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