DrmManagerClientImpl.cpp revision 3473846f64f5b28e1cbeb70ef5867073fc93159e
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> 2427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "DrmManagerClientImpl.h" 2627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiusing namespace android; 2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define INVALID_VALUE -1 3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiMutex DrmManagerClientImpl::mMutex; 3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshisp<IDrmManagerService> DrmManagerClientImpl::mDrmManagerService; 3327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiconst String8 DrmManagerClientImpl::EMPTY_STRING(""); 3427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmManagerClientImpl* DrmManagerClientImpl::create(int* pUniqueId) { 3627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 == *pUniqueId) { 372272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi int uniqueId = getDrmManagerService()->addUniqueId(*pUniqueId); 3827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *pUniqueId = uniqueId; 392272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } else { 402272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi getDrmManagerService()->addUniqueId(*pUniqueId); 4127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 4227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return new DrmManagerClientImpl(); 4327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 4427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid DrmManagerClientImpl::remove(int uniqueId) { 462272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi getDrmManagerService()->removeUniqueId(uniqueId); 4727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 4827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiconst sp<IDrmManagerService>& DrmManagerClientImpl::getDrmManagerService() { 5027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mMutex.lock(); 5127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL == mDrmManagerService.get()) { 5227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi sp<IServiceManager> sm = defaultServiceManager(); 5327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi sp<IBinder> binder; 5427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi do { 5527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi binder = sm->getService(String16("drm.drmManager")); 5627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (binder != 0) { 5727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi break; 5827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 5927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGW("DrmManagerService not published, waiting..."); 6027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi struct timespec reqt; 6127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reqt.tv_sec = 0; 6227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reqt.tv_nsec = 500000000; //0.5 sec 6327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi nanosleep(&reqt, NULL); 6427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } while (true); 6527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mDrmManagerService = interface_cast<IDrmManagerService>(binder); 6727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 6827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mMutex.unlock(); 6927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mDrmManagerService; 7027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 7127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 72e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid DrmManagerClientImpl::addClient(int uniqueId) { 73e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi getDrmManagerService()->addClient(uniqueId); 7427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 7527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 76e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid DrmManagerClientImpl::removeClient(int uniqueId) { 77e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi getDrmManagerService()->removeClient(uniqueId); 7827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 7927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 8027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerClientImpl::setOnInfoListener( 8127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const sp<DrmManagerClient::OnInfoListener>& infoListener) { 8227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Mutex::Autolock _l(mLock); 8327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mOnInfoListener = infoListener; 8427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return getDrmManagerService()->setDrmServiceListener(uniqueId, this); 8527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 8627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 8727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerClientImpl::installDrmEngine(int uniqueId, const String8& drmEngineFile) { 8827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = DRM_ERROR_UNKNOWN; 8927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != drmEngineFile) { 9027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status = getDrmManagerService()->installDrmEngine(uniqueId, drmEngineFile); 9127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 9227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return status; 9327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 9427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConstraints* DrmManagerClientImpl::getConstraints( 9627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8* path, const int action) { 9727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConstraints *drmConstraints = NULL; 9827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if ((NULL != path) && (EMPTY_STRING != *path)) { 9927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConstraints = getDrmManagerService()->getConstraints(uniqueId, path, action); 10027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 10127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConstraints; 10227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 10327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1043473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi AimiDrmMetadata* DrmManagerClientImpl::getMetadata(int uniqueId, const String8* path) { 1053473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi DrmMetadata *drmMetadata = NULL; 1063473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if ((NULL != path) && (EMPTY_STRING != *path)) { 1073473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi drmMetadata = getDrmManagerService()->getMetadata(uniqueId, path); 1083473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 1093473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi return drmMetadata; 1103473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi} 1113473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 11227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool DrmManagerClientImpl::canHandle(int uniqueId, const String8& path, const String8& mimeType) { 11327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bool retCode = false; 11427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if ((EMPTY_STRING != path) || (EMPTY_STRING != mimeType)) { 11527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi retCode = getDrmManagerService()->canHandle(uniqueId, path, mimeType); 11627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 11727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return retCode; 11827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 11927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 12027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfoStatus* DrmManagerClientImpl::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) { 12127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoStatus *drmInfoStatus = NULL; 12227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfo) { 12327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfoStatus = getDrmManagerService()->processDrmInfo(uniqueId, drmInfo); 12427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 12527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmInfoStatus; 12627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 12727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 12827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfo* DrmManagerClientImpl::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) { 12927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo* drmInfo = NULL; 13027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfoRequest) { 13127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfo = getDrmManagerService()->acquireDrmInfo(uniqueId, drmInfoRequest); 13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmInfo; 13427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 13527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1362272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerClientImpl::saveRights(int uniqueId, const DrmRights& drmRights, 13727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8& rightsPath, const String8& contentPath) { 1382272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t status = DRM_ERROR_UNKNOWN; 13927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != contentPath) { 1402272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status = getDrmManagerService()->saveRights(uniqueId, drmRights, rightsPath, contentPath); 14127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 1422272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return status; 14327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 DrmManagerClientImpl::getOriginalMimeType(int uniqueId, const String8& path) { 14627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 mimeType = EMPTY_STRING; 14727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != path) { 14827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi mimeType = getDrmManagerService()->getOriginalMimeType(uniqueId, path); 14927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 15027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return mimeType; 15127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 15227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 15327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManagerClientImpl::getDrmObjectType( 15427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, const String8& mimeType) { 15527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int drmOjectType = DrmObjectType::UNKNOWN; 15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if ((EMPTY_STRING != path) || (EMPTY_STRING != mimeType)) { 15727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmOjectType = getDrmManagerService()->getDrmObjectType(uniqueId, path, mimeType); 15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 15927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmOjectType; 16027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 16127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManagerClientImpl::checkRightsStatus( 16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, int action) { 16427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int rightsStatus = RightsStatus::RIGHTS_INVALID; 16527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != path) { 16627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi rightsStatus = getDrmManagerService()->checkRightsStatus(uniqueId, path, action); 16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return rightsStatus; 16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 17027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1712272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerClientImpl::consumeRights( 17227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) { 1732272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t status = DRM_ERROR_UNKNOWN; 17427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle) { 1752272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status = getDrmManagerService()->consumeRights(uniqueId, decryptHandle, action, reserve); 17627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 1772272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return status; 17827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 17927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1802272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerClientImpl::setPlaybackStatus( 18127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int position) { 1822272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t status = DRM_ERROR_UNKNOWN; 18327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle) { 1842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status = getDrmManagerService()->setPlaybackStatus( 18527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi uniqueId, decryptHandle, playbackStatus, position); 18627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 1872272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return status; 18827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 18927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 19027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool DrmManagerClientImpl::validateAction( 19127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, int action, const ActionDescription& description) { 19227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bool retCode = false; 19327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != path) { 19427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi retCode = getDrmManagerService()->validateAction(uniqueId, path, action, description); 19527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 19627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return retCode; 19727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 19827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1992272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerClientImpl::removeRights(int uniqueId, const String8& path) { 2002272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t status = DRM_ERROR_UNKNOWN; 20127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != path) { 2022272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status = getDrmManagerService()->removeRights(uniqueId, path); 20327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 2042272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return status; 20527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 20627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2072272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerClientImpl::removeAllRights(int uniqueId) { 2082272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return getDrmManagerService()->removeAllRights(uniqueId); 20927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 21027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 21127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint DrmManagerClientImpl::openConvertSession(int uniqueId, const String8& mimeType) { 21227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int retCode = INVALID_VALUE; 21327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (EMPTY_STRING != mimeType) { 21427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi retCode = getDrmManagerService()->openConvertSession(uniqueId, mimeType); 21527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 21627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return retCode; 21727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 21827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 21927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* DrmManagerClientImpl::convertData( 22027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int convertId, const DrmBuffer* inputData) { 22127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* drmConvertedStatus = NULL; 22227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != inputData) { 22327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConvertedStatus = getDrmManagerService()->convertData(uniqueId, convertId, inputData); 22427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 22527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConvertedStatus; 22627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 22727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 22827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* DrmManagerClientImpl::closeConvertSession(int uniqueId, int convertId) { 22927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return getDrmManagerService()->closeConvertSession(uniqueId, convertId); 23027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 23127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 23227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerClientImpl::getAllSupportInfo( 23327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) { 23427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = DRM_ERROR_UNKNOWN; 23527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if ((NULL != drmSupportInfoArray) && (NULL != length)) { 23627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status = getDrmManagerService()->getAllSupportInfo(uniqueId, length, drmSupportInfoArray); 23727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 23827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return status; 23927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 24027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 24127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDecryptHandle* DrmManagerClientImpl::openDecryptSession( 24227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int fd, int offset, int length) { 24327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return getDrmManagerService()->openDecryptSession(uniqueId, fd, offset, length); 24427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 24527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 246e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi AimiDecryptHandle* DrmManagerClientImpl::openDecryptSession(int uniqueId, const char* uri) { 247e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi DecryptHandle* handle = NULL; 248e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi if (NULL != uri) { 249e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi handle = getDrmManagerService()->openDecryptSession(uniqueId, uri); 250e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } 251e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi return handle; 252e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi} 253e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 2542272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerClientImpl::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { 2552272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t status = DRM_ERROR_UNKNOWN; 25627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle) { 2572272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status = getDrmManagerService()->closeDecryptSession( uniqueId, decryptHandle); 25827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 2592272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return status; 26027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 26127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2622272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerClientImpl::initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, 26327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int decryptUnitId, const DrmBuffer* headerInfo) { 2642272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t status = DRM_ERROR_UNKNOWN; 26527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if ((NULL != decryptHandle) && (NULL != headerInfo)) { 2662272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status = getDrmManagerService()->initializeDecryptUnit( 26727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi uniqueId, decryptHandle, decryptUnitId, headerInfo); 26827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 2692272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return status; 27027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 27127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 27227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerClientImpl::decrypt(int uniqueId, DecryptHandle* decryptHandle, 2732272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi int decryptUnitId, const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { 27427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = DRM_ERROR_UNKNOWN; 27527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if ((NULL != decryptHandle) && (NULL != encBuffer) 27627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi && (NULL != decBuffer) && (NULL != *decBuffer)) { 27727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status = getDrmManagerService()->decrypt( 2782272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi uniqueId, decryptHandle, decryptUnitId, encBuffer, decBuffer, IV); 27927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 28027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return status; 28127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 28227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2832272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t DrmManagerClientImpl::finalizeDecryptUnit( 28427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { 2852272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t status = DRM_ERROR_UNKNOWN; 28627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle) { 2872272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status 2882272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi = getDrmManagerService()->finalizeDecryptUnit(uniqueId, decryptHandle, decryptUnitId); 28927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 2902272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return status; 29127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 29227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 29327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshissize_t DrmManagerClientImpl::pread(int uniqueId, DecryptHandle* decryptHandle, 29427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi void* buffer, ssize_t numBytes, off_t offset) { 29527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ssize_t retCode = INVALID_VALUE; 29627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if ((NULL != decryptHandle) && (NULL != buffer) && (0 < numBytes)) { 29727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi retCode = getDrmManagerService()->pread(uniqueId, decryptHandle, buffer, numBytes, offset); 29827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 29927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return retCode; 30027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 30127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 30227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t DrmManagerClientImpl::notify(const DrmInfoEvent& event) { 30327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != mOnInfoListener.get()) { 30427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Mutex::Autolock _l(mLock); 30527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi sp<DrmManagerClient::OnInfoListener> listener = mOnInfoListener; 30627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi listener->onInfo(event); 30727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 30827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 30927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 31027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 311