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 "DrmManagerService(Native)" 1927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/Log.h> 2027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 213473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi#include <private/android_filesystem_config.h> 228635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong#include <media/MemoryLeakTrackUtil.h> 233473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 2427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <errno.h> 2527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/threads.h> 2627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <binder/IServiceManager.h> 273473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi#include <binder/IPCThreadState.h> 2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <sys/stat.h> 2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "DrmManagerService.h" 3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "DrmManager.h" 3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiusing namespace android; 3327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 343473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimistatic Vector<uid_t> trustedUids; 353473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 363473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimistatic bool isProtectedCallAllowed() { 371608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber return true; 383473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi} 393473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 4027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManagerService::instantiate() { 413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("instantiate"); 42e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi defaultServiceManager()->addService(String16("drm.drmManager"), new DrmManagerService()); 433473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 443473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (0 >= trustedUids.size()) { 453473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi // TODO 463473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi // Following implementation is just for reference. 473473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi // Each OEM manufacturer should implement/replace with their own solutions. 483473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 493473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi // Add trusted uids here 503473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi trustedUids.push(AID_MEDIA); 513473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 5227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 5327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 54e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi AimiDrmManagerService::DrmManagerService() : 55e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi mDrmManager(NULL) { 563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("created"); 5727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mDrmManager = new DrmManager(); 58e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi mDrmManager->loadPlugIns(); 5927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 6027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmManagerService::~DrmManagerService() { 623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Destroyed"); 63e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi mDrmManager->unloadPlugIns(); 6427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete mDrmManager; mDrmManager = NULL; 6527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 6627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 678f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wangint DrmManagerService::addUniqueId(bool isNative) { 688f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang return mDrmManager->addUniqueId(isNative); 692272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi} 702272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 712272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimivoid DrmManagerService::removeUniqueId(int uniqueId) { 722272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi mDrmManager->removeUniqueId(uniqueId); 732272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi} 742272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 75e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid DrmManagerService::addClient(int uniqueId) { 76e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi mDrmManager->addClient(uniqueId); 7727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 7827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 79e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid DrmManagerService::removeClient(int uniqueId) { 80e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi mDrmManager->removeClient(uniqueId); 8127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 8227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 8327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerService::setDrmServiceListener( 8427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) { 853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering setDrmServiceListener"); 8627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mDrmManager->setDrmServiceListener(uniqueId, drmServiceListener); 8727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 8827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 8927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConstraints* DrmManagerService::getConstraints( 9127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8* path, const int action) { 923856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering getConstraints from content"); 9327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->getConstraints(uniqueId, path, action); 9427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 9527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 963473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi AimiDrmMetadata* DrmManagerService::getMetadata(int uniqueId, const String8* path) { 973856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering getMetadata from content"); 983473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi return mDrmManager->getMetadata(uniqueId, path); 993473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi} 1003473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 10127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool DrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) { 1023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering canHandle"); 10327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->canHandle(uniqueId, path, mimeType); 10427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 10527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfoStatus* DrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) { 1073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering processDrmInfo"); 10827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->processDrmInfo(uniqueId, drmInfo); 10927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 11027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfo* DrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) { 1123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering acquireDrmInfo"); 11327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->acquireDrmInfo(uniqueId, drmInfoRequest); 11427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 11527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1162272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::saveRights( 11727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const DrmRights& drmRights, 11827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8& rightsPath, const String8& contentPath) { 1193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering saveRights"); 12027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->saveRights(uniqueId, drmRights, rightsPath, contentPath); 12127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 12227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 123bf5b3b29e31b293313788d7464cfb258ac0da803James DongString8 DrmManagerService::getOriginalMimeType(int uniqueId, const String8& path, int fd) { 1243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering getOriginalMimeType"); 125bf5b3b29e31b293313788d7464cfb258ac0da803James Dong return mDrmManager->getOriginalMimeType(uniqueId, path, fd); 12627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 12727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 12827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManagerService::getDrmObjectType( 12927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, const String8& mimeType) { 1303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering getDrmObjectType"); 13127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->getDrmObjectType(uniqueId, path, mimeType); 13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManagerService::checkRightsStatus( 13527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, int action) { 1363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering checkRightsStatus"); 13727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->checkRightsStatus(uniqueId, path, action); 13827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 13927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1402272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::consumeRights( 14127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) { 1423856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering consumeRights"); 143328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 144328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 145328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 1462272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->consumeRights(uniqueId, decryptHandle, action, reserve); 14727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 14827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1492272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::setPlaybackStatus( 150a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) { 1513856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering setPlaybackStatus"); 152328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 153328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 154328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 1552272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->setPlaybackStatus(uniqueId, decryptHandle, playbackStatus, position); 15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 15727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool DrmManagerService::validateAction( 15927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, 16027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int action, const ActionDescription& description) { 1613856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering validateAction"); 16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->validateAction(uniqueId, path, action, description); 16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 16427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1652272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::removeRights(int uniqueId, const String8& path) { 1663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering removeRights"); 1672272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->removeRights(uniqueId, path); 16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1702272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::removeAllRights(int uniqueId) { 1713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering removeAllRights"); 1722272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->removeAllRights(uniqueId); 17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 17427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 17527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) { 1763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering openConvertSession"); 17727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->openConvertSession(uniqueId, mimeType); 17827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 17927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 18027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* DrmManagerService::convertData( 18127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int convertId, const DrmBuffer* inputData) { 1823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering convertData"); 18327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->convertData(uniqueId, convertId, inputData); 18427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 18527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 18627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* DrmManagerService::closeConvertSession(int uniqueId, int convertId) { 1873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering closeConvertSession"); 18827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->closeConvertSession(uniqueId, convertId); 18927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 19027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 19127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerService::getAllSupportInfo( 19227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) { 1933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering getAllSupportInfo"); 19427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->getAllSupportInfo(uniqueId, length, drmSupportInfoArray); 19527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 19627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 19727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDecryptHandle* DrmManagerService::openDecryptSession( 1989d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) { 1993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering DrmManagerService::openDecryptSession"); 2003473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (isProtectedCallAllowed()) { 2019d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong return mDrmManager->openDecryptSession(uniqueId, fd, offset, length, mime); 2023473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 2033473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 2043473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi return NULL; 20527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 20627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 207e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi AimiDecryptHandle* DrmManagerService::openDecryptSession( 2089d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong int uniqueId, const char* uri, const char* mime) { 2093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering DrmManagerService::openDecryptSession with uri"); 2103473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (isProtectedCallAllowed()) { 2119d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong return mDrmManager->openDecryptSession(uniqueId, uri, mime); 2123473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 2133473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 2143473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi return NULL; 215e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi} 216e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 217cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei TakahashiDecryptHandle* DrmManagerService::openDecryptSession( 218cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi int uniqueId, const DrmBuffer& buf, const String8& mimeType) { 219cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi ALOGV("Entering DrmManagerService::openDecryptSession for streaming"); 220cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi if (isProtectedCallAllowed()) { 221cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi return mDrmManager->openDecryptSession(uniqueId, buf, mimeType); 222cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi } 223cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi 224cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi return NULL; 225cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi} 226cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi 2272272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { 2283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering closeDecryptSession"); 229328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 230328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 231328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 2322272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->closeDecryptSession(uniqueId, decryptHandle); 23327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 23427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2352272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, 23627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int decryptUnitId, const DrmBuffer* headerInfo) { 2373856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering initializeDecryptUnit"); 238328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 239328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 240328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 2412272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->initializeDecryptUnit(uniqueId,decryptHandle, decryptUnitId, headerInfo); 24227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 24327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 24427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerService::decrypt( 2452272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, 2462272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { 2473856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering decrypt"); 248328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 249328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 250328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 2512272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->decrypt(uniqueId, decryptHandle, decryptUnitId, encBuffer, decBuffer, IV); 25227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 25327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2542272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::finalizeDecryptUnit( 25527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { 2563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering finalizeDecryptUnit"); 257328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 258328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 259328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 2602272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->finalizeDecryptUnit(uniqueId, decryptHandle, decryptUnitId); 26127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 26227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 26327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshissize_t DrmManagerService::pread(int uniqueId, DecryptHandle* decryptHandle, 264a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang void* buffer, ssize_t numBytes, off64_t offset) { 2653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering pread"); 266328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 267328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 268328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 26927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->pread(uniqueId, decryptHandle, buffer, numBytes, offset); 27027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 27127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2728635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dongstatus_t DrmManagerService::dump(int fd, const Vector<String16>& args) 2738635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong{ 2748635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong const size_t SIZE = 256; 2758635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong char buffer[SIZE]; 2768635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong String8 result; 2778635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong if (checkCallingPermission(String16("android.permission.DUMP")) == false) { 2788635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong snprintf(buffer, SIZE, "Permission Denial: " 2798635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong "can't dump DrmManagerService from pid=%d, uid=%d\n", 2808635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong IPCThreadState::self()->getCallingPid(), 2818635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong IPCThreadState::self()->getCallingUid()); 2828635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong result.append(buffer); 2838635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong } else { 2848635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong#if DRM_MEMORY_LEAK_TRACK 2858635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong bool dumpMem = false; 2868635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong for (size_t i = 0; i < args.size(); i++) { 2878635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong if (args[i] == String16("-m")) { 2888635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong dumpMem = true; 2898635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong } 2908635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong } 2918635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong if (dumpMem) { 2928635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong dumpMemoryAddresses(fd); 2938635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong } 2948635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong#endif 2958635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong } 2968635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong write(fd, result.string(), result.size()); 2978635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong return NO_ERROR; 2988635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong} 2998635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong 300