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_CLIENT_H__
18d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#define __DRM_MANAGER_CLIENT_H__
19d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
20c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi#include <utils/threads.h>
21d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include <binder/IInterface.h>
22d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include "drm_framework_common.h"
23d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
24d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshinamespace android {
25d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
26d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmInfo;
27d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmRights;
28dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimiclass DrmMetadata;
29d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmInfoEvent;
30d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmInfoStatus;
31d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmInfoRequest;
32d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmSupportInfo;
33d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmConstraints;
34d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmConvertedStatus;
35d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmManagerClientImpl;
36d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
37d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/**
38d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * The Native application will instantiate this class and access DRM Framework
39d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * services through this class.
40d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *
41d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */
42d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiclass DrmManagerClient {
43d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshipublic:
44d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    DrmManagerClient();
45d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
46d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    virtual ~DrmManagerClient();
47d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
48d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshipublic:
49d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    class OnInfoListener: virtual public RefBase {
50d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
51d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    public:
52f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi        virtual ~OnInfoListener() {}
53f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi
54f05913aaa0cc96eab32be3431de1a80d405527a1Takeshi Aimi    public:
55d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        virtual void onInfo(const DrmInfoEvent& event) = 0;
56d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    };
57d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
58d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/**
59d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * APIs which will be used by native modules (e.g. StageFright)
60d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *
61d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */
62d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshipublic:
63d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
64d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Open the decrypt session to decrypt the given protected content
65d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
66d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] fd File descriptor of the protected content to be decrypted
67d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] offset Start position of the content
68d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] length The length of the protected content
69d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return
70d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     Handle for the decryption session
71d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
72ae7752798a98fc81ff5e6ae69dde2137692106beGloria Wang    sp<DecryptHandle> openDecryptSession(int fd, off64_t offset, off64_t length);
73d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
74d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
75c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi     * Open the decrypt session to decrypt the given protected content
76c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi     *
77c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi     * @param[in] uri Path of the protected content to be decrypted
78c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi     * @return
79c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi     *     Handle for the decryption session
80c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi     */
81ae7752798a98fc81ff5e6ae69dde2137692106beGloria Wang    sp<DecryptHandle> openDecryptSession(const char* uri);
82c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi
83c7b3ccc564448cb4b918728421f9402bc18278c5Takeshi Aimi    /**
84d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Close the decrypt session for the given handle
85d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
86d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] decryptHandle Handle for the decryption session
87dc549d60f98d809f626c99de614960409a847054Takeshi Aimi     * @return status_t
88dc549d60f98d809f626c99de614960409a847054Takeshi Aimi     *     Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure
89d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
90ae7752798a98fc81ff5e6ae69dde2137692106beGloria Wang    status_t closeDecryptSession(sp<DecryptHandle> &decryptHandle);
91d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
92d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
93d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Consumes the rights for a content.
94d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * If the reserve parameter is true the rights is reserved until the same
95d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * application calls this api again with the reserve parameter set to false.
96d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
97d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] decryptHandle Handle for the decryption session
98d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] action Action to perform. (Action::DEFAULT, Action::PLAY, etc)
99d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] reserve True if the rights should be reserved.
100dc549d60f98d809f626c99de614960409a847054Takeshi Aimi     * @return status_t
101dc549d60f98d809f626c99de614960409a847054Takeshi Aimi     *     Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure.
102dc549d60f98d809f626c99de614960409a847054Takeshi Aimi     *     In case license has been expired, DRM_ERROR_LICENSE_EXPIRED will be returned.
103d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
104ae7752798a98fc81ff5e6ae69dde2137692106beGloria Wang    status_t consumeRights(sp<DecryptHandle> &decryptHandle, int action, bool reserve);
105d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
106d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
107d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Informs the DRM engine about the playback actions performed on the DRM files.
108d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
109d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] decryptHandle Handle for the decryption session
110d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] playbackStatus Playback action (Playback::START, Playback::STOP, Playback::PAUSE)
111d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] position Position in the file (in milliseconds) where the start occurs.
112dc549d60f98d809f626c99de614960409a847054Takeshi Aimi     *                     Only valid together with Playback::START.
113dc549d60f98d809f626c99de614960409a847054Takeshi Aimi     * @return status_t
114dc549d60f98d809f626c99de614960409a847054Takeshi Aimi     *     Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure
115d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
116ae7752798a98fc81ff5e6ae69dde2137692106beGloria Wang    status_t setPlaybackStatus(
117ae7752798a98fc81ff5e6ae69dde2137692106beGloria Wang            sp<DecryptHandle> &decryptHandle, int playbackStatus, int64_t position);
118d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
119d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
120d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Initialize decryption for the given unit of the protected content
121d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
122d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] decryptHandle Handle for the decryption session
123d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] decryptUnitId ID which specifies decryption unit, such as track ID
124d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] headerInfo Information for initializing decryption of this decrypUnit
125dc549d60f98d809f626c99de614960409a847054Takeshi Aimi     * @return status_t
126dc549d60f98d809f626c99de614960409a847054Takeshi Aimi     *     Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure
127d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
128dc549d60f98d809f626c99de614960409a847054Takeshi Aimi    status_t initializeDecryptUnit(
129ae7752798a98fc81ff5e6ae69dde2137692106beGloria Wang            sp<DecryptHandle> &decryptHandle, int decryptUnitId, const DrmBuffer* headerInfo);
130d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
131d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
132d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Decrypt the protected content buffers for the given unit
133d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * This method will be called any number of times, based on number of
134d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * encrypted streams received from application.
135d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
136d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] decryptHandle Handle for the decryption session
137d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] decryptUnitId ID which specifies decryption unit, such as track ID
138d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] encBuffer Encrypted data block
139d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[out] decBuffer Decrypted data block
140dc549d60f98d809f626c99de614960409a847054Takeshi Aimi     * @param[in] IV Optional buffer
141d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return status_t
142d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     Returns the error code for this API
143d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     DRM_NO_ERROR for success, and one of DRM_ERROR_UNKNOWN, DRM_ERROR_LICENSE_EXPIRED
144d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     DRM_ERROR_SESSION_NOT_OPENED, DRM_ERROR_DECRYPT_UNIT_NOT_INITIALIZED,
145d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     DRM_ERROR_DECRYPT for failure.
146d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
147d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    status_t decrypt(
148ae7752798a98fc81ff5e6ae69dde2137692106beGloria Wang            sp<DecryptHandle> &decryptHandle, int decryptUnitId,
149dc549d60f98d809f626c99de614960409a847054Takeshi Aimi            const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV = NULL);
150d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
151d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
152d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Finalize decryption for the given unit of the protected content
153d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
154d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] decryptHandle Handle for the decryption session
155d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] decryptUnitId ID which specifies decryption unit, such as track ID
156dc549d60f98d809f626c99de614960409a847054Takeshi Aimi     * @return status_t
157dc549d60f98d809f626c99de614960409a847054Takeshi Aimi     *     Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure
158d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
159ae7752798a98fc81ff5e6ae69dde2137692106beGloria Wang    status_t finalizeDecryptUnit(
160ae7752798a98fc81ff5e6ae69dde2137692106beGloria Wang            sp<DecryptHandle> &decryptHandle, int decryptUnitId);
161d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
162d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
163d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Reads the specified number of bytes from an open DRM file.
164d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
165d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] decryptHandle Handle for the decryption session
166d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[out] buffer Reference to the buffer that should receive the read data.
167d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] numBytes Number of bytes to read.
168d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] offset Offset with which to update the file position.
169d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
170d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return Number of bytes read. Returns -1 for Failure.
171d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
172ae7752798a98fc81ff5e6ae69dde2137692106beGloria Wang    ssize_t pread(sp<DecryptHandle> &decryptHandle,
173ae7752798a98fc81ff5e6ae69dde2137692106beGloria Wang            void* buffer, ssize_t numBytes, off64_t offset);
174d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
175d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
176d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Validates whether an action on the DRM content is allowed or not.
177d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
178d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] path Path of the protected content
179d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] action Action to validate. (Action::DEFAULT, Action::PLAY, etc)
180d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] description Detailed description of the action
181d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return true if the action is allowed.
182d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
183d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    bool validateAction(const String8& path, int action, const ActionDescription& description);
184d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
185d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/**
186d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * APIs which are just the underlying implementation for the Java API
187d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi *
188d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */
189d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshipublic:
190d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
191d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Register a callback to be invoked when the caller required to
192d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * receive necessary information
193d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
194d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] infoListener Listener
195d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return status_t
196d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure
197d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
198d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    status_t setOnInfoListener(const sp<DrmManagerClient::OnInfoListener>& infoListener);
199d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
200d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
201d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Get constraint information associated with input content
202d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
203d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] path Path of the protected content
204d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] action Actions defined such as,
205d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *             Action::DEFAULT, Action::PLAY, etc
206d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return DrmConstraints
207d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     key-value pairs of constraint are embedded in it
208d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @note
209d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     In case of error, return NULL
210d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
211d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    DrmConstraints* getConstraints(const String8* path, const int action);
212d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
213d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
214dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi     * Get metadata information associated with input content
215dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi     *
216dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi     * @param[in] path Path of the protected content
217dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi     * @return DrmMetadata
218dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi     *         key-value pairs of metadata
219dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi     * @note
220dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi     *     In case of error, return NULL
221dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi     */
222dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi    DrmMetadata* getMetadata(const String8* path);
223dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi
224dc91865622e3cc9ff0bb33b83f1d3b38cd7a6d7aTakeshi Aimi    /**
225d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Check whether the given mimetype or path can be handled
226d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
227d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] path Path of the content needs to be handled
228d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] mimetype Mimetype of the content needs to be handled
229d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return
230d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     True if DrmManager can handle given path or mime type.
231d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
232d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    bool canHandle(const String8& path, const String8& mimeType);
233d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
234d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
235d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Executes given drm information based on its type
236d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
237d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] drmInfo Information needs to be processed
238d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return DrmInfoStatus
239d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     instance as a result of processing given input
240d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
241d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    DrmInfoStatus* processDrmInfo(const DrmInfo* drmInfo);
242d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
243d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
244d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Retrieves necessary information for registration, unregistration or rights
245d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * acquisition information.
246d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
247d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] drmInfoRequest Request information to retrieve drmInfo
248d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return DrmInfo
249d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     instance as a result of processing given input
250d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
251d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    DrmInfo* acquireDrmInfo(const DrmInfoRequest* drmInfoRequest);
252d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
253d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
254d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Save DRM rights to specified rights path
255d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * and make association with content path
256d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
257d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] drmRights DrmRights to be saved
258d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] rightsPath File path where rights to be saved
259d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] contentPath File path where content was saved
260dc549d60f98d809f626c99de614960409a847054Takeshi Aimi     * @return status_t
261dc549d60f98d809f626c99de614960409a847054Takeshi Aimi     *     Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure
262d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
263dc549d60f98d809f626c99de614960409a847054Takeshi Aimi    status_t saveRights(
264d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi        const DrmRights& drmRights, const String8& rightsPath, const String8& contentPath);
265d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
266d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
267d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Retrieves the mime type embedded inside the original content
268d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
269d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] path the path of the protected content
270d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return String8
271d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     Returns mime-type of the original content, such as "video/mpeg"
272d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
273d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    String8 getOriginalMimeType(const String8& path);
274d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
275d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
276d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Retrieves the type of the protected object (content, rights, etc..)
277d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * by using specified path or mimetype. At least one parameter should be non null
278d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * to retrieve DRM object type
279d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
280d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] path Path of the content or null.
281d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] mimeType Mime type of the content or null.
282d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return type of the DRM content,
283d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     such as DrmObjectType::CONTENT, DrmObjectType::RIGHTS_OBJECT
284d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
285d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    int getDrmObjectType(const String8& path, const String8& mimeType);
286d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
287d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
288d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Check whether the given content has valid rights or not
289d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
290d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] path Path of the protected content
291d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] action Action to perform
292d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return the status of the rights for the protected content,
293d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     such as RightsStatus::RIGHTS_VALID, RightsStatus::RIGHTS_EXPIRED, etc.
294d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
295d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    int checkRightsStatus(const String8& path, int action);
296d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
297d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
298d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Removes the rights associated with the given protected content
299d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
300d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] path Path of the protected content
301dc549d60f98d809f626c99de614960409a847054Takeshi Aimi     * @return status_t
302dc549d60f98d809f626c99de614960409a847054Takeshi Aimi     *     Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure
303d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
304dc549d60f98d809f626c99de614960409a847054Takeshi Aimi    status_t removeRights(const String8& path);
305d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
306d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
307d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Removes all the rights information of each plug-in associated with
308d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * DRM framework. Will be used in master reset
309d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
310dc549d60f98d809f626c99de614960409a847054Takeshi Aimi     * @return status_t
311dc549d60f98d809f626c99de614960409a847054Takeshi Aimi     *     Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure
312d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
313dc549d60f98d809f626c99de614960409a847054Takeshi Aimi    status_t removeAllRights();
314d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
315d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
316d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * This API is for Forward Lock DRM.
317d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Each time the application tries to download a new DRM file
318d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * which needs to be converted, then the application has to
319d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * begin with calling this API.
320d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
321d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] convertId Handle for the convert session
322d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] mimeType Description/MIME type of the input data packet
323d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return Return handle for the convert session
324d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
325d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    int openConvertSession(const String8& mimeType);
326d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
327d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
328d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Passes the input data which need to be converted. The resultant
329d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * converted data and the status is returned in the DrmConvertedInfo
330d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * object. This method will be called each time there are new block
331d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * of data received by the application.
332d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
333d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] convertId Handle for the convert session
334d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] inputData Input Data which need to be converted
335d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return Return object contains the status of the data conversion,
336d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     the output converted data and offset. In this case the
337d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     application will ignore the offset information.
338d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
339d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    DrmConvertedStatus* convertData(int convertId, const DrmBuffer* inputData);
340d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
341d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
342d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * When there is no more data which need to be converted or when an
343d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * error occurs that time the application has to inform the Drm agent
344d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * via this API. Upon successful conversion of the complete data,
345d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * the agent will inform that where the header and body signature
346d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * should be added. This signature appending is needed to integrity
347d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * protect the converted file.
348d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
349d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[in] convertId Handle for the convert session
350d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return Return object contains the status of the data conversion,
351d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     the header and body signature data. It also informs
352d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     the application on which offset these signature data
353d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     should be appended.
354d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
355d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    DrmConvertedStatus* closeConvertSession(int convertId);
356d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
357d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    /**
358d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * Retrieves all DrmSupportInfo instance that native DRM framework can handle.
359d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * This interface is meant to be used by JNI layer
360d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *
361d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[out] length Number of elements in drmSupportInfoArray
362d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @param[out] drmSupportInfoArray Array contains all DrmSupportInfo
363d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     that native DRM framework can handle
364d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     * @return status_t
365d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     *     Returns DRM_NO_ERROR for success, DRM_ERROR_UNKNOWN for failure
366d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi     */
367d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    status_t getAllSupportInfo(int* length, DrmSupportInfo** drmSupportInfoArray);
368d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
369d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiprivate:
370d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi    int mUniqueId;
3714c87a75073987e30b36f6be781cd10f696876ba4Gloria Wang    sp<DrmManagerClientImpl> mDrmManagerClientImpl;
372d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi};
373d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
374d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi};
375d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
376d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#endif /* __DRM_MANAGER_CLIENT_H__ */
377d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi
378