DrmManagerClient.java revision d074e30ce44b9e33da43b67a4515b8986ca72b26
1d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/*
2d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Copyright (C) 2010 The Android Open Source Project
3d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *
4d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Licensed under the Apache License, Version 2.0 (the "License");
5d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * you may not use this file except in compliance with the License.
6d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * You may obtain a copy of the License at
7d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *
8d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *      http://www.apache.org/licenses/LICENSE-2.0
9d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *
10d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Unless required by applicable law or agreed to in writing, software
11d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * distributed under the License is distributed on an "AS IS" BASIS,
12d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * See the License for the specific language governing permissions and
14d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * limitations under the License.
15d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */
16d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
17d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshipackage android.drm;
18d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
19d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport android.content.ContentValues;
20d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport android.content.Context;
21d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport android.os.Handler;
22d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport android.os.Looper;
23d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport android.os.Message;
24d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport android.util.Log;
25d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
26d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport java.io.IOException;
27d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport java.lang.ref.WeakReference;
28d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiimport java.util.ArrayList;
29d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
30d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/**
31d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Interface of DRM Framework.
32d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Java application will instantiate this class
33d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * to access DRM agent through DRM Framework.
34d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *
35d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */
36d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshipublic class DrmManagerClient {
37d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private static final String TAG = "DrmManager";
38d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
39d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    static {
40d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        // Load the respective library
41d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        System.loadLibrary("drmframework_jni");
42d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
43d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
44d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
45d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Interface definition of a callback to be invoked to communicate
46d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * some info and/or warning about DrmManagerClient.
47d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
48d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public interface OnInfoListener {
49d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        /**
50d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi         * Called to indicate an info or a warning.
51d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi         *
52d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi         * @param client DrmManagerClient instance
53d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi         * @param event instance which wraps reason and necessary information
54d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi         */
55d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        public void onInfo(DrmManagerClient client, DrmInfoEvent event);
56d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
57d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
58d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private static final int STATE_UNINITIALIZED = 0x00000000;
59d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private static final int STATE_INITIALIZED = 0x00000001;
60d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
61d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private int mUniqueId;
62d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private int mNativeContext;
63d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private EventHandler mEventHandler;
64d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private OnInfoListener mOnInfoListener;
65d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private int mCurrentState = STATE_UNINITIALIZED;
66d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
67d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
68d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * {@hide}
69d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
70d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public static void notify(Object thisReference, int uniqueId, int infoType, String message) {
71d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        DrmManagerClient instance = (DrmManagerClient)((WeakReference)thisReference).get();
72d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
73d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if (null != instance && null != instance.mEventHandler) {
74d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            Message m = instance.mEventHandler.obtainMessage(
75d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                EventHandler.INFO_EVENT_TYPE, uniqueId, infoType, message);
76d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            instance.mEventHandler.sendMessage(m);
77d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
78d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
79d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
80d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private class EventHandler extends Handler {
81d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        public static final int INFO_EVENT_TYPE = 1;
82d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
83d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        public EventHandler(Looper looper) {
84d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            super(looper);
85d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
86d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
87d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        public void handleMessage(Message msg) {
88d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
89d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            switch (msg.what) {
90d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            case EventHandler.INFO_EVENT_TYPE:
91d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                int uniqueId = msg.arg1;
92d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                int infoType = msg.arg2;
93d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                String message = msg.obj.toString();
94d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
95d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                if (infoType == DrmInfoEvent.TYPE_REMOVE_RIGHTS) {
96d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                    try {
97d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                        DrmUtils.removeFile(message);
98d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                    } catch (IOException e) {
99d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                        e.printStackTrace();
100d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                    }
101d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                }
102d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
103d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                if (null != mOnInfoListener) {
104d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                    DrmInfoEvent event = new DrmInfoEvent(uniqueId, infoType, message);
105d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                    mOnInfoListener.onInfo(DrmManagerClient.this, event);
106d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                }
107d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                return;
108d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            default:
109d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                Log.e(TAG, "Unknown message type " + msg.what);
110d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                return;
111d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            }
112d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
113d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
114d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
115d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
116d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * To instantiate DrmManagerClient
117d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
118d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param context context of the caller
119d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
120d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public DrmManagerClient(Context context) {
121d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        Looper looper;
122d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
123d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if (null != (looper = Looper.myLooper())) {
124d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            mEventHandler = new EventHandler(looper);
125d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        } else if (null != (looper = Looper.getMainLooper())) {
126d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            mEventHandler = new EventHandler(looper);
127d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        } else {
128d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            mEventHandler = null;
129d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
130d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
131d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        // save the unique id
132d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        mUniqueId = hashCode();
133d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
134d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
135d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
136d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Register a callback to be invoked when the caller required to receive
137d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * necessary information
138d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
139d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param infoListener
140d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
141d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public void setOnInfoListener(OnInfoListener infoListener) {
142d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        synchronized(this) {
143d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            if (null != infoListener) {
144d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                mOnInfoListener = infoListener;
145d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            }
146d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
147d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
148d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
149d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
150d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Initializes DrmFramework, which loads all available plug-ins
151d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * in the default plug-in directory path
152d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
153d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
154d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public void loadPlugIns() {
155d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if (getState() == STATE_UNINITIALIZED) {
156d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            _loadPlugIns(mUniqueId, new WeakReference<DrmManagerClient>(this));
157d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
158d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            mCurrentState = STATE_INITIALIZED;
159d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
160d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
161d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
162d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
163d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Finalize DrmFramework, which release resources associated with each plug-in
164d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * and unload all plug-ins.
165d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
166d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public void unloadPlugIns() {
167d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if (getState() == STATE_INITIALIZED) {
168d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            _unloadPlugIns(mUniqueId);
169d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
170d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            mCurrentState = STATE_UNINITIALIZED;
171d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
172d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
173d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
174d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
175d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Retrieves informations about all the plug-ins registered with DrmFramework.
176d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
177d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return Array of DrmEngine plug-in strings
178d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
179d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public String[] getAvailableDrmEngines() {
180d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if (getState() == STATE_UNINITIALIZED) {
181d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalStateException("Not Initialized yet");
182d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
183d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
184d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        DrmSupportInfo[] supportInfos = _getAllSupportInfo(mUniqueId);
185d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        ArrayList<String> descriptions = new ArrayList<String>();
186d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
187d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        for (int i = 0; i < supportInfos.length; i++) {
188d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            descriptions.add(supportInfos[i].getDescriprition());
189d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
190d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
191d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        String[] drmEngines = new String[descriptions.size()];
192d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return descriptions.toArray(drmEngines);
193d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
194d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
195d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
196d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Get constraints information evaluated from DRM content
197d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
198d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param path Content path from where DRM constraints would be retrieved.
199d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param action Actions defined in {@link DrmStore.Action}
200d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return ContentValues instance in which constraints key-value pairs are embedded
201d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *         or null in case of failure
202d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
203d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public ContentValues getConstraints(String path, int action) {
204d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if (null == path || path.equals("") || !DrmStore.Action.isValid(action)) {
205d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalArgumentException("Given usage or path is invalid/null");
206d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        } else if (getState() == STATE_UNINITIALIZED) {
207d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalStateException("Not Initialized yet");
208d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
209d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return _getConstraints(mUniqueId, path, action);
210d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
211d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
212d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
213d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Save DRM rights to specified rights path
214d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * and make association with content path.
215d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
216d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param drmRights DrmRights to be saved
217d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param rightsPath File path where rights to be saved
218d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param contentPath File path where content was saved
219d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @throws IOException if failed to save rights information in the given path
220d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
221d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @note In case of OMA or WM-DRM, rightsPath and contentPath could be null
222d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
223d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public void saveRights(
224d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            DrmRights drmRights, String rightsPath, String contentPath) throws IOException {
225d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if (null == drmRights || !drmRights.isValid()
226d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            || null == contentPath || contentPath.equals("")) {
227d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalArgumentException("Given drmRights or contentPath is not valid");
228d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        } else if (getState() == STATE_UNINITIALIZED) {
229d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalStateException("Not Initialized yet");
230d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
231d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if (null != rightsPath && !rightsPath.equals("")) {
232d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            DrmUtils.writeToFile(rightsPath, drmRights.getData());
233d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
234d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        _saveRights(mUniqueId, drmRights, rightsPath, contentPath);
235d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
236d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
237d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
238d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Install new DRM Engine Plug-in at the runtime
239d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
240d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param engineFilePath Path of the plug-in file to be installed
241d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * {@hide}
242d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
243d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public void installDrmEngine(String engineFilePath) {
244d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if (null == engineFilePath || engineFilePath.equals("")) {
245d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalArgumentException(
246d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi                "Given engineFilePath: "+ engineFilePath + "is not valid");
247d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        } else if (getState() == STATE_UNINITIALIZED) {
248d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalStateException("Not Initialized yet");
249d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
250d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        _installDrmEngine(mUniqueId, engineFilePath);
251d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
252d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
253d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
254d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Check whether the given mimetype or path can be handled.
255d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
256d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param path Path of the content to be handled
257d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param mimeType Mimetype of the object to be handled
258d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return
259d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *        true - if the given mimeType or path can be handled
260d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *        false - cannot be handled.
261d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @note false will be return in case the state is uninitialized
262d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
263d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public boolean canHandle(String path, String mimeType) {
264d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if ((null == path || path.equals("")) && (null == mimeType || mimeType.equals(""))) {
265d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalArgumentException("Path or the mimetype should be non null");
266d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        } else if (getState() == STATE_UNINITIALIZED) {
267d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalStateException("Not Initialized yet");
268d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
269d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return _canHandle(mUniqueId, path, mimeType);
270d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
271d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
272d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
273d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Executes given drm information based on its type
274d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
275d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param drmInfo Information needs to be processed
276d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return DrmInfoStatus Instance as a result of processing given input
277d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
278d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public DrmInfoStatus processDrmInfo(DrmInfo drmInfo) {
279d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if (null == drmInfo || !drmInfo.isValid()) {
280d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalArgumentException("Given drmInfo is invalid/null");
281d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        } else if (getState() == STATE_UNINITIALIZED) {
282d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalStateException("Not Initialized yet");
283d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
284d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return _processDrmInfo(mUniqueId, drmInfo);
285d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
286d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
287d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
288d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Retrieves necessary information for register, unregister or rights acquisition.
289d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
290d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param drmInfoRequest Request information to retrieve drmInfo
291d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return DrmInfo Instance as a result of processing given input
292d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
293d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public DrmInfo acquireDrmInfo(DrmInfoRequest drmInfoRequest) {
294d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if (null == drmInfoRequest || !drmInfoRequest.isValid()) {
295d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalArgumentException("Given drmInfoRequest is invalid/null");
296d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        } else if (getState() == STATE_UNINITIALIZED) {
297d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalStateException("Not Initialized yet");
298d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
299d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return _acquireDrmInfo(mUniqueId, drmInfoRequest);
300d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
301d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
302d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
303d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Retrieves the type of the protected object (content, rights, etc..)
304d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * using specified path or mimetype. At least one parameter should be non null
305d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * to retrieve DRM object type
306d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
307d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param path Path of the content or null.
308d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param mimeType Mimetype of the content or null.
309d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return Type of the DRM content.
310d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @see DrmStore.DrmObjectType
311d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
312d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public int getDrmObjectType(String path, String mimeType) {
313d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if ((null == path || path.equals("")) && (null == mimeType || mimeType.equals(""))) {
314d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalArgumentException("Path or the mimetype should be non null");
315d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        } else if (getState() == STATE_UNINITIALIZED) {
316d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalStateException("Not Initialized yet");
317d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
318d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return _getDrmObjectType(mUniqueId, path, mimeType);
319d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
320d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
321d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
322d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Retrieves the mime type embedded inside the original content
323d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
324d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param path Path of the protected content
325d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return Mimetype of the original content, such as "video/mpeg"
326d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
327d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public String getOriginalMimeType(String path) {
328d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if (null == path || path.equals("")) {
329d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalArgumentException("Given path should be non null");
330d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        } else if (getState() == STATE_UNINITIALIZED) {
331d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalStateException("Not Initialized yet");
332d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
333d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return _getOriginalMimeType(mUniqueId, path);
334d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
335d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
336d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
337d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Check whether the given content has valid rights or not
338d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
339d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param path Path of the protected content
340d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return Status of the rights for the protected content
341d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @see DrmStore.RightsStatus
342d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
343d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public int checkRightsStatus(String path) {
344d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return checkRightsStatus(path, DrmStore.Action.DEFAULT);
345d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
346d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
347d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
348d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Check whether the given content has valid rights or not for specified action.
349d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
350d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param path Path of the protected content
351d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param action Action to perform
352d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return Status of the rights for the protected content
353d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @see DrmStore.RightsStatus
354d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
355d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public int checkRightsStatus(String path, int action) {
356d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if (null == path || path.equals("") || !DrmStore.Action.isValid(action)) {
357d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalArgumentException("Given path or action is not valid");
358d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        } else if (getState() == STATE_UNINITIALIZED) {
359d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalStateException("Not Initialized yet");
360d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
361d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return _checkRightsStatus(mUniqueId, path, action);
362d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
363d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
364d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
365d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Removes the rights associated with the given protected content
366d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
367d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param path Path of the protected content
368d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
369d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public void removeRights(String path) {
370d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if (null == path || path.equals("")) {
371d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalArgumentException("Given path should be non null");
372d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        } else if (getState() == STATE_UNINITIALIZED) {
373d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalStateException("Not Initialized yet");
374d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
375d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        _removeRights(mUniqueId, path);
376d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
377d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
378d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
379d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Removes all the rights information of every plug-in associated with
380d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * DRM framework. Will be used in master reset
381d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
382d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public void removeAllRights() {
383d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if (getState() == STATE_UNINITIALIZED) {
384d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalStateException("Not Initialized yet");
385d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
386d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        _removeAllRights(mUniqueId);
387d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
388d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
389d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
390d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * This API is for Forward Lock based DRM scheme.
391d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Each time the application tries to download a new DRM file
392d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * which needs to be converted, then the application has to
393d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * begin with calling this API.
394d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
395d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param mimeType Description/MIME type of the input data packet
396d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return convert ID which will be used for maintaining convert session.
397d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
398d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public int openConvertSession(String mimeType) {
399d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if (null == mimeType || mimeType.equals("")) {
400d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalArgumentException("Path or the mimeType should be non null");
401d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        } else if (getState() == STATE_UNINITIALIZED) {
402d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalStateException("Not Initialized yet");
403d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
404d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return _openConvertSession(mUniqueId, mimeType);
405d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
406d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
407d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
408d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Accepts and converts the input data which is part of DRM file.
409d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * The resultant converted data and the status is returned in the DrmConvertedInfo
410d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * object. This method will be called each time there are new block
411d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * of data received by the application.
412d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
413d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param convertId Handle for the convert session
414d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param inputData Input Data which need to be converted
415d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return Return object contains the status of the data conversion,
416d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *         the output converted data and offset. In this case the
417d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *         application will ignore the offset information.
418d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
419d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public DrmConvertedStatus convertData(int convertId, byte[] inputData) {
420d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if (null == inputData || 0 >= inputData.length) {
421d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalArgumentException("Given inputData should be non null");
422d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        } else if (getState() == STATE_UNINITIALIZED) {
423d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalStateException("Not Initialized yet");
424d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
425d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return _convertData(mUniqueId, convertId, inputData);
426d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
427d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
428d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
429d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Informs the Drm Agent when there is no more data which need to be converted
430d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * or when an error occurs. Upon successful conversion of the complete data,
431d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * the agent will inform that where the header and body signature
432d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * should be added. This signature appending is needed to integrity
433d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * protect the converted file.
434d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
435d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param convertId Handle for the convert session
436d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return Return object contains the status of the data conversion,
437d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     the header and body signature data. It also informs
438d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     the application on which offset these signature data should be appended.
439d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
440d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public DrmConvertedStatus closeConvertSession(int convertId) {
441d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        if (getState() == STATE_UNINITIALIZED) {
442d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            throw new IllegalStateException("Not Initialized yet");
443d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        }
444d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return _closeConvertSession(mUniqueId, convertId);
445d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
446d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
447d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private int getState() {
448d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        return mCurrentState;
449d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    }
450d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
451d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    // private native interfaces
452d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private native void _loadPlugIns(int uniqueId, Object weak_this);
453d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
454d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private native void _unloadPlugIns(int uniqueId);
455d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
456d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private native void _installDrmEngine(int uniqueId, String engineFilepath);
457d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
458d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private native ContentValues _getConstraints(int uniqueId, String path, int usage);
459d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
460d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private native boolean _canHandle(int uniqueId, String path, String mimeType);
461d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
462d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private native DrmInfoStatus _processDrmInfo(int uniqueId, DrmInfo drmInfo);
463d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
464d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private native DrmInfo _acquireDrmInfo(int uniqueId, DrmInfoRequest drmInfoRequest);
465d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
466d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private native void _saveRights(
467d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi            int uniqueId, DrmRights drmRights, String rightsPath, String contentPath);
468d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
469d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private native int _getDrmObjectType(int uniqueId, String path, String mimeType);
470d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
471d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private native String _getOriginalMimeType(int uniqueId, String path);
472d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
473d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private native int _checkRightsStatus(int uniqueId, String path, int action);
474d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
475d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private native void _removeRights(int uniqueId, String path);
476d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
477d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private native void _removeAllRights(int uniqueId);
478d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
479d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private native int _openConvertSession(int uniqueId, String mimeType);
480d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
481d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private native DrmConvertedStatus _convertData(int uniqueId, int convertId, byte[] inputData);
482d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
483d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private native DrmConvertedStatus _closeConvertSession(int uniqueId, int convertId);
484d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
485d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    private native DrmSupportInfo[] _getAllSupportInfo(int uniqueId);
486d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi}
487d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
488