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 "DrmManagerClientImpl(Native)" 1927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/Log.h> 2027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/String8.h> 2227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/Vector.h> 2327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <binder/IServiceManager.h> 24927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski#include <cutils/properties.h> 2527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "DrmManagerClientImpl.h" 27927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski#include "NoOpDrmManagerClientImpl.h" 2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiusing namespace android; 3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define INVALID_VALUE -1 3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 338d2577b9ac2f95f218db59a78447efd3c6a742ddGloria WangMutex DrmManagerClientImpl::sMutex; 348d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wangsp<IDrmManagerService> DrmManagerClientImpl::sDrmManagerService; 358d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wangsp<DrmManagerClientImpl::DeathNotifier> DrmManagerClientImpl::sDeathNotifier; 3627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiconst String8 DrmManagerClientImpl::EMPTY_STRING(""); 3727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 388f00151cbe693d52f3e233757c57fab3b6396d21Gloria WangDrmManagerClientImpl* DrmManagerClientImpl::create( 398f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang int* pUniqueId, bool isNative) { 40927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski sp<IDrmManagerService> service = getDrmManagerService(); 41927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski if (service != NULL) { 42927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski *pUniqueId = getDrmManagerService()->addUniqueId(isNative); 43927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski return new DrmManagerClientImpl(); 44927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski } 45927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski return new NoOpDrmManagerClientImpl(); 4627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 4727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManagerClientImpl::remove(int uniqueId) { 492272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi getDrmManagerService()->removeUniqueId(uniqueId); 5027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 5127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 5227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiconst sp<IDrmManagerService>& DrmManagerClientImpl::getDrmManagerService() { 538d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang Mutex::Autolock lock(sMutex); 548d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang if (NULL == sDrmManagerService.get()) { 55927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski char value[PROPERTY_VALUE_MAX]; 56927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski if (property_get("drm.service.enabled", value, NULL) == 0) { 57927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski // Drm is undefined for this device 58927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski return sDrmManagerService; 59927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski } 60927634a98167e24241b89d80a1ea4511c0bb9cd1Adam Lesinski 6127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi sp<IServiceManager> sm = defaultServiceManager(); 6227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi sp<IBinder> binder; 6327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi do { 6427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi binder = sm->getService(String16("drm.drmManager")); 6527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (binder != 0) { 6627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi break; 6727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 685ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("DrmManagerService not published, waiting..."); 6927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi struct timespec reqt; 7027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reqt.tv_sec = 0; 7127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reqt.tv_nsec = 500000000; //0.5 sec 7227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi nanosleep(&reqt, NULL); 7327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } while (true); 748d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang if (NULL == sDeathNotifier.get()) { 758d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang sDeathNotifier = new DeathNotifier(); 768d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang } 778d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang binder->linkToDeath(sDeathNotifier); 788d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang sDrmManagerService = interface_cast<IDrmManagerService>(binder); 7927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 808d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang return sDrmManagerService; 8127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 8227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 83e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid DrmManagerClientImpl::addClient(int uniqueId) { 84e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi getDrmManagerService()->addClient(uniqueId); 8527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 8627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 87e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid DrmManagerClientImpl::removeClient(int uniqueId) { 88e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi getDrmManagerService()->removeClient(uniqueId); 8927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 9027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerClientImpl::setOnInfoListener( 92b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang int uniqueId, 93b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang const sp<DrmManagerClient::OnInfoListener>& infoListener) { 9427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Mutex::Autolock _l(mLock); 9527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mOnInfoListener = infoListener; 96c618b5af98dec06d49374a61a5a94016f9fec2d3Takeshi Aimi return getDrmManagerService()->setDrmServiceListener(uniqueId, 97c618b5af98dec06d49374a61a5a94016f9fec2d3Takeshi Aimi (NULL != infoListener.get()) ? this : NULL); 9827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 9927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConstraints* DrmManagerClientImpl::getConstraints( 10127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8* path, const int action) { 10227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConstraints *drmConstraints = NULL; 10327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if ((NULL != path) && (EMPTY_STRING != *path)) { 104b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang drmConstraints = 105b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang getDrmManagerService()->getConstraints(uniqueId, path, action); 10627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 10727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConstraints; 10827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 10927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1103473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi AimiDrmMetadata* DrmManagerClientImpl::getMetadata(int uniqueId, const String8* path) { 1113473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi DrmMetadata *drmMetadata = NULL; 1123473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if ((NULL != path) && (EMPTY_STRING != *path)) { 1133473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi drmMetadata = getDrmManagerService()->getMetadata(uniqueId, path); 1143473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 1153473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi return drmMetadata; 1163473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi} 1173473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 118b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wangbool DrmManagerClientImpl::canHandle( 119b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang int uniqueId, const String8& path, const String8& mimeType) { 12027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bool retCode = false; 12127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if ((EMPTY_STRING != path) || (EMPTY_STRING != mimeType)) { 12227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi retCode = getDrmManagerService()->canHandle(uniqueId, path, mimeType); 12327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 12427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return retCode; 12527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 12627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 127b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria WangDrmInfoStatus* DrmManagerClientImpl::processDrmInfo( 128b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang int uniqueId, const DrmInfo* drmInfo) { 12927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoStatus *drmInfoStatus = NULL; 13027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfo) { 13127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfoStatus = getDrmManagerService()->processDrmInfo(uniqueId, drmInfo); 13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmInfoStatus; 13427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 13527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 136b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria WangDrmInfo* DrmManagerClientImpl::acquireDrmInfo( 137b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang int uniqueId, const DrmInfoRequest* drmInfoRequest) { 13827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo* drmInfo = NULL; 13927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfoRequest) { 14027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfo = getDrmManagerService()->acquireDrmInfo(uniqueId, drmInfoRequest); 14127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 14227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmInfo; 14327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1452272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerClientImpl::saveRights(int uniqueId, const DrmRights& drmRights, 14627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8& rightsPath, const String8& contentPath) { 1478d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang return getDrmManagerService()->saveRights( 148b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang uniqueId, drmRights, rightsPath, contentPath); 14927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 15027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 151b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria WangString8 DrmManagerClientImpl::getOriginalMimeType( 152bf5b3b29e31b293313788d7464cfb258ac0da803James Dong int uniqueId, const String8& path, int fd) { 15327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 mimeType = EMPTY_STRING; 15427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != path) { 155bf5b3b29e31b293313788d7464cfb258ac0da803James Dong mimeType = getDrmManagerService()->getOriginalMimeType(uniqueId, path, fd); 15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 15727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mimeType; 15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 15927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManagerClientImpl::getDrmObjectType( 16127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, const String8& mimeType) { 16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int drmOjectType = DrmObjectType::UNKNOWN; 16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if ((EMPTY_STRING != path) || (EMPTY_STRING != mimeType)) { 164b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang drmOjectType = 165b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang getDrmManagerService()->getDrmObjectType(uniqueId, path, mimeType); 16627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmOjectType; 16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 17027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManagerClientImpl::checkRightsStatus( 17127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, int action) { 17227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int rightsStatus = RightsStatus::RIGHTS_INVALID; 17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != path) { 174b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang rightsStatus = 175b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang getDrmManagerService()->checkRightsStatus(uniqueId, path, action); 17627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 17727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return rightsStatus; 17827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 17927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1802272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerClientImpl::consumeRights( 181b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang int uniqueId, sp<DecryptHandle> &decryptHandle, 182b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang int action, bool reserve) { 1832272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t status = DRM_ERROR_UNKNOWN; 184b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang if (NULL != decryptHandle.get()) { 185b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang status = getDrmManagerService()->consumeRights( 186b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang uniqueId, decryptHandle.get(), action, reserve); 18727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 1882272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return status; 18927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 19027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1912272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerClientImpl::setPlaybackStatus( 192b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang int uniqueId, sp<DecryptHandle> &decryptHandle, 193b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang int playbackStatus, int64_t position) { 1942272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t status = DRM_ERROR_UNKNOWN; 195b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang if (NULL != decryptHandle.get()) { 1962272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status = getDrmManagerService()->setPlaybackStatus( 197b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang uniqueId, decryptHandle.get(), playbackStatus, position); 19827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 1992272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return status; 20027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 20127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 20227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool DrmManagerClientImpl::validateAction( 203b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang int uniqueId, const String8& path, 204b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang int action, const ActionDescription& description) { 20527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bool retCode = false; 20627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != path) { 207b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang retCode = getDrmManagerService()->validateAction( 208b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang uniqueId, path, action, description); 20927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 21027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return retCode; 21127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 21227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2132272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerClientImpl::removeRights(int uniqueId, const String8& path) { 2142272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t status = DRM_ERROR_UNKNOWN; 21527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != path) { 2162272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status = getDrmManagerService()->removeRights(uniqueId, path); 21727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 2182272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return status; 21927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 22027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2212272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerClientImpl::removeAllRights(int uniqueId) { 2222272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return getDrmManagerService()->removeAllRights(uniqueId); 22327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 22427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 225b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wangint DrmManagerClientImpl::openConvertSession( 226b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang int uniqueId, const String8& mimeType) { 22727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int retCode = INVALID_VALUE; 22827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != mimeType) { 22927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi retCode = getDrmManagerService()->openConvertSession(uniqueId, mimeType); 23027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 23127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return retCode; 23227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 23327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 23427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* DrmManagerClientImpl::convertData( 23527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int convertId, const DrmBuffer* inputData) { 23627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* drmConvertedStatus = NULL; 23727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != inputData) { 238b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang drmConvertedStatus = 239b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang getDrmManagerService()->convertData(uniqueId, convertId, inputData); 24027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 24127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConvertedStatus; 24227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 24327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 244b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria WangDrmConvertedStatus* DrmManagerClientImpl::closeConvertSession( 245b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang int uniqueId, int convertId) { 24627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return getDrmManagerService()->closeConvertSession(uniqueId, convertId); 24727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 24827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 24927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerClientImpl::getAllSupportInfo( 25027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) { 25127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = DRM_ERROR_UNKNOWN; 25227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if ((NULL != drmSupportInfoArray) && (NULL != length)) { 253b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang status = getDrmManagerService()->getAllSupportInfo( 254b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang uniqueId, length, drmSupportInfoArray); 25527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 25627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return status; 25727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 25827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 259b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wangsp<DecryptHandle> DrmManagerClientImpl::openDecryptSession( 2609d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong int uniqueId, int fd, off64_t offset, 2619d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong off64_t length, const char* mime) { 2629d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 2639d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong return getDrmManagerService()->openDecryptSession( 2649d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong uniqueId, fd, offset, length, mime); 26527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 26627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 267b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wangsp<DecryptHandle> DrmManagerClientImpl::openDecryptSession( 2689d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong int uniqueId, const char* uri, const char* mime) { 2699d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 270e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi DecryptHandle* handle = NULL; 271e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi if (NULL != uri) { 2729d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong handle = getDrmManagerService()->openDecryptSession(uniqueId, uri, mime); 273e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } 274e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi return handle; 275e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi} 276e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 277cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashisp<DecryptHandle> DrmManagerClientImpl::openDecryptSession( 278cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi int uniqueId, const DrmBuffer& buf, const String8& mimeType) { 279cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi return getDrmManagerService()->openDecryptSession(uniqueId, buf, mimeType); 280cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi} 281cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi 282b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wangstatus_t DrmManagerClientImpl::closeDecryptSession( 283b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang int uniqueId, sp<DecryptHandle> &decryptHandle) { 2842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t status = DRM_ERROR_UNKNOWN; 285b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang if (NULL != decryptHandle.get()) { 286b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang status = getDrmManagerService()->closeDecryptSession( 287b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang uniqueId, decryptHandle.get()); 28827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 2892272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return status; 29027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 29127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 292b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wangstatus_t DrmManagerClientImpl::initializeDecryptUnit( 293b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang int uniqueId, sp<DecryptHandle> &decryptHandle, 294b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang int decryptUnitId, const DrmBuffer* headerInfo) { 2952272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t status = DRM_ERROR_UNKNOWN; 296b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang if ((NULL != decryptHandle.get()) && (NULL != headerInfo)) { 2972272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status = getDrmManagerService()->initializeDecryptUnit( 298b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang uniqueId, decryptHandle.get(), decryptUnitId, headerInfo); 29927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 3002272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return status; 30127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 30227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 303b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wangstatus_t DrmManagerClientImpl::decrypt( 304b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang int uniqueId, sp<DecryptHandle> &decryptHandle, 305b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang int decryptUnitId, const DrmBuffer* encBuffer, 306b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang DrmBuffer** decBuffer, DrmBuffer* IV) { 30727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = DRM_ERROR_UNKNOWN; 308b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang if ((NULL != decryptHandle.get()) && (NULL != encBuffer) 30927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi && (NULL != decBuffer) && (NULL != *decBuffer)) { 31027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status = getDrmManagerService()->decrypt( 311b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang uniqueId, decryptHandle.get(), decryptUnitId, 312b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang encBuffer, decBuffer, IV); 31327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 31427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return status; 31527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 31627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3172272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerClientImpl::finalizeDecryptUnit( 318b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang int uniqueId, sp<DecryptHandle> &decryptHandle, int decryptUnitId) { 3192272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t status = DRM_ERROR_UNKNOWN; 320b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang if (NULL != decryptHandle.get()) { 321b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang status = getDrmManagerService()->finalizeDecryptUnit( 322b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang uniqueId, decryptHandle.get(), decryptUnitId); 32327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 3242272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return status; 32527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 32627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 327b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wangssize_t DrmManagerClientImpl::pread(int uniqueId, sp<DecryptHandle> &decryptHandle, 328a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang void* buffer, ssize_t numBytes, off64_t offset) { 32927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ssize_t retCode = INVALID_VALUE; 330b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang if ((NULL != decryptHandle.get()) && (NULL != buffer) && (0 < numBytes)) { 331b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang retCode = getDrmManagerService()->pread( 332b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang uniqueId, decryptHandle.get(), buffer, numBytes, offset); 33327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 33427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return retCode; 33527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 33627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 33727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerClientImpl::notify(const DrmInfoEvent& event) { 33827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != mOnInfoListener.get()) { 33927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Mutex::Autolock _l(mLock); 34027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi sp<DrmManagerClient::OnInfoListener> listener = mOnInfoListener; 34127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi listener->onInfo(event); 34227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 34327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 34427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 34527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3468d2577b9ac2f95f218db59a78447efd3c6a742ddGloria WangDrmManagerClientImpl::DeathNotifier::~DeathNotifier() { 3478d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang Mutex::Autolock lock(sMutex); 3488d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang if (NULL != sDrmManagerService.get()) { 34906b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen IInterface::asBinder(sDrmManagerService)->unlinkToDeath(this); 3508d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang } 3518d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang} 3528d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang 353c52ca479388f4b98da4a25850f552f9c54ccc1d2Aurimas Liutikasvoid DrmManagerClientImpl::DeathNotifier::binderDied( 354c52ca479388f4b98da4a25850f552f9c54ccc1d2Aurimas Liutikas const wp<IBinder>& /* who */) { 3558d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang Mutex::Autolock lock(sMutex); 3568d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang DrmManagerClientImpl::sDrmManagerService.clear(); 3575ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("DrmManager server died!"); 3588d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang} 3598d2577b9ac2f95f218db59a78447efd3c6a742ddGloria Wang 360