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