Drm.cpp revision cc82dc6d500023eba6048616301a4b12682458db
1cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker/*
2cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * Copyright (C) 2013 The Android Open Source Project
3cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker *
4cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * Licensed under the Apache License, Version 2.0 (the "License");
5cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * you may not use this file except in compliance with the License.
6cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * You may obtain a copy of the License at
7cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker *
8cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker *      http://www.apache.org/licenses/LICENSE-2.0
9cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker *
10cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * Unless required by applicable law or agreed to in writing, software
11cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * distributed under the License is distributed on an "AS IS" BASIS,
12cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * See the License for the specific language governing permissions and
14cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * limitations under the License.
15cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker */
16cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
17cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker//#define LOG_NDEBUG 0
18cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#define LOG_TAG "Drm"
19cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <utils/Log.h>
20cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
21cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <dirent.h>
22cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <dlfcn.h>
23cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
24cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include "Drm.h"
25cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
26cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <media/drm/DrmAPI.h>
27cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <media/stagefright/foundation/ADebug.h>
28cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <media/stagefright/foundation/AString.h>
29cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <media/stagefright/foundation/hexdump.h>
30cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker#include <media/stagefright/MediaErrors.h>
31cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
32cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkernamespace android {
33cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
34cc82dc6d500023eba6048616301a4b12682458dbJeff TinkerKeyedVector<Vector<uint8_t>, String8> Drm::mUUIDToLibraryPathMap;
35cc82dc6d500023eba6048616301a4b12682458dbJeff TinkerKeyedVector<String8, wp<SharedLibrary> > Drm::mLibraryPathToOpenLibraryMap;
36cc82dc6d500023eba6048616301a4b12682458dbJeff TinkerMutex Drm::mMapLock;
37cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
38cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatic bool operator<(const Vector<uint8_t> &lhs, const Vector<uint8_t> &rhs) {
39cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (lhs.size() < rhs.size()) {
40cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return true;
41cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    } else if (lhs.size() > rhs.size()) {
42cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return false;
43cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
44cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
45cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return memcmp((void *)lhs.array(), (void *)rhs.array(), rhs.size()) < 0;
46cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
47cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
48cc82dc6d500023eba6048616301a4b12682458dbJeff TinkerDrm::Drm()
49cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    : mInitCheck(NO_INIT),
50cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker      mFactory(NULL),
51cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker      mPlugin(NULL) {
52cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
53cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
54cc82dc6d500023eba6048616301a4b12682458dbJeff TinkerDrm::~Drm() {
55cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    delete mPlugin;
56cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    mPlugin = NULL;
57cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    closeFactory();
58cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
59cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
60cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkervoid Drm::closeFactory() {
61cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    delete mFactory;
62cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    mFactory = NULL;
63cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    mLibrary.clear();
64cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
65cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
66cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::initCheck() const {
67cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mInitCheck;
68cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
69cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
70cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
71cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker/*
72cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * Search the plugins directory for a plugin that supports the scheme
73cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * specified by uuid
74cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker *
75cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * If found:
76cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker *    mLibrary holds a strong pointer to the dlopen'd library
77cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker *    mFactory is set to the library's factory method
78cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker *    mInitCheck is set to OK
79cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker *
80cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker * If not found:
81cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker *    mLibrary is cleared and mFactory are set to NULL
82cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker *    mInitCheck is set to an error (!OK)
83cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker */
84cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkervoid Drm::findFactoryForScheme(const uint8_t uuid[16]) {
85cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
86cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    closeFactory();
87cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
88cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    // lock static maps
89cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mMapLock);
90cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
91cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    // first check cache
92cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Vector<uint8_t> uuidVector;
93cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    uuidVector.appendArray(uuid, sizeof(uuid));
94cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    ssize_t index = mUUIDToLibraryPathMap.indexOfKey(uuidVector);
95cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (index >= 0) {
96cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        if (loadLibraryForScheme(mUUIDToLibraryPathMap[index], uuid)) {
97cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker            mInitCheck = OK;
98cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker            return;
99cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        } else {
100cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker            ALOGE("Failed to load from cached library path!");
101cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker            mInitCheck = ERROR_UNSUPPORTED;
102cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker            return;
103cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        }
104cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
105cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
106cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    // no luck, have to search
107cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    String8 dirPath("/vendor/lib/mediadrm");
108cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    DIR* pDir = opendir(dirPath.string());
109cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
110cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (pDir == NULL) {
111cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        mInitCheck = ERROR_UNSUPPORTED;
112cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        ALOGE("Failed to open plugin directory %s", dirPath.string());
113cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return;
114cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
115cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
116cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
117cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    struct dirent* pEntry;
118cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    while ((pEntry = readdir(pDir))) {
119cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
120cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        String8 pluginPath = dirPath + "/" + pEntry->d_name;
121cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
122cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        if (pluginPath.getPathExtension() == ".so") {
123cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
124cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker            if (loadLibraryForScheme(pluginPath, uuid)) {
125cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker                mUUIDToLibraryPathMap.add(uuidVector, pluginPath);
126cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker                mInitCheck = OK;
127cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker                closedir(pDir);
128cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker                return;
129cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker            }
130cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        }
131cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
132cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
133cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    closedir(pDir);
134cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
135cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    ALOGE("Failed to find drm plugin");
136cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    mInitCheck = ERROR_UNSUPPORTED;
137cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
138cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
139cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerbool Drm::loadLibraryForScheme(const String8 &path, const uint8_t uuid[16]) {
140cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
141cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    // get strong pointer to open shared library
142cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    ssize_t index = mLibraryPathToOpenLibraryMap.indexOfKey(path);
143cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (index >= 0) {
144cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        mLibrary = mLibraryPathToOpenLibraryMap[index].promote();
145cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    } else {
146cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        index = mLibraryPathToOpenLibraryMap.add(path, NULL);
147cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
148cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
149cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (!mLibrary.get()) {
150cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        mLibrary = new SharedLibrary(path);
151cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        if (!*mLibrary) {
152cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker            return false;
153cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        }
154cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
155cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        mLibraryPathToOpenLibraryMap.replaceValueAt(index, mLibrary);
156cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
157cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
158cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    typedef DrmFactory *(*CreateDrmFactoryFunc)();
159cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
160cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    CreateDrmFactoryFunc createDrmFactory =
161cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        (CreateDrmFactoryFunc)mLibrary->lookup("createDrmFactory");
162cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
163cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (createDrmFactory == NULL ||
164cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        (mFactory = createDrmFactory()) == NULL ||
165cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        !mFactory->isCryptoSchemeSupported(uuid)) {
166cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        closeFactory();
167cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return false;
168cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
169cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return true;
170cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
171cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
172cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerbool Drm::isCryptoSchemeSupported(const uint8_t uuid[16]) {
173cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
174cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
175cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mFactory && mFactory->isCryptoSchemeSupported(uuid)) {
176cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return true;
177cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
178cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
179cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    findFactoryForScheme(uuid);
180cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return (mInitCheck == OK);
181cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
182cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
183cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::createPlugin(const uint8_t uuid[16]) {
184cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
185cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
186cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin != NULL) {
187cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
188cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
189cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
190cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (!mFactory || !mFactory->isCryptoSchemeSupported(uuid)) {
191cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        findFactoryForScheme(uuid);
192cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
193cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
194cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
195cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
196cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
197cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
198cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mFactory->createDrmPlugin(uuid, &mPlugin);
199cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
200cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
201cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::destroyPlugin() {
202cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
203cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
204cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
205cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
206cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
207cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
208cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
209cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
210cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
211cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
212cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    delete mPlugin;
213cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    mPlugin = NULL;
214cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
215cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return OK;
216cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
217cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
218cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::openSession(Vector<uint8_t> &sessionId) {
219cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
220cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
221cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
222cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
223cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
224cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
225cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
226cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
227cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
228cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
229cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->openSession(sessionId);
230cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
231cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
232cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::closeSession(Vector<uint8_t> const &sessionId) {
233cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
234cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
235cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
236cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
237cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
238cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
239cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
240cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
241cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
242cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
243cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->closeSession(sessionId);
244cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
245cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
246cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::getLicenseRequest(Vector<uint8_t> const &sessionId,
247cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker                                Vector<uint8_t> const &initData,
248cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker                                String8 const &mimeType, DrmPlugin::LicenseType licenseType,
249cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker                                KeyedVector<String8, String8> const &optionalParameters,
250cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker                                Vector<uint8_t> &request, String8 &defaultUrl) {
251cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
252cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
253cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
254cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
255cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
256cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
257cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
258cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
259cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
260cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
261cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->getLicenseRequest(sessionId, initData, mimeType, licenseType,
262cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker                                      optionalParameters, request, defaultUrl);
263cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
264cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
265cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::provideLicenseResponse(Vector<uint8_t> const &sessionId,
266cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker                                     Vector<uint8_t> const &response) {
267cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
268cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
269cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
270cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
271cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
272cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
273cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
274cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
275cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
276cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
277cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->provideLicenseResponse(sessionId, response);
278cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
279cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
280cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::removeLicense(Vector<uint8_t> const &sessionId) {
281cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
282cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
283cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
284cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
285cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
286cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
287cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
288cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
289cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
290cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
291cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->removeLicense(sessionId);
292cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
293cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
294cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::queryLicenseStatus(Vector<uint8_t> const &sessionId,
295cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker                                 KeyedVector<String8, String8> &infoMap) const {
296cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
297cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
298cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
299cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
300cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
301cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
302cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
303cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
304cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
305cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
306cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->queryLicenseStatus(sessionId, infoMap);
307cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
308cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
309cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::getProvisionRequest(Vector<uint8_t> &request, String8 &defaultUrl) {
310cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
311cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
312cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
313cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
314cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
315cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
316cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
317cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
318cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
319cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
320cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->getProvisionRequest(request, defaultUrl);
321cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
322cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
323cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::provideProvisionResponse(Vector<uint8_t> const &response) {
324cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
325cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
326cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
327cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
328cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
329cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
330cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
331cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
332cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
333cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
334cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->provideProvisionResponse(response);
335cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
336cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
337cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
338cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::getSecureStops(List<Vector<uint8_t> > &secureStops) {
339cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
340cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
341cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
342cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
343cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
344cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
345cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
346cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
347cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
348cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
349cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->getSecureStops(secureStops);
350cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
351cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
352cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::releaseSecureStops(Vector<uint8_t> const &ssRelease) {
353cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
354cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
355cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
356cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
357cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
358cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
359cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
360cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
361cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
362cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
363cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->releaseSecureStops(ssRelease);
364cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
365cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
366cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::getPropertyString(String8 const &name, String8 &value ) const {
367cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
368cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
369cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
370cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
371cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
372cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
373cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
374cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
375cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
376cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
377cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->getPropertyString(name, value);
378cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
379cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
380cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::getPropertyByteArray(String8 const &name, Vector<uint8_t> &value ) const {
381cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
382cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
383cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
384cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
385cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
386cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
387cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
388cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
389cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
390cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
391cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->getPropertyByteArray(name, value);
392cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
393cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
394cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::setPropertyString(String8 const &name, String8 const &value ) const {
395cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
396cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
397cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
398cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
399cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
400cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
401cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
402cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
403cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
404cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
405cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->setPropertyString(name, value);
406cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
407cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
408cc82dc6d500023eba6048616301a4b12682458dbJeff Tinkerstatus_t Drm::setPropertyByteArray(String8 const &name,
409cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker                                   Vector<uint8_t> const &value ) const {
410cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    Mutex::Autolock autoLock(mLock);
411cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
412cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mInitCheck != OK) {
413cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return mInitCheck;
414cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
415cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
416cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    if (mPlugin == NULL) {
417cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker        return -EINVAL;
418cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    }
419cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
420cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker    return mPlugin->setPropertyByteArray(name, value);
421cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}
422cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker
423cc82dc6d500023eba6048616301a4b12682458dbJeff Tinker}  // namespace android
424