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