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