DrmManager.cpp revision 2272ee27d9022d173b6eab45c409b3c3f57f30ec
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 172272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi//#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 392272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi AimiVector<int> DrmManager::mUniqueIdVector; 4027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiconst String8 DrmManager::EMPTY_STRING(""); 4127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmManager::DrmManager() : 4327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mDecryptSessionId(0), 4427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mConvertId(0) { 4527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 4727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmManager::~DrmManager() { 4927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 5027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 5127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 522272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimiint DrmManager::addUniqueId(int uniqueId) { 532272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi if (0 == uniqueId) { 542272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi int temp = 0; 552272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi bool foundUniqueId = false; 562272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi srand(time(NULL)); 572272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 582272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi while (!foundUniqueId) { 592272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const int size = mUniqueIdVector.size(); 602272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi temp = rand() % 100; 612272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 622272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi int index = 0; 632272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi for (; index < size; ++index) { 642272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi if (mUniqueIdVector.itemAt(index) == temp) { 652272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi foundUniqueId = false; 662272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi break; 672272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 682272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 692272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi if (index == size) { 702272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi foundUniqueId = true; 712272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 722272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 732272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi uniqueId = temp; 742272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 752272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi mUniqueIdVector.push(uniqueId); 762272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return uniqueId; 772272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi} 782272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 792272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimivoid DrmManager::removeUniqueId(int uniqueId) { 802272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi for (unsigned int i = 0; i < mUniqueIdVector.size(); i++) { 812272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi if (uniqueId == mUniqueIdVector.itemAt(i)) { 822272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi mUniqueIdVector.removeAt(i); 832272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi break; 842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 852272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 862272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi} 872272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 8827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManager::loadPlugIns(int uniqueId) { 8927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 pluginDirPath("/system/lib/drm/plugins/native"); 9027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return loadPlugIns(uniqueId, pluginDirPath); 9127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 9227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManager::loadPlugIns(int uniqueId, const String8& plugInDirPath) { 9427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (mSupportInfoToPlugInIdMap.isEmpty()) { 9527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mPlugInManager.loadPlugIns(plugInDirPath); 9627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi initializePlugIns(uniqueId); 9827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi populate(uniqueId); 10027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 10127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi initializePlugIns(uniqueId); 10227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 10327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 10527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 10627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManager::setDrmServiceListener( 10827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) { 10927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Mutex::Autolock _l(mLock); 11027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mServiceListeners.add(uniqueId, drmServiceListener); 11127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 11227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 11327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManager::unloadPlugIns(int uniqueId) { 11527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); 11627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (unsigned int index = 0; index < plugInIdList.size(); index++) { 11827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index)); 11927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi rDrmEngine.terminate(uniqueId); 12027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 12127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1222272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi if (0 >= mUniqueIdVector.size()) { 1232272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi mConvertSessionMap.clear(); 1242272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi mDecryptSessionMap.clear(); 1252272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi mSupportInfoToPlugInIdMap.clear(); 1262272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi mPlugInManager.unloadPlugIns(); 1272272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 12827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 12927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 13027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConstraints* DrmManager::getConstraints(int uniqueId, const String8* path, const int action) { 13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, *path); 13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != plugInId) { 13427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 13527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return rDrmEngine.getConstraints(uniqueId, path, action); 13627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 13727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return NULL; 13827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 13927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManager::installDrmEngine(int uniqueId, const String8& absolutePath) { 14127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mPlugInManager.loadPlugIn(absolutePath); 14227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(absolutePath); 14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi rDrmEngine.initialize(uniqueId); 14527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi rDrmEngine.setOnInfoListener(uniqueId, this); 14627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo* info = rDrmEngine.getSupportInfo(uniqueId); 14827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mSupportInfoToPlugInIdMap.add(*info, absolutePath); 14927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 15027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 15127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 15227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 15327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool DrmManager::canHandle(int uniqueId, const String8& path, const String8& mimeType) { 15427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInId(mimeType); 15527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bool result = (EMPTY_STRING != plugInId) ? true : false; 15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 15727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != path) { 15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (result) { 15927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 16027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi result = rDrmEngine.canHandle(uniqueId, path); 16127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi result = canHandle(uniqueId, path); 16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 16427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 16527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return result; 16627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfoStatus* DrmManager::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) { 16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInId(drmInfo->getMimeType()); 17027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != plugInId) { 17127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 17227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return rDrmEngine.processDrmInfo(uniqueId, drmInfo); 17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 17427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return NULL; 17527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 17627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 17727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool DrmManager::canHandle(int uniqueId, const String8& path) { 17827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bool result = false; 17927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList(); 18027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 18127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (unsigned int i = 0; i < plugInPathList.size(); ++i) { 18227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInPathList[i]); 18327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi result = rDrmEngine.canHandle(uniqueId, path); 18427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 18527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (result) { 18627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi break; 18727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 18827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 18927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return result; 19027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 19127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 19227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfo* DrmManager::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) { 19327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInId(drmInfoRequest->getMimeType()); 19427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != plugInId) { 19527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 19627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return rDrmEngine.acquireDrmInfo(uniqueId, drmInfoRequest); 19727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 19827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return NULL; 19927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 20027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2012272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManager::saveRights(int uniqueId, const DrmRights& drmRights, 20227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8& rightsPath, const String8& contentPath) { 20327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInId(drmRights.getMimeType()); 2042272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 20527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != plugInId) { 20627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 2072272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi result = rDrmEngine.saveRights(uniqueId, drmRights, rightsPath, contentPath); 20827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 2092272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return result; 21027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 21127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 21227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 DrmManager::getOriginalMimeType(int uniqueId, const String8& path) { 21327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path); 21427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != plugInId) { 21527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 21627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return rDrmEngine.getOriginalMimeType(uniqueId, path); 21727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 21827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return EMPTY_STRING; 21927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 22027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 22127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManager::getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType) { 22227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInId(uniqueId, path, mimeType); 22327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != plugInId) { 22427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 22527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return rDrmEngine.getDrmObjectType(uniqueId, path, mimeType); 22627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 22727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DrmObjectType::UNKNOWN; 22827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 22927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 23027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManager::checkRightsStatus(int uniqueId, const String8& path, int action) { 23127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path); 23227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != plugInId) { 23327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 23427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return rDrmEngine.checkRightsStatus(uniqueId, path, action); 23527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 23627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return RightsStatus::RIGHTS_INVALID; 23727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 23827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2392272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManager::consumeRights( 24027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) { 2412272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 24227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 24327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 2442272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi result = drmEngine->consumeRights(uniqueId, decryptHandle, action, reserve); 24527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 2462272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return result; 24727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 24827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2492272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManager::setPlaybackStatus( 25027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int position) { 2512272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 25227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 25327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 2542272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi result = drmEngine->setPlaybackStatus(uniqueId, decryptHandle, playbackStatus, position); 25527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 2562272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return result; 25727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 25827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 25927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool DrmManager::validateAction( 26027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, int action, const ActionDescription& description) { 26127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path); 26227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != plugInId) { 26327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 26427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return rDrmEngine.validateAction(uniqueId, path, action, description); 26527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 26627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return false; 26727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 26827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2692272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManager::removeRights(int uniqueId, const String8& path) { 27027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path); 2712272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 27227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != plugInId) { 27327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 2742272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi result = rDrmEngine.removeRights(uniqueId, path); 27527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 2762272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return result; 27727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 27827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2792272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManager::removeAllRights(int uniqueId) { 28027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); 2812272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 28227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (unsigned int index = 0; index < plugInIdList.size(); index++) { 28327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index)); 2842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi result = rDrmEngine.removeAllRights(uniqueId); 2852272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi if (DRM_NO_ERROR != result) { 2862272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi break; 2872272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 28827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 2892272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return result; 29027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 29127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 29227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManager::openConvertSession(int uniqueId, const String8& mimeType) { 29327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int convertId = -1; 29427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 29527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 plugInId = getSupportedPlugInId(mimeType); 29627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != plugInId) { 29727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 29827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2992272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi if (DRM_NO_ERROR == rDrmEngine.openConvertSession(uniqueId, mConvertId + 1)) { 3002272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi Mutex::Autolock _l(mConvertLock); 3012272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi ++mConvertId; 3022272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi convertId = mConvertId; 3032272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi mConvertSessionMap.add(convertId, &rDrmEngine); 3042272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 30527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 30627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return convertId; 30727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 30827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 30927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* DrmManager::convertData( 31027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int convertId, const DrmBuffer* inputData) { 31127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus *drmConvertedStatus = NULL; 31227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 31327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (mConvertSessionMap.indexOfKey(convertId) != NAME_NOT_FOUND) { 31427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine* drmEngine = mConvertSessionMap.valueFor(convertId); 31527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConvertedStatus = drmEngine->convertData(uniqueId, convertId, inputData); 31627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 31727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConvertedStatus; 31827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 31927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 32027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* DrmManager::closeConvertSession(int uniqueId, int convertId) { 32127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus *drmConvertedStatus = NULL; 32227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 32327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (mConvertSessionMap.indexOfKey(convertId) != NAME_NOT_FOUND) { 32427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine* drmEngine = mConvertSessionMap.valueFor(convertId); 32527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConvertedStatus = drmEngine->closeConvertSession(uniqueId, convertId); 32627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mConvertSessionMap.removeItem(convertId); 32727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 32827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConvertedStatus; 32927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 33027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 33127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManager::getAllSupportInfo( 33227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) { 33327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList(); 33427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int size = plugInPathList.size(); 33527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int validPlugins = 0; 33627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 33727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < size) { 33827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Vector<DrmSupportInfo> drmSupportInfoList; 33927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 34027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int i = 0; i < size; ++i) { 34127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 plugInPath = plugInPathList[i]; 34227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo* drmSupportInfo 34327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = mPlugInManager.getPlugIn(plugInPath).getSupportInfo(uniqueId); 34427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmSupportInfo) { 34527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmSupportInfoList.add(*drmSupportInfo); 34627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmSupportInfo; drmSupportInfo = NULL; 34727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 34827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 34927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 35027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi validPlugins = drmSupportInfoList.size(); 35127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < validPlugins) { 35227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *drmSupportInfoArray = new DrmSupportInfo[validPlugins]; 35327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int i = 0; i < validPlugins; ++i) { 35427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi (*drmSupportInfoArray)[i] = drmSupportInfoList[i]; 35527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 35627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 35727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 35827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *length = validPlugins; 35927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 36027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 36127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 36227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDecryptHandle* DrmManager::openDecryptSession(int uniqueId, int fd, int offset, int length) { 36327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t result = DRM_ERROR_CANNOT_HANDLE; 36427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); 36527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 36627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle* handle = new DecryptHandle(); 36727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != handle) { 36827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Mutex::Autolock _l(mDecryptLock); 36927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptId = mDecryptSessionId + 1; 37027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 37127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (unsigned int index = 0; index < plugInIdList.size(); index++) { 37227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 plugInId = plugInIdList.itemAt(index); 37327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 37427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi result = rDrmEngine.openDecryptSession(uniqueId, handle, fd, offset, length); 37527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 37627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (DRM_NO_ERROR == result) { 37727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ++mDecryptSessionId; 37827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mDecryptSessionMap.add(mDecryptSessionId, &rDrmEngine); 37927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi break; 38027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 38127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 38227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 38327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi if (DRM_NO_ERROR != result) { 38527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete handle; handle = NULL; 38627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGE("DrmManager::openDecryptSession: no capable plug-in found"); 38727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 38827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 38927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return handle; 39027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 39127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3922272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManager::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { 3932272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 39427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 39527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 3962272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi result = drmEngine->closeDecryptSession(uniqueId, decryptHandle); 3972272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi if (DRM_NO_ERROR == result) { 3982272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi mDecryptSessionMap.removeItem(decryptHandle->decryptId); 3992272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 40027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 4012272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return result; 40227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 40327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4042272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManager::initializeDecryptUnit( 40527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, const DrmBuffer* headerInfo) { 4062272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 40727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 40827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 4092272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi result = drmEngine->initializeDecryptUnit(uniqueId, decryptHandle, decryptUnitId, headerInfo); 41027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 4112272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return result; 41227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 41327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4142272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManager::decrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, 4152272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { 4162272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 41727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 41827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 4192272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi result = drmEngine->decrypt( 4202272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi uniqueId, decryptHandle, decryptUnitId, encBuffer, decBuffer, IV); 42127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 4222272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return result; 42327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 42427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4252272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManager::finalizeDecryptUnit( 42627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { 4272272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 42827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 42927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 4302272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi result = drmEngine->finalizeDecryptUnit(uniqueId, decryptHandle, decryptUnitId); 43127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 4322272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return result; 43327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 43427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 43527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshissize_t DrmManager::pread(int uniqueId, DecryptHandle* decryptHandle, 43627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi void* buffer, ssize_t numBytes, off_t offset) { 43727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ssize_t result = DECRYPT_FILE_ERROR; 43827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 43927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 44027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 44127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi result = drmEngine->pread(uniqueId, decryptHandle, buffer, numBytes, offset); 44227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 44327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return result; 44427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 44527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 44627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManager::initializePlugIns(int uniqueId) { 44727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); 44827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 44927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (unsigned int index = 0; index < plugInIdList.size(); index++) { 45027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index)); 45127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi rDrmEngine.initialize(uniqueId); 45227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi rDrmEngine.setOnInfoListener(uniqueId, this); 45327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 45427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 45527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 45627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManager::populate(int uniqueId) { 45727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList(); 45827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 45927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (unsigned int i = 0; i < plugInPathList.size(); ++i) { 46027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 plugInPath = plugInPathList[i]; 46127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo* info = mPlugInManager.getPlugIn(plugInPath).getSupportInfo(uniqueId); 46227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != info) { 46327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mSupportInfoToPlugInIdMap.add(*info, plugInPath); 46427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 46527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 46627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 46727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 46827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 DrmManager::getSupportedPlugInId( 46927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, const String8& mimeType) { 47027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 plugInId(""); 47127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 47227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != mimeType) { 47327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi plugInId = getSupportedPlugInId(mimeType); 47427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 47527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi plugInId = getSupportedPlugInIdFromPath(uniqueId, path); 47627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 47727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return plugInId; 47827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 47927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 48027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 DrmManager::getSupportedPlugInId(const String8& mimeType) { 48127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 plugInId(""); 48227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 48327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != mimeType) { 48427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (unsigned int index = 0; index < mSupportInfoToPlugInIdMap.size(); index++) { 48527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmSupportInfo& drmSupportInfo = mSupportInfoToPlugInIdMap.keyAt(index); 48627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 48727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (drmSupportInfo.isSupportedMimeType(mimeType)) { 48827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi plugInId = mSupportInfoToPlugInIdMap.valueFor(drmSupportInfo); 48927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi break; 49027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 49127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 49227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 49327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return plugInId; 49427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 49527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 49627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 DrmManager::getSupportedPlugInIdFromPath(int uniqueId, const String8& path) { 49727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 plugInId(""); 49827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 fileSuffix = path.getPathExtension(); 49927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 50027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (unsigned int index = 0; index < mSupportInfoToPlugInIdMap.size(); index++) { 50127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmSupportInfo& drmSupportInfo = mSupportInfoToPlugInIdMap.keyAt(index); 50227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 50327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (drmSupportInfo.isSupportedFileSuffix(fileSuffix)) { 50427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 key = mSupportInfoToPlugInIdMap.valueFor(drmSupportInfo); 50527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi IDrmEngine& drmEngine = mPlugInManager.getPlugIn(key); 50627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 50727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (drmEngine.canHandle(uniqueId, path)) { 50827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi plugInId = key; 50927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi break; 51027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 51127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 51227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 51327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return plugInId; 51427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 51527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 51627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManager::onInfo(const DrmInfoEvent& event) { 51727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Mutex::Autolock _l(mLock); 51827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (unsigned int index = 0; index < mServiceListeners.size(); index++) { 51927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId = mServiceListeners.keyAt(index); 52027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 52127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (uniqueId == event.getUniqueId()) { 52227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi sp<IDrmServiceListener> serviceListener = mServiceListeners.valueFor(uniqueId); 52327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi serviceListener->notify(event); 52427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 52527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 52627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 52727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 528