DrmManager.cpp revision 5f6f4e4e89bc9b234d89276aea3eae7f677e2ff7
127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi/*
227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Copyright (C) 2010 The Android Open Source Project
327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Licensed under the Apache License, Version 2.0 (the "License");
527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * you may not use this file except in compliance with the License.
627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * You may obtain a copy of the License at
727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *      http://www.apache.org/licenses/LICENSE-2.0
927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
1027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Unless required by applicable law or agreed to in writing, software
1127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * distributed under the License is distributed on an "AS IS" BASIS,
1227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * See the License for the specific language governing permissions and
1427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * limitations under the License.
1527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi */
1627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
172272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi//#define LOG_NDEBUG 0
1827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define LOG_TAG "DrmManager(Native)"
1927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "utils/Log.h"
2027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/String8.h>
2227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfo.h>
2327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoEvent.h>
2427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmRights.h>
2527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmConstraints.h>
263473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi#include <drm/DrmMetadata.h>
2727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoStatus.h>
2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoRequest.h>
2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmSupportInfo.h>
3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmConvertedStatus.h>
3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <IDrmEngine.h>
3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "DrmManager.h"
3427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "ReadWriteUtils.h"
3527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define DECRYPT_FILE_ERROR -1
3727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiusing namespace android;
3927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiconst String8 DrmManager::EMPTY_STRING("");
4127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmManager::DrmManager() :
4327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    mDecryptSessionId(0),
4427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    mConvertId(0) {
4527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
4727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmManager::~DrmManager() {
4927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
5027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
5127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
528f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wangint DrmManager::addUniqueId(bool isNative) {
536b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mLock);
548f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang
558f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang    int temp = 0;
568f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang    bool foundUniqueId = false;
578f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang    const int size = mUniqueIdVector.size();
588f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang    const int uniqueIdRange = 0xfff;
598f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang    int maxLoopTimes = (uniqueIdRange - 1) / 2;
608f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang    srand(time(NULL));
618f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang
628f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang    while (!foundUniqueId) {
638f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang        temp = rand() & uniqueIdRange;
648f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang
658f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang        if (isNative) {
668f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang            // set a flag to differentiate DrmManagerClient
678f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang            // created from native side and java side
688f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang            temp |= 0x1000;
698f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang        }
708f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang
718f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang        int index = 0;
728f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang        for (; index < size; ++index) {
738f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang            if (mUniqueIdVector.itemAt(index) == temp) {
748f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang                foundUniqueId = false;
758f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang                break;
762272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            }
772272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        }
788f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang        if (index == size) {
798f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang            foundUniqueId = true;
808f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang        }
818f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang
828f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang        maxLoopTimes --;
838f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang        LOG_FATAL_IF(maxLoopTimes <= 0, "cannot find an unique ID for this session");
842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    }
858f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang
868f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang    mUniqueIdVector.push(temp);
878f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang    return temp;
882272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi}
892272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
902272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimivoid DrmManager::removeUniqueId(int uniqueId) {
916b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mLock);
922272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    for (unsigned int i = 0; i < mUniqueIdVector.size(); i++) {
932272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        if (uniqueId == mUniqueIdVector.itemAt(i)) {
942272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            mUniqueIdVector.removeAt(i);
952272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            break;
962272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        }
972272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    }
982272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi}
992272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
100e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimistatus_t DrmManager::loadPlugIns() {
1015f6f4e4e89bc9b234d89276aea3eae7f677e2ff7Edwin Wong
1025f6f4e4e89bc9b234d89276aea3eae7f677e2ff7Edwin Wong    String8 vendorPluginDirPath("/vendor/lib/drm");
1035f6f4e4e89bc9b234d89276aea3eae7f677e2ff7Edwin Wong    loadPlugIns(vendorPluginDirPath);
1045f6f4e4e89bc9b234d89276aea3eae7f677e2ff7Edwin Wong
105fc4f5aad4af1e2d8eea5e7d7f69d1cad4704cbb7Glenn Kasten    String8 pluginDirPath("/system/lib/drm");
1065f6f4e4e89bc9b234d89276aea3eae7f677e2ff7Edwin Wong    loadPlugIns(pluginDirPath);
1075f6f4e4e89bc9b234d89276aea3eae7f677e2ff7Edwin Wong    return DRM_NO_ERROR;
1085f6f4e4e89bc9b234d89276aea3eae7f677e2ff7Edwin Wong
10927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
11027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
111e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimistatus_t DrmManager::loadPlugIns(const String8& plugInDirPath) {
1125f6f4e4e89bc9b234d89276aea3eae7f677e2ff7Edwin Wong    mPlugInManager.loadPlugIns(plugInDirPath);
1135f6f4e4e89bc9b234d89276aea3eae7f677e2ff7Edwin Wong    Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList();
1145f6f4e4e89bc9b234d89276aea3eae7f677e2ff7Edwin Wong    for (unsigned int i = 0; i < plugInPathList.size(); ++i) {
1155f6f4e4e89bc9b234d89276aea3eae7f677e2ff7Edwin Wong        String8 plugInPath = plugInPathList[i];
1165f6f4e4e89bc9b234d89276aea3eae7f677e2ff7Edwin Wong        DrmSupportInfo* info = mPlugInManager.getPlugIn(plugInPath).getSupportInfo(0);
1175f6f4e4e89bc9b234d89276aea3eae7f677e2ff7Edwin Wong        if (NULL != info) {
1185f6f4e4e89bc9b234d89276aea3eae7f677e2ff7Edwin Wong            if (mSupportInfoToPlugInIdMap.indexOfKey(*info) < 0) {
119e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi                mSupportInfoToPlugInIdMap.add(*info, plugInPath);
120e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            }
1215f6f4e4e89bc9b234d89276aea3eae7f677e2ff7Edwin Wong            delete info;
122e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        }
12327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
124e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    return DRM_NO_ERROR;
125e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi}
12627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
127e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimistatus_t DrmManager::unloadPlugIns() {
1286b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mLock);
129e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    mConvertSessionMap.clear();
130e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    mDecryptSessionMap.clear();
131e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    mPlugInManager.unloadPlugIns();
132e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    mSupportInfoToPlugInIdMap.clear();
13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return DRM_NO_ERROR;
13427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
13527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManager::setDrmServiceListener(
13727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) {
1380e0a5f9e0b7a7ca618e8a1f7ccecc57a17e0d1e2Gloria Wang    Mutex::Autolock _l(mListenerLock);
139c618b5af98dec06d49374a61a5a94016f9fec2d3Takeshi Aimi    if (NULL != drmServiceListener.get()) {
140c618b5af98dec06d49374a61a5a94016f9fec2d3Takeshi Aimi        mServiceListeners.add(uniqueId, drmServiceListener);
141c618b5af98dec06d49374a61a5a94016f9fec2d3Takeshi Aimi    } else {
142c618b5af98dec06d49374a61a5a94016f9fec2d3Takeshi Aimi        mServiceListeners.removeItem(uniqueId);
143c618b5af98dec06d49374a61a5a94016f9fec2d3Takeshi Aimi    }
14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return DRM_NO_ERROR;
14527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
14627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
147e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid DrmManager::addClient(int uniqueId) {
1486b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mLock);
149e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    if (!mSupportInfoToPlugInIdMap.isEmpty()) {
150e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList();
151e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        for (unsigned int index = 0; index < plugInIdList.size(); index++) {
152e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index));
153e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            rDrmEngine.initialize(uniqueId);
154e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            rDrmEngine.setOnInfoListener(uniqueId, this);
155e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        }
156e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    }
157e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi}
15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
159e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid DrmManager::removeClient(int uniqueId) {
1606b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mLock);
161e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList();
16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    for (unsigned int index = 0; index < plugInIdList.size(); index++) {
16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index));
16427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        rDrmEngine.terminate(uniqueId);
16527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
16627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConstraints* DrmManager::getConstraints(int uniqueId, const String8* path, const int action) {
1696b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mLock);
17027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, *path);
17127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (EMPTY_STRING != plugInId) {
17227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return rDrmEngine.getConstraints(uniqueId, path, action);
17427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
17527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return NULL;
17627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
17727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1783473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi AimiDrmMetadata* DrmManager::getMetadata(int uniqueId, const String8* path) {
1796b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mLock);
1803473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, *path);
1813473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    if (EMPTY_STRING != plugInId) {
1823473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
1833473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        return rDrmEngine.getMetadata(uniqueId, path);
1843473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    }
1853473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    return NULL;
1863473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi}
1873473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
18827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManager::installDrmEngine(int uniqueId, const String8& absolutePath) {
1896b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mLock);
19027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    mPlugInManager.loadPlugIn(absolutePath);
19127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
19227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(absolutePath);
19327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    rDrmEngine.initialize(uniqueId);
19427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    rDrmEngine.setOnInfoListener(uniqueId, this);
19527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
196e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    DrmSupportInfo* info = rDrmEngine.getSupportInfo(0);
19727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    mSupportInfoToPlugInIdMap.add(*info, absolutePath);
198adfb5592622305090ad39dcc2b7df477736da2c6James Dong    delete info;
19927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
20027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return DRM_NO_ERROR;
20127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
20227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
20327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool DrmManager::canHandle(int uniqueId, const String8& path, const String8& mimeType) {
2046b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mLock);
20527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 plugInId = getSupportedPlugInId(mimeType);
20627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    bool result = (EMPTY_STRING != plugInId) ? true : false;
20727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
208e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    if (0 < path.length()) {
20927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (result) {
21027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
21127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            result = rDrmEngine.canHandle(uniqueId, path);
21227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        } else {
2137f89d09c0f4a47119834ba15789260b933123ea5Gloria Wang            String8 extension = path.getPathExtension();
2147f89d09c0f4a47119834ba15789260b933123ea5Gloria Wang            if (String8("") != extension) {
2157f89d09c0f4a47119834ba15789260b933123ea5Gloria Wang                result = canHandle(uniqueId, path);
2167f89d09c0f4a47119834ba15789260b933123ea5Gloria Wang            }
21727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
21827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
21927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return result;
22027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
22127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
22227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfoStatus* DrmManager::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) {
2236b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mLock);
22427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 plugInId = getSupportedPlugInId(drmInfo->getMimeType());
22527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (EMPTY_STRING != plugInId) {
22627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
22727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return rDrmEngine.processDrmInfo(uniqueId, drmInfo);
22827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
22927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return NULL;
23027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
23127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
23227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool DrmManager::canHandle(int uniqueId, const String8& path) {
23327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    bool result = false;
23427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList();
23527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
23627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    for (unsigned int i = 0; i < plugInPathList.size(); ++i) {
23727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInPathList[i]);
23827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        result = rDrmEngine.canHandle(uniqueId, path);
23927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
24027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (result) {
24127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            break;
24227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
24327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
24427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return result;
24527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
24627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
24727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfo* DrmManager::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) {
2486b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mLock);
24927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 plugInId = getSupportedPlugInId(drmInfoRequest->getMimeType());
25027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (EMPTY_STRING != plugInId) {
25127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
25227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return rDrmEngine.acquireDrmInfo(uniqueId, drmInfoRequest);
25327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
25427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return NULL;
25527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
25627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2572272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManager::saveRights(int uniqueId, const DrmRights& drmRights,
25827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8& rightsPath, const String8& contentPath) {
2596b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mLock);
26027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 plugInId = getSupportedPlugInId(drmRights.getMimeType());
2612272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t result = DRM_ERROR_UNKNOWN;
26227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (EMPTY_STRING != plugInId) {
26327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
2642272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        result = rDrmEngine.saveRights(uniqueId, drmRights, rightsPath, contentPath);
26527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
2662272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return result;
26727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
26827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
26927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 DrmManager::getOriginalMimeType(int uniqueId, const String8& path) {
2706b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mLock);
27127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path);
27227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (EMPTY_STRING != plugInId) {
27327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
27427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return rDrmEngine.getOriginalMimeType(uniqueId, path);
27527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
27627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return EMPTY_STRING;
27727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
27827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
27927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManager::getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType) {
2806b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mLock);
28127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 plugInId = getSupportedPlugInId(uniqueId, path, mimeType);
28227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (EMPTY_STRING != plugInId) {
28327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
28427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return rDrmEngine.getDrmObjectType(uniqueId, path, mimeType);
28527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
28627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return DrmObjectType::UNKNOWN;
28727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
28827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
28927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManager::checkRightsStatus(int uniqueId, const String8& path, int action) {
2906b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mLock);
29127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path);
29227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (EMPTY_STRING != plugInId) {
29327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
29427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return rDrmEngine.checkRightsStatus(uniqueId, path, action);
29527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
29627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return RightsStatus::RIGHTS_INVALID;
29727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
29827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2992272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManager::consumeRights(
30027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) {
3012272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t result = DRM_ERROR_UNKNOWN;
3026b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mDecryptLock);
30327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) {
30427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId);
3052272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        result = drmEngine->consumeRights(uniqueId, decryptHandle, action, reserve);
30627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
3072272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return result;
30827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
30927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3102272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManager::setPlaybackStatus(
311a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang    int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) {
3122272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t result = DRM_ERROR_UNKNOWN;
3136b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mDecryptLock);
31427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) {
31527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId);
3162272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        result = drmEngine->setPlaybackStatus(uniqueId, decryptHandle, playbackStatus, position);
31727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
3182272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return result;
31927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
32027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
32127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool DrmManager::validateAction(
32227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int uniqueId, const String8& path, int action, const ActionDescription& description) {
3236b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mLock);
32427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path);
32527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (EMPTY_STRING != plugInId) {
32627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
32727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return rDrmEngine.validateAction(uniqueId, path, action, description);
32827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
32927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return false;
33027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
33127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3322272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManager::removeRights(int uniqueId, const String8& path) {
3336b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mLock);
33427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 plugInId = getSupportedPlugInIdFromPath(uniqueId, path);
3352272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t result = DRM_ERROR_UNKNOWN;
33627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (EMPTY_STRING != plugInId) {
33727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
3382272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        result = rDrmEngine.removeRights(uniqueId, path);
33927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
3402272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return result;
34127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
34227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3432272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManager::removeAllRights(int uniqueId) {
34427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList();
3452272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t result = DRM_ERROR_UNKNOWN;
34627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    for (unsigned int index = 0; index < plugInIdList.size(); index++) {
34727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInIdList.itemAt(index));
3482272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        result = rDrmEngine.removeAllRights(uniqueId);
3492272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        if (DRM_NO_ERROR != result) {
3502272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            break;
3512272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        }
35227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
3532272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return result;
35427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
35527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
35627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManager::openConvertSession(int uniqueId, const String8& mimeType) {
3576b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mConvertLock);
35827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int convertId = -1;
35927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
36027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 plugInId = getSupportedPlugInId(mimeType);
36127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (EMPTY_STRING != plugInId) {
36227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
36327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3642272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        if (DRM_NO_ERROR == rDrmEngine.openConvertSession(uniqueId, mConvertId + 1)) {
3652272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            ++mConvertId;
3662272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            convertId = mConvertId;
3672272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            mConvertSessionMap.add(convertId, &rDrmEngine);
3682272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        }
36927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
37027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return convertId;
37127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
37227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
37327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* DrmManager::convertData(
37427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, int convertId, const DrmBuffer* inputData) {
37527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConvertedStatus *drmConvertedStatus = NULL;
37627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3776b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mConvertLock);
37827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (mConvertSessionMap.indexOfKey(convertId) != NAME_NOT_FOUND) {
37927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine* drmEngine = mConvertSessionMap.valueFor(convertId);
38027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmConvertedStatus = drmEngine->convertData(uniqueId, convertId, inputData);
38127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
38227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmConvertedStatus;
38327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
38427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
38527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* DrmManager::closeConvertSession(int uniqueId, int convertId) {
3866b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mConvertLock);
38727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConvertedStatus *drmConvertedStatus = NULL;
38827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
38927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (mConvertSessionMap.indexOfKey(convertId) != NAME_NOT_FOUND) {
39027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine* drmEngine = mConvertSessionMap.valueFor(convertId);
39127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmConvertedStatus = drmEngine->closeConvertSession(uniqueId, convertId);
39227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        mConvertSessionMap.removeItem(convertId);
39327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
39427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmConvertedStatus;
39527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
39627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
39727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManager::getAllSupportInfo(
39827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) {
3996b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mLock);
40027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Vector<String8> plugInPathList = mPlugInManager.getPlugInIdList();
40127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int size = plugInPathList.size();
40227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int validPlugins = 0;
40327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
40427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 < size) {
40527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        Vector<DrmSupportInfo> drmSupportInfoList;
40627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
40727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int i = 0; i < size; ++i) {
40827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            String8 plugInPath = plugInPathList[i];
40927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo* drmSupportInfo
410e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi                = mPlugInManager.getPlugIn(plugInPath).getSupportInfo(0);
41127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (NULL != drmSupportInfo) {
41227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                drmSupportInfoList.add(*drmSupportInfo);
41327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete drmSupportInfo; drmSupportInfo = NULL;
41427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
41527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
41627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
41727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        validPlugins = drmSupportInfoList.size();
41827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 < validPlugins) {
41927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            *drmSupportInfoArray = new DrmSupportInfo[validPlugins];
42027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            for (int i = 0; i < validPlugins; ++i) {
42127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                (*drmSupportInfoArray)[i] = drmSupportInfoList[i];
42227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
42327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
42427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
42527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    *length = validPlugins;
42627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return DRM_NO_ERROR;
42727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
42827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
429a2cd44cb5067b4fe98794860690394254d3ac73cGloria WangDecryptHandle* DrmManager::openDecryptSession(int uniqueId, int fd, off64_t offset, off64_t length) {
430e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    Mutex::Autolock _l(mDecryptLock);
43127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    status_t result = DRM_ERROR_CANNOT_HANDLE;
43227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList();
43327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
43427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DecryptHandle* handle = new DecryptHandle();
43527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != handle) {
43627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->decryptId = mDecryptSessionId + 1;
43727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
43827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (unsigned int index = 0; index < plugInIdList.size(); index++) {
43927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            String8 plugInId = plugInIdList.itemAt(index);
44027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
44127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            result = rDrmEngine.openDecryptSession(uniqueId, handle, fd, offset, length);
44227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
44327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (DRM_NO_ERROR == result) {
44427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                ++mDecryptSessionId;
44527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                mDecryptSessionMap.add(mDecryptSessionId, &rDrmEngine);
44627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                break;
44727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
44827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
44927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
4502272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    if (DRM_NO_ERROR != result) {
45127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete handle; handle = NULL;
45227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
453e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    return handle;
454e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi}
455e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
456e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi AimiDecryptHandle* DrmManager::openDecryptSession(int uniqueId, const char* uri) {
457e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    Mutex::Autolock _l(mDecryptLock);
458e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    status_t result = DRM_ERROR_CANNOT_HANDLE;
459e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    Vector<String8> plugInIdList = mPlugInManager.getPlugInIdList();
46027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
461e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    DecryptHandle* handle = new DecryptHandle();
462e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    if (NULL != handle) {
463e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        handle->decryptId = mDecryptSessionId + 1;
464e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
465e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        for (unsigned int index = 0; index < plugInIdList.size(); index++) {
466e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            String8 plugInId = plugInIdList.itemAt(index);
467e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            IDrmEngine& rDrmEngine = mPlugInManager.getPlugIn(plugInId);
468e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            result = rDrmEngine.openDecryptSession(uniqueId, handle, uri);
46927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
470e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            if (DRM_NO_ERROR == result) {
471e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi                ++mDecryptSessionId;
472e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi                mDecryptSessionMap.add(mDecryptSessionId, &rDrmEngine);
473e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi                break;
474e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            }
475e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        }
476e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    }
477e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    if (DRM_NO_ERROR != result) {
478e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        delete handle; handle = NULL;
4796b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang        LOGV("DrmManager::openDecryptSession: no capable plug-in found");
480e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    }
48127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return handle;
48227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
48327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManager::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) {
485e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    Mutex::Autolock _l(mDecryptLock);
4862272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t result = DRM_ERROR_UNKNOWN;
48727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) {
48827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId);
4892272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        result = drmEngine->closeDecryptSession(uniqueId, decryptHandle);
4902272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        if (DRM_NO_ERROR == result) {
4912272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            mDecryptSessionMap.removeItem(decryptHandle->decryptId);
4922272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        }
49327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
4942272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return result;
49527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
49627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4972272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManager::initializeDecryptUnit(
49827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, const DrmBuffer* headerInfo) {
4992272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t result = DRM_ERROR_UNKNOWN;
5006b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mDecryptLock);
50127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) {
50227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId);
5032272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        result = drmEngine->initializeDecryptUnit(uniqueId, decryptHandle, decryptUnitId, headerInfo);
50427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
5052272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return result;
50627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
50727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
5082272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManager::decrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,
5092272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) {
5102272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t result = DRM_ERROR_UNKNOWN;
5116b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang
5126b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mDecryptLock);
51327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) {
51427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId);
5152272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        result = drmEngine->decrypt(
5162272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi                uniqueId, decryptHandle, decryptUnitId, encBuffer, decBuffer, IV);
51727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
5182272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return result;
51927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
52027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
5212272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManager::finalizeDecryptUnit(
52227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) {
5232272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t result = DRM_ERROR_UNKNOWN;
5246b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mDecryptLock);
52527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) {
52627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId);
5272272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        result = drmEngine->finalizeDecryptUnit(uniqueId, decryptHandle, decryptUnitId);
52827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
5292272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return result;
53027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
53127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
53227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshissize_t DrmManager::pread(int uniqueId, DecryptHandle* decryptHandle,
533a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            void* buffer, ssize_t numBytes, off64_t offset) {
53427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    ssize_t result = DECRYPT_FILE_ERROR;
53527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
5366b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang    Mutex::Autolock _l(mDecryptLock);
53727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (mDecryptSessionMap.indexOfKey(decryptHandle->decryptId) != NAME_NOT_FOUND) {
53827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        IDrmEngine* drmEngine = mDecryptSessionMap.valueFor(decryptHandle->decryptId);
53927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        result = drmEngine->pread(uniqueId, decryptHandle, buffer, numBytes, offset);
54027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
54127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return result;
54227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
54327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
54427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 DrmManager::getSupportedPlugInId(
54527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const String8& path, const String8& mimeType) {
54627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    String8 plugInId("");
54727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
54827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (EMPTY_STRING != mimeType) {
54927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        plugInId = getSupportedPlugInId(mimeType);
55027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    } else {
55127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        plugInId = getSupportedPlugInIdFromPath(uniqueId, path);
55227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
55327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return plugInId;
55427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
55527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
55627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 DrmManager::getSupportedPlugInId(const String8& mimeType) {
55727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    String8 plugInId("");
55827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
55927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (EMPTY_STRING != mimeType) {
56027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (unsigned int index = 0; index < mSupportInfoToPlugInIdMap.size(); index++) {
56127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const DrmSupportInfo& drmSupportInfo = mSupportInfoToPlugInIdMap.keyAt(index);
56227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
56327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (drmSupportInfo.isSupportedMimeType(mimeType)) {
56427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                plugInId = mSupportInfoToPlugInIdMap.valueFor(drmSupportInfo);
56527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                break;
56627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
56727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
56827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
56927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return plugInId;
57027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
57127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
57227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 DrmManager::getSupportedPlugInIdFromPath(int uniqueId, const String8& path) {
57327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    String8 plugInId("");
57427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 fileSuffix = path.getPathExtension();
57527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
57627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    for (unsigned int index = 0; index < mSupportInfoToPlugInIdMap.size(); index++) {
57727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const DrmSupportInfo& drmSupportInfo = mSupportInfoToPlugInIdMap.keyAt(index);
57827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
57927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (drmSupportInfo.isSupportedFileSuffix(fileSuffix)) {
58027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            String8 key = mSupportInfoToPlugInIdMap.valueFor(drmSupportInfo);
58127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            IDrmEngine& drmEngine = mPlugInManager.getPlugIn(key);
58227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
58327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (drmEngine.canHandle(uniqueId, path)) {
58427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                plugInId = key;
58527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                break;
58627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
58727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
58827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
58927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return plugInId;
59027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
59127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
59227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManager::onInfo(const DrmInfoEvent& event) {
5930e0a5f9e0b7a7ca618e8a1f7ccecc57a17e0d1e2Gloria Wang    Mutex::Autolock _l(mListenerLock);
59427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    for (unsigned int index = 0; index < mServiceListeners.size(); index++) {
59527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        int uniqueId = mServiceListeners.keyAt(index);
59627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
59727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (uniqueId == event.getUniqueId()) {
59827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            sp<IDrmServiceListener> serviceListener = mServiceListeners.valueFor(uniqueId);
59927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            serviceListener->notify(event);
60027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
60127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
60227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
60327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
604