blob: ec400b797b4508f1a6e8ae18f04c1f4e5eaddec6 [file] [log] [blame]
aimitakeshid074e302010-07-29 10:12:27 +09001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Takeshi Aimidc549d62010-09-20 23:40:41 +090017//#define LOG_NDEBUG 0
aimitakeshid074e302010-07-29 10:12:27 +090018#define LOG_TAG "DrmManager(Native)"
19#include "utils/Log.h"
20
21#include <utils/String8.h>
22#include <drm/DrmInfo.h>
23#include <drm/DrmInfoEvent.h>
24#include <drm/DrmRights.h>
25#include <drm/DrmConstraints.h>
Takeshi Aimidc9186562010-11-16 13:56:11 +090026#include <drm/DrmMetadata.h>
aimitakeshid074e302010-07-29 10:12:27 +090027#include <drm/DrmInfoStatus.h>
28#include <drm/DrmInfoRequest.h>
29#include <drm/DrmSupportInfo.h>
30#include <drm/DrmConvertedStatus.h>
31#include <IDrmEngine.h>
32
33#include "DrmManager.h"
34#include "ReadWriteUtils.h"
35
36#define DECRYPT_FILE_ERROR -1
37
38using namespace android;
39
Takeshi Aimidc549d62010-09-20 23:40:41 +090040Vector<int> DrmManager::mUniqueIdVector;
aimitakeshid074e302010-07-29 10:12:27 +090041const String8 DrmManager::EMPTY_STRING("");
42
43DrmManager::DrmManager() :
44 mDecryptSessionId(0),
45 mConvertId(0) {
46
47}
48
49DrmManager::~DrmManager() {
50
51}
52
Takeshi Aimidc549d62010-09-20 23:40:41 +090053int DrmManager::addUniqueId(int uniqueId) {
54 if (0 == uniqueId) {
55 int temp = 0;
56 bool foundUniqueId = false;
57 srand(time(NULL));
58
59 while (!foundUniqueId) {
60 const int size = mUniqueIdVector.size();
61 temp = rand() % 100;
62
63 int index = 0;
64 for (; index < size; ++index) {
65 if (mUniqueIdVector.itemAt(index) == temp) {
66 foundUniqueId = false;
67 break;
68 }
69 }
70 if (index == size) {
71 foundUniqueId = true;
72 }
73 }
74 uniqueId = temp;
75 }
76 mUniqueIdVector.push(uniqueId);
77 return uniqueId;
78}
79
80void DrmManager::removeUniqueId(int uniqueId) {
81 for (unsigned int i = 0; i < mUniqueIdVector.size(); i++) {
82 if (uniqueId == mUniqueIdVector.itemAt(i)) {
83 mUniqueIdVector.removeAt(i);
84 break;
85 }
86 }
87}
88
Takeshi Aimic7b3ccc2010-10-08 23:05:49 +090089status_t DrmManager::loadPlugIns() {
Glenn Kastencbba7202011-01-11 17:15:49 -080090 String8 pluginDirPath("/system/lib/drm");
Takeshi Aimic7b3ccc2010-10-08 23:05:49 +090091 return loadPlugIns(pluginDirPath);
aimitakeshid074e302010-07-29 10:12:27 +090092}
93
Takeshi Aimic7b3ccc2010-10-08 23:05:49 +090094status_t DrmManager::loadPlugIns(const String8& plugInDirPath) {
aimitakeshid074e302010-07-29 10:12:27 +090095 if (mSupportInfoToPlugInIdMap.isEmpty()) {
96 mPlugInManager.loadPlugIns(plugInDirPath);
Takeshi Aimic7b3ccc2010-10-08 23:05:49 +090097 Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList();
98 for (unsigned int i = 0; i < plugInPathList.size(); ++i) {
99 String8 plugInPath = plugInPathList[i];
100 DrmSupportInfo* info = mPlugInManager.getPlugIn(plugInPath).getSupportInfo(0);
101 if (NULL != info) {
102 mSupportInfoToPlugInIdMap.add(*info, plugInPath);
103 }
104 }
aimitakeshid074e302010-07-29 10:12:27 +0900105 }
Takeshi Aimic7b3ccc2010-10-08 23:05:49 +0900106 return DRM_NO_ERROR;
107}
aimitakeshid074e302010-07-29 10:12:27 +0900108
Takeshi Aimic7b3ccc2010-10-08 23:05:49 +0900109status_t DrmManager::unloadPlugIns() {
110 mConvertSessionMap.clear();
111 mDecryptSessionMap.clear();
112 mPlugInManager.unloadPlugIns();
113 mSupportInfoToPlugInIdMap.clear();
aimitakeshid074e302010-07-29 10:12:27 +0900114 return DRM_NO_ERROR;
115}
116
117status_t DrmManager::setDrmServiceListener(
118 int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) {
119 Mutex::Autolock _l(mLock);
Takeshi Aimif05913a2010-11-30 16:27:42 +0900120 if (NULL != drmServiceListener.get()) {
121 mServiceListeners.add(uniqueId, drmServiceListener);
122 } else {
123 mServiceListeners.removeItem(uniqueId);
124 }
aimitakeshid074e302010-07-29 10:12:27 +0900125 return DRM_NO_ERROR;
126}
127
Takeshi Aimic7b3ccc2010-10-08 23:05:49 +0900128void DrmManager::addClient(int uniqueId) {
129 if (!mSupportInfoToPlugInIdMap.isEmpty()) {
130 Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList();
131 for (unsigned int index = 0; index < plugInIdList.size(); index++) {
132 IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index));
133 rDrmEngine.initialize(uniqueId);
134 rDrmEngine.setOnInfoListener(uniqueId, this);
135 }
136 }
137}
aimitakeshid074e302010-07-29 10:12:27 +0900138
Takeshi Aimic7b3ccc2010-10-08 23:05:49 +0900139void DrmManager::removeClient(int uniqueId) {
140 Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList();
aimitakeshid074e302010-07-29 10:12:27 +0900141 for (unsigned int index = 0; index < plugInIdList.size(); index++) {
142 IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index));
143 rDrmEngine.terminate(uniqueId);
144 }
aimitakeshid074e302010-07-29 10:12:27 +0900145}
146
147DrmConstraints* DrmManager::getConstraints(int uniqueId, const String8* path, const int action) {
148 const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, *path);
149 if (EMPTY_STRING != plugInId) {
150 IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
151 return rDrmEngine.getConstraints(uniqueId, path, action);
152 }
153 return NULL;
154}
155
Takeshi Aimidc9186562010-11-16 13:56:11 +0900156DrmMetadata* DrmManager::getMetadata(int uniqueId, const String8* path) {
157 const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, *path);
158 if (EMPTY_STRING != plugInId) {
159 IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
160 return rDrmEngine.getMetadata(uniqueId, path);
161 }
162 return NULL;
163}
164
aimitakeshid074e302010-07-29 10:12:27 +0900165status_t DrmManager::installDrmEngine(int uniqueId, const String8& absolutePath) {
166 mPlugInManager.loadPlugIn(absolutePath);
167
168 IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(absolutePath);
169 rDrmEngine.initialize(uniqueId);
170 rDrmEngine.setOnInfoListener(uniqueId, this);
171
Takeshi Aimic7b3ccc2010-10-08 23:05:49 +0900172 DrmSupportInfo* info = rDrmEngine.getSupportInfo(0);
aimitakeshid074e302010-07-29 10:12:27 +0900173 mSupportInfoToPlugInIdMap.add(*info, absolutePath);
174
175 return DRM_NO_ERROR;
176}
177
178bool DrmManager::canHandle(int uniqueId, const String8& path, const String8& mimeType) {
179 const String8 plugInId = getSupportedPlugInId(mimeType);
180 bool result = (EMPTY_STRING != plugInId) ? true : false;
181
Takeshi Aimic7b3ccc2010-10-08 23:05:49 +0900182 if (0 < path.length()) {
aimitakeshid074e302010-07-29 10:12:27 +0900183 if (result) {
184 IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
185 result = rDrmEngine.canHandle(uniqueId, path);
186 } else {
Gloria Wang289401b2011-03-02 12:33:00 -0800187 String8 extension = path.getPathExtension();
188 if (String8("") != extension) {
189 result = canHandle(uniqueId, path);
190 }
aimitakeshid074e302010-07-29 10:12:27 +0900191 }
192 }
193 return result;
194}
195
196DrmInfoStatus* DrmManager::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) {
197 const String8 plugInId = getSupportedPlugInId(drmInfo->getMimeType());
198 if (EMPTY_STRING != plugInId) {
199 IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
200 return rDrmEngine.processDrmInfo(uniqueId, drmInfo);
201 }
202 return NULL;
203}
204
205bool DrmManager::canHandle(int uniqueId, const String8& path) {
206 bool result = false;
207 Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList();
208
209 for (unsigned int i = 0; i < plugInPathList.size(); ++i) {
210 IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInPathList[i]);
211 result = rDrmEngine.canHandle(uniqueId, path);
212
213 if (result) {
214 break;
215 }
216 }
217 return result;
218}
219
220DrmInfo* DrmManager::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) {
221 const String8 plugInId = getSupportedPlugInId(drmInfoRequest->getMimeType());
222 if (EMPTY_STRING != plugInId) {
223 IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
224 return rDrmEngine.acquireDrmInfo(uniqueId, drmInfoRequest);
225 }
226 return NULL;
227}
228
Takeshi Aimidc549d62010-09-20 23:40:41 +0900229status_t DrmManager::saveRights(int uniqueId, const DrmRights& drmRights,
aimitakeshid074e302010-07-29 10:12:27 +0900230 const String8& rightsPath, const String8& contentPath) {
231 const String8 plugInId = getSupportedPlugInId(drmRights.getMimeType());
Takeshi Aimidc549d62010-09-20 23:40:41 +0900232 status_t result = DRM_ERROR_UNKNOWN;
aimitakeshid074e302010-07-29 10:12:27 +0900233 if (EMPTY_STRING != plugInId) {
234 IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
Takeshi Aimidc549d62010-09-20 23:40:41 +0900235 result = rDrmEngine.saveRights(uniqueId, drmRights, rightsPath, contentPath);
aimitakeshid074e302010-07-29 10:12:27 +0900236 }
Takeshi Aimidc549d62010-09-20 23:40:41 +0900237 return result;
aimitakeshid074e302010-07-29 10:12:27 +0900238}
239
240String8 DrmManager::getOriginalMimeType(int uniqueId, const String8& path) {
241 const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path);
242 if (EMPTY_STRING != plugInId) {
243 IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
244 return rDrmEngine.getOriginalMimeType(uniqueId, path);
245 }
246 return EMPTY_STRING;
247}
248
249int DrmManager::getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType) {
250 const String8 plugInId = getSupportedPlugInId(uniqueId, path, mimeType);
251 if (EMPTY_STRING != plugInId) {
252 IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
253 return rDrmEngine.getDrmObjectType(uniqueId, path, mimeType);
254 }
255 return DrmObjectType::UNKNOWN;
256}
257
258int DrmManager::checkRightsStatus(int uniqueId, const String8& path, int action) {
259 const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path);
260 if (EMPTY_STRING != plugInId) {
261 IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
262 return rDrmEngine.checkRightsStatus(uniqueId, path, action);
263 }
264 return RightsStatus::RIGHTS_INVALID;
265}
266
Takeshi Aimidc549d62010-09-20 23:40:41 +0900267status_t DrmManager::consumeRights(
aimitakeshid074e302010-07-29 10:12:27 +0900268 int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) {
Takeshi Aimidc549d62010-09-20 23:40:41 +0900269 status_t result = DRM_ERROR_UNKNOWN;
aimitakeshid074e302010-07-29 10:12:27 +0900270 if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) {
271 IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId);
Takeshi Aimidc549d62010-09-20 23:40:41 +0900272 result = drmEngine->consumeRights(uniqueId, decryptHandle, action, reserve);
aimitakeshid074e302010-07-29 10:12:27 +0900273 }
Takeshi Aimidc549d62010-09-20 23:40:41 +0900274 return result;
aimitakeshid074e302010-07-29 10:12:27 +0900275}
276
Takeshi Aimidc549d62010-09-20 23:40:41 +0900277status_t DrmManager::setPlaybackStatus(
Gloria Wang5fc3edb2010-11-19 15:19:36 -0800278 int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) {
Takeshi Aimidc549d62010-09-20 23:40:41 +0900279 status_t result = DRM_ERROR_UNKNOWN;
aimitakeshid074e302010-07-29 10:12:27 +0900280 if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) {
281 IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId);
Takeshi Aimidc549d62010-09-20 23:40:41 +0900282 result = drmEngine->setPlaybackStatus(uniqueId, decryptHandle, playbackStatus, position);
aimitakeshid074e302010-07-29 10:12:27 +0900283 }
Takeshi Aimidc549d62010-09-20 23:40:41 +0900284 return result;
aimitakeshid074e302010-07-29 10:12:27 +0900285}
286
287bool DrmManager::validateAction(
288 int uniqueId, const String8& path, int action, const ActionDescription& description) {
289 const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path);
290 if (EMPTY_STRING != plugInId) {
291 IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
292 return rDrmEngine.validateAction(uniqueId, path, action, description);
293 }
294 return false;
295}
296
Takeshi Aimidc549d62010-09-20 23:40:41 +0900297status_t DrmManager::removeRights(int uniqueId, const String8& path) {
aimitakeshid074e302010-07-29 10:12:27 +0900298 const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path);
Takeshi Aimidc549d62010-09-20 23:40:41 +0900299 status_t result = DRM_ERROR_UNKNOWN;
aimitakeshid074e302010-07-29 10:12:27 +0900300 if (EMPTY_STRING != plugInId) {
301 IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
Takeshi Aimidc549d62010-09-20 23:40:41 +0900302 result = rDrmEngine.removeRights(uniqueId, path);
aimitakeshid074e302010-07-29 10:12:27 +0900303 }
Takeshi Aimidc549d62010-09-20 23:40:41 +0900304 return result;
aimitakeshid074e302010-07-29 10:12:27 +0900305}
306
Takeshi Aimidc549d62010-09-20 23:40:41 +0900307status_t DrmManager::removeAllRights(int uniqueId) {
aimitakeshid074e302010-07-29 10:12:27 +0900308 Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList();
Takeshi Aimidc549d62010-09-20 23:40:41 +0900309 status_t result = DRM_ERROR_UNKNOWN;
aimitakeshid074e302010-07-29 10:12:27 +0900310 for (unsigned int index = 0; index < plugInIdList.size(); index++) {
311 IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index));
Takeshi Aimidc549d62010-09-20 23:40:41 +0900312 result = rDrmEngine.removeAllRights(uniqueId);
313 if (DRM_NO_ERROR != result) {
314 break;
315 }
aimitakeshid074e302010-07-29 10:12:27 +0900316 }
Takeshi Aimidc549d62010-09-20 23:40:41 +0900317 return result;
aimitakeshid074e302010-07-29 10:12:27 +0900318}
319
320int DrmManager::openConvertSession(int uniqueId, const String8& mimeType) {
321 int convertId = -1;
322
323 const String8 plugInId = getSupportedPlugInId(mimeType);
324 if (EMPTY_STRING != plugInId) {
325 IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
326
Takeshi Aimidc549d62010-09-20 23:40:41 +0900327 if (DRM_NO_ERROR == rDrmEngine.openConvertSession(uniqueId, mConvertId + 1)) {
328 Mutex::Autolock _l(mConvertLock);
329 ++mConvertId;
330 convertId = mConvertId;
331 mConvertSessionMap.add(convertId, &rDrmEngine);
332 }
aimitakeshid074e302010-07-29 10:12:27 +0900333 }
334 return convertId;
335}
336
337DrmConvertedStatus* DrmManager::convertData(
338 int uniqueId, int convertId, const DrmBuffer* inputData) {
339 DrmConvertedStatus *drmConvertedStatus = NULL;
340
341 if (mConvertSessionMap.indexOfKey(convertId) != NAME_NOT_FOUND) {
342 IDrmEngine* drmEngine = mConvertSessionMap.valueFor(convertId);
343 drmConvertedStatus = drmEngine->convertData(uniqueId, convertId, inputData);
344 }
345 return drmConvertedStatus;
346}
347
348DrmConvertedStatus* DrmManager::closeConvertSession(int uniqueId, int convertId) {
349 DrmConvertedStatus *drmConvertedStatus = NULL;
350
351 if (mConvertSessionMap.indexOfKey(convertId) != NAME_NOT_FOUND) {
352 IDrmEngine* drmEngine = mConvertSessionMap.valueFor(convertId);
353 drmConvertedStatus = drmEngine->closeConvertSession(uniqueId, convertId);
354 mConvertSessionMap.removeItem(convertId);
355 }
356 return drmConvertedStatus;
357}
358
359status_t DrmManager::getAllSupportInfo(
360 int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) {
361 Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList();
362 int size = plugInPathList.size();
363 int validPlugins = 0;
364
365 if (0 < size) {
366 Vector<DrmSupportInfo> drmSupportInfoList;
367
368 for (int i = 0; i < size; ++i) {
369 String8 plugInPath = plugInPathList[i];
370 DrmSupportInfo* drmSupportInfo
Takeshi Aimic7b3ccc2010-10-08 23:05:49 +0900371 = mPlugInManager.getPlugIn(plugInPath).getSupportInfo(0);
aimitakeshid074e302010-07-29 10:12:27 +0900372 if (NULL != drmSupportInfo) {
373 drmSupportInfoList.add(*drmSupportInfo);
374 delete drmSupportInfo; drmSupportInfo = NULL;
375 }
376 }
377
378 validPlugins = drmSupportInfoList.size();
379 if (0 < validPlugins) {
380 *drmSupportInfoArray = new DrmSupportInfo[validPlugins];
381 for (int i = 0; i < validPlugins; ++i) {
382 (*drmSupportInfoArray)[i] = drmSupportInfoList[i];
383 }
384 }
385 }
386 *length = validPlugins;
387 return DRM_NO_ERROR;
388}
389
Gloria Wang5fc3edb2010-11-19 15:19:36 -0800390DecryptHandle* DrmManager::openDecryptSession(int uniqueId, int fd, off64_t offset, off64_t length) {
Takeshi Aimic7b3ccc2010-10-08 23:05:49 +0900391 Mutex::Autolock _l(mDecryptLock);
aimitakeshid074e302010-07-29 10:12:27 +0900392 status_t result = DRM_ERROR_CANNOT_HANDLE;
393 Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList();
394
395 DecryptHandle* handle = new DecryptHandle();
396 if (NULL != handle) {
aimitakeshid074e302010-07-29 10:12:27 +0900397 handle->decryptId = mDecryptSessionId + 1;
398
399 for (unsigned int index = 0; index < plugInIdList.size(); index++) {
400 String8 plugInId = plugInIdList.itemAt(index);
401 IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
402 result = rDrmEngine.openDecryptSession(uniqueId, handle, fd, offset, length);
403
aimitakeshid074e302010-07-29 10:12:27 +0900404 if (DRM_NO_ERROR == result) {
405 ++mDecryptSessionId;
406 mDecryptSessionMap.add(mDecryptSessionId, &rDrmEngine);
aimitakeshid074e302010-07-29 10:12:27 +0900407 break;
408 }
409 }
410 }
Takeshi Aimidc549d62010-09-20 23:40:41 +0900411 if (DRM_NO_ERROR != result) {
aimitakeshid074e302010-07-29 10:12:27 +0900412 delete handle; handle = NULL;
aimitakeshid074e302010-07-29 10:12:27 +0900413 }
Takeshi Aimic7b3ccc2010-10-08 23:05:49 +0900414 return handle;
415}
aimitakeshid074e302010-07-29 10:12:27 +0900416
Takeshi Aimic7b3ccc2010-10-08 23:05:49 +0900417DecryptHandle* DrmManager::openDecryptSession(int uniqueId, const char* uri) {
418 Mutex::Autolock _l(mDecryptLock);
419 status_t result = DRM_ERROR_CANNOT_HANDLE;
420 Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList();
421
422 DecryptHandle* handle = new DecryptHandle();
423 if (NULL != handle) {
424 handle->decryptId = mDecryptSessionId + 1;
425
426 for (unsigned int index = 0; index < plugInIdList.size(); index++) {
427 String8 plugInId = plugInIdList.itemAt(index);
428 IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
429 result = rDrmEngine.openDecryptSession(uniqueId, handle, uri);
430
431 if (DRM_NO_ERROR == result) {
432 ++mDecryptSessionId;
433 mDecryptSessionMap.add(mDecryptSessionId, &rDrmEngine);
434 break;
435 }
436 }
437 }
438 if (DRM_NO_ERROR != result) {
439 delete handle; handle = NULL;
440 LOGE("DrmManager::openDecryptSession: no capable plug-in found");
441 }
aimitakeshid074e302010-07-29 10:12:27 +0900442 return handle;
443}
444
Takeshi Aimidc549d62010-09-20 23:40:41 +0900445status_t DrmManager::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) {
Takeshi Aimic7b3ccc2010-10-08 23:05:49 +0900446 Mutex::Autolock _l(mDecryptLock);
Takeshi Aimidc549d62010-09-20 23:40:41 +0900447 status_t result = DRM_ERROR_UNKNOWN;
aimitakeshid074e302010-07-29 10:12:27 +0900448 if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) {
449 IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId);
Takeshi Aimidc549d62010-09-20 23:40:41 +0900450 result = drmEngine->closeDecryptSession(uniqueId, decryptHandle);
451 if (DRM_NO_ERROR == result) {
452 mDecryptSessionMap.removeItem(decryptHandle->decryptId);
453 }
aimitakeshid074e302010-07-29 10:12:27 +0900454 }
Takeshi Aimidc549d62010-09-20 23:40:41 +0900455 return result;
aimitakeshid074e302010-07-29 10:12:27 +0900456}
457
Takeshi Aimidc549d62010-09-20 23:40:41 +0900458status_t DrmManager::initializeDecryptUnit(
aimitakeshid074e302010-07-29 10:12:27 +0900459 int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, const DrmBuffer* headerInfo) {
Takeshi Aimidc549d62010-09-20 23:40:41 +0900460 status_t result = DRM_ERROR_UNKNOWN;
aimitakeshid074e302010-07-29 10:12:27 +0900461 if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) {
462 IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId);
Takeshi Aimidc549d62010-09-20 23:40:41 +0900463 result = drmEngine->initializeDecryptUnit(uniqueId, decryptHandle, decryptUnitId, headerInfo);
aimitakeshid074e302010-07-29 10:12:27 +0900464 }
Takeshi Aimidc549d62010-09-20 23:40:41 +0900465 return result;
aimitakeshid074e302010-07-29 10:12:27 +0900466}
467
Takeshi Aimidc549d62010-09-20 23:40:41 +0900468status_t DrmManager::decrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,
469 const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) {
470 status_t result = DRM_ERROR_UNKNOWN;
aimitakeshid074e302010-07-29 10:12:27 +0900471 if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) {
472 IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId);
Takeshi Aimidc549d62010-09-20 23:40:41 +0900473 result = drmEngine->decrypt(
474 uniqueId, decryptHandle, decryptUnitId, encBuffer, decBuffer, IV);
aimitakeshid074e302010-07-29 10:12:27 +0900475 }
Takeshi Aimidc549d62010-09-20 23:40:41 +0900476 return result;
aimitakeshid074e302010-07-29 10:12:27 +0900477}
478
Takeshi Aimidc549d62010-09-20 23:40:41 +0900479status_t DrmManager::finalizeDecryptUnit(
aimitakeshid074e302010-07-29 10:12:27 +0900480 int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) {
Takeshi Aimidc549d62010-09-20 23:40:41 +0900481 status_t result = DRM_ERROR_UNKNOWN;
aimitakeshid074e302010-07-29 10:12:27 +0900482 if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) {
483 IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId);
Takeshi Aimidc549d62010-09-20 23:40:41 +0900484 result = drmEngine->finalizeDecryptUnit(uniqueId, decryptHandle, decryptUnitId);
aimitakeshid074e302010-07-29 10:12:27 +0900485 }
Takeshi Aimidc549d62010-09-20 23:40:41 +0900486 return result;
aimitakeshid074e302010-07-29 10:12:27 +0900487}
488
489ssize_t DrmManager::pread(int uniqueId, DecryptHandle* decryptHandle,
Gloria Wang5fc3edb2010-11-19 15:19:36 -0800490 void* buffer, ssize_t numBytes, off64_t offset) {
aimitakeshid074e302010-07-29 10:12:27 +0900491 ssize_t result = DECRYPT_FILE_ERROR;
492
493 if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) {
494 IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId);
495 result = drmEngine->pread(uniqueId, decryptHandle, buffer, numBytes, offset);
496 }
497 return result;
498}
499
aimitakeshid074e302010-07-29 10:12:27 +0900500String8 DrmManager::getSupportedPlugInId(
501 int uniqueId, const String8& path, const String8& mimeType) {
502 String8 plugInId("");
503
504 if (EMPTY_STRING != mimeType) {
505 plugInId = getSupportedPlugInId(mimeType);
506 } else {
507 plugInId = getSupportedPlugInIdFromPath(uniqueId, path);
508 }
509 return plugInId;
510}
511
512String8 DrmManager::getSupportedPlugInId(const String8& mimeType) {
513 String8 plugInId("");
514
515 if (EMPTY_STRING != mimeType) {
516 for (unsigned int index = 0; index < mSupportInfoToPlugInIdMap.size(); index++) {
517 const DrmSupportInfo& drmSupportInfo = mSupportInfoToPlugInIdMap.keyAt(index);
518
519 if (drmSupportInfo.isSupportedMimeType(mimeType)) {
520 plugInId = mSupportInfoToPlugInIdMap.valueFor(drmSupportInfo);
521 break;
522 }
523 }
524 }
525 return plugInId;
526}
527
528String8 DrmManager::getSupportedPlugInIdFromPath(int uniqueId, const String8& path) {
529 String8 plugInId("");
530 const String8 fileSuffix = path.getPathExtension();
531
532 for (unsigned int index = 0; index < mSupportInfoToPlugInIdMap.size(); index++) {
533 const DrmSupportInfo& drmSupportInfo = mSupportInfoToPlugInIdMap.keyAt(index);
534
535 if (drmSupportInfo.isSupportedFileSuffix(fileSuffix)) {
536 String8 key = mSupportInfoToPlugInIdMap.valueFor(drmSupportInfo);
537 IDrmEngine& drmEngine = mPlugInManager.getPlugIn(key);
538
539 if (drmEngine.canHandle(uniqueId, path)) {
540 plugInId = key;
541 break;
542 }
543 }
544 }
545 return plugInId;
546}
547
548void DrmManager::onInfo(const DrmInfoEvent& event) {
549 Mutex::Autolock _l(mLock);
550 for (unsigned int index = 0; index < mServiceListeners.size(); index++) {
551 int uniqueId = mServiceListeners.keyAt(index);
552
553 if (uniqueId == event.getUniqueId()) {
554 sp<IDrmServiceListener> serviceListener = mServiceListeners.valueFor(uniqueId);
555 serviceListener->notify(event);
556 }
557 }
558}
559