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