DrmManager.cpp revision 27ed8ad2db653f6ac07dcf8bcc05e2409c8bb024
127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi/* 227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Copyright (C) 2010 The Android Open Source Project 327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * 427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Licensed under the Apache License, Version 2.0 (the "License"); 527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * you may not use this file except in compliance with the License. 627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * You may obtain a copy of the License at 727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * 827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * http://www.apache.org/licenses/LICENSE-2.0 927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * 1027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Unless required by applicable law or agreed to in writing, software 1127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * distributed under the License is distributed on an "AS IS" BASIS, 1227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * See the License for the specific language governing permissions and 1427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * limitations under the License. 1527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi */ 1627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define LOG_NDEBUG 0 1827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define LOG_TAG "DrmManager(Native)" 1927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "utils/Log.h" 2027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/String8.h> 2227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfo.h> 2327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoEvent.h> 2427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmRights.h> 2527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmConstraints.h> 2627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoStatus.h> 2727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoRequest.h> 2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmSupportInfo.h> 2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmConvertedStatus.h> 3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <IDrmEngine.h> 3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "DrmManager.h" 3327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "ReadWriteUtils.h" 3427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define DECRYPT_FILE_ERROR -1 3627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiusing namespace android; 3827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiconst String8 DrmManager::EMPTY_STRING(""); 4027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmManager::DrmManager() : 4227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mDecryptSessionId(0), 4327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mConvertId(0) { 4427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 4627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmManager::~DrmManager() { 4827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 5027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 5127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManager::loadPlugIns(int uniqueId) { 5227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 pluginDirPath("/system/lib/drm/plugins/native"); 5327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return loadPlugIns(uniqueId, pluginDirPath); 5427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 5527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 5627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManager::loadPlugIns(int uniqueId, const String8& plugInDirPath) { 5727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (mSupportInfoToPlugInIdMap.isEmpty()) { 5827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mPlugInManager.loadPlugIns(plugInDirPath); 5927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi initializePlugIns(uniqueId); 6127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi populate(uniqueId); 6327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 6427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi initializePlugIns(uniqueId); 6527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 6627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 6827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 6927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManager::setDrmServiceListener( 7127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) { 7227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Mutex::Autolock _l(mLock); 7327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mServiceListeners.add(uniqueId, drmServiceListener); 7427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 7527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 7627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManager::unloadPlugIns(int uniqueId) { 7827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); 7927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 8027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (unsigned int index = 0; index < plugInIdList.size(); index++) { 8127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index)); 8227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi rDrmEngine.terminate(uniqueId); 8327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 8427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 8527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mConvertSessionMap.clear(); 8627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mDecryptSessionMap.clear(); 8727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mSupportInfoToPlugInIdMap.clear(); 8827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mPlugInManager.unloadPlugIns(); 8927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 9027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 9127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConstraints* DrmManager::getConstraints(int uniqueId, const String8* path, const int action) { 9327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, *path); 9427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != plugInId) { 9527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 9627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return rDrmEngine.getConstraints(uniqueId, path, action); 9727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 9827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return NULL; 9927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 10027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManager::installDrmEngine(int uniqueId, const String8& absolutePath) { 10227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mPlugInManager.loadPlugIn(absolutePath); 10327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(absolutePath); 10527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi rDrmEngine.initialize(uniqueId); 10627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi rDrmEngine.setOnInfoListener(uniqueId, this); 10727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo* info = rDrmEngine.getSupportInfo(uniqueId); 10927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mSupportInfoToPlugInIdMap.add(*info, absolutePath); 11027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 11227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 11327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool DrmManager::canHandle(int uniqueId, const String8& path, const String8& mimeType) { 11527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInId(mimeType); 11627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bool result = (EMPTY_STRING != plugInId) ? true : false; 11727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != path) { 11927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (result) { 12027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 12127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi result = rDrmEngine.canHandle(uniqueId, path); 12227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 12327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi result = canHandle(uniqueId, path); 12427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 12527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 12627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return result; 12727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 12827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 12927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfoStatus* DrmManager::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) { 13027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInId(drmInfo->getMimeType()); 13127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != plugInId) { 13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return rDrmEngine.processDrmInfo(uniqueId, drmInfo); 13427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 13527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return NULL; 13627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 13727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool DrmManager::canHandle(int uniqueId, const String8& path) { 13927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bool result = false; 14027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList(); 14127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (unsigned int i = 0; i < plugInPathList.size(); ++i) { 14327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInPathList[i]); 14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi result = rDrmEngine.canHandle(uniqueId, path); 14527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (result) { 14727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi break; 14827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 14927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 15027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return result; 15127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 15227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 15327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfo* DrmManager::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) { 15427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInId(drmInfoRequest->getMimeType()); 15527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != plugInId) { 15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 15727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return rDrmEngine.acquireDrmInfo(uniqueId, drmInfoRequest); 15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 15927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return NULL; 16027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 16127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManager::saveRights(int uniqueId, const DrmRights& drmRights, 16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8& rightsPath, const String8& contentPath) { 16427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInId(drmRights.getMimeType()); 16527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != plugInId) { 16627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi rDrmEngine.saveRights(uniqueId, drmRights, rightsPath, contentPath); 16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 17027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 17127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 DrmManager::getOriginalMimeType(int uniqueId, const String8& path) { 17227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path); 17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != plugInId) { 17427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 17527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return rDrmEngine.getOriginalMimeType(uniqueId, path); 17627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 17727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return EMPTY_STRING; 17827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 17927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 18027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManager::getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType) { 18127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInId(uniqueId, path, mimeType); 18227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != plugInId) { 18327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 18427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return rDrmEngine.getDrmObjectType(uniqueId, path, mimeType); 18527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 18627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DrmObjectType::UNKNOWN; 18727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 18827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 18927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManager::checkRightsStatus(int uniqueId, const String8& path, int action) { 19027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path); 19127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != plugInId) { 19227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 19327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return rDrmEngine.checkRightsStatus(uniqueId, path, action); 19427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 19527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return RightsStatus::RIGHTS_INVALID; 19627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 19727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 19827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManager::consumeRights( 19927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) { 20027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 20127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 20227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmEngine->consumeRights(uniqueId, decryptHandle, action, reserve); 20327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 20427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 20527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 20627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManager::setPlaybackStatus( 20727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int position) { 20827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 20927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 21027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 21127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmEngine->setPlaybackStatus(uniqueId, decryptHandle, playbackStatus, position); 21227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 21327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 21427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 21527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool DrmManager::validateAction( 21627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, int action, const ActionDescription& description) { 21727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path); 21827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != plugInId) { 21927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 22027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return rDrmEngine.validateAction(uniqueId, path, action, description); 22127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 22227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return false; 22327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 22427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 22527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManager::removeRights(int uniqueId, const String8& path) { 22627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path); 22727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != plugInId) { 22827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 22927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi rDrmEngine.removeRights(uniqueId, path); 23027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 23127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 23227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 23327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManager::removeAllRights(int uniqueId) { 23427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); 23527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 23627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (unsigned int index = 0; index < plugInIdList.size(); index++) { 23727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index)); 23827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi rDrmEngine.removeAllRights(uniqueId); 23927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 24027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 24127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 24227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManager::openConvertSession(int uniqueId, const String8& mimeType) { 24327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int convertId = -1; 24427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 24527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInId(mimeType); 24627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != plugInId) { 24727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 24827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 24927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Mutex::Autolock _l(mConvertLock); 25027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ++mConvertId; 25127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi convertId = mConvertId; 25227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mConvertSessionMap.add(mConvertId, &rDrmEngine); 25327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 25427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi rDrmEngine.openConvertSession(uniqueId, mConvertId); 25527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 25627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return convertId; 25727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 25827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 25927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* DrmManager::convertData( 26027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int convertId, const DrmBuffer* inputData) { 26127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus *drmConvertedStatus = NULL; 26227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 26327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (mConvertSessionMap.indexOfKey(convertId) != NAME_NOT_FOUND) { 26427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine* drmEngine = mConvertSessionMap.valueFor(convertId); 26527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConvertedStatus = drmEngine->convertData(uniqueId, convertId, inputData); 26627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 26727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConvertedStatus; 26827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 26927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 27027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* DrmManager::closeConvertSession(int uniqueId, int convertId) { 27127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus *drmConvertedStatus = NULL; 27227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 27327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (mConvertSessionMap.indexOfKey(convertId) != NAME_NOT_FOUND) { 27427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine* drmEngine = mConvertSessionMap.valueFor(convertId); 27527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConvertedStatus = drmEngine->closeConvertSession(uniqueId, convertId); 27627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mConvertSessionMap.removeItem(convertId); 27727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 27827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConvertedStatus; 27927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 28027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 28127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManager::getAllSupportInfo( 28227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) { 28327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList(); 28427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int size = plugInPathList.size(); 28527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int validPlugins = 0; 28627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 28727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < size) { 28827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Vector<DrmSupportInfo> drmSupportInfoList; 28927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 29027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int i = 0; i < size; ++i) { 29127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 plugInPath = plugInPathList[i]; 29227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo* drmSupportInfo 29327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = mPlugInManager.getPlugIn(plugInPath).getSupportInfo(uniqueId); 29427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmSupportInfo) { 29527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmSupportInfoList.add(*drmSupportInfo); 29627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmSupportInfo; drmSupportInfo = NULL; 29727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 29827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 29927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 30027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi validPlugins = drmSupportInfoList.size(); 30127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < validPlugins) { 30227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *drmSupportInfoArray = new DrmSupportInfo[validPlugins]; 30327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int i = 0; i < validPlugins; ++i) { 30427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi (*drmSupportInfoArray)[i] = drmSupportInfoList[i]; 30527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 30627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 30727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 30827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *length = validPlugins; 30927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 31027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 31127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 31227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDecryptHandle* DrmManager::openDecryptSession(int uniqueId, int fd, int offset, int length) { 31327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Entering DrmManager::openDecryptSession"); 31427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t result = DRM_ERROR_CANNOT_HANDLE; 31527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); 31627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 31727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle* handle = new DecryptHandle(); 31827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != handle) { 31927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Mutex::Autolock _l(mDecryptLock); 32027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptId = mDecryptSessionId + 1; 32127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 32227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (unsigned int index = 0; index < plugInIdList.size(); index++) { 32327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 plugInId = plugInIdList.itemAt(index); 32427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 32527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi result = rDrmEngine.openDecryptSession(uniqueId, handle, fd, offset, length); 32627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 32727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("plug-in %s return value = %d", plugInId.string(), result); 32827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 32927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (DRM_NO_ERROR == result) { 33027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ++mDecryptSessionId; 33127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mDecryptSessionMap.add(mDecryptSessionId, &rDrmEngine); 33227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("plug-in %s is selected", plugInId.string()); 33327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi break; 33427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 33527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 33627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 33727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 33827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (DRM_ERROR_CANNOT_HANDLE == result) { 33927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete handle; handle = NULL; 34027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGE("DrmManager::openDecryptSession: no capable plug-in found"); 34127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 34227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 34327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return handle; 34427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 34527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 34627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManager::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { 34727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 34827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 34927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmEngine->closeDecryptSession(uniqueId, decryptHandle); 35027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 35127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mDecryptSessionMap.removeItem(decryptHandle->decryptId); 35227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 35327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 35427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 35527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManager::initializeDecryptUnit( 35627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, const DrmBuffer* headerInfo) { 35727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 35827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 35927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmEngine->initializeDecryptUnit(uniqueId, decryptHandle, decryptUnitId, headerInfo); 36027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 36127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 36227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 36327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManager::decrypt(int uniqueId, DecryptHandle* decryptHandle, 36427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int decryptUnitId, const DrmBuffer* encBuffer, DrmBuffer** decBuffer) { 36527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = DRM_ERROR_UNKNOWN; 36627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 36727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 36827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status = drmEngine->decrypt(uniqueId, decryptHandle, decryptUnitId, encBuffer, decBuffer); 36927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 37027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return status; 37127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 37227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 37327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManager::finalizeDecryptUnit( 37427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { 37527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 37627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 37727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmEngine->finalizeDecryptUnit(uniqueId, decryptHandle, decryptUnitId); 37827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 37927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 38027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 38127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshissize_t DrmManager::pread(int uniqueId, DecryptHandle* decryptHandle, 38227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi void* buffer, ssize_t numBytes, off_t offset) { 38327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ssize_t result = DECRYPT_FILE_ERROR; 38427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 38527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 38627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 38727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi result = drmEngine->pread(uniqueId, decryptHandle, buffer, numBytes, offset); 38827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 38927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return result; 39027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 39127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 39227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManager::initializePlugIns(int uniqueId) { 39327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); 39427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 39527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (unsigned int index = 0; index < plugInIdList.size(); index++) { 39627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index)); 39727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi rDrmEngine.initialize(uniqueId); 39827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi rDrmEngine.setOnInfoListener(uniqueId, this); 39927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 40027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 40127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 40227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManager::populate(int uniqueId) { 40327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList(); 40427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 40527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (unsigned int i = 0; i < plugInPathList.size(); ++i) { 40627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 plugInPath = plugInPathList[i]; 40727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo* info = mPlugInManager.getPlugIn(plugInPath).getSupportInfo(uniqueId); 40827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != info) { 40927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mSupportInfoToPlugInIdMap.add(*info, plugInPath); 41027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 41127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 41227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 41327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 41427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 DrmManager::getSupportedPlugInId( 41527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, const String8& mimeType) { 41627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 plugInId(""); 41727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 41827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != mimeType) { 41927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi plugInId = getSupportedPlugInId(mimeType); 42027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 42127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi plugInId = getSupportedPlugInIdFromPath(uniqueId, path); 42227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 42327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return plugInId; 42427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 42527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 42627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 DrmManager::getSupportedPlugInId(const String8& mimeType) { 42727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 plugInId(""); 42827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 42927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != mimeType) { 43027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (unsigned int index = 0; index < mSupportInfoToPlugInIdMap.size(); index++) { 43127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmSupportInfo& drmSupportInfo = mSupportInfoToPlugInIdMap.keyAt(index); 43227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 43327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (drmSupportInfo.isSupportedMimeType(mimeType)) { 43427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi plugInId = mSupportInfoToPlugInIdMap.valueFor(drmSupportInfo); 43527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi break; 43627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 43727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 43827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 43927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return plugInId; 44027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 44127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 44227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 DrmManager::getSupportedPlugInIdFromPath(int uniqueId, const String8& path) { 44327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 plugInId(""); 44427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 fileSuffix = path.getPathExtension(); 44527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 44627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (unsigned int index = 0; index < mSupportInfoToPlugInIdMap.size(); index++) { 44727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmSupportInfo& drmSupportInfo = mSupportInfoToPlugInIdMap.keyAt(index); 44827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 44927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (drmSupportInfo.isSupportedFileSuffix(fileSuffix)) { 45027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 key = mSupportInfoToPlugInIdMap.valueFor(drmSupportInfo); 45127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& drmEngine = mPlugInManager.getPlugIn(key); 45227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 45327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (drmEngine.canHandle(uniqueId, path)) { 45427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi plugInId = key; 45527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi break; 45627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 45727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 45827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 45927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return plugInId; 46027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 46127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 46227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManager::onInfo(const DrmInfoEvent& event) { 46327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Mutex::Autolock _l(mLock); 46427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (unsigned int index = 0; index < mServiceListeners.size(); index++) { 46527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId = mServiceListeners.keyAt(index); 46627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 46727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (uniqueId == event.getUniqueId()) { 46827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi sp<IDrmServiceListener> serviceListener = mServiceListeners.valueFor(uniqueId); 46927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi serviceListener->notify(event); 47027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 47127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 47227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 47327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 474