DrmManager.h revision f355f18aa2cc1706761e373fe19298a9ccc9c75a
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/*
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * Copyright (C) 2010 The Android Open Source Project
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * Licensed under the Apache License, Version 2.0 (the "License");
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * you may not use this file except in compliance with the License.
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * You may obtain a copy of the License at
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *      http://www.apache.org/licenses/LICENSE-2.0
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * Unless required by applicable law or agreed to in writing, software
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * distributed under the License is distributed on an "AS IS" BASIS,
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * See the License for the specific language governing permissions and
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * limitations under the License.
155f54ac373b119a4c6693e4875c48aa761fba0c86Greg Clayton */
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef __DRM_MANAGER_H__
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define __DRM_MANAGER_H__
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <utils/Errors.h>
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <utils/threads.h>
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <drm/drm_framework_common.h>
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "IDrmEngine.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "PlugInManager.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "IDrmServiceListener.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace android {
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass IDrmManager;
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DrmRegistrationInfo;
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DrmUnregistrationInfo;
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DrmRightsAcquisitionInfo;
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DrmConstraints;
343508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Claytonclass DrmMetadata;
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DrmRights;
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DrmInfo;
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DrmInfoStatus;
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DrmConvertedStatus;
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DrmInfoRequest;
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DrmSupportInfo;
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ActionDescription;
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/**
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * This is implementation class for DRM Manager. This class delegates the
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * functionality to corresponding DRM Engine.
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner * The DrmManagerService class creates an instance of this class.
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner */
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DrmManager : public IDrmEngine::OnInfoListener {
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DrmManager();
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ~DrmManager();
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int addUniqueId(bool isNative);
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void removeUniqueId(int uniqueId);
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void addClient(int uniqueId);
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void removeClient(int uniqueId);
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    status_t loadPlugIns();
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    status_t loadPlugIns(const String8& plugInDirPath);
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    status_t unloadPlugIns();
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    status_t setDrmServiceListener(
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            int uniqueId, const sp<IDrmServiceListener>& drmServiceListener);
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DrmConstraints* getConstraints(int uniqueId, const String8* path, const int action);
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DrmMetadata* getMetadata(int uniqueId, const String8* path);
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool canHandle(int uniqueId, const String8& path, const String8& mimeType);
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DrmInfoStatus* processDrmInfo(int uniqueId, const DrmInfo* drmInfo);
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DrmInfo* acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest);
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    status_t saveRights(int uniqueId, const DrmRights& drmRights,
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const String8& rightsPath, const String8& contentPath);
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    String8 getOriginalMimeType(int uniqueId, const String8& path, int fd);
87eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType);
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9012bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    int checkRightsStatus(int uniqueId, const String8& path, int action);
9112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
9212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    status_t consumeRights(int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve);
93eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton
9412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    status_t setPlaybackStatus(
9512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton            int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position);
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool validateAction(
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            int uniqueId, const String8& path, int action, const ActionDescription& description);
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    status_t removeRights(int uniqueId, const String8& path);
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    status_t removeAllRights(int uniqueId);
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int openConvertSession(int uniqueId, const String8& mimeType);
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DrmConvertedStatus* convertData(int uniqueId, int convertId, const DrmBuffer* inputData);
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DrmConvertedStatus* closeConvertSession(int uniqueId, int convertId);
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    status_t getAllSupportInfo(int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray);
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DecryptHandle* openDecryptSession(
11372b7158235500ae6d4b69ed378cbc36bf6e5cbe1Greg Clayton            int uniqueId, int fd, off64_t offset, off64_t length, const char* mime);
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DecryptHandle* openDecryptSession(int uniqueId, const char* uri, const char* mime);
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DecryptHandle* openDecryptSession(int uniqueId, const DrmBuffer& buf,
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const String8& mimeType);
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle);
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle,
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            int decryptUnitId, const DrmBuffer* headerInfo);
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    status_t decrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV);
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    status_t finalizeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId);
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ssize_t pread(int uniqueId, DecryptHandle* decryptHandle,
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            void* buffer, ssize_t numBytes, off64_t offset);
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void onInfo(const DrmInfoEvent& event);
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    String8 getSupportedPlugInId(int uniqueId, const String8& path, const String8& mimeType);
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    String8 getSupportedPlugInId(const String8& mimeType);
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    String8 getSupportedPlugInIdFromPath(int uniqueId, const String8& path);
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool canHandle(int uniqueId, const String8& path);
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    enum {
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        kMaxNumUniqueIds = 0x1000,
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool mUniqueIdArray[kMaxNumUniqueIds];
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const String8 EMPTY_STRING;
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int mDecryptSessionId;
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int mConvertId;
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex mLock;
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex mListenerLock;
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex mDecryptLock;
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex mConvertLock;
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    TPlugInManager<IDrmEngine> mPlugInManager;
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    KeyedVector< DrmSupportInfo, String8 > mSupportInfoToPlugInIdMap;
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    KeyedVector< int, IDrmEngine*> mConvertSessionMap;
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    KeyedVector< int, sp<IDrmServiceListener> > mServiceListeners;
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    KeyedVector< int, IDrmEngine*> mDecryptSessionMap;
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif /* __DRM_MANAGER_H__ */
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner