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_SERVICE_H__
1827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define __DRM_MANAGER_SERVICE_H__
1927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/RefBase.h>
2127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/KeyedVector.h>
2227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <binder/IInterface.h>
2327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <binder/Parcel.h>
2427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "IDrmManagerService.h"
2527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "IDrmServiceListener.h"
2627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshinamespace android {
2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass DrmManager;
3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass String8;
3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass Mutex;
3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi/**
3427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * This is the implementation class for DRM manager service. This delegates
3527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * the responsibility to DrmManager.
3627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
3727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * The instance of this class is created while starting the DRM manager service.
3827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
3927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi */
4027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiclass DrmManagerService : public BnDrmManagerService {
4127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshipublic:
4227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    static void instantiate();
4327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiprivate:
4527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmManagerService();
4627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    virtual ~DrmManagerService();
4727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshipublic:
498f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang    int addUniqueId(bool isNative);
502272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
512272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    void removeUniqueId(int uniqueId);
522272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
53e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    void addClient(int uniqueId);
5427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
55e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    void removeClient(int uniqueId);
5627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
5727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    status_t setDrmServiceListener(
5827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const sp<IDrmServiceListener>& drmServiceListener);
5927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    status_t installDrmEngine(int uniqueId, const String8& drmEngineFile);
6127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConstraints* getConstraints(int uniqueId, const String8* path, const int action);
6327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
643473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    DrmMetadata* getMetadata(int uniqueId, const String8* path);
653473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
6627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    bool canHandle(int uniqueId, const String8& path, const String8& mimeType);
6727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfoStatus* processDrmInfo(int uniqueId, const DrmInfo* drmInfo);
6927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfo* acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest);
7127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
722272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t saveRights(int uniqueId, const DrmRights& drmRights,
7327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8& rightsPath, const String8& contentPath);
7427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
75bf5b3b29e31b293313788d7464cfb258ac0da803James Dong    String8 getOriginalMimeType(int uniqueId, const String8& path, int fd);
7627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int getDrmObjectType(int uniqueId, const String8& path, const String8& mimeType);
7827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int checkRightsStatus(int uniqueId, const String8& path,int action);
8027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
812272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t consumeRights(int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve);
8227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
832272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t setPlaybackStatus(
84a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position);
8527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
8627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    bool validateAction(int uniqueId, const String8& path,
8727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int action, const ActionDescription& description);
8827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
892272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t removeRights(int uniqueId, const String8& path);
9027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
912272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t removeAllRights(int uniqueId);
9227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
9327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int openConvertSession(int uniqueId, const String8& mimeType);
9427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
9527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConvertedStatus* convertData(int uniqueId, int convertId, const DrmBuffer* inputData);
9627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
9727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConvertedStatus* closeConvertSession(int uniqueId, int convertId);
9827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
9927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    status_t getAllSupportInfo(int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray);
10027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1019d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    DecryptHandle* openDecryptSession(
1029d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        int uniqueId, int fd, off64_t offset, off64_t length, const char *mime);
10327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1049d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    DecryptHandle* openDecryptSession(
1059d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        int uniqueId, const char* uri, const char* mime);
106e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
107cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    DecryptHandle* openDecryptSession(int uniqueId, const DrmBuffer& buf,
108cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi            const String8& mimeType);
109cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi
1102272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle);
11127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1122272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle,
11327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int decryptUnitId, const DrmBuffer* headerInfo);
11427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1152272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t decrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,
1162272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV);
11727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1182272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    status_t finalizeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId);
11927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
12027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    ssize_t pread(int uniqueId, DecryptHandle* decryptHandle,
121a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            void* buffer, ssize_t numBytes, off64_t offset);
12227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1238635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong    virtual status_t dump(int fd, const Vector<String16>& args);
1248635b7b095fbf7ffc63d3ce791891a9116ace1f6James Dong
12527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiprivate:
12627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmManager* mDrmManager;
12727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi};
12827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
12927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi};
13027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#endif /* __DRM_MANAGER_SERVICE_H__ */
13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
133