DrmManager.cpp revision 3f0341cbbdeee248e71814f7071233c823b44f74
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 52dc549d60f98d809f626c99de614960409a847054Takeshi Aimiint DrmManager::addUniqueId(int uniqueId) { 532ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 54dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (0 == uniqueId) { 55dc549d60f98d809f626c99de614960409a847054Takeshi Aimi int temp = 0; 56dc549d60f98d809f626c99de614960409a847054Takeshi Aimi bool foundUniqueId = false; 57dc549d60f98d809f626c99de614960409a847054Takeshi Aimi srand(time(NULL)); 58dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 59dc549d60f98d809f626c99de614960409a847054Takeshi Aimi while (!foundUniqueId) { 60dc549d60f98d809f626c99de614960409a847054Takeshi Aimi const int size = mUniqueIdVector.size(); 61dc549d60f98d809f626c99de614960409a847054Takeshi Aimi temp = rand() % 100; 62dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 63dc549d60f98d809f626c99de614960409a847054Takeshi Aimi int index = 0; 64dc549d60f98d809f626c99de614960409a847054Takeshi Aimi for (; index < size; ++index) { 65dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (mUniqueIdVector.itemAt(index) == temp) { 66dc549d60f98d809f626c99de614960409a847054Takeshi Aimi foundUniqueId = false; 67dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 68dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 69dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 70dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (index == size) { 71dc549d60f98d809f626c99de614960409a847054Takeshi Aimi foundUniqueId = true; 72dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 73dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 74dc549d60f98d809f626c99de614960409a847054Takeshi Aimi uniqueId = temp; 75dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 76dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mUniqueIdVector.push(uniqueId); 77dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return uniqueId; 78dc549d60f98d809f626c99de614960409a847054Takeshi Aimi} 79dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 80dc549d60f98d809f626c99de614960409a847054Takeshi Aimivoid DrmManager::removeUniqueId(int uniqueId) { 812ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 82dc549d60f98d809f626c99de614960409a847054Takeshi Aimi for (unsigned int i = 0; i < mUniqueIdVector.size(); i++) { 83dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (uniqueId == mUniqueIdVector.itemAt(i)) { 84dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mUniqueIdVector.removeAt(i); 85dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 86dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 87dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 88dc549d60f98d809f626c99de614960409a847054Takeshi Aimi} 89dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 90c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimistatus_t DrmManager::loadPlugIns() { 91cbba720a460f49a9d16afcc7e85c4564d7d945a1Glenn Kasten String8 pluginDirPath("/system/lib/drm"); 92c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi return loadPlugIns(pluginDirPath); 93d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 94d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 95c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimistatus_t DrmManager::loadPlugIns(const String8& plugInDirPath) { 96d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (mSupportInfoToPlugInIdMap.isEmpty()) { 97d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mPlugInManager.loadPlugIns(plugInDirPath); 98c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList(); 99c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi for (unsigned int i = 0; i < plugInPathList.size(); ++i) { 100c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi String8 plugInPath = plugInPathList[i]; 101c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi DrmSupportInfo* info = mPlugInManager.getPlugIn(plugInPath).getSupportInfo(0); 102c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi if (NULL != info) { 103c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi mSupportInfoToPlugInIdMap.add(*info, plugInPath); 1043f0341cbbdeee248e71814f7071233c823b44f74James Dong delete info; 105c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi } 106c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi } 107d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 108c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi return DRM_NO_ERROR; 109c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi} 110d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 111c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimistatus_t DrmManager::unloadPlugIns() { 1122ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 113c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi mConvertSessionMap.clear(); 114c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi mDecryptSessionMap.clear(); 115c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi mPlugInManager.unloadPlugIns(); 116c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi mSupportInfoToPlugInIdMap.clear(); 117d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return DRM_NO_ERROR; 118d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 119d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 120d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatus_t DrmManager::setDrmServiceListener( 121d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) { 122192b591cdca78f258dd3260e41d7217f6fc6e36cGloria Wang Mutex::Autolock _l(mListenerLock); 123f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi if (NULL != drmServiceListener.get()) { 124f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi mServiceListeners.add(uniqueId, drmServiceListener); 125f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi } else { 126f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi mServiceListeners.removeItem(uniqueId); 127f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi } 128d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return DRM_NO_ERROR; 129d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 130d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 131c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimivoid DrmManager::addClient(int uniqueId) { 1322ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 133c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi if (!mSupportInfoToPlugInIdMap.isEmpty()) { 134c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); 135c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi for (unsigned int index = 0; index < plugInIdList.size(); index++) { 136c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index)); 137c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi rDrmEngine.initialize(uniqueId); 138c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi rDrmEngine.setOnInfoListener(uniqueId, this); 139c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi } 140c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi } 141c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi} 142d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 143c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimivoid DrmManager::removeClient(int uniqueId) { 1442ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 145c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); 146d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (unsigned int index = 0; index < plugInIdList.size(); index++) { 147d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index)); 148d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi rDrmEngine.terminate(uniqueId); 149d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 150d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 151d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 152d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiDrmConstraints* DrmManager::getConstraints(int uniqueId, const String8* path, const int action) { 1532ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 154d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, *path); 155d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != plugInId) { 156d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 157d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return rDrmEngine.getConstraints(uniqueId, path, action); 158d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 159d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return NULL; 160d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 161d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 162dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi AimiDrmMetadata* DrmManager::getMetadata(int uniqueId, const String8* path) { 1632ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 164dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, *path); 165dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi if (EMPTY_STRING != plugInId) { 166dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 167dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi return rDrmEngine.getMetadata(uniqueId, path); 168dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi } 169dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi return NULL; 170dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi} 171dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi 172d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatus_t DrmManager::installDrmEngine(int uniqueId, const String8& absolutePath) { 1732ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 174d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mPlugInManager.loadPlugIn(absolutePath); 175d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 176d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(absolutePath); 177d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi rDrmEngine.initialize(uniqueId); 178d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi rDrmEngine.setOnInfoListener(uniqueId, this); 179d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 180c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi DrmSupportInfo* info = rDrmEngine.getSupportInfo(0); 181d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mSupportInfoToPlugInIdMap.add(*info, absolutePath); 1823f0341cbbdeee248e71814f7071233c823b44f74James Dong delete info; 183d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 184d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return DRM_NO_ERROR; 185d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 186d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 187d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshibool DrmManager::canHandle(int uniqueId, const String8& path, const String8& mimeType) { 1882ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 189d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInId(mimeType); 190d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi bool result = (EMPTY_STRING != plugInId) ? true : false; 191d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 192c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi if (0 < path.length()) { 193d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (result) { 194d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 195d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi result = rDrmEngine.canHandle(uniqueId, path); 196d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } else { 197289401b7566384570de86e9ad6ab3c572e358675Gloria Wang String8 extension = path.getPathExtension(); 198289401b7566384570de86e9ad6ab3c572e358675Gloria Wang if (String8("") != extension) { 199289401b7566384570de86e9ad6ab3c572e358675Gloria Wang result = canHandle(uniqueId, path); 200289401b7566384570de86e9ad6ab3c572e358675Gloria Wang } 201d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 202d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 203d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return result; 204d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 205d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 206d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiDrmInfoStatus* DrmManager::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) { 2072ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 208d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInId(drmInfo->getMimeType()); 209d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != plugInId) { 210d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 211d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return rDrmEngine.processDrmInfo(uniqueId, drmInfo); 212d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 213d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return NULL; 214d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 215d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 216d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshibool DrmManager::canHandle(int uniqueId, const String8& path) { 217d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi bool result = false; 218d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList(); 219d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 220d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (unsigned int i = 0; i < plugInPathList.size(); ++i) { 221d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInPathList[i]); 222d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi result = rDrmEngine.canHandle(uniqueId, path); 223d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 224d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (result) { 225d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi break; 226d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 227d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 228d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return result; 229d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 230d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 231d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiDrmInfo* DrmManager::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) { 2322ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 233d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInId(drmInfoRequest->getMimeType()); 234d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != plugInId) { 235d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 236d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return rDrmEngine.acquireDrmInfo(uniqueId, drmInfoRequest); 237d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 238d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return NULL; 239d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 240d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 241dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatus_t DrmManager::saveRights(int uniqueId, const DrmRights& drmRights, 242d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8& rightsPath, const String8& contentPath) { 2432ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 244d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInId(drmRights.getMimeType()); 245dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 246d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != plugInId) { 247d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 248dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = rDrmEngine.saveRights(uniqueId, drmRights, rightsPath, contentPath); 249d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 250dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 251d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 252d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 253d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiString8 DrmManager::getOriginalMimeType(int uniqueId, const String8& path) { 2542ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 255d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path); 256d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != plugInId) { 257d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 258d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return rDrmEngine.getOriginalMimeType(uniqueId, path); 259d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 260d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return EMPTY_STRING; 261d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 262d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 263d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiint DrmManager::getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType) { 2642ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 265d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInId(uniqueId, path, mimeType); 266d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != plugInId) { 267d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 268d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return rDrmEngine.getDrmObjectType(uniqueId, path, mimeType); 269d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 270d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return DrmObjectType::UNKNOWN; 271d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 272d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 273d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiint DrmManager::checkRightsStatus(int uniqueId, const String8& path, int action) { 2742ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 275d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path); 276d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != plugInId) { 277d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 278d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return rDrmEngine.checkRightsStatus(uniqueId, path, action); 279d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 280d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return RightsStatus::RIGHTS_INVALID; 281d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 282d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 283dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatus_t DrmManager::consumeRights( 284d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) { 285dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 2862ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mDecryptLock); 287d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 288d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 289dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = drmEngine->consumeRights(uniqueId, decryptHandle, action, reserve); 290d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 291dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 292d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 293d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 294dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatus_t DrmManager::setPlaybackStatus( 2955fc3edb13edb058f14e6550d295ce3e50e5ebf8cGloria Wang int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) { 296dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 2972ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mDecryptLock); 298d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 299d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 300dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = drmEngine->setPlaybackStatus(uniqueId, decryptHandle, playbackStatus, position); 301d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 302dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 303d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 304d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 305d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshibool DrmManager::validateAction( 306d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId, const String8& path, int action, const ActionDescription& description) { 3072ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 308d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path); 309d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != plugInId) { 310d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 311d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return rDrmEngine.validateAction(uniqueId, path, action, description); 312d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 313d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return false; 314d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 315d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 316dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatus_t DrmManager::removeRights(int uniqueId, const String8& path) { 3172ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 318d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path); 319dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 320d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != plugInId) { 321d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 322dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = rDrmEngine.removeRights(uniqueId, path); 323d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 324dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 325d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 326d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 327dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatus_t DrmManager::removeAllRights(int uniqueId) { 328d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); 329dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 330d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (unsigned int index = 0; index < plugInIdList.size(); index++) { 331d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index)); 332dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = rDrmEngine.removeAllRights(uniqueId); 333dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (DRM_NO_ERROR != result) { 334dc549d60f98d809f626c99de614960409a847054Takeshi Aimi break; 335dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 336d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 337dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 338d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 339d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 340d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiint DrmManager::openConvertSession(int uniqueId, const String8& mimeType) { 3412ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mConvertLock); 342d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int convertId = -1; 343d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 344d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 plugInId = getSupportedPlugInId(mimeType); 345d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != plugInId) { 346d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 347d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 348dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (DRM_NO_ERROR == rDrmEngine.openConvertSession(uniqueId, mConvertId + 1)) { 349dc549d60f98d809f626c99de614960409a847054Takeshi Aimi ++mConvertId; 350dc549d60f98d809f626c99de614960409a847054Takeshi Aimi convertId = mConvertId; 351dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mConvertSessionMap.add(convertId, &rDrmEngine); 352dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 353d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 354d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return convertId; 355d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 356d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 357d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiDrmConvertedStatus* DrmManager::convertData( 358d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId, int convertId, const DrmBuffer* inputData) { 359d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmConvertedStatus *drmConvertedStatus = NULL; 360d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 3612ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mConvertLock); 362d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (mConvertSessionMap.indexOfKey(convertId) != NAME_NOT_FOUND) { 363d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine* drmEngine = mConvertSessionMap.valueFor(convertId); 364d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmConvertedStatus = drmEngine->convertData(uniqueId, convertId, inputData); 365d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 366d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return drmConvertedStatus; 367d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 368d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 369d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiDrmConvertedStatus* DrmManager::closeConvertSession(int uniqueId, int convertId) { 3702ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mConvertLock); 371d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmConvertedStatus *drmConvertedStatus = NULL; 372d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 373d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (mConvertSessionMap.indexOfKey(convertId) != NAME_NOT_FOUND) { 374d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine* drmEngine = mConvertSessionMap.valueFor(convertId); 375d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmConvertedStatus = drmEngine->closeConvertSession(uniqueId, convertId); 376d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mConvertSessionMap.removeItem(convertId); 377d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 378d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return drmConvertedStatus; 379d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 380d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 381d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshistatus_t DrmManager::getAllSupportInfo( 382d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) { 3832ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mLock); 384d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList(); 385d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int size = plugInPathList.size(); 386d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int validPlugins = 0; 387d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 388d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (0 < size) { 389d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Vector<DrmSupportInfo> drmSupportInfoList; 390d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 391d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (int i = 0; i < size; ++i) { 392d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 plugInPath = plugInPathList[i]; 393d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmSupportInfo* drmSupportInfo 394c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi = mPlugInManager.getPlugIn(plugInPath).getSupportInfo(0); 395d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != drmSupportInfo) { 396d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi drmSupportInfoList.add(*drmSupportInfo); 397d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete drmSupportInfo; drmSupportInfo = NULL; 398d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 399d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 400d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 401d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi validPlugins = drmSupportInfoList.size(); 402d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (0 < validPlugins) { 403d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *drmSupportInfoArray = new DrmSupportInfo[validPlugins]; 404d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (int i = 0; i < validPlugins; ++i) { 405d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi (*drmSupportInfoArray)[i] = drmSupportInfoList[i]; 406d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 407d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 408d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 409d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *length = validPlugins; 410d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return DRM_NO_ERROR; 411d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 412d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 4135fc3edb13edb058f14e6550d295ce3e50e5ebf8cGloria WangDecryptHandle* DrmManager::openDecryptSession(int uniqueId, int fd, off64_t offset, off64_t length) { 414c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi Mutex::Autolock _l(mDecryptLock); 415d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi status_t result = DRM_ERROR_CANNOT_HANDLE; 416d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); 417d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 418d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DecryptHandle* handle = new DecryptHandle(); 419d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (NULL != handle) { 420d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi handle->decryptId = mDecryptSessionId + 1; 421d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 422d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (unsigned int index = 0; index < plugInIdList.size(); index++) { 423d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 plugInId = plugInIdList.itemAt(index); 424d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 425d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi result = rDrmEngine.openDecryptSession(uniqueId, handle, fd, offset, length); 426d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 427d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (DRM_NO_ERROR == result) { 428d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi ++mDecryptSessionId; 429d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi mDecryptSessionMap.add(mDecryptSessionId, &rDrmEngine); 430d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi break; 431d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 432d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 433d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 434dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (DRM_NO_ERROR != result) { 435d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi delete handle; handle = NULL; 436d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 437c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi return handle; 438c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi} 439c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi 440c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi AimiDecryptHandle* DrmManager::openDecryptSession(int uniqueId, const char* uri) { 441c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi Mutex::Autolock _l(mDecryptLock); 442c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi status_t result = DRM_ERROR_CANNOT_HANDLE; 443c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList(); 444d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 445c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi DecryptHandle* handle = new DecryptHandle(); 446c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi if (NULL != handle) { 447c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi handle->decryptId = mDecryptSessionId + 1; 448c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi 449c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi for (unsigned int index = 0; index < plugInIdList.size(); index++) { 450c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi String8 plugInId = plugInIdList.itemAt(index); 451c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId); 452c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi result = rDrmEngine.openDecryptSession(uniqueId, handle, uri); 453d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 454c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi if (DRM_NO_ERROR == result) { 455c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi ++mDecryptSessionId; 456c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi mDecryptSessionMap.add(mDecryptSessionId, &rDrmEngine); 457c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi break; 458c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi } 459c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi } 460c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi } 461c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi if (DRM_NO_ERROR != result) { 462c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi delete handle; handle = NULL; 4632ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang LOGV("DrmManager::openDecryptSession: no capable plug-in found"); 464c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi } 465d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return handle; 466d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 467d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 468dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatus_t DrmManager::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { 469c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi Mutex::Autolock _l(mDecryptLock); 470dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 471d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 472d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 473dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = drmEngine->closeDecryptSession(uniqueId, decryptHandle); 474dc549d60f98d809f626c99de614960409a847054Takeshi Aimi if (DRM_NO_ERROR == result) { 475dc549d60f98d809f626c99de614960409a847054Takeshi Aimi mDecryptSessionMap.removeItem(decryptHandle->decryptId); 476dc549d60f98d809f626c99de614960409a847054Takeshi Aimi } 477d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 478dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 479d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 480d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 481dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatus_t DrmManager::initializeDecryptUnit( 482d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, const DrmBuffer* headerInfo) { 483dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 4842ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mDecryptLock); 485d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 486d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 487dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = drmEngine->initializeDecryptUnit(uniqueId, decryptHandle, decryptUnitId, headerInfo); 488d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 489dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 490d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 491d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 492dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatus_t DrmManager::decrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, 493dc549d60f98d809f626c99de614960409a847054Takeshi Aimi const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { 494dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 4952ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang 4962ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mDecryptLock); 497d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 498d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 499dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = drmEngine->decrypt( 500dc549d60f98d809f626c99de614960409a847054Takeshi Aimi uniqueId, decryptHandle, decryptUnitId, encBuffer, decBuffer, IV); 501d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 502dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 503d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 504d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 505dc549d60f98d809f626c99de614960409a847054Takeshi Aimistatus_t DrmManager::finalizeDecryptUnit( 506d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { 507dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t result = DRM_ERROR_UNKNOWN; 5082ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mDecryptLock); 509d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 510d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 511dc549d60f98d809f626c99de614960409a847054Takeshi Aimi result = drmEngine->finalizeDecryptUnit(uniqueId, decryptHandle, decryptUnitId); 512d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 513dc549d60f98d809f626c99de614960409a847054Takeshi Aimi return result; 514d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 515d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 516d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshissize_t DrmManager::pread(int uniqueId, DecryptHandle* decryptHandle, 5175fc3edb13edb058f14e6550d295ce3e50e5ebf8cGloria Wang void* buffer, ssize_t numBytes, off64_t offset) { 518d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi ssize_t result = DECRYPT_FILE_ERROR; 519d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 5202ef2d49aa3c19e99e2a753dac2dfb51fc87b5328Gloria Wang Mutex::Autolock _l(mDecryptLock); 521d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) { 522d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId); 523d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi result = drmEngine->pread(uniqueId, decryptHandle, buffer, numBytes, offset); 524d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 525d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return result; 526d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 527d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 528d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiString8 DrmManager::getSupportedPlugInId( 529d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId, const String8& path, const String8& mimeType) { 530d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 plugInId(""); 531d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 532d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != mimeType) { 533d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi plugInId = getSupportedPlugInId(mimeType); 534d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } else { 535d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi plugInId = getSupportedPlugInIdFromPath(uniqueId, path); 536d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 537d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return plugInId; 538d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 539d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 540d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiString8 DrmManager::getSupportedPlugInId(const String8& mimeType) { 541d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 plugInId(""); 542d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 543d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (EMPTY_STRING != mimeType) { 544d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (unsigned int index = 0; index < mSupportInfoToPlugInIdMap.size(); index++) { 545d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const DrmSupportInfo& drmSupportInfo = mSupportInfoToPlugInIdMap.keyAt(index); 546d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 547d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (drmSupportInfo.isSupportedMimeType(mimeType)) { 548d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi plugInId = mSupportInfoToPlugInIdMap.valueFor(drmSupportInfo); 549d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi break; 550d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 551d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 552d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 553d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return plugInId; 554d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 555d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 556d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiString8 DrmManager::getSupportedPlugInIdFromPath(int uniqueId, const String8& path) { 557d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 plugInId(""); 558d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8 fileSuffix = path.getPathExtension(); 559d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 560d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (unsigned int index = 0; index < mSupportInfoToPlugInIdMap.size(); index++) { 561d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const DrmSupportInfo& drmSupportInfo = mSupportInfoToPlugInIdMap.keyAt(index); 562d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 563d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (drmSupportInfo.isSupportedFileSuffix(fileSuffix)) { 564d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 key = mSupportInfoToPlugInIdMap.valueFor(drmSupportInfo); 565d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi IDrmEngine& drmEngine = mPlugInManager.getPlugIn(key); 566d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 567d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (drmEngine.canHandle(uniqueId, path)) { 568d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi plugInId = key; 569d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi break; 570d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 571d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 572d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 573d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi return plugInId; 574d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 575d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 576d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshivoid DrmManager::onInfo(const DrmInfoEvent& event) { 577192b591cdca78f258dd3260e41d7217f6fc6e36cGloria Wang Mutex::Autolock _l(mListenerLock); 578d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi for (unsigned int index = 0; index < mServiceListeners.size(); index++) { 579d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId = mServiceListeners.keyAt(index); 580d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 581d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi if (uniqueId == event.getUniqueId()) { 582d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi sp<IDrmServiceListener> serviceListener = mServiceListeners.valueFor(uniqueId); 583d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi serviceListener->notify(event); 584d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 585d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi } 586d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi} 587d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 588