127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi/* 227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Copyright (C) 2010 The Android Open Source Project 327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * 427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Licensed under the Apache License, Version 2.0 (the "License"); 527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * you may not use this file except in compliance with the License. 627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * You may obtain a copy of the License at 727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * 827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * http://www.apache.org/licenses/LICENSE-2.0 927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * 1027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Unless required by applicable law or agreed to in writing, software 1127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * distributed under the License is distributed on an "AS IS" BASIS, 1227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * See the License for the specific language governing permissions and 1427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * limitations under the License. 1527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi */ 1627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#ifndef __DRM_MANAGER_H__ 1827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define __DRM_MANAGER_H__ 1927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/Errors.h> 2127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/threads.h> 2227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/drm_framework_common.h> 2327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "IDrmEngine.h" 2427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "PlugInManager.h" 2527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "IDrmServiceListener.h" 2627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshinamespace android { 2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass IDrmManager; 3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass DrmRegistrationInfo; 3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass DrmUnregistrationInfo; 3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass DrmRightsAcquisitionInfo; 3327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass DrmConstraints; 343473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimiclass DrmMetadata; 3527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass DrmRights; 3627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass DrmInfo; 3727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass DrmInfoStatus; 3827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass DrmConvertedStatus; 3927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass DrmInfoRequest; 4027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass DrmSupportInfo; 4127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass ActionDescription; 4227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi/** 4427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * This is implementation class for DRM Manager. This class delegates the 4527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * functionality to corresponding DRM Engine. 4627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * 4727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * The DrmManagerService class creates an instance of this class. 4827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * 4927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi */ 5027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass DrmManager : public IDrmEngine::OnInfoListener { 5127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshipublic: 5227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmManager(); 5327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi virtual ~DrmManager(); 5427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 5527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshipublic: 568f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang int addUniqueId(bool isNative); 572272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 582272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi void removeUniqueId(int uniqueId); 5927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 60e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi void addClient(int uniqueId); 6127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 62e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi void removeClient(int uniqueId); 63e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 64e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi status_t loadPlugIns(); 65e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 66e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi status_t loadPlugIns(const String8& plugInDirPath); 67e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 68e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi status_t unloadPlugIns(); 6927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t setDrmServiceListener( 7127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const sp<IDrmServiceListener>& drmServiceListener); 7227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConstraints* getConstraints(int uniqueId, const String8* path, const int action); 7427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 753473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi DrmMetadata* getMetadata(int uniqueId, const String8* path); 763473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 7727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bool canHandle(int uniqueId, const String8& path, const String8& mimeType); 7827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoStatus* processDrmInfo(int uniqueId, const DrmInfo* drmInfo); 8027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 8127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo* acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest); 8227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 832272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t saveRights(int uniqueId, const DrmRights& drmRights, 8427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8& rightsPath, const String8& contentPath); 8527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 86bf5b3b29e31b293313788d7464cfb258ac0da803James Dong String8 getOriginalMimeType(int uniqueId, const String8& path, int fd); 8727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 8827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType); 8927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int checkRightsStatus(int uniqueId, const String8& path, int action); 9127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 922272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t consumeRights(int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve); 9327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 942272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t setPlaybackStatus( 95a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position); 9627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bool validateAction( 9827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, int action, const ActionDescription& description); 9927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1002272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t removeRights(int uniqueId, const String8& path); 10127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1022272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t removeAllRights(int uniqueId); 10327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int openConvertSession(int uniqueId, const String8& mimeType); 10527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* convertData(int uniqueId, int convertId, const DrmBuffer* inputData); 10727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* closeConvertSession(int uniqueId, int convertId); 10927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t getAllSupportInfo(int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray); 11127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1129d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong DecryptHandle* openDecryptSession( 1139d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong int uniqueId, int fd, off64_t offset, off64_t length, const char* mime); 11427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1159d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong DecryptHandle* openDecryptSession(int uniqueId, const char* uri, const char* mime); 116e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 117cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi DecryptHandle* openDecryptSession(int uniqueId, const DrmBuffer& buf, 118cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi const String8& mimeType); 119cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi 1202272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle); 12127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1222272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, 12327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int decryptUnitId, const DrmBuffer* headerInfo); 12427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1252272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t decrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, 1262272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV); 12727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1282272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t finalizeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId); 12927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ssize_t pread(int uniqueId, DecryptHandle* decryptHandle, 131a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang void* buffer, ssize_t numBytes, off64_t offset); 13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi void onInfo(const DrmInfoEvent& event); 13427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiprivate: 13627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 getSupportedPlugInId(int uniqueId, const String8& path, const String8& mimeType); 13727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 getSupportedPlugInId(const String8& mimeType); 13927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi String8 getSupportedPlugInIdFromPath(int uniqueId, const String8& path); 14127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bool canHandle(int uniqueId, const String8& path); 14327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiprivate: 14513f7fe763b9ad52fc27f21ed923c46b9555a321fHenrik B Andersson enum { 14613f7fe763b9ad52fc27f21ed923c46b9555a321fHenrik B Andersson kMaxNumUniqueIds = 0x1000, 14713f7fe763b9ad52fc27f21ed923c46b9555a321fHenrik B Andersson }; 14813f7fe763b9ad52fc27f21ed923c46b9555a321fHenrik B Andersson 14913f7fe763b9ad52fc27f21ed923c46b9555a321fHenrik B Andersson bool mUniqueIdArray[kMaxNumUniqueIds]; 15027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi static const String8 EMPTY_STRING; 15127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 15227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int mDecryptSessionId; 15327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int mConvertId; 15427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Mutex mLock; 1550e0a5f9e0b7a7ca618e8a1f7ccecc57a17e0d1e2Gloria Wang Mutex mListenerLock; 15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Mutex mDecryptLock; 15727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Mutex mConvertLock; 15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi TPlugInManager<IDrmEngine> mPlugInManager; 15927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi KeyedVector< DrmSupportInfo, String8 > mSupportInfoToPlugInIdMap; 16027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi KeyedVector< int, IDrmEngine*> mConvertSessionMap; 16127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi KeyedVector< int, sp<IDrmServiceListener> > mServiceListeners; 16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi KeyedVector< int, IDrmEngine*> mDecryptSessionMap; 16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}; 16427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}; 16627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#endif /* __DRM_MANAGER_H__ */ 16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 169