1d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/* 2d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Copyright (C) 2010 The Android Open Source Project 3d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 4d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Licensed under the Apache License, Version 2.0 (the "License"); 5d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * you may not use this file except in compliance with the License. 6d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * You may obtain a copy of the License at 7d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 8d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * http://www.apache.org/licenses/LICENSE-2.0 9d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 10d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Unless required by applicable law or agreed to in writing, software 11d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * distributed under the License is distributed on an "AS IS" BASIS, 12d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * See the License for the specific language governing permissions and 14d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * limitations under the License. 15d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 16d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 17d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#ifndef __DRM_MANAGER_H__ 18d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#define __DRM_MANAGER_H__ 19d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 20d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <utils/Errors.h> 21d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <utils/threads.h> 22d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <drm/drm_framework_common.h> 23d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include "IDrmEngine.h" 24d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include "PlugInManager.h" 25d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include "IDrmServiceListener.h" 26d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 27d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshinamespace android { 28d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 29d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass IDrmManager; 30d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmRegistrationInfo; 31d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmUnregistrationInfo; 32d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmRightsAcquisitionInfo; 33d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmConstraints; 34dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimiclass DrmMetadata; 35d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmRights; 36d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmInfo; 37d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmInfoStatus; 38d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmConvertedStatus; 39d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmInfoRequest; 40d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmSupportInfo; 41d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass ActionDescription; 42d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 43d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/** 44d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * This is implementation class for DRM Manager. This class delegates the 45d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * functionality to corresponding DRM Engine. 46d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 47d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * The DrmManagerService class creates an instance of this class. 48d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 49d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 50d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmManager : public IDrmEngine::OnInfoListener { 51d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshipublic: 52d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmManager(); 53d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi virtual ~DrmManager(); 54d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 55d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshipublic: 56a17d454fd0d20d14cf1fbc09f0f296cb6cbb870bGloria Wang int addUniqueId(bool isNative); 57dc549d60f98d809f626c99de614960409a847054Takeshi Aimi 58dc549d60f98d809f626c99de614960409a847054Takeshi Aimi void removeUniqueId(int uniqueId); 59d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 60c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi void addClient(int uniqueId); 61d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 62c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi void removeClient(int uniqueId); 63c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi 64c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi status_t loadPlugIns(); 65c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi 66c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi status_t loadPlugIns(const String8& plugInDirPath); 67c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi 68c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi status_t unloadPlugIns(); 69d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 70d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi status_t setDrmServiceListener( 71d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId, const sp<IDrmServiceListener>& drmServiceListener); 72d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 73d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi status_t installDrmEngine(int uniqueId, const String8& drmEngineFile); 74d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 75d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmConstraints* getConstraints(int uniqueId, const String8* path, const int action); 76d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 77dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi DrmMetadata* getMetadata(int uniqueId, const String8* path); 78dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi 79d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi bool canHandle(int uniqueId, const String8& path, const String8& mimeType); 80d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 81d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmInfoStatus* processDrmInfo(int uniqueId, const DrmInfo* drmInfo); 82d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 83d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmInfo* acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest); 84d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 85dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t saveRights(int uniqueId, const DrmRights& drmRights, 86d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi const String8& rightsPath, const String8& contentPath); 87d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 88d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 getOriginalMimeType(int uniqueId, const String8& path); 89d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 90d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType); 91d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 92d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int checkRightsStatus(int uniqueId, const String8& path, int action); 93d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 94dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t consumeRights(int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve); 95d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 96dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t setPlaybackStatus( 975fc3edb13edb058f14e6550d295ce3e50e5ebf8cGloria Wang int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position); 98d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 99d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi bool validateAction( 100d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int uniqueId, const String8& path, int action, const ActionDescription& description); 101d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 102dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t removeRights(int uniqueId, const String8& path); 103d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 104dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t removeAllRights(int uniqueId); 105d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 106d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int openConvertSession(int uniqueId, const String8& mimeType); 107d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 108d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmConvertedStatus* convertData(int uniqueId, int convertId, const DrmBuffer* inputData); 109d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 110d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi DrmConvertedStatus* closeConvertSession(int uniqueId, int convertId); 111d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 112d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi status_t getAllSupportInfo(int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray); 113d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 1145fc3edb13edb058f14e6550d295ce3e50e5ebf8cGloria Wang DecryptHandle* openDecryptSession(int uniqueId, int fd, off64_t offset, off64_t length); 115d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 116c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi DecryptHandle* openDecryptSession(int uniqueId, const char* uri); 117c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi 118dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle); 119d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 120dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, 121d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int decryptUnitId, const DrmBuffer* headerInfo); 122d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 123dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t decrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, 124dc549d60f98d809f626c99de614960409a847054Takeshi Aimi const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV); 125d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 126dc549d60f98d809f626c99de614960409a847054Takeshi Aimi status_t finalizeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId); 127d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 128d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi ssize_t pread(int uniqueId, DecryptHandle* decryptHandle, 1295fc3edb13edb058f14e6550d295ce3e50e5ebf8cGloria Wang void* buffer, ssize_t numBytes, off64_t offset); 130d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 131d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi void onInfo(const DrmInfoEvent& event); 132d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 133d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiprivate: 134d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 getSupportedPlugInId(int uniqueId, const String8& path, const String8& mimeType); 135d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 136d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 getSupportedPlugInId(const String8& mimeType); 137d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 138d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi String8 getSupportedPlugInIdFromPath(int uniqueId, const String8& path); 139d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 140d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi bool canHandle(int uniqueId, const String8& path); 141d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 142d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiprivate: 1435c96c65f692f8c2297d213c88450dd601d2b5c1fGloria Wang Vector<int> mUniqueIdVector; 144d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi static const String8 EMPTY_STRING; 145d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 146d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int mDecryptSessionId; 147d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi int mConvertId; 148d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Mutex mLock; 149192b591cdca78f258dd3260e41d7217f6fc6e36cGloria Wang Mutex mListenerLock; 150d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Mutex mDecryptLock; 151d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Mutex mConvertLock; 152d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi TPlugInManager<IDrmEngine> mPlugInManager; 153d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi KeyedVector< DrmSupportInfo, String8 > mSupportInfoToPlugInIdMap; 154d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi KeyedVector< int, IDrmEngine*> mConvertSessionMap; 155d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi KeyedVector< int, sp<IDrmServiceListener> > mServiceListeners; 156d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi KeyedVector< int, IDrmEngine*> mDecryptSessionMap; 157d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi}; 158d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 159d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi}; 160d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 161d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#endif /* __DRM_MANAGER_H__ */ 162d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 163