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() { 37b710094cc9fe5eaf4b00b091ba024e2a6837a7c3Jeff Tinker // TODO 38b710094cc9fe5eaf4b00b091ba024e2a6837a7c3Jeff Tinker // Following implementation is just for reference. 39b710094cc9fe5eaf4b00b091ba024e2a6837a7c3Jeff Tinker // Each OEM manufacturer should implement/replace with their own solutions. 40b710094cc9fe5eaf4b00b091ba024e2a6837a7c3Jeff Tinker IPCThreadState* ipcState = IPCThreadState::self(); 41b710094cc9fe5eaf4b00b091ba024e2a6837a7c3Jeff Tinker uid_t uid = ipcState->getCallingUid(); 42b710094cc9fe5eaf4b00b091ba024e2a6837a7c3Jeff Tinker 43b710094cc9fe5eaf4b00b091ba024e2a6837a7c3Jeff Tinker for (unsigned int i = 0; i < trustedUids.size(); ++i) { 44b710094cc9fe5eaf4b00b091ba024e2a6837a7c3Jeff Tinker if (trustedUids[i] == uid) { 45b710094cc9fe5eaf4b00b091ba024e2a6837a7c3Jeff Tinker return true; 46b710094cc9fe5eaf4b00b091ba024e2a6837a7c3Jeff Tinker } 47b710094cc9fe5eaf4b00b091ba024e2a6837a7c3Jeff Tinker } 48b710094cc9fe5eaf4b00b091ba024e2a6837a7c3Jeff Tinker return false; 493473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi} 503473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 5127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManagerService::instantiate() { 523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("instantiate"); 53e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi defaultServiceManager()->addService(String16("drm.drmManager"), new DrmManagerService()); 543473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 553473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (0 >= trustedUids.size()) { 563473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi // TODO 573473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi // Following implementation is just for reference. 583473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi // Each OEM manufacturer should implement/replace with their own solutions. 593473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 603473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi // Add trusted uids here 613473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi trustedUids.push(AID_MEDIA); 623473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 6327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 6427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 65e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi AimiDrmManagerService::DrmManagerService() : 66e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi mDrmManager(NULL) { 673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("created"); 6827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mDrmManager = new DrmManager(); 69e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi mDrmManager->loadPlugIns(); 7027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 7127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmManagerService::~DrmManagerService() { 733856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Destroyed"); 74e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi mDrmManager->unloadPlugIns(); 7527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete mDrmManager; mDrmManager = NULL; 7627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 7727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 788f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wangint DrmManagerService::addUniqueId(bool isNative) { 798f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang return mDrmManager->addUniqueId(isNative); 802272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi} 812272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 822272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimivoid DrmManagerService::removeUniqueId(int uniqueId) { 832272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi mDrmManager->removeUniqueId(uniqueId); 842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi} 852272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 86e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid DrmManagerService::addClient(int uniqueId) { 87e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi mDrmManager->addClient(uniqueId); 8827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 8927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 90e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid DrmManagerService::removeClient(int uniqueId) { 91e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi mDrmManager->removeClient(uniqueId); 9227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 9327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerService::setDrmServiceListener( 9527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) { 963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering setDrmServiceListener"); 9727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mDrmManager->setDrmServiceListener(uniqueId, drmServiceListener); 9827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 9927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 10027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConstraints* DrmManagerService::getConstraints( 10227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8* path, const int action) { 1033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering getConstraints from content"); 10427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->getConstraints(uniqueId, path, action); 10527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 10627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1073473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi AimiDrmMetadata* DrmManagerService::getMetadata(int uniqueId, const String8* path) { 1083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering getMetadata from content"); 1093473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi return mDrmManager->getMetadata(uniqueId, path); 1103473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi} 1113473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 11227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool DrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) { 1133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering canHandle"); 11427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->canHandle(uniqueId, path, mimeType); 11527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 11627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfoStatus* DrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) { 1183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering processDrmInfo"); 11927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->processDrmInfo(uniqueId, drmInfo); 12027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 12127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 12227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfo* DrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) { 1233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering acquireDrmInfo"); 12427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->acquireDrmInfo(uniqueId, drmInfoRequest); 12527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 12627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1272272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::saveRights( 12827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const DrmRights& drmRights, 12927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8& rightsPath, const String8& contentPath) { 1303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering saveRights"); 13127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->saveRights(uniqueId, drmRights, rightsPath, contentPath); 13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 134bf5b3b29e31b293313788d7464cfb258ac0da803James DongString8 DrmManagerService::getOriginalMimeType(int uniqueId, const String8& path, int fd) { 1353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering getOriginalMimeType"); 136bf5b3b29e31b293313788d7464cfb258ac0da803James Dong return mDrmManager->getOriginalMimeType(uniqueId, path, fd); 13727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 13827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManagerService::getDrmObjectType( 14027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, const String8& mimeType) { 1413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering getDrmObjectType"); 14227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->getDrmObjectType(uniqueId, path, mimeType); 14327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManagerService::checkRightsStatus( 14627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, int action) { 1473856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering checkRightsStatus"); 14827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->checkRightsStatus(uniqueId, path, action); 14927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 15027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1512272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::consumeRights( 15227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) { 1533856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering consumeRights"); 154328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 155328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 156328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 1572272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->consumeRights(uniqueId, decryptHandle, action, reserve); 15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 15927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1602272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::setPlaybackStatus( 161a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) { 1623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering setPlaybackStatus"); 163328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 164328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 165328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 1662272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->setPlaybackStatus(uniqueId, decryptHandle, playbackStatus, position); 16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool DrmManagerService::validateAction( 17027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, 17127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int action, const ActionDescription& description) { 1723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering validateAction"); 17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->validateAction(uniqueId, path, action, description); 17427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 17527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1762272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::removeRights(int uniqueId, const String8& path) { 1773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering removeRights"); 1782272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->removeRights(uniqueId, path); 17927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 18027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1812272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::removeAllRights(int uniqueId) { 1823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering removeAllRights"); 1832272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->removeAllRights(uniqueId); 18427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 18527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 18627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) { 1873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering openConvertSession"); 18827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->openConvertSession(uniqueId, mimeType); 18927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 19027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 19127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* DrmManagerService::convertData( 19227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int convertId, const DrmBuffer* inputData) { 1933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering convertData"); 19427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->convertData(uniqueId, convertId, inputData); 19527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 19627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 19727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* DrmManagerService::closeConvertSession(int uniqueId, int convertId) { 1983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering closeConvertSession"); 19927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->closeConvertSession(uniqueId, convertId); 20027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 20127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 20227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerService::getAllSupportInfo( 20327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) { 2043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering getAllSupportInfo"); 20527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->getAllSupportInfo(uniqueId, length, drmSupportInfoArray); 20627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 20727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 20827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDecryptHandle* DrmManagerService::openDecryptSession( 2099d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) { 2103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering DrmManagerService::openDecryptSession"); 2113473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (isProtectedCallAllowed()) { 2129d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong return mDrmManager->openDecryptSession(uniqueId, fd, offset, length, mime); 2133473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 2143473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 2153473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi return NULL; 21627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 21727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 218e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi AimiDecryptHandle* DrmManagerService::openDecryptSession( 2199d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong int uniqueId, const char* uri, const char* mime) { 2203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering DrmManagerService::openDecryptSession with uri"); 2213473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (isProtectedCallAllowed()) { 2229d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong return mDrmManager->openDecryptSession(uniqueId, uri, mime); 2233473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 2243473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 2253473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi return NULL; 226e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi} 227e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 228cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei TakahashiDecryptHandle* DrmManagerService::openDecryptSession( 229cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi int uniqueId, const DrmBuffer& buf, const String8& mimeType) { 230cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi ALOGV("Entering DrmManagerService::openDecryptSession for streaming"); 231cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi if (isProtectedCallAllowed()) { 232cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi return mDrmManager->openDecryptSession(uniqueId, buf, mimeType); 233cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi } 234cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi 235cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi return NULL; 236cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi} 237cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi 2382272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { 2393856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering closeDecryptSession"); 240328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 241328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 242328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 2432272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->closeDecryptSession(uniqueId, decryptHandle); 24427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 24527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2462272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, 24727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int decryptUnitId, const DrmBuffer* headerInfo) { 2483856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering initializeDecryptUnit"); 249328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 250328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 251328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 2522272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->initializeDecryptUnit(uniqueId,decryptHandle, decryptUnitId, headerInfo); 25327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 25427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 25527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerService::decrypt( 2562272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, 2572272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { 2583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering decrypt"); 259328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 260328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 261328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 2622272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->decrypt(uniqueId, decryptHandle, decryptUnitId, encBuffer, decBuffer, IV); 26327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 26427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2652272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerService::finalizeDecryptUnit( 26627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { 2673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering finalizeDecryptUnit"); 268328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 269328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 270328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 2712272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return mDrmManager->finalizeDecryptUnit(uniqueId, decryptHandle, decryptUnitId); 27227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 27327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 27427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshissize_t DrmManagerService::pread(int uniqueId, DecryptHandle* decryptHandle, 275a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang void* buffer, ssize_t numBytes, off64_t offset) { 2763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering pread"); 277328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong if (!isProtectedCallAllowed()) { 278328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong return DRM_ERROR_NO_PERMISSION; 279328745b130c1c59e53d68a9a3c71675d3932d34bJames Dong } 28027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManager->pread(uniqueId, decryptHandle, buffer, numBytes, offset); 28127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 28227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2838635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dongstatus_t DrmManagerService::dump(int fd, const Vector<String16>& args) 2848635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong{ 2858635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong const size_t SIZE = 256; 2868635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong char buffer[SIZE]; 2878635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong String8 result; 2888635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong if (checkCallingPermission(String16("android.permission.DUMP")) == false) { 2898635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong snprintf(buffer, SIZE, "Permission Denial: " 2908635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong "can't dump DrmManagerService from pid=%d, uid=%d\n", 2918635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong IPCThreadState::self()->getCallingPid(), 2928635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong IPCThreadState::self()->getCallingUid()); 2938635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong result.append(buffer); 2948635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong } else { 2958635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong#if DRM_MEMORY_LEAK_TRACK 2968635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong bool dumpMem = false; 2978635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong for (size_t i = 0; i < args.size(); i++) { 2988635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong if (args[i] == String16("-m")) { 2998635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong dumpMem = true; 3008635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong } 3018635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong } 3028635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong if (dumpMem) { 3038635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong dumpMemoryAddresses(fd); 3048635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong } 3058635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong#endif 3068635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong } 3078635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong write(fd, result.string(), result.size()); 3088635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong return NO_ERROR; 3098635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong} 3108635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong 311