DrmManager.cpp revision a17d454fd0d20d14cf1fbc09f0f296cb6cbb870b
1d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/* 2d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Copyright (C) 2010 The Android Open Source Project 3d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 4d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Licensed under the Apache License, Version 2.0 (the "License"); 5d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * you may not use this file except in compliance with the License. 6d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * You may obtain a copy of the License at 7d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 8d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * http://www.apache.org/licenses/LICENSE-2.0 9d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 10d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Unless required by applicable law or agreed to in writing, software 11d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * distributed under the License is distributed on an "AS IS" BASIS, 12d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * See the License for the specific language governing permissions and 14d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * limitations under the License. 15d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 16d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 17dc549d60f98d809f626c99de614960409a847054Takeshi Aimi//#define LOG_NDEBUG 0 18d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#define LOG_TAG "DrmManager(Native)" 19d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include "utils/Log.h" 20d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 21d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <utils/String8.h> 22d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <drm/DrmInfo.h> 23d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <drm/DrmInfoEvent.h> 24d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <drm/DrmRights.h> 25d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <drm/DrmConstraints.h> 26dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi#include <drm/DrmMetadata.h> 27d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <drm/DrmInfoStatus.h> 28d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <drm/DrmInfoRequest.h> 29d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <drm/DrmSupportInfo.h> 30d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <drm/DrmConvertedStatus.h> 31d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <IDrmEngine.h> 32d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 33d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include "DrmManager.h" 34d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include "ReadWriteUtils.h" 35d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 36d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#define DECRYPT_FILE_ERROR -1 37d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 38d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiusing namespace android; 39d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 40d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiconst String8 DrmManager::EMPTY_STRING(""); 41d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 42d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiDrmManager::DrmManager() : 43d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mDecryptSessionId(0), 44d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mConvertId(0) { 45d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 46d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 47d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 48d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiDrmManager::~DrmManager() { 49d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 50d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 51d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 52a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wangint DrmManager::addUniqueId(bool isNative) { 532ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 54a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang 55a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang int temp = 0; 56a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang bool foundUniqueId = false; 57a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang const int size = mUniqueIdVector.size(); 58a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang const int uniqueIdRange = 0xfff; 59a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang int maxLoopTimes = (uniqueIdRange - 1) / 2; 60a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang srand(time(NULL)); 61a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang 62a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang while (!foundUniqueId) { 63a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang temp = rand() & uniqueIdRange; 64a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang 65a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang if (isNative) { 66a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang // set a flag to differentiate DrmManagerClient 67a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang // created from native side and java side 68a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang temp |= 0x1000; 69a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang } 70a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang 71a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang int index = 0; 72a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang for (; index < size; ++index) { 73a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang if (mUniqueIdVector.itemAt(index) == temp) { 74a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang foundUniqueId = false; 75a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang break; 76dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 77dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 78a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang if (index == size) { 79a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang foundUniqueId = true; 80a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang } 81a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang 82a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang maxLoopTimes --; 83a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang LOG_FATAL_IF(maxLoopTimes <= 0, "cannot find an unique ID for this session"); 84dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 85a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang 86a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang mUniqueIdVector.push(temp); 87a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang return temp; 88dc549d60f98d809f626c99de614960409a847054Takeshi Aimi} 89dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 90dc549d60f98d809f626c99de614960409a847054Takeshi Aimivoid DrmManager::removeUniqueId(int uniqueId) { 912ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 92dc549d60f98d809f626c99de614960409a847054Takeshi Aimi for (unsigned int i = 0; i < mUniqueIdVector.size(); i++) { 93dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (uniqueId == mUniqueIdVector.itemAt(i)) { 94dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mUniqueIdVector.removeAt(i); 95dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 96dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 97dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 98dc549d60f98d809f626c99de614960409a847054Takeshi Aimi} 99dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 100c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimistatus_t DrmManager::loadPlugIns() { 101cbba720a460f49a9d16afcc7e85c4564d7d945a1Glenn Kasten String8 pluginDirPath("/system/lib/drm"); 102c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi return loadPlugIns(pluginDirPath); 103d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 104d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 105c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimistatus_t DrmManager::loadPlugIns(const String8& plugInDirPath) { 106d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (mSupportInfoToPlugInIdMap.isEmpty()) { 107d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mPlugInManager.loadPlugIns(plugInDirPath); 108c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList(); 109c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi for (unsigned int i = 0; i < plugInPathList.size(); ++i) { 110c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi String8 plugInPath = plugInPathList[i]; 111c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi DrmSupportInfo* info = mPlugInManager.getPlugIn(plugInPath).getSupportInfo(0); 112c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi if (NULL != info) { 113c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi mSupportInfoToPlugInIdMap.add(*info, plugInPath); 1143f0341cbbdeee248e71814f7071233c823b44f74James Dong delete info; 115c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi } 116c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi } 117d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 118c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi return DRM_NO_ERROR; 119c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi} 120d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 121c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimistatus_t DrmManager::unloadPlugIns() { 1222ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 123c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi mConvertSessionMap.clear(); 124c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi mDecryptSessionMap.clear(); 125c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi mPlugInManager.unloadPlugIns(); 126c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi mSupportInfoToPlugInIdMap.clear(); 127d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return DRM_NO_ERROR; 128d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 129d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 130d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatus_t DrmManager::setDrmServiceListener( 131d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) { 132192b591cdca78f258dd3260e41d7217f6fc6e36cGloria Wang Mutex::Autolock _l(mListenerLock); 133f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi if (NULL != drmServiceListener.get()) { 134f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi mServiceListeners.add(uniqueId, drmServiceListener); 135f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi } else { 136f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi mServiceListeners.removeItem(uniqueId); 137f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi } 138d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return DRM_NO_ERROR; 139d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 140d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 141c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimivoid DrmManager::addClient(int uniqueId) { 1422ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 143c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi if (!mSupportInfoToPlugInIdMap.isEmpty()) { 144c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); 145c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi for (unsigned int index = 0; index < plugInIdList.size(); index++) { 146c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index)); 147c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi rDrmEngine.initialize(uniqueId); 148c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi rDrmEngine.setOnInfoListener(uniqueId, this); 149c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi } 150c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi } 151c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi} 152d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 153c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimivoid DrmManager::removeClient(int uniqueId) { 1542ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 155c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); 156d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (unsigned int index = 0; index < plugInIdList.size(); index++) { 157d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index)); 158d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi rDrmEngine.terminate(uniqueId); 159d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 160d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 161d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 162d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiDrmConstraints* DrmManager::getConstraints(int uniqueId, const String8* path, const int action) { 1632ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 164d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, *path); 165d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != plugInId) { 166d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 167d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return rDrmEngine.getConstraints(uniqueId, path, action); 168d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 169d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return NULL; 170d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 171d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 172dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi AimiDrmMetadata* DrmManager::getMetadata(int uniqueId, const String8* path) { 1732ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 174dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, *path); 175dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi if (EMPTY_STRING != plugInId) { 176dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 177dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi return rDrmEngine.getMetadata(uniqueId, path); 178dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi } 179dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi return NULL; 180dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi} 181dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi 182d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatus_t DrmManager::installDrmEngine(int uniqueId, const String8& absolutePath) { 1832ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 184d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mPlugInManager.loadPlugIn(absolutePath); 185d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 186d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(absolutePath); 187d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi rDrmEngine.initialize(uniqueId); 188d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi rDrmEngine.setOnInfoListener(uniqueId, this); 189d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 190c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi DrmSupportInfo* info = rDrmEngine.getSupportInfo(0); 191d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mSupportInfoToPlugInIdMap.add(*info, absolutePath); 1923f0341cbbdeee248e71814f7071233c823b44f74James Dong delete info; 193d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 194d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return DRM_NO_ERROR; 195d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 196d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 197d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshibool DrmManager::canHandle(int uniqueId, const String8& path, const String8& mimeType) { 1982ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 199d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInId(mimeType); 200d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi bool result = (EMPTY_STRING != plugInId) ? true : false; 201d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 202c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi if (0 < path.length()) { 203d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (result) { 204d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 205d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi result = rDrmEngine.canHandle(uniqueId, path); 206d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } else { 207289401b7566384570de86e9ad6ab3c572e358675Gloria Wang String8 extension = path.getPathExtension(); 208289401b7566384570de86e9ad6ab3c572e358675Gloria Wang if (String8("") != extension) { 209289401b7566384570de86e9ad6ab3c572e358675Gloria Wang result = canHandle(uniqueId, path); 210289401b7566384570de86e9ad6ab3c572e358675Gloria Wang } 211d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 212d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 213d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return result; 214d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 215d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 216d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiDrmInfoStatus* DrmManager::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) { 2172ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 218d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInId(drmInfo->getMimeType()); 219d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != plugInId) { 220d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 221d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return rDrmEngine.processDrmInfo(uniqueId, drmInfo); 222d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 223d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return NULL; 224d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 225d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 226d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshibool DrmManager::canHandle(int uniqueId, const String8& path) { 227d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi bool result = false; 228d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList(); 229d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 230d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (unsigned int i = 0; i < plugInPathList.size(); ++i) { 231d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInPathList[i]); 232d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi result = rDrmEngine.canHandle(uniqueId, path); 233d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 234d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (result) { 235d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi break; 236d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 237d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 238d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return result; 239d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 240d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 241d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiDrmInfo* DrmManager::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) { 2422ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 243d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInId(drmInfoRequest->getMimeType()); 244d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != plugInId) { 245d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 246d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return rDrmEngine.acquireDrmInfo(uniqueId, drmInfoRequest); 247d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 248d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return NULL; 249d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 250d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 251dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatus_t DrmManager::saveRights(int uniqueId, const DrmRights& drmRights, 252d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8& rightsPath, const String8& contentPath) { 2532ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 254d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInId(drmRights.getMimeType()); 255dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 256d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != plugInId) { 257d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 258dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = rDrmEngine.saveRights(uniqueId, drmRights, rightsPath, contentPath); 259d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 260dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 261d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 262d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 263d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiString8 DrmManager::getOriginalMimeType(int uniqueId, const String8& path) { 2642ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 265d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path); 266d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != plugInId) { 267d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 268d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return rDrmEngine.getOriginalMimeType(uniqueId, path); 269d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 270d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return EMPTY_STRING; 271d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 272d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 273d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiint DrmManager::getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType) { 2742ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 275d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInId(uniqueId, path, mimeType); 276d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != plugInId) { 277d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 278d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return rDrmEngine.getDrmObjectType(uniqueId, path, mimeType); 279d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 280d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return DrmObjectType::UNKNOWN; 281d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 282d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 283d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiint DrmManager::checkRightsStatus(int uniqueId, const String8& path, int action) { 2842ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 285d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path); 286d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != plugInId) { 287d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 288d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return rDrmEngine.checkRightsStatus(uniqueId, path, action); 289d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 290d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return RightsStatus::RIGHTS_INVALID; 291d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 292d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 293dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatus_t DrmManager::consumeRights( 294d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) { 295dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 2962ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mDecryptLock); 297d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 298d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 299dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = drmEngine->consumeRights(uniqueId, decryptHandle, action, reserve); 300d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 301dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 302d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 303d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 304dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatus_t DrmManager::setPlaybackStatus( 3055fc3edb13edb058f14e6550d295ce3e50e5ebf8cGloria Wang int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) { 306dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 3072ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mDecryptLock); 308d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 309d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 310dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = drmEngine->setPlaybackStatus(uniqueId, decryptHandle, playbackStatus, position); 311d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 312dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 313d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 314d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 315d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshibool DrmManager::validateAction( 316d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId, const String8& path, int action, const ActionDescription& description) { 3172ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 318d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path); 319d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != plugInId) { 320d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 321d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return rDrmEngine.validateAction(uniqueId, path, action, description); 322d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 323d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return false; 324d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 325d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 326dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatus_t DrmManager::removeRights(int uniqueId, const String8& path) { 3272ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 328d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path); 329dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 330d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != plugInId) { 331d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 332dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = rDrmEngine.removeRights(uniqueId, path); 333d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 334dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 335d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 336d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 337dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatus_t DrmManager::removeAllRights(int uniqueId) { 338d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); 339dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 340d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (unsigned int index = 0; index < plugInIdList.size(); index++) { 341d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index)); 342dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = rDrmEngine.removeAllRights(uniqueId); 343dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (DRM_NO_ERROR != result) { 344dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 345dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 346d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 347dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 348d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 349d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 350d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiint DrmManager::openConvertSession(int uniqueId, const String8& mimeType) { 3512ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mConvertLock); 352d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int convertId = -1; 353d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 354d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInId(mimeType); 355d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != plugInId) { 356d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 357d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 358dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (DRM_NO_ERROR == rDrmEngine.openConvertSession(uniqueId, mConvertId + 1)) { 359dc549d60f98d809f626c99de614960409a847054Takeshi Aimi ++mConvertId; 360dc549d60f98d809f626c99de614960409a847054Takeshi Aimi convertId = mConvertId; 361dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mConvertSessionMap.add(convertId, &rDrmEngine); 362dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 363d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 364d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return convertId; 365d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 366d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 367d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiDrmConvertedStatus* DrmManager::convertData( 368d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId, int convertId, const DrmBuffer* inputData) { 369d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmConvertedStatus *drmConvertedStatus = NULL; 370d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 3712ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mConvertLock); 372d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (mConvertSessionMap.indexOfKey(convertId) != NAME_NOT_FOUND) { 373d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine* drmEngine = mConvertSessionMap.valueFor(convertId); 374d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmConvertedStatus = drmEngine->convertData(uniqueId, convertId, inputData); 375d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 376d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return drmConvertedStatus; 377d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 378d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 379d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiDrmConvertedStatus* DrmManager::closeConvertSession(int uniqueId, int convertId) { 3802ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mConvertLock); 381d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmConvertedStatus *drmConvertedStatus = NULL; 382d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 383d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (mConvertSessionMap.indexOfKey(convertId) != NAME_NOT_FOUND) { 384d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine* drmEngine = mConvertSessionMap.valueFor(convertId); 385d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmConvertedStatus = drmEngine->closeConvertSession(uniqueId, convertId); 386d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mConvertSessionMap.removeItem(convertId); 387d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 388d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return drmConvertedStatus; 389d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 390d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 391d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatus_t DrmManager::getAllSupportInfo( 392d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) { 3932ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 394d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList(); 395d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int size = plugInPathList.size(); 396d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int validPlugins = 0; 397d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 398d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (0 < size) { 399d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Vector<DrmSupportInfo> drmSupportInfoList; 400d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 401d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (int i = 0; i < size; ++i) { 402d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 plugInPath = plugInPathList[i]; 403d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmSupportInfo* drmSupportInfo 404c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi = mPlugInManager.getPlugIn(plugInPath).getSupportInfo(0); 405d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != drmSupportInfo) { 406d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmSupportInfoList.add(*drmSupportInfo); 407d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete drmSupportInfo; drmSupportInfo = NULL; 408d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 409d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 410d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 411d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi validPlugins = drmSupportInfoList.size(); 412d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (0 < validPlugins) { 413d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *drmSupportInfoArray = new DrmSupportInfo[validPlugins]; 414d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (int i = 0; i < validPlugins; ++i) { 415d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (*drmSupportInfoArray)[i] = drmSupportInfoList[i]; 416d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 417d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 418d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 419d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *length = validPlugins; 420d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return DRM_NO_ERROR; 421d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 422d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 4235fc3edb13edb058f14e6550d295ce3e50e5ebf8cGloria WangDecryptHandle* DrmManager::openDecryptSession(int uniqueId, int fd, off64_t offset, off64_t length) { 424c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi Mutex::Autolock _l(mDecryptLock); 425d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi status_t result = DRM_ERROR_CANNOT_HANDLE; 426d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); 427d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 428d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DecryptHandle* handle = new DecryptHandle(); 429d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != handle) { 430d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi handle->decryptId = mDecryptSessionId + 1; 431d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 432d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (unsigned int index = 0; index < plugInIdList.size(); index++) { 433d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 plugInId = plugInIdList.itemAt(index); 434d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 435d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi result = rDrmEngine.openDecryptSession(uniqueId, handle, fd, offset, length); 436d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 437d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (DRM_NO_ERROR == result) { 438d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi ++mDecryptSessionId; 439d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mDecryptSessionMap.add(mDecryptSessionId, &rDrmEngine); 440d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi break; 441d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 442d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 443d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 444dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (DRM_NO_ERROR != result) { 445d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete handle; handle = NULL; 446d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 447c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi return handle; 448c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi} 449c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi 450c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi AimiDecryptHandle* DrmManager::openDecryptSession(int uniqueId, const char* uri) { 451c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi Mutex::Autolock _l(mDecryptLock); 452c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi status_t result = DRM_ERROR_CANNOT_HANDLE; 453c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); 454d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 455c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi DecryptHandle* handle = new DecryptHandle(); 456c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi if (NULL != handle) { 457c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi handle->decryptId = mDecryptSessionId + 1; 458c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi 459c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi for (unsigned int index = 0; index < plugInIdList.size(); index++) { 460c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi String8 plugInId = plugInIdList.itemAt(index); 461c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 462c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi result = rDrmEngine.openDecryptSession(uniqueId, handle, uri); 463d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 464c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi if (DRM_NO_ERROR == result) { 465c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi ++mDecryptSessionId; 466c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi mDecryptSessionMap.add(mDecryptSessionId, &rDrmEngine); 467c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi break; 468c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi } 469c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi } 470c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi } 471c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi if (DRM_NO_ERROR != result) { 472c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi delete handle; handle = NULL; 4732ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang LOGV("DrmManager::openDecryptSession: no capable plug-in found"); 474c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi } 475d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return handle; 476d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 477d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 478dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatus_t DrmManager::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { 479c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi Mutex::Autolock _l(mDecryptLock); 480dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 481d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 482d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 483dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = drmEngine->closeDecryptSession(uniqueId, decryptHandle); 484dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (DRM_NO_ERROR == result) { 485dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mDecryptSessionMap.removeItem(decryptHandle->decryptId); 486dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 487d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 488dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 489d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 490d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 491dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatus_t DrmManager::initializeDecryptUnit( 492d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, const DrmBuffer* headerInfo) { 493dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 4942ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mDecryptLock); 495d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 496d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 497dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = drmEngine->initializeDecryptUnit(uniqueId, decryptHandle, decryptUnitId, headerInfo); 498d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 499dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 500d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 501d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 502dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatus_t DrmManager::decrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, 503dc549d60f98d809f626c99de614960409a847054Takeshi Aimi const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { 504dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 5052ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang 5062ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mDecryptLock); 507d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 508d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 509dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = drmEngine->decrypt( 510dc549d60f98d809f626c99de614960409a847054Takeshi Aimi uniqueId, decryptHandle, decryptUnitId, encBuffer, decBuffer, IV); 511d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 512dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 513d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 514d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 515dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatus_t DrmManager::finalizeDecryptUnit( 516d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { 517dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 5182ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mDecryptLock); 519d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 520d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 521dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = drmEngine->finalizeDecryptUnit(uniqueId, decryptHandle, decryptUnitId); 522d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 523dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 524d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 525d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 526d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshissize_t DrmManager::pread(int uniqueId, DecryptHandle* decryptHandle, 5275fc3edb13edb058f14e6550d295ce3e50e5ebf8cGloria Wang void* buffer, ssize_t numBytes, off64_t offset) { 528d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi ssize_t result = DECRYPT_FILE_ERROR; 529d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 5302ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mDecryptLock); 531d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 532d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 533d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi result = drmEngine->pread(uniqueId, decryptHandle, buffer, numBytes, offset); 534d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 535d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return result; 536d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 537d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 538d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiString8 DrmManager::getSupportedPlugInId( 539d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId, const String8& path, const String8& mimeType) { 540d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 plugInId(""); 541d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 542d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != mimeType) { 543d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi plugInId = getSupportedPlugInId(mimeType); 544d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } else { 545d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi plugInId = getSupportedPlugInIdFromPath(uniqueId, path); 546d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 547d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return plugInId; 548d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 549d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 550d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiString8 DrmManager::getSupportedPlugInId(const String8& mimeType) { 551d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 plugInId(""); 552d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 553d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != mimeType) { 554d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (unsigned int index = 0; index < mSupportInfoToPlugInIdMap.size(); index++) { 555d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const DrmSupportInfo& drmSupportInfo = mSupportInfoToPlugInIdMap.keyAt(index); 556d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 557d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (drmSupportInfo.isSupportedMimeType(mimeType)) { 558d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi plugInId = mSupportInfoToPlugInIdMap.valueFor(drmSupportInfo); 559d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi break; 560d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 561d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 562d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 563d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return plugInId; 564d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 565d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 566d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiString8 DrmManager::getSupportedPlugInIdFromPath(int uniqueId, const String8& path) { 567d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 plugInId(""); 568d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 fileSuffix = path.getPathExtension(); 569d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 570d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (unsigned int index = 0; index < mSupportInfoToPlugInIdMap.size(); index++) { 571d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const DrmSupportInfo& drmSupportInfo = mSupportInfoToPlugInIdMap.keyAt(index); 572d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 573d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (drmSupportInfo.isSupportedFileSuffix(fileSuffix)) { 574d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 key = mSupportInfoToPlugInIdMap.valueFor(drmSupportInfo); 575d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& drmEngine = mPlugInManager.getPlugIn(key); 576d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 577d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (drmEngine.canHandle(uniqueId, path)) { 578d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi plugInId = key; 579d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi break; 580d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 581d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 582d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 583d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return plugInId; 584d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 585d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 586d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshivoid DrmManager::onInfo(const DrmInfoEvent& event) { 587192b591cdca78f258dd3260e41d7217f6fc6e36cGloria Wang Mutex::Autolock _l(mListenerLock); 588d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (unsigned int index = 0; index < mServiceListeners.size(); index++) { 589d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId = mServiceListeners.keyAt(index); 590d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 591d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (uniqueId == event.getUniqueId()) { 592d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi sp<IDrmServiceListener> serviceListener = mServiceListeners.valueFor(uniqueId); 593d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi serviceListener->notify(event); 594d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 595d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 596d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 597d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 598