DrmManagerClientImpl.cpp revision 3473846f64f5b28e1cbeb70ef5867073fc93159e
190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 2f71323e297a928af368937089d3ed71239786f86Andreas Huber * Copyright (C) 2010 The Android Open Source Project 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4f71323e297a928af368937089d3ed71239786f86Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5f71323e297a928af368937089d3ed71239786f86Andreas Huber * you may not use this file except in compliance with the License. 6f71323e297a928af368937089d3ed71239786f86Andreas Huber * You may obtain a copy of the License at 7f71323e297a928af368937089d3ed71239786f86Andreas Huber * 8f71323e297a928af368937089d3ed71239786f86Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Unless required by applicable law or agreed to in writing, software 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * See the License for the specific language governing permissions and 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * limitations under the License. 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 161b362b15af34006e6a11974088a46d42b903418eJohann 1779f15823c34ae1e423108295e416213200bb280fAndreas Huber//#define LOG_NDEBUG 0 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define LOG_TAG "DrmManagerClientImpl(Native)" 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <utils/Log.h> 2079f15823c34ae1e423108295e416213200bb280fAndreas Huber 211b362b15af34006e6a11974088a46d42b903418eJohann#include <utils/String8.h> 2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <utils/Vector.h> 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <binder/IServiceManager.h> 2479f15823c34ae1e423108295e416213200bb280fAndreas Huber 2579f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "DrmManagerClientImpl.h" 2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 27f71323e297a928af368937089d3ed71239786f86Andreas Huberusing namespace android; 281b362b15af34006e6a11974088a46d42b903418eJohann 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define INVALID_VALUE -1 3079f15823c34ae1e423108295e416213200bb280fAndreas Huber 311b362b15af34006e6a11974088a46d42b903418eJohannMutex DrmManagerClientImpl::mMutex; 321b362b15af34006e6a11974088a46d42b903418eJohannsp<IDrmManagerService> DrmManagerClientImpl::mDrmManagerService; 331b362b15af34006e6a11974088a46d42b903418eJohannconst String8 DrmManagerClientImpl::EMPTY_STRING(""); 341b362b15af34006e6a11974088a46d42b903418eJohann 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberDrmManagerClientImpl* DrmManagerClientImpl::create(int* pUniqueId) { 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (0 == *pUniqueId) { 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int uniqueId = getDrmManagerService()->addUniqueId(*pUniqueId); 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *pUniqueId = uniqueId; 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber getDrmManagerService()->addUniqueId(*pUniqueId); 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return new DrmManagerClientImpl(); 4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid DrmManagerClientImpl::remove(int uniqueId) { 46ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang getDrmManagerService()->removeUniqueId(uniqueId); 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberconst sp<IDrmManagerService>& DrmManagerClientImpl::getDrmManagerService() { 5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mMutex.lock(); 511b362b15af34006e6a11974088a46d42b903418eJohann if (NULL == mDrmManagerService.get()) { 521b362b15af34006e6a11974088a46d42b903418eJohann sp<IServiceManager> sm = defaultServiceManager(); 5379f15823c34ae1e423108295e416213200bb280fAndreas Huber sp<IBinder> binder; 5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber do { 5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber binder = sm->getService(String16("drm.drmManager")); 5679f15823c34ae1e423108295e416213200bb280fAndreas Huber if (binder != 0) { 5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 5879f15823c34ae1e423108295e416213200bb280fAndreas Huber } 5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber LOGW("DrmManagerService not published, waiting..."); 601b362b15af34006e6a11974088a46d42b903418eJohann struct timespec reqt; 611b362b15af34006e6a11974088a46d42b903418eJohann reqt.tv_sec = 0; 621b362b15af34006e6a11974088a46d42b903418eJohann reqt.tv_nsec = 500000000; //0.5 sec 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber nanosleep(&reqt, NULL); 6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } while (true); 6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mDrmManagerService = interface_cast<IDrmManagerService>(binder); 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mMutex.unlock(); 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return mDrmManagerService; 7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid DrmManagerClientImpl::addClient(int uniqueId) { 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber getDrmManagerService()->addClient(uniqueId); 7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid DrmManagerClientImpl::removeClient(int uniqueId) { 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber getDrmManagerService()->removeClient(uniqueId); 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatus_t DrmManagerClientImpl::setOnInfoListener( 8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int uniqueId, const sp<DrmManagerClient::OnInfoListener>& infoListener) { 8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber Mutex::Autolock _l(mLock); 8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mOnInfoListener = infoListener; 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return getDrmManagerService()->setDrmServiceListener(uniqueId, this); 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatus_t DrmManagerClientImpl::installDrmEngine(int uniqueId, const String8& drmEngineFile) { 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber status_t status = DRM_ERROR_UNKNOWN; 8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (EMPTY_STRING != drmEngineFile) { 9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber status = getDrmManagerService()->installDrmEngine(uniqueId, drmEngineFile); 9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return status; 9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberDrmConstraints* DrmManagerClientImpl::getConstraints( 9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int uniqueId, const String8* path, const int action) { 9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber DrmConstraints *drmConstraints = NULL; 9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ((NULL != path) && (EMPTY_STRING != *path)) { 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber drmConstraints = getDrmManagerService()->getConstraints(uniqueId, path, action); 10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return drmConstraints; 10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberDrmMetadata* DrmManagerClientImpl::getMetadata(int uniqueId, const String8* path) { 10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber DrmMetadata *drmMetadata = NULL; 10679f15823c34ae1e423108295e416213200bb280fAndreas Huber if ((NULL != path) && (EMPTY_STRING != *path)) { 10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber drmMetadata = getDrmManagerService()->getMetadata(uniqueId, path); 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return drmMetadata; 11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberbool DrmManagerClientImpl::canHandle(int uniqueId, const String8& path, const String8& mimeType) { 11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber bool retCode = false; 1141b362b15af34006e6a11974088a46d42b903418eJohann if ((EMPTY_STRING != path) || (EMPTY_STRING != mimeType)) { 11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber retCode = getDrmManagerService()->canHandle(uniqueId, path, mimeType); 11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return retCode; 11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberDrmInfoStatus* DrmManagerClientImpl::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) { 12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber DrmInfoStatus *drmInfoStatus = NULL; 12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (NULL != drmInfo) { 12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber drmInfoStatus = getDrmManagerService()->processDrmInfo(uniqueId, drmInfo); 12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return drmInfoStatus; 12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberDrmInfo* DrmManagerClientImpl::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) { 12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber DrmInfo* drmInfo = NULL; 13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (NULL != drmInfoRequest) { 13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber drmInfo = getDrmManagerService()->acquireDrmInfo(uniqueId, drmInfoRequest); 13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return drmInfo; 13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatus_t DrmManagerClientImpl::saveRights(int uniqueId, const DrmRights& drmRights, 1371b362b15af34006e6a11974088a46d42b903418eJohann const String8& rightsPath, const String8& contentPath) { 13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber status_t status = DRM_ERROR_UNKNOWN; 13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (EMPTY_STRING != contentPath) { 1401b362b15af34006e6a11974088a46d42b903418eJohann status = getDrmManagerService()->saveRights(uniqueId, drmRights, rightsPath, contentPath); 1411b362b15af34006e6a11974088a46d42b903418eJohann } 14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return status; 1431b362b15af34006e6a11974088a46d42b903418eJohann} 1441b362b15af34006e6a11974088a46d42b903418eJohann 14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberString8 DrmManagerClientImpl::getOriginalMimeType(int uniqueId, const String8& path) { 1461b362b15af34006e6a11974088a46d42b903418eJohann String8 mimeType = EMPTY_STRING; 1471b362b15af34006e6a11974088a46d42b903418eJohann if (EMPTY_STRING != path) { 14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber mimeType = getDrmManagerService()->getOriginalMimeType(uniqueId, path); 1491b362b15af34006e6a11974088a46d42b903418eJohann } 1501b362b15af34006e6a11974088a46d42b903418eJohann return mimeType; 15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint DrmManagerClientImpl::getDrmObjectType( 15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int uniqueId, const String8& path, const String8& mimeType) { 15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int drmOjectType = DrmObjectType::UNKNOWN; 1561b362b15af34006e6a11974088a46d42b903418eJohann if ((EMPTY_STRING != path) || (EMPTY_STRING != mimeType)) { 1571b362b15af34006e6a11974088a46d42b903418eJohann drmOjectType = getDrmManagerService()->getDrmObjectType(uniqueId, path, mimeType); 1581b362b15af34006e6a11974088a46d42b903418eJohann } 15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return drmOjectType; 1601b362b15af34006e6a11974088a46d42b903418eJohann} 1611b362b15af34006e6a11974088a46d42b903418eJohann 1621b362b15af34006e6a11974088a46d42b903418eJohannint DrmManagerClientImpl::checkRightsStatus( 16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int uniqueId, const String8& path, int action) { 1641b362b15af34006e6a11974088a46d42b903418eJohann int rightsStatus = RightsStatus::RIGHTS_INVALID; 16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (EMPTY_STRING != path) { 16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber rightsStatus = getDrmManagerService()->checkRightsStatus(uniqueId, path, action); 16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return rightsStatus; 16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatus_t DrmManagerClientImpl::consumeRights( 17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) { 17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber status_t status = DRM_ERROR_UNKNOWN; 17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (NULL != decryptHandle) { 17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber status = getDrmManagerService()->consumeRights(uniqueId, decryptHandle, action, reserve); 17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return status; 17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatus_t DrmManagerClientImpl::setPlaybackStatus( 18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int position) { 18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber status_t status = DRM_ERROR_UNKNOWN; 18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (NULL != decryptHandle) { 18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber status = getDrmManagerService()->setPlaybackStatus( 18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber uniqueId, decryptHandle, playbackStatus, position); 18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return status; 18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberbool DrmManagerClientImpl::validateAction( 19179f15823c34ae1e423108295e416213200bb280fAndreas Huber int uniqueId, const String8& path, int action, const ActionDescription& description) { 19279f15823c34ae1e423108295e416213200bb280fAndreas Huber bool retCode = false; 19379f15823c34ae1e423108295e416213200bb280fAndreas Huber if (EMPTY_STRING != path) { 19479f15823c34ae1e423108295e416213200bb280fAndreas Huber retCode = getDrmManagerService()->validateAction(uniqueId, path, action, description); 19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return retCode; 19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatus_t DrmManagerClientImpl::removeRights(int uniqueId, const String8& path) { 20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber status_t status = DRM_ERROR_UNKNOWN; 20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (EMPTY_STRING != path) { 20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber status = getDrmManagerService()->removeRights(uniqueId, path); 20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return status; 20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatus_t DrmManagerClientImpl::removeAllRights(int uniqueId) { 20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return getDrmManagerService()->removeAllRights(uniqueId); 20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint DrmManagerClientImpl::openConvertSession(int uniqueId, const String8& mimeType) { 21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int retCode = INVALID_VALUE; 21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (EMPTY_STRING != mimeType) { 21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber retCode = getDrmManagerService()->openConvertSession(uniqueId, mimeType); 21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return retCode; 21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberDrmConvertedStatus* DrmManagerClientImpl::convertData( 22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int uniqueId, int convertId, const DrmBuffer* inputData) { 22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber DrmConvertedStatus* drmConvertedStatus = NULL; 222538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (NULL != inputData) { 223538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber drmConvertedStatus = getDrmManagerService()->convertData(uniqueId, convertId, inputData); 224538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 225538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber return drmConvertedStatus; 226538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} 227538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 228538f6170b788de7408b06efc6613dc98579aa6a6Andreas HuberDrmConvertedStatus* DrmManagerClientImpl::closeConvertSession(int uniqueId, int convertId) { 229538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber return getDrmManagerService()->closeConvertSession(uniqueId, convertId); 230538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} 231538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatus_t DrmManagerClientImpl::getAllSupportInfo( 23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) { 2341b362b15af34006e6a11974088a46d42b903418eJohann status_t status = DRM_ERROR_UNKNOWN; 23591037db265ecdd914a26e056cf69207b4f50924ehkuang if ((NULL != drmSupportInfoArray) && (NULL != length)) { 2361b362b15af34006e6a11974088a46d42b903418eJohann status = getDrmManagerService()->getAllSupportInfo(uniqueId, length, drmSupportInfoArray); 2371b362b15af34006e6a11974088a46d42b903418eJohann } 2381b362b15af34006e6a11974088a46d42b903418eJohann return status; 2391b362b15af34006e6a11974088a46d42b903418eJohann} 2401b362b15af34006e6a11974088a46d42b903418eJohann 2411b362b15af34006e6a11974088a46d42b903418eJohannDecryptHandle* DrmManagerClientImpl::openDecryptSession( 2421b362b15af34006e6a11974088a46d42b903418eJohann int uniqueId, int fd, int offset, int length) { 2431b362b15af34006e6a11974088a46d42b903418eJohann return getDrmManagerService()->openDecryptSession(uniqueId, fd, offset, length); 2441b362b15af34006e6a11974088a46d42b903418eJohann} 2451b362b15af34006e6a11974088a46d42b903418eJohann 2461b362b15af34006e6a11974088a46d42b903418eJohannDecryptHandle* DrmManagerClientImpl::openDecryptSession(int uniqueId, const char* uri) { 2471b362b15af34006e6a11974088a46d42b903418eJohann DecryptHandle* handle = NULL; 2481b362b15af34006e6a11974088a46d42b903418eJohann if (NULL != uri) { 2491b362b15af34006e6a11974088a46d42b903418eJohann handle = getDrmManagerService()->openDecryptSession(uniqueId, uri); 2501b362b15af34006e6a11974088a46d42b903418eJohann } 2511b362b15af34006e6a11974088a46d42b903418eJohann return handle; 2521b362b15af34006e6a11974088a46d42b903418eJohann} 2531b362b15af34006e6a11974088a46d42b903418eJohann 2541b362b15af34006e6a11974088a46d42b903418eJohannstatus_t DrmManagerClientImpl::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { 2551b362b15af34006e6a11974088a46d42b903418eJohann status_t status = DRM_ERROR_UNKNOWN; 2561b362b15af34006e6a11974088a46d42b903418eJohann if (NULL != decryptHandle) { 2571b362b15af34006e6a11974088a46d42b903418eJohann status = getDrmManagerService()->closeDecryptSession( uniqueId, decryptHandle); 2581b362b15af34006e6a11974088a46d42b903418eJohann } 2591b362b15af34006e6a11974088a46d42b903418eJohann return status; 2601b362b15af34006e6a11974088a46d42b903418eJohann} 2611b362b15af34006e6a11974088a46d42b903418eJohann 2621b362b15af34006e6a11974088a46d42b903418eJohannstatus_t DrmManagerClientImpl::initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, 2631b362b15af34006e6a11974088a46d42b903418eJohann int decryptUnitId, const DrmBuffer* headerInfo) { 2641b362b15af34006e6a11974088a46d42b903418eJohann status_t status = DRM_ERROR_UNKNOWN; 2651b362b15af34006e6a11974088a46d42b903418eJohann if ((NULL != decryptHandle) && (NULL != headerInfo)) { 2661b362b15af34006e6a11974088a46d42b903418eJohann status = getDrmManagerService()->initializeDecryptUnit( 2671b362b15af34006e6a11974088a46d42b903418eJohann uniqueId, decryptHandle, decryptUnitId, headerInfo); 2681b362b15af34006e6a11974088a46d42b903418eJohann } 2691b362b15af34006e6a11974088a46d42b903418eJohann return status; 2701b362b15af34006e6a11974088a46d42b903418eJohann} 2711b362b15af34006e6a11974088a46d42b903418eJohann 2721b362b15af34006e6a11974088a46d42b903418eJohannstatus_t DrmManagerClientImpl::decrypt(int uniqueId, DecryptHandle* decryptHandle, 2731b362b15af34006e6a11974088a46d42b903418eJohann int decryptUnitId, const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { 2741b362b15af34006e6a11974088a46d42b903418eJohann status_t status = DRM_ERROR_UNKNOWN; 2751b362b15af34006e6a11974088a46d42b903418eJohann if ((NULL != decryptHandle) && (NULL != encBuffer) 2761b362b15af34006e6a11974088a46d42b903418eJohann && (NULL != decBuffer) && (NULL != *decBuffer)) { 2771b362b15af34006e6a11974088a46d42b903418eJohann status = getDrmManagerService()->decrypt( 2781b362b15af34006e6a11974088a46d42b903418eJohann uniqueId, decryptHandle, decryptUnitId, encBuffer, decBuffer, IV); 2791b362b15af34006e6a11974088a46d42b903418eJohann } 2801b362b15af34006e6a11974088a46d42b903418eJohann return status; 2811b362b15af34006e6a11974088a46d42b903418eJohann} 2821b362b15af34006e6a11974088a46d42b903418eJohann 28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatus_t DrmManagerClientImpl::finalizeDecryptUnit( 284538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { 285ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang status_t status = DRM_ERROR_UNKNOWN; 286538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (NULL != decryptHandle) { 287538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber status 28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber = getDrmManagerService()->finalizeDecryptUnit(uniqueId, decryptHandle, decryptUnitId); 289538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 290ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return status; 291538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} 292538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberssize_t DrmManagerClientImpl::pread(int uniqueId, DecryptHandle* decryptHandle, 294538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber void* buffer, ssize_t numBytes, off_t offset) { 295ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ssize_t retCode = INVALID_VALUE; 296538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if ((NULL != decryptHandle) && (NULL != buffer) && (0 < numBytes)) { 297538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber retCode = getDrmManagerService()->pread(uniqueId, decryptHandle, buffer, numBytes, offset); 29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return retCode; 30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 30279f15823c34ae1e423108295e416213200bb280fAndreas Huberstatus_t DrmManagerClientImpl::notify(const DrmInfoEvent& event) { 30379f15823c34ae1e423108295e416213200bb280fAndreas Huber if (NULL != mOnInfoListener.get()) { 30479f15823c34ae1e423108295e416213200bb280fAndreas Huber Mutex::Autolock _l(mLock); 30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber sp<DrmManagerClient::OnInfoListener> listener = mOnInfoListener; 30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber listener->onInfo(event); 30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return DRM_NO_ERROR; 3091b362b15af34006e6a11974088a46d42b903418eJohann} 31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber