xref: /aosp_15_r20/frameworks/av/drm/common/IDrmManagerService.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2010 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
18*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "IDrmManagerService(Native)"
19*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
20*ec779b8eSAndroid Build Coastguard Worker 
21*ec779b8eSAndroid Build Coastguard Worker #include <stdint.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <sys/types.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <binder/IPCThreadState.h>
24*ec779b8eSAndroid Build Coastguard Worker 
25*ec779b8eSAndroid Build Coastguard Worker #include <drm/DrmInfo.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <drm/DrmConstraints.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <drm/DrmMetadata.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <drm/DrmRights.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <drm/DrmInfoStatus.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <drm/DrmConvertedStatus.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <drm/DrmInfoRequest.h>
32*ec779b8eSAndroid Build Coastguard Worker #include <drm/DrmSupportInfo.h>
33*ec779b8eSAndroid Build Coastguard Worker 
34*ec779b8eSAndroid Build Coastguard Worker #include "IDrmManagerService.h"
35*ec779b8eSAndroid Build Coastguard Worker 
36*ec779b8eSAndroid Build Coastguard Worker #define INVALID_BUFFER_LENGTH (-1)
37*ec779b8eSAndroid Build Coastguard Worker #define MAX_BINDER_TRANSACTION_SIZE ((1*1024*1024)-(4096*2))
38*ec779b8eSAndroid Build Coastguard Worker 
39*ec779b8eSAndroid Build Coastguard Worker using namespace android;
40*ec779b8eSAndroid Build Coastguard Worker 
writeDecryptHandleToParcelData(const sp<DecryptHandle> & handle,Parcel * data)41*ec779b8eSAndroid Build Coastguard Worker static void writeDecryptHandleToParcelData(
42*ec779b8eSAndroid Build Coastguard Worker         const sp<DecryptHandle>& handle, Parcel* data) {
43*ec779b8eSAndroid Build Coastguard Worker     data->writeInt32(handle->decryptId);
44*ec779b8eSAndroid Build Coastguard Worker     data->writeString8(handle->mimeType);
45*ec779b8eSAndroid Build Coastguard Worker     data->writeInt32(handle->decryptApiType);
46*ec779b8eSAndroid Build Coastguard Worker     data->writeInt32(handle->status);
47*ec779b8eSAndroid Build Coastguard Worker 
48*ec779b8eSAndroid Build Coastguard Worker     int size = handle->copyControlVector.size();
49*ec779b8eSAndroid Build Coastguard Worker     data->writeInt32(size);
50*ec779b8eSAndroid Build Coastguard Worker     for (int i = 0; i < size; i++) {
51*ec779b8eSAndroid Build Coastguard Worker         data->writeInt32(handle->copyControlVector.keyAt(i));
52*ec779b8eSAndroid Build Coastguard Worker         data->writeInt32(handle->copyControlVector.valueAt(i));
53*ec779b8eSAndroid Build Coastguard Worker     }
54*ec779b8eSAndroid Build Coastguard Worker 
55*ec779b8eSAndroid Build Coastguard Worker     size = handle->extendedData.size();
56*ec779b8eSAndroid Build Coastguard Worker     data->writeInt32(size);
57*ec779b8eSAndroid Build Coastguard Worker     for (int i = 0; i < size; i++) {
58*ec779b8eSAndroid Build Coastguard Worker         data->writeString8(handle->extendedData.keyAt(i));
59*ec779b8eSAndroid Build Coastguard Worker         data->writeString8(handle->extendedData.valueAt(i));
60*ec779b8eSAndroid Build Coastguard Worker     }
61*ec779b8eSAndroid Build Coastguard Worker 
62*ec779b8eSAndroid Build Coastguard Worker     if (NULL != handle->decryptInfo) {
63*ec779b8eSAndroid Build Coastguard Worker         data->writeInt32(handle->decryptInfo->decryptBufferLength);
64*ec779b8eSAndroid Build Coastguard Worker     } else {
65*ec779b8eSAndroid Build Coastguard Worker         data->writeInt32(INVALID_BUFFER_LENGTH);
66*ec779b8eSAndroid Build Coastguard Worker     }
67*ec779b8eSAndroid Build Coastguard Worker }
68*ec779b8eSAndroid Build Coastguard Worker 
readDecryptHandleFromParcelData(sp<DecryptHandle> & handle,const Parcel & data)69*ec779b8eSAndroid Build Coastguard Worker static void readDecryptHandleFromParcelData(
70*ec779b8eSAndroid Build Coastguard Worker         sp<DecryptHandle>& handle, const Parcel& data) {
71*ec779b8eSAndroid Build Coastguard Worker     if (0 == data.dataAvail()) {
72*ec779b8eSAndroid Build Coastguard Worker         return;
73*ec779b8eSAndroid Build Coastguard Worker     }
74*ec779b8eSAndroid Build Coastguard Worker 
75*ec779b8eSAndroid Build Coastguard Worker     handle->decryptId = data.readInt32();
76*ec779b8eSAndroid Build Coastguard Worker     handle->mimeType = data.readString8();
77*ec779b8eSAndroid Build Coastguard Worker     handle->decryptApiType = data.readInt32();
78*ec779b8eSAndroid Build Coastguard Worker     handle->status = data.readInt32();
79*ec779b8eSAndroid Build Coastguard Worker 
80*ec779b8eSAndroid Build Coastguard Worker     int size = data.readInt32();
81*ec779b8eSAndroid Build Coastguard Worker     for (int i = 0; i < size; i++) {
82*ec779b8eSAndroid Build Coastguard Worker         DrmCopyControl key = (DrmCopyControl)data.readInt32();
83*ec779b8eSAndroid Build Coastguard Worker         int value = data.readInt32();
84*ec779b8eSAndroid Build Coastguard Worker         handle->copyControlVector.add(key, value);
85*ec779b8eSAndroid Build Coastguard Worker     }
86*ec779b8eSAndroid Build Coastguard Worker 
87*ec779b8eSAndroid Build Coastguard Worker     size = data.readInt32();
88*ec779b8eSAndroid Build Coastguard Worker     for (int i = 0; i < size; i++) {
89*ec779b8eSAndroid Build Coastguard Worker         String8 key = data.readString8();
90*ec779b8eSAndroid Build Coastguard Worker         String8 value = data.readString8();
91*ec779b8eSAndroid Build Coastguard Worker         handle->extendedData.add(key, value);
92*ec779b8eSAndroid Build Coastguard Worker     }
93*ec779b8eSAndroid Build Coastguard Worker 
94*ec779b8eSAndroid Build Coastguard Worker     handle->decryptInfo = NULL;
95*ec779b8eSAndroid Build Coastguard Worker     const int bufferLen = data.readInt32();
96*ec779b8eSAndroid Build Coastguard Worker     if (INVALID_BUFFER_LENGTH != bufferLen) {
97*ec779b8eSAndroid Build Coastguard Worker         handle->decryptInfo = new DecryptInfo();
98*ec779b8eSAndroid Build Coastguard Worker         handle->decryptInfo->decryptBufferLength = bufferLen;
99*ec779b8eSAndroid Build Coastguard Worker     }
100*ec779b8eSAndroid Build Coastguard Worker }
101*ec779b8eSAndroid Build Coastguard Worker 
clearDecryptHandle(sp<DecryptHandle> & handle)102*ec779b8eSAndroid Build Coastguard Worker static void clearDecryptHandle(sp<DecryptHandle> &handle) {
103*ec779b8eSAndroid Build Coastguard Worker     if (handle == NULL) {
104*ec779b8eSAndroid Build Coastguard Worker         return;
105*ec779b8eSAndroid Build Coastguard Worker     }
106*ec779b8eSAndroid Build Coastguard Worker     if (handle->decryptInfo) {
107*ec779b8eSAndroid Build Coastguard Worker         delete handle->decryptInfo;
108*ec779b8eSAndroid Build Coastguard Worker         handle->decryptInfo = NULL;
109*ec779b8eSAndroid Build Coastguard Worker     }
110*ec779b8eSAndroid Build Coastguard Worker     handle->copyControlVector.clear();
111*ec779b8eSAndroid Build Coastguard Worker     handle->extendedData.clear();
112*ec779b8eSAndroid Build Coastguard Worker }
113*ec779b8eSAndroid Build Coastguard Worker 
addUniqueId(bool isNative)114*ec779b8eSAndroid Build Coastguard Worker int BpDrmManagerService::addUniqueId(bool isNative) {
115*ec779b8eSAndroid Build Coastguard Worker     ALOGV("add uniqueid");
116*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
117*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
118*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(isNative);
119*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(ADD_UNIQUEID, data, &reply);
120*ec779b8eSAndroid Build Coastguard Worker     return reply.readInt32();
121*ec779b8eSAndroid Build Coastguard Worker }
122*ec779b8eSAndroid Build Coastguard Worker 
removeUniqueId(int uniqueId)123*ec779b8eSAndroid Build Coastguard Worker void BpDrmManagerService::removeUniqueId(int uniqueId) {
124*ec779b8eSAndroid Build Coastguard Worker     ALOGV("remove uniqueid");
125*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
126*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
127*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
128*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(REMOVE_UNIQUEID, data, &reply);
129*ec779b8eSAndroid Build Coastguard Worker }
130*ec779b8eSAndroid Build Coastguard Worker 
addClient(int uniqueId)131*ec779b8eSAndroid Build Coastguard Worker void BpDrmManagerService::addClient(int uniqueId) {
132*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
133*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
134*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
135*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(ADD_CLIENT, data, &reply);
136*ec779b8eSAndroid Build Coastguard Worker }
137*ec779b8eSAndroid Build Coastguard Worker 
removeClient(int uniqueId)138*ec779b8eSAndroid Build Coastguard Worker void BpDrmManagerService::removeClient(int uniqueId) {
139*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
140*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
141*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
142*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(REMOVE_CLIENT, data, &reply);
143*ec779b8eSAndroid Build Coastguard Worker }
144*ec779b8eSAndroid Build Coastguard Worker 
setDrmServiceListener(int uniqueId,const sp<IDrmServiceListener> & drmServiceListener)145*ec779b8eSAndroid Build Coastguard Worker status_t BpDrmManagerService::setDrmServiceListener(
146*ec779b8eSAndroid Build Coastguard Worker             int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) {
147*ec779b8eSAndroid Build Coastguard Worker     ALOGV("setDrmServiceListener");
148*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
149*ec779b8eSAndroid Build Coastguard Worker 
150*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
151*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
152*ec779b8eSAndroid Build Coastguard Worker     data.writeStrongBinder(IInterface::asBinder(drmServiceListener));
153*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(SET_DRM_SERVICE_LISTENER, data, &reply);
154*ec779b8eSAndroid Build Coastguard Worker     return reply.readInt32();
155*ec779b8eSAndroid Build Coastguard Worker }
156*ec779b8eSAndroid Build Coastguard Worker 
getConstraints(int uniqueId,const String8 * path,const int action)157*ec779b8eSAndroid Build Coastguard Worker DrmConstraints* BpDrmManagerService::getConstraints(
158*ec779b8eSAndroid Build Coastguard Worker             int uniqueId, const String8* path, const int action) {
159*ec779b8eSAndroid Build Coastguard Worker     ALOGV("Get Constraints");
160*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
161*ec779b8eSAndroid Build Coastguard Worker 
162*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
163*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
164*ec779b8eSAndroid Build Coastguard Worker     data.writeString8(*path);
165*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(action);
166*ec779b8eSAndroid Build Coastguard Worker 
167*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(GET_CONSTRAINTS_FROM_CONTENT, data, &reply);
168*ec779b8eSAndroid Build Coastguard Worker 
169*ec779b8eSAndroid Build Coastguard Worker     DrmConstraints* drmConstraints = NULL;
170*ec779b8eSAndroid Build Coastguard Worker     if (0 != reply.dataAvail()) {
171*ec779b8eSAndroid Build Coastguard Worker         //Filling Drm Constraints
172*ec779b8eSAndroid Build Coastguard Worker         drmConstraints = new DrmConstraints();
173*ec779b8eSAndroid Build Coastguard Worker 
174*ec779b8eSAndroid Build Coastguard Worker         const int size = reply.readInt32();
175*ec779b8eSAndroid Build Coastguard Worker         for (int index = 0; index < size; ++index) {
176*ec779b8eSAndroid Build Coastguard Worker             const String8 key(reply.readString8());
177*ec779b8eSAndroid Build Coastguard Worker             const int bufferSize = reply.readInt32();
178*ec779b8eSAndroid Build Coastguard Worker             char* data = NULL;
179*ec779b8eSAndroid Build Coastguard Worker             if (0 < bufferSize) {
180*ec779b8eSAndroid Build Coastguard Worker                 data = new char[bufferSize];
181*ec779b8eSAndroid Build Coastguard Worker                 reply.read(data, bufferSize);
182*ec779b8eSAndroid Build Coastguard Worker                 drmConstraints->put(&key, data);
183*ec779b8eSAndroid Build Coastguard Worker                 delete[] data;
184*ec779b8eSAndroid Build Coastguard Worker             }
185*ec779b8eSAndroid Build Coastguard Worker         }
186*ec779b8eSAndroid Build Coastguard Worker     }
187*ec779b8eSAndroid Build Coastguard Worker     return drmConstraints;
188*ec779b8eSAndroid Build Coastguard Worker }
189*ec779b8eSAndroid Build Coastguard Worker 
getMetadata(int uniqueId,const String8 * path)190*ec779b8eSAndroid Build Coastguard Worker DrmMetadata* BpDrmManagerService::getMetadata(int uniqueId, const String8* path) {
191*ec779b8eSAndroid Build Coastguard Worker     ALOGV("Get Metadata");
192*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
193*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
194*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
195*ec779b8eSAndroid Build Coastguard Worker 
196*ec779b8eSAndroid Build Coastguard Worker     DrmMetadata* drmMetadata = NULL;
197*ec779b8eSAndroid Build Coastguard Worker     data.writeString8(*path);
198*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(GET_METADATA_FROM_CONTENT, data, &reply);
199*ec779b8eSAndroid Build Coastguard Worker 
200*ec779b8eSAndroid Build Coastguard Worker     if (0 != reply.dataAvail()) {
201*ec779b8eSAndroid Build Coastguard Worker         //Filling Drm Metadata
202*ec779b8eSAndroid Build Coastguard Worker         drmMetadata = new DrmMetadata();
203*ec779b8eSAndroid Build Coastguard Worker 
204*ec779b8eSAndroid Build Coastguard Worker         const int size = reply.readInt32();
205*ec779b8eSAndroid Build Coastguard Worker         for (int index = 0; index < size; ++index) {
206*ec779b8eSAndroid Build Coastguard Worker             const String8 key(reply.readString8());
207*ec779b8eSAndroid Build Coastguard Worker             const int bufferSize = reply.readInt32();
208*ec779b8eSAndroid Build Coastguard Worker             char* data = NULL;
209*ec779b8eSAndroid Build Coastguard Worker             if (0 < bufferSize) {
210*ec779b8eSAndroid Build Coastguard Worker                 data = new char[bufferSize];
211*ec779b8eSAndroid Build Coastguard Worker                 reply.read(data, bufferSize);
212*ec779b8eSAndroid Build Coastguard Worker                 drmMetadata->put(&key, data);
213*ec779b8eSAndroid Build Coastguard Worker                 delete[] data;
214*ec779b8eSAndroid Build Coastguard Worker             }
215*ec779b8eSAndroid Build Coastguard Worker         }
216*ec779b8eSAndroid Build Coastguard Worker     }
217*ec779b8eSAndroid Build Coastguard Worker     return drmMetadata;
218*ec779b8eSAndroid Build Coastguard Worker }
219*ec779b8eSAndroid Build Coastguard Worker 
canHandle(int uniqueId,const String8 & path,const String8 & mimeType)220*ec779b8eSAndroid Build Coastguard Worker bool BpDrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) {
221*ec779b8eSAndroid Build Coastguard Worker     ALOGV("Can Handle");
222*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
223*ec779b8eSAndroid Build Coastguard Worker 
224*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
225*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
226*ec779b8eSAndroid Build Coastguard Worker 
227*ec779b8eSAndroid Build Coastguard Worker     data.writeString8(path);
228*ec779b8eSAndroid Build Coastguard Worker     data.writeString8(mimeType);
229*ec779b8eSAndroid Build Coastguard Worker 
230*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(CAN_HANDLE, data, &reply);
231*ec779b8eSAndroid Build Coastguard Worker 
232*ec779b8eSAndroid Build Coastguard Worker     return static_cast<bool>(reply.readInt32());
233*ec779b8eSAndroid Build Coastguard Worker }
234*ec779b8eSAndroid Build Coastguard Worker 
processDrmInfo(int uniqueId,const DrmInfo * drmInfo)235*ec779b8eSAndroid Build Coastguard Worker DrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) {
236*ec779b8eSAndroid Build Coastguard Worker     ALOGV("Process DRM Info");
237*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
238*ec779b8eSAndroid Build Coastguard Worker 
239*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
240*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
241*ec779b8eSAndroid Build Coastguard Worker 
242*ec779b8eSAndroid Build Coastguard Worker     //Filling DRM info
243*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(drmInfo->getInfoType());
244*ec779b8eSAndroid Build Coastguard Worker     const DrmBuffer dataBuffer = drmInfo->getData();
245*ec779b8eSAndroid Build Coastguard Worker     const int dataBufferSize = dataBuffer.length;
246*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(dataBufferSize);
247*ec779b8eSAndroid Build Coastguard Worker     if (0 < dataBufferSize) {
248*ec779b8eSAndroid Build Coastguard Worker         data.write(dataBuffer.data, dataBufferSize);
249*ec779b8eSAndroid Build Coastguard Worker     }
250*ec779b8eSAndroid Build Coastguard Worker     data.writeString8(drmInfo->getMimeType());
251*ec779b8eSAndroid Build Coastguard Worker 
252*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(drmInfo->getCount());
253*ec779b8eSAndroid Build Coastguard Worker     DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
254*ec779b8eSAndroid Build Coastguard Worker 
255*ec779b8eSAndroid Build Coastguard Worker     while (keyIt.hasNext()) {
256*ec779b8eSAndroid Build Coastguard Worker         const String8 key = keyIt.next();
257*ec779b8eSAndroid Build Coastguard Worker         data.writeString8(key);
258*ec779b8eSAndroid Build Coastguard Worker         const String8 value = drmInfo->get(key);
259*ec779b8eSAndroid Build Coastguard Worker         data.writeString8((value == String8("")) ? String8("NULL") : value);
260*ec779b8eSAndroid Build Coastguard Worker     }
261*ec779b8eSAndroid Build Coastguard Worker 
262*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(PROCESS_DRM_INFO, data, &reply);
263*ec779b8eSAndroid Build Coastguard Worker 
264*ec779b8eSAndroid Build Coastguard Worker     DrmInfoStatus* drmInfoStatus = NULL;
265*ec779b8eSAndroid Build Coastguard Worker     if (0 != reply.dataAvail()) {
266*ec779b8eSAndroid Build Coastguard Worker         //Filling DRM Info Status
267*ec779b8eSAndroid Build Coastguard Worker         const int statusCode = reply.readInt32();
268*ec779b8eSAndroid Build Coastguard Worker         const int infoType = reply.readInt32();
269*ec779b8eSAndroid Build Coastguard Worker         const String8 mimeType = reply.readString8();
270*ec779b8eSAndroid Build Coastguard Worker 
271*ec779b8eSAndroid Build Coastguard Worker         DrmBuffer* drmBuffer = NULL;
272*ec779b8eSAndroid Build Coastguard Worker         if (0 != reply.dataAvail()) {
273*ec779b8eSAndroid Build Coastguard Worker             const int bufferSize = reply.readInt32();
274*ec779b8eSAndroid Build Coastguard Worker             char* data = NULL;
275*ec779b8eSAndroid Build Coastguard Worker             if (0 < bufferSize) {
276*ec779b8eSAndroid Build Coastguard Worker                 data = new char[bufferSize];
277*ec779b8eSAndroid Build Coastguard Worker                 reply.read(data, bufferSize);
278*ec779b8eSAndroid Build Coastguard Worker             }
279*ec779b8eSAndroid Build Coastguard Worker             drmBuffer = new DrmBuffer(data, bufferSize);
280*ec779b8eSAndroid Build Coastguard Worker         }
281*ec779b8eSAndroid Build Coastguard Worker         drmInfoStatus = new DrmInfoStatus(statusCode, infoType, drmBuffer, mimeType);
282*ec779b8eSAndroid Build Coastguard Worker     }
283*ec779b8eSAndroid Build Coastguard Worker     return drmInfoStatus;
284*ec779b8eSAndroid Build Coastguard Worker }
285*ec779b8eSAndroid Build Coastguard Worker 
acquireDrmInfo(int uniqueId,const DrmInfoRequest * drmInforequest)286*ec779b8eSAndroid Build Coastguard Worker DrmInfo* BpDrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) {
287*ec779b8eSAndroid Build Coastguard Worker     ALOGV("Acquire DRM Info");
288*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
289*ec779b8eSAndroid Build Coastguard Worker 
290*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
291*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
292*ec779b8eSAndroid Build Coastguard Worker 
293*ec779b8eSAndroid Build Coastguard Worker     //Filling DRM Info Request
294*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(drmInforequest->getInfoType());
295*ec779b8eSAndroid Build Coastguard Worker     data.writeString8(drmInforequest->getMimeType());
296*ec779b8eSAndroid Build Coastguard Worker 
297*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(drmInforequest->getCount());
298*ec779b8eSAndroid Build Coastguard Worker     DrmInfoRequest::KeyIterator keyIt = drmInforequest->keyIterator();
299*ec779b8eSAndroid Build Coastguard Worker 
300*ec779b8eSAndroid Build Coastguard Worker     while (keyIt.hasNext()) {
301*ec779b8eSAndroid Build Coastguard Worker         const String8 key = keyIt.next();
302*ec779b8eSAndroid Build Coastguard Worker         data.writeString8(key);
303*ec779b8eSAndroid Build Coastguard Worker         const String8 value = drmInforequest->get(key);
304*ec779b8eSAndroid Build Coastguard Worker         if (key == String8("FileDescriptorKey")) {
305*ec779b8eSAndroid Build Coastguard Worker             int fd = -1;
306*ec779b8eSAndroid Build Coastguard Worker             if (sscanf(value.c_str(), "FileDescriptor[%d]", &fd) != 1) {
307*ec779b8eSAndroid Build Coastguard Worker                 sscanf(value.c_str(), "%d", &fd);
308*ec779b8eSAndroid Build Coastguard Worker             }
309*ec779b8eSAndroid Build Coastguard Worker             data.writeFileDescriptor(fd);
310*ec779b8eSAndroid Build Coastguard Worker         } else {
311*ec779b8eSAndroid Build Coastguard Worker             data.writeString8((value == String8("")) ? String8("NULL") : value);
312*ec779b8eSAndroid Build Coastguard Worker         }
313*ec779b8eSAndroid Build Coastguard Worker     }
314*ec779b8eSAndroid Build Coastguard Worker 
315*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(ACQUIRE_DRM_INFO, data, &reply);
316*ec779b8eSAndroid Build Coastguard Worker 
317*ec779b8eSAndroid Build Coastguard Worker     DrmInfo* drmInfo = NULL;
318*ec779b8eSAndroid Build Coastguard Worker     if (0 != reply.dataAvail()) {
319*ec779b8eSAndroid Build Coastguard Worker         //Filling DRM Info
320*ec779b8eSAndroid Build Coastguard Worker         const int infoType = reply.readInt32();
321*ec779b8eSAndroid Build Coastguard Worker         const int bufferSize = reply.readInt32();
322*ec779b8eSAndroid Build Coastguard Worker         char* data = NULL;
323*ec779b8eSAndroid Build Coastguard Worker 
324*ec779b8eSAndroid Build Coastguard Worker         if (0 < bufferSize) {
325*ec779b8eSAndroid Build Coastguard Worker             data = new char[bufferSize];
326*ec779b8eSAndroid Build Coastguard Worker             reply.read(data, bufferSize);
327*ec779b8eSAndroid Build Coastguard Worker         }
328*ec779b8eSAndroid Build Coastguard Worker         drmInfo = new DrmInfo(infoType, DrmBuffer(data, bufferSize), reply.readString8());
329*ec779b8eSAndroid Build Coastguard Worker 
330*ec779b8eSAndroid Build Coastguard Worker         const int size = reply.readInt32();
331*ec779b8eSAndroid Build Coastguard Worker         for (int index = 0; index < size; ++index) {
332*ec779b8eSAndroid Build Coastguard Worker             const String8 key(reply.readString8());
333*ec779b8eSAndroid Build Coastguard Worker             const String8 value(reply.readString8());
334*ec779b8eSAndroid Build Coastguard Worker             drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
335*ec779b8eSAndroid Build Coastguard Worker         }
336*ec779b8eSAndroid Build Coastguard Worker     }
337*ec779b8eSAndroid Build Coastguard Worker     return drmInfo;
338*ec779b8eSAndroid Build Coastguard Worker }
339*ec779b8eSAndroid Build Coastguard Worker 
saveRights(int uniqueId,const DrmRights & drmRights,const String8 & rightsPath,const String8 & contentPath)340*ec779b8eSAndroid Build Coastguard Worker status_t BpDrmManagerService::saveRights(
341*ec779b8eSAndroid Build Coastguard Worker             int uniqueId, const DrmRights& drmRights,
342*ec779b8eSAndroid Build Coastguard Worker             const String8& rightsPath, const String8& contentPath) {
343*ec779b8eSAndroid Build Coastguard Worker     ALOGV("Save Rights");
344*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
345*ec779b8eSAndroid Build Coastguard Worker 
346*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
347*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
348*ec779b8eSAndroid Build Coastguard Worker 
349*ec779b8eSAndroid Build Coastguard Worker     //Filling Drm Rights
350*ec779b8eSAndroid Build Coastguard Worker     const DrmBuffer dataBuffer = drmRights.getData();
351*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(dataBuffer.length);
352*ec779b8eSAndroid Build Coastguard Worker     data.write(dataBuffer.data, dataBuffer.length);
353*ec779b8eSAndroid Build Coastguard Worker 
354*ec779b8eSAndroid Build Coastguard Worker     const String8 mimeType = drmRights.getMimeType();
355*ec779b8eSAndroid Build Coastguard Worker     data.writeString8((mimeType == String8("")) ? String8("NULL") : mimeType);
356*ec779b8eSAndroid Build Coastguard Worker 
357*ec779b8eSAndroid Build Coastguard Worker     const String8 accountId = drmRights.getAccountId();
358*ec779b8eSAndroid Build Coastguard Worker     data.writeString8((accountId == String8("")) ? String8("NULL") : accountId);
359*ec779b8eSAndroid Build Coastguard Worker 
360*ec779b8eSAndroid Build Coastguard Worker     const String8 subscriptionId = drmRights.getSubscriptionId();
361*ec779b8eSAndroid Build Coastguard Worker     data.writeString8((subscriptionId == String8("")) ? String8("NULL") : subscriptionId);
362*ec779b8eSAndroid Build Coastguard Worker 
363*ec779b8eSAndroid Build Coastguard Worker     data.writeString8((rightsPath == String8("")) ? String8("NULL") : rightsPath);
364*ec779b8eSAndroid Build Coastguard Worker     data.writeString8((contentPath == String8("")) ? String8("NULL") : contentPath);
365*ec779b8eSAndroid Build Coastguard Worker 
366*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(SAVE_RIGHTS, data, &reply);
367*ec779b8eSAndroid Build Coastguard Worker     return reply.readInt32();
368*ec779b8eSAndroid Build Coastguard Worker }
369*ec779b8eSAndroid Build Coastguard Worker 
getOriginalMimeType(int uniqueId,const String8 & path,int fd)370*ec779b8eSAndroid Build Coastguard Worker String8 BpDrmManagerService::getOriginalMimeType(int uniqueId, const String8& path, int fd) {
371*ec779b8eSAndroid Build Coastguard Worker     ALOGV("Get Original MimeType");
372*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
373*ec779b8eSAndroid Build Coastguard Worker 
374*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
375*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
376*ec779b8eSAndroid Build Coastguard Worker     data.writeString8(path);
377*ec779b8eSAndroid Build Coastguard Worker     int32_t isFdValid = (fd >= 0);
378*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(isFdValid);
379*ec779b8eSAndroid Build Coastguard Worker     if (isFdValid) {
380*ec779b8eSAndroid Build Coastguard Worker         data.writeFileDescriptor(fd);
381*ec779b8eSAndroid Build Coastguard Worker     }
382*ec779b8eSAndroid Build Coastguard Worker 
383*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(GET_ORIGINAL_MIMETYPE, data, &reply);
384*ec779b8eSAndroid Build Coastguard Worker     return reply.readString8();
385*ec779b8eSAndroid Build Coastguard Worker }
386*ec779b8eSAndroid Build Coastguard Worker 
getDrmObjectType(int uniqueId,const String8 & path,const String8 & mimeType)387*ec779b8eSAndroid Build Coastguard Worker int BpDrmManagerService::getDrmObjectType(
388*ec779b8eSAndroid Build Coastguard Worker             int uniqueId, const String8& path, const String8& mimeType) {
389*ec779b8eSAndroid Build Coastguard Worker     ALOGV("Get Drm object type");
390*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
391*ec779b8eSAndroid Build Coastguard Worker 
392*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
393*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
394*ec779b8eSAndroid Build Coastguard Worker     data.writeString8(path);
395*ec779b8eSAndroid Build Coastguard Worker     data.writeString8(mimeType);
396*ec779b8eSAndroid Build Coastguard Worker 
397*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(GET_DRM_OBJECT_TYPE, data, &reply);
398*ec779b8eSAndroid Build Coastguard Worker 
399*ec779b8eSAndroid Build Coastguard Worker     return reply.readInt32();
400*ec779b8eSAndroid Build Coastguard Worker }
401*ec779b8eSAndroid Build Coastguard Worker 
checkRightsStatus(int uniqueId,const String8 & path,int action)402*ec779b8eSAndroid Build Coastguard Worker int BpDrmManagerService::checkRightsStatus(int uniqueId, const String8& path, int action) {
403*ec779b8eSAndroid Build Coastguard Worker     ALOGV("checkRightsStatus");
404*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
405*ec779b8eSAndroid Build Coastguard Worker 
406*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
407*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
408*ec779b8eSAndroid Build Coastguard Worker     data.writeString8(path);
409*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(action);
410*ec779b8eSAndroid Build Coastguard Worker 
411*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(CHECK_RIGHTS_STATUS, data, &reply);
412*ec779b8eSAndroid Build Coastguard Worker 
413*ec779b8eSAndroid Build Coastguard Worker     return reply.readInt32();
414*ec779b8eSAndroid Build Coastguard Worker }
415*ec779b8eSAndroid Build Coastguard Worker 
consumeRights(int uniqueId,sp<DecryptHandle> & decryptHandle,int action,bool reserve)416*ec779b8eSAndroid Build Coastguard Worker status_t BpDrmManagerService::consumeRights(
417*ec779b8eSAndroid Build Coastguard Worker             int uniqueId, sp<DecryptHandle>& decryptHandle, int action, bool reserve) {
418*ec779b8eSAndroid Build Coastguard Worker     ALOGV("consumeRights");
419*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
420*ec779b8eSAndroid Build Coastguard Worker 
421*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
422*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
423*ec779b8eSAndroid Build Coastguard Worker 
424*ec779b8eSAndroid Build Coastguard Worker     writeDecryptHandleToParcelData(decryptHandle, &data);
425*ec779b8eSAndroid Build Coastguard Worker 
426*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(action);
427*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(static_cast< int>(reserve));
428*ec779b8eSAndroid Build Coastguard Worker 
429*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(CONSUME_RIGHTS, data, &reply);
430*ec779b8eSAndroid Build Coastguard Worker     return reply.readInt32();
431*ec779b8eSAndroid Build Coastguard Worker }
432*ec779b8eSAndroid Build Coastguard Worker 
setPlaybackStatus(int uniqueId,sp<DecryptHandle> & decryptHandle,int playbackStatus,int64_t position)433*ec779b8eSAndroid Build Coastguard Worker status_t BpDrmManagerService::setPlaybackStatus(
434*ec779b8eSAndroid Build Coastguard Worker             int uniqueId, sp<DecryptHandle>& decryptHandle, int playbackStatus, int64_t position) {
435*ec779b8eSAndroid Build Coastguard Worker     ALOGV("setPlaybackStatus");
436*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
437*ec779b8eSAndroid Build Coastguard Worker 
438*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
439*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
440*ec779b8eSAndroid Build Coastguard Worker 
441*ec779b8eSAndroid Build Coastguard Worker     writeDecryptHandleToParcelData(decryptHandle, &data);
442*ec779b8eSAndroid Build Coastguard Worker 
443*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(playbackStatus);
444*ec779b8eSAndroid Build Coastguard Worker     data.writeInt64(position);
445*ec779b8eSAndroid Build Coastguard Worker 
446*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(SET_PLAYBACK_STATUS, data, &reply);
447*ec779b8eSAndroid Build Coastguard Worker     return reply.readInt32();
448*ec779b8eSAndroid Build Coastguard Worker }
449*ec779b8eSAndroid Build Coastguard Worker 
validateAction(int uniqueId,const String8 & path,int action,const ActionDescription & description)450*ec779b8eSAndroid Build Coastguard Worker bool BpDrmManagerService::validateAction(
451*ec779b8eSAndroid Build Coastguard Worker             int uniqueId, const String8& path,
452*ec779b8eSAndroid Build Coastguard Worker             int action, const ActionDescription& description) {
453*ec779b8eSAndroid Build Coastguard Worker     ALOGV("validateAction");
454*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
455*ec779b8eSAndroid Build Coastguard Worker 
456*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
457*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
458*ec779b8eSAndroid Build Coastguard Worker     data.writeString8(path);
459*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(action);
460*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(description.outputType);
461*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(description.configuration);
462*ec779b8eSAndroid Build Coastguard Worker 
463*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(VALIDATE_ACTION, data, &reply);
464*ec779b8eSAndroid Build Coastguard Worker 
465*ec779b8eSAndroid Build Coastguard Worker     return static_cast<bool>(reply.readInt32());
466*ec779b8eSAndroid Build Coastguard Worker }
467*ec779b8eSAndroid Build Coastguard Worker 
removeRights(int uniqueId,const String8 & path)468*ec779b8eSAndroid Build Coastguard Worker status_t BpDrmManagerService::removeRights(int uniqueId, const String8& path) {
469*ec779b8eSAndroid Build Coastguard Worker     ALOGV("removeRights");
470*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
471*ec779b8eSAndroid Build Coastguard Worker 
472*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
473*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
474*ec779b8eSAndroid Build Coastguard Worker     data.writeString8(path);
475*ec779b8eSAndroid Build Coastguard Worker 
476*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(REMOVE_RIGHTS, data, &reply);
477*ec779b8eSAndroid Build Coastguard Worker     return reply.readInt32();
478*ec779b8eSAndroid Build Coastguard Worker }
479*ec779b8eSAndroid Build Coastguard Worker 
removeAllRights(int uniqueId)480*ec779b8eSAndroid Build Coastguard Worker status_t BpDrmManagerService::removeAllRights(int uniqueId) {
481*ec779b8eSAndroid Build Coastguard Worker     ALOGV("removeAllRights");
482*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
483*ec779b8eSAndroid Build Coastguard Worker 
484*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
485*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
486*ec779b8eSAndroid Build Coastguard Worker 
487*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(REMOVE_ALL_RIGHTS, data, &reply);
488*ec779b8eSAndroid Build Coastguard Worker     return reply.readInt32();
489*ec779b8eSAndroid Build Coastguard Worker }
490*ec779b8eSAndroid Build Coastguard Worker 
openConvertSession(int uniqueId,const String8 & mimeType)491*ec779b8eSAndroid Build Coastguard Worker int BpDrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) {
492*ec779b8eSAndroid Build Coastguard Worker     ALOGV("openConvertSession");
493*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
494*ec779b8eSAndroid Build Coastguard Worker 
495*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
496*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
497*ec779b8eSAndroid Build Coastguard Worker     data.writeString8(mimeType);
498*ec779b8eSAndroid Build Coastguard Worker 
499*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(OPEN_CONVERT_SESSION, data, &reply);
500*ec779b8eSAndroid Build Coastguard Worker     return reply.readInt32();
501*ec779b8eSAndroid Build Coastguard Worker }
502*ec779b8eSAndroid Build Coastguard Worker 
convertData(int uniqueId,int convertId,const DrmBuffer * inputData)503*ec779b8eSAndroid Build Coastguard Worker DrmConvertedStatus* BpDrmManagerService::convertData(
504*ec779b8eSAndroid Build Coastguard Worker             int uniqueId, int convertId, const DrmBuffer* inputData) {
505*ec779b8eSAndroid Build Coastguard Worker     ALOGV("convertData");
506*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
507*ec779b8eSAndroid Build Coastguard Worker 
508*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
509*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
510*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(convertId);
511*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(inputData->length);
512*ec779b8eSAndroid Build Coastguard Worker     data.write(inputData->data, inputData->length);
513*ec779b8eSAndroid Build Coastguard Worker 
514*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(CONVERT_DATA, data, &reply);
515*ec779b8eSAndroid Build Coastguard Worker 
516*ec779b8eSAndroid Build Coastguard Worker     DrmConvertedStatus* drmConvertedStatus = NULL;
517*ec779b8eSAndroid Build Coastguard Worker 
518*ec779b8eSAndroid Build Coastguard Worker     if (0 != reply.dataAvail()) {
519*ec779b8eSAndroid Build Coastguard Worker         //Filling DRM Converted Status
520*ec779b8eSAndroid Build Coastguard Worker         const int statusCode = reply.readInt32();
521*ec779b8eSAndroid Build Coastguard Worker         const off64_t offset = reply.readInt64();
522*ec779b8eSAndroid Build Coastguard Worker 
523*ec779b8eSAndroid Build Coastguard Worker         DrmBuffer* convertedData = NULL;
524*ec779b8eSAndroid Build Coastguard Worker         if (0 != reply.dataAvail()) {
525*ec779b8eSAndroid Build Coastguard Worker             const int bufferSize = reply.readInt32();
526*ec779b8eSAndroid Build Coastguard Worker             char* data = NULL;
527*ec779b8eSAndroid Build Coastguard Worker             if (0 < bufferSize) {
528*ec779b8eSAndroid Build Coastguard Worker                 data = new char[bufferSize];
529*ec779b8eSAndroid Build Coastguard Worker                 reply.read(data, bufferSize);
530*ec779b8eSAndroid Build Coastguard Worker             }
531*ec779b8eSAndroid Build Coastguard Worker             convertedData = new DrmBuffer(data, bufferSize);
532*ec779b8eSAndroid Build Coastguard Worker         }
533*ec779b8eSAndroid Build Coastguard Worker         drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
534*ec779b8eSAndroid Build Coastguard Worker     }
535*ec779b8eSAndroid Build Coastguard Worker     return drmConvertedStatus;
536*ec779b8eSAndroid Build Coastguard Worker }
537*ec779b8eSAndroid Build Coastguard Worker 
closeConvertSession(int uniqueId,int convertId)538*ec779b8eSAndroid Build Coastguard Worker DrmConvertedStatus* BpDrmManagerService::closeConvertSession(int uniqueId, int convertId) {
539*ec779b8eSAndroid Build Coastguard Worker     ALOGV("closeConvertSession");
540*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
541*ec779b8eSAndroid Build Coastguard Worker 
542*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
543*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
544*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(convertId);
545*ec779b8eSAndroid Build Coastguard Worker 
546*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(CLOSE_CONVERT_SESSION, data, &reply);
547*ec779b8eSAndroid Build Coastguard Worker 
548*ec779b8eSAndroid Build Coastguard Worker     DrmConvertedStatus* drmConvertedStatus = NULL;
549*ec779b8eSAndroid Build Coastguard Worker 
550*ec779b8eSAndroid Build Coastguard Worker     if (0 != reply.dataAvail()) {
551*ec779b8eSAndroid Build Coastguard Worker         //Filling DRM Converted Status
552*ec779b8eSAndroid Build Coastguard Worker         const int statusCode = reply.readInt32();
553*ec779b8eSAndroid Build Coastguard Worker         const off64_t offset = reply.readInt64();
554*ec779b8eSAndroid Build Coastguard Worker 
555*ec779b8eSAndroid Build Coastguard Worker         DrmBuffer* convertedData = NULL;
556*ec779b8eSAndroid Build Coastguard Worker         if (0 != reply.dataAvail()) {
557*ec779b8eSAndroid Build Coastguard Worker             const int bufferSize = reply.readInt32();
558*ec779b8eSAndroid Build Coastguard Worker             char* data = NULL;
559*ec779b8eSAndroid Build Coastguard Worker             if (0 < bufferSize) {
560*ec779b8eSAndroid Build Coastguard Worker                 data = new char[bufferSize];
561*ec779b8eSAndroid Build Coastguard Worker                 reply.read(data, bufferSize);
562*ec779b8eSAndroid Build Coastguard Worker             }
563*ec779b8eSAndroid Build Coastguard Worker             convertedData = new DrmBuffer(data, bufferSize);
564*ec779b8eSAndroid Build Coastguard Worker         }
565*ec779b8eSAndroid Build Coastguard Worker         drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
566*ec779b8eSAndroid Build Coastguard Worker     }
567*ec779b8eSAndroid Build Coastguard Worker     return drmConvertedStatus;
568*ec779b8eSAndroid Build Coastguard Worker }
569*ec779b8eSAndroid Build Coastguard Worker 
getAllSupportInfo(int uniqueId,int * length,DrmSupportInfo ** drmSupportInfoArray)570*ec779b8eSAndroid Build Coastguard Worker status_t BpDrmManagerService::getAllSupportInfo(
571*ec779b8eSAndroid Build Coastguard Worker             int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) {
572*ec779b8eSAndroid Build Coastguard Worker     ALOGV("Get All Support Info");
573*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
574*ec779b8eSAndroid Build Coastguard Worker 
575*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
576*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
577*ec779b8eSAndroid Build Coastguard Worker 
578*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(GET_ALL_SUPPORT_INFO, data, &reply);
579*ec779b8eSAndroid Build Coastguard Worker 
580*ec779b8eSAndroid Build Coastguard Worker     //Filling DRM Support Info
581*ec779b8eSAndroid Build Coastguard Worker     const int arraySize = reply.readInt32();
582*ec779b8eSAndroid Build Coastguard Worker     if (0 < arraySize) {
583*ec779b8eSAndroid Build Coastguard Worker         *drmSupportInfoArray = new DrmSupportInfo[arraySize];
584*ec779b8eSAndroid Build Coastguard Worker 
585*ec779b8eSAndroid Build Coastguard Worker         for (int index = 0; index < arraySize; ++index) {
586*ec779b8eSAndroid Build Coastguard Worker             DrmSupportInfo drmSupportInfo;
587*ec779b8eSAndroid Build Coastguard Worker 
588*ec779b8eSAndroid Build Coastguard Worker             const int fileSuffixVectorSize = reply.readInt32();
589*ec779b8eSAndroid Build Coastguard Worker             for (int i = 0; i < fileSuffixVectorSize; ++i) {
590*ec779b8eSAndroid Build Coastguard Worker                 drmSupportInfo.addFileSuffix(reply.readString8());
591*ec779b8eSAndroid Build Coastguard Worker             }
592*ec779b8eSAndroid Build Coastguard Worker 
593*ec779b8eSAndroid Build Coastguard Worker             const int mimeTypeVectorSize = reply.readInt32();
594*ec779b8eSAndroid Build Coastguard Worker             for (int i = 0; i < mimeTypeVectorSize; ++i) {
595*ec779b8eSAndroid Build Coastguard Worker                 drmSupportInfo.addMimeType(reply.readString8());
596*ec779b8eSAndroid Build Coastguard Worker             }
597*ec779b8eSAndroid Build Coastguard Worker 
598*ec779b8eSAndroid Build Coastguard Worker             drmSupportInfo.setDescription(reply.readString8());
599*ec779b8eSAndroid Build Coastguard Worker             (*drmSupportInfoArray)[index] = drmSupportInfo;
600*ec779b8eSAndroid Build Coastguard Worker         }
601*ec779b8eSAndroid Build Coastguard Worker     }
602*ec779b8eSAndroid Build Coastguard Worker     *length = arraySize;
603*ec779b8eSAndroid Build Coastguard Worker     return reply.readInt32();
604*ec779b8eSAndroid Build Coastguard Worker }
605*ec779b8eSAndroid Build Coastguard Worker 
openDecryptSession(int uniqueId,int fd,off64_t offset,off64_t length,const char * mime)606*ec779b8eSAndroid Build Coastguard Worker sp<DecryptHandle> BpDrmManagerService::openDecryptSession(
607*ec779b8eSAndroid Build Coastguard Worker             int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) {
608*ec779b8eSAndroid Build Coastguard Worker     ALOGV("Entering BpDrmManagerService::openDecryptSession");
609*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
610*ec779b8eSAndroid Build Coastguard Worker 
611*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
612*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
613*ec779b8eSAndroid Build Coastguard Worker     data.writeFileDescriptor(fd);
614*ec779b8eSAndroid Build Coastguard Worker     data.writeInt64(offset);
615*ec779b8eSAndroid Build Coastguard Worker     data.writeInt64(length);
616*ec779b8eSAndroid Build Coastguard Worker     String8 mimeType;
617*ec779b8eSAndroid Build Coastguard Worker     if (mime) {
618*ec779b8eSAndroid Build Coastguard Worker         mimeType = mime;
619*ec779b8eSAndroid Build Coastguard Worker     }
620*ec779b8eSAndroid Build Coastguard Worker     data.writeString8(mimeType);
621*ec779b8eSAndroid Build Coastguard Worker 
622*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(OPEN_DECRYPT_SESSION, data, &reply);
623*ec779b8eSAndroid Build Coastguard Worker 
624*ec779b8eSAndroid Build Coastguard Worker     sp<DecryptHandle> handle;
625*ec779b8eSAndroid Build Coastguard Worker     if (0 != reply.dataAvail()) {
626*ec779b8eSAndroid Build Coastguard Worker         handle = new DecryptHandle();
627*ec779b8eSAndroid Build Coastguard Worker         readDecryptHandleFromParcelData(handle, reply);
628*ec779b8eSAndroid Build Coastguard Worker     }
629*ec779b8eSAndroid Build Coastguard Worker     return handle;
630*ec779b8eSAndroid Build Coastguard Worker }
631*ec779b8eSAndroid Build Coastguard Worker 
openDecryptSession(int uniqueId,const char * uri,const char * mime)632*ec779b8eSAndroid Build Coastguard Worker sp<DecryptHandle> BpDrmManagerService::openDecryptSession(
633*ec779b8eSAndroid Build Coastguard Worker         int uniqueId, const char* uri, const char* mime) {
634*ec779b8eSAndroid Build Coastguard Worker 
635*ec779b8eSAndroid Build Coastguard Worker     ALOGV("Entering BpDrmManagerService::openDecryptSession: mime=%s", mime? mime: "NULL");
636*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
637*ec779b8eSAndroid Build Coastguard Worker 
638*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
639*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
640*ec779b8eSAndroid Build Coastguard Worker     data.writeString8(String8(uri));
641*ec779b8eSAndroid Build Coastguard Worker     String8 mimeType;
642*ec779b8eSAndroid Build Coastguard Worker     if (mime) {
643*ec779b8eSAndroid Build Coastguard Worker         mimeType = mime;
644*ec779b8eSAndroid Build Coastguard Worker     }
645*ec779b8eSAndroid Build Coastguard Worker     data.writeString8(mimeType);
646*ec779b8eSAndroid Build Coastguard Worker 
647*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(OPEN_DECRYPT_SESSION_FROM_URI, data, &reply);
648*ec779b8eSAndroid Build Coastguard Worker 
649*ec779b8eSAndroid Build Coastguard Worker     sp<DecryptHandle> handle;
650*ec779b8eSAndroid Build Coastguard Worker     if (0 != reply.dataAvail()) {
651*ec779b8eSAndroid Build Coastguard Worker         handle = new DecryptHandle();
652*ec779b8eSAndroid Build Coastguard Worker         readDecryptHandleFromParcelData(handle, reply);
653*ec779b8eSAndroid Build Coastguard Worker     } else {
654*ec779b8eSAndroid Build Coastguard Worker         ALOGV("no decryptHandle is generated in service side");
655*ec779b8eSAndroid Build Coastguard Worker     }
656*ec779b8eSAndroid Build Coastguard Worker     return handle;
657*ec779b8eSAndroid Build Coastguard Worker }
658*ec779b8eSAndroid Build Coastguard Worker 
openDecryptSession(int uniqueId,const DrmBuffer & buf,const String8 & mimeType)659*ec779b8eSAndroid Build Coastguard Worker sp<DecryptHandle> BpDrmManagerService::openDecryptSession(
660*ec779b8eSAndroid Build Coastguard Worker             int uniqueId, const DrmBuffer& buf, const String8& mimeType) {
661*ec779b8eSAndroid Build Coastguard Worker     ALOGV("Entering BpDrmManagerService::openDecryptSession");
662*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
663*ec779b8eSAndroid Build Coastguard Worker 
664*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
665*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
666*ec779b8eSAndroid Build Coastguard Worker     if (buf.data != NULL && buf.length > 0) {
667*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32(buf.length);
668*ec779b8eSAndroid Build Coastguard Worker         data.write(buf.data, buf.length);
669*ec779b8eSAndroid Build Coastguard Worker     } else {
670*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32(0);
671*ec779b8eSAndroid Build Coastguard Worker     }
672*ec779b8eSAndroid Build Coastguard Worker     data.writeString8(mimeType);
673*ec779b8eSAndroid Build Coastguard Worker 
674*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(OPEN_DECRYPT_SESSION_FOR_STREAMING, data, &reply);
675*ec779b8eSAndroid Build Coastguard Worker 
676*ec779b8eSAndroid Build Coastguard Worker     sp<DecryptHandle> handle;
677*ec779b8eSAndroid Build Coastguard Worker     if (0 != reply.dataAvail()) {
678*ec779b8eSAndroid Build Coastguard Worker         handle = new DecryptHandle();
679*ec779b8eSAndroid Build Coastguard Worker         readDecryptHandleFromParcelData(handle, reply);
680*ec779b8eSAndroid Build Coastguard Worker     } else {
681*ec779b8eSAndroid Build Coastguard Worker         ALOGV("no decryptHandle is generated in service side");
682*ec779b8eSAndroid Build Coastguard Worker     }
683*ec779b8eSAndroid Build Coastguard Worker     return handle;
684*ec779b8eSAndroid Build Coastguard Worker }
685*ec779b8eSAndroid Build Coastguard Worker 
closeDecryptSession(int uniqueId,sp<DecryptHandle> & decryptHandle)686*ec779b8eSAndroid Build Coastguard Worker status_t BpDrmManagerService::closeDecryptSession(int uniqueId, sp<DecryptHandle>& decryptHandle) {
687*ec779b8eSAndroid Build Coastguard Worker     ALOGV("closeDecryptSession");
688*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
689*ec779b8eSAndroid Build Coastguard Worker 
690*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
691*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
692*ec779b8eSAndroid Build Coastguard Worker 
693*ec779b8eSAndroid Build Coastguard Worker     writeDecryptHandleToParcelData(decryptHandle, &data);
694*ec779b8eSAndroid Build Coastguard Worker 
695*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply);
696*ec779b8eSAndroid Build Coastguard Worker 
697*ec779b8eSAndroid Build Coastguard Worker     return reply.readInt32();
698*ec779b8eSAndroid Build Coastguard Worker }
699*ec779b8eSAndroid Build Coastguard Worker 
initializeDecryptUnit(int uniqueId,sp<DecryptHandle> & decryptHandle,int decryptUnitId,const DrmBuffer * headerInfo)700*ec779b8eSAndroid Build Coastguard Worker status_t BpDrmManagerService::initializeDecryptUnit(
701*ec779b8eSAndroid Build Coastguard Worker             int uniqueId, sp<DecryptHandle>& decryptHandle,
702*ec779b8eSAndroid Build Coastguard Worker             int decryptUnitId, const DrmBuffer* headerInfo) {
703*ec779b8eSAndroid Build Coastguard Worker     ALOGV("initializeDecryptUnit");
704*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
705*ec779b8eSAndroid Build Coastguard Worker 
706*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
707*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
708*ec779b8eSAndroid Build Coastguard Worker 
709*ec779b8eSAndroid Build Coastguard Worker     writeDecryptHandleToParcelData(decryptHandle, &data);
710*ec779b8eSAndroid Build Coastguard Worker 
711*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(decryptUnitId);
712*ec779b8eSAndroid Build Coastguard Worker 
713*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(headerInfo->length);
714*ec779b8eSAndroid Build Coastguard Worker     data.write(headerInfo->data, headerInfo->length);
715*ec779b8eSAndroid Build Coastguard Worker 
716*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply);
717*ec779b8eSAndroid Build Coastguard Worker     return reply.readInt32();
718*ec779b8eSAndroid Build Coastguard Worker }
719*ec779b8eSAndroid Build Coastguard Worker 
decrypt(int uniqueId,sp<DecryptHandle> & decryptHandle,int decryptUnitId,const DrmBuffer * encBuffer,DrmBuffer ** decBuffer,DrmBuffer * IV)720*ec779b8eSAndroid Build Coastguard Worker status_t BpDrmManagerService::decrypt(
721*ec779b8eSAndroid Build Coastguard Worker             int uniqueId, sp<DecryptHandle>& decryptHandle, int decryptUnitId,
722*ec779b8eSAndroid Build Coastguard Worker             const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) {
723*ec779b8eSAndroid Build Coastguard Worker     ALOGV("decrypt");
724*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
725*ec779b8eSAndroid Build Coastguard Worker 
726*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
727*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
728*ec779b8eSAndroid Build Coastguard Worker 
729*ec779b8eSAndroid Build Coastguard Worker     writeDecryptHandleToParcelData(decryptHandle, &data);
730*ec779b8eSAndroid Build Coastguard Worker 
731*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(decryptUnitId);
732*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32((*decBuffer)->length);
733*ec779b8eSAndroid Build Coastguard Worker 
734*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(encBuffer->length);
735*ec779b8eSAndroid Build Coastguard Worker     data.write(encBuffer->data, encBuffer->length);
736*ec779b8eSAndroid Build Coastguard Worker 
737*ec779b8eSAndroid Build Coastguard Worker     if (NULL != IV) {
738*ec779b8eSAndroid Build Coastguard Worker         data.writeInt32(IV->length);
739*ec779b8eSAndroid Build Coastguard Worker         data.write(IV->data, IV->length);
740*ec779b8eSAndroid Build Coastguard Worker     }
741*ec779b8eSAndroid Build Coastguard Worker 
742*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(DECRYPT, data, &reply);
743*ec779b8eSAndroid Build Coastguard Worker 
744*ec779b8eSAndroid Build Coastguard Worker     const status_t status = reply.readInt32();
745*ec779b8eSAndroid Build Coastguard Worker     ALOGV("Return value of decrypt() is %d", status);
746*ec779b8eSAndroid Build Coastguard Worker 
747*ec779b8eSAndroid Build Coastguard Worker     if (status == NO_ERROR) {
748*ec779b8eSAndroid Build Coastguard Worker         const int size = reply.readInt32();
749*ec779b8eSAndroid Build Coastguard Worker         (*decBuffer)->length = size;
750*ec779b8eSAndroid Build Coastguard Worker         reply.read((void *)(*decBuffer)->data, size);
751*ec779b8eSAndroid Build Coastguard Worker     }
752*ec779b8eSAndroid Build Coastguard Worker 
753*ec779b8eSAndroid Build Coastguard Worker     return status;
754*ec779b8eSAndroid Build Coastguard Worker }
755*ec779b8eSAndroid Build Coastguard Worker 
finalizeDecryptUnit(int uniqueId,sp<DecryptHandle> & decryptHandle,int decryptUnitId)756*ec779b8eSAndroid Build Coastguard Worker status_t BpDrmManagerService::finalizeDecryptUnit(
757*ec779b8eSAndroid Build Coastguard Worker             int uniqueId, sp<DecryptHandle>& decryptHandle, int decryptUnitId) {
758*ec779b8eSAndroid Build Coastguard Worker     ALOGV("finalizeDecryptUnit");
759*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
760*ec779b8eSAndroid Build Coastguard Worker 
761*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
762*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
763*ec779b8eSAndroid Build Coastguard Worker 
764*ec779b8eSAndroid Build Coastguard Worker     writeDecryptHandleToParcelData(decryptHandle, &data);
765*ec779b8eSAndroid Build Coastguard Worker 
766*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(decryptUnitId);
767*ec779b8eSAndroid Build Coastguard Worker 
768*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply);
769*ec779b8eSAndroid Build Coastguard Worker     return reply.readInt32();
770*ec779b8eSAndroid Build Coastguard Worker }
771*ec779b8eSAndroid Build Coastguard Worker 
pread(int uniqueId,sp<DecryptHandle> & decryptHandle,void * buffer,ssize_t numBytes,off64_t offset)772*ec779b8eSAndroid Build Coastguard Worker ssize_t BpDrmManagerService::pread(
773*ec779b8eSAndroid Build Coastguard Worker             int uniqueId, sp<DecryptHandle>& decryptHandle, void* buffer,
774*ec779b8eSAndroid Build Coastguard Worker             ssize_t numBytes, off64_t offset) {
775*ec779b8eSAndroid Build Coastguard Worker     ALOGV("read");
776*ec779b8eSAndroid Build Coastguard Worker     Parcel data, reply;
777*ec779b8eSAndroid Build Coastguard Worker     int result;
778*ec779b8eSAndroid Build Coastguard Worker 
779*ec779b8eSAndroid Build Coastguard Worker     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
780*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(uniqueId);
781*ec779b8eSAndroid Build Coastguard Worker 
782*ec779b8eSAndroid Build Coastguard Worker     writeDecryptHandleToParcelData(decryptHandle, &data);
783*ec779b8eSAndroid Build Coastguard Worker 
784*ec779b8eSAndroid Build Coastguard Worker     data.writeInt32(numBytes);
785*ec779b8eSAndroid Build Coastguard Worker     data.writeInt64(offset);
786*ec779b8eSAndroid Build Coastguard Worker 
787*ec779b8eSAndroid Build Coastguard Worker     remote()->transact(PREAD, data, &reply);
788*ec779b8eSAndroid Build Coastguard Worker     result = reply.readInt32();
789*ec779b8eSAndroid Build Coastguard Worker     if (0 < result) {
790*ec779b8eSAndroid Build Coastguard Worker         reply.read(buffer, result);
791*ec779b8eSAndroid Build Coastguard Worker     }
792*ec779b8eSAndroid Build Coastguard Worker     return result;
793*ec779b8eSAndroid Build Coastguard Worker }
794*ec779b8eSAndroid Build Coastguard Worker 
795*ec779b8eSAndroid Build Coastguard Worker IMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService");
796*ec779b8eSAndroid Build Coastguard Worker 
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)797*ec779b8eSAndroid Build Coastguard Worker status_t BnDrmManagerService::onTransact(
798*ec779b8eSAndroid Build Coastguard Worker             uint32_t code, const Parcel& data,
799*ec779b8eSAndroid Build Coastguard Worker             Parcel* reply, uint32_t flags) {
800*ec779b8eSAndroid Build Coastguard Worker     ALOGV("Entering BnDrmManagerService::onTransact with code %d", code);
801*ec779b8eSAndroid Build Coastguard Worker 
802*ec779b8eSAndroid Build Coastguard Worker     switch (code) {
803*ec779b8eSAndroid Build Coastguard Worker     case ADD_UNIQUEID:
804*ec779b8eSAndroid Build Coastguard Worker     {
805*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID");
806*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
807*ec779b8eSAndroid Build Coastguard Worker         int uniqueId = addUniqueId(data.readInt32());
808*ec779b8eSAndroid Build Coastguard Worker         reply->writeInt32(uniqueId);
809*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
810*ec779b8eSAndroid Build Coastguard Worker     }
811*ec779b8eSAndroid Build Coastguard Worker 
812*ec779b8eSAndroid Build Coastguard Worker     case REMOVE_UNIQUEID:
813*ec779b8eSAndroid Build Coastguard Worker     {
814*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID");
815*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
816*ec779b8eSAndroid Build Coastguard Worker         removeUniqueId(data.readInt32());
817*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
818*ec779b8eSAndroid Build Coastguard Worker     }
819*ec779b8eSAndroid Build Coastguard Worker 
820*ec779b8eSAndroid Build Coastguard Worker     case ADD_CLIENT:
821*ec779b8eSAndroid Build Coastguard Worker     {
822*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :ADD_CLIENT");
823*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
824*ec779b8eSAndroid Build Coastguard Worker         addClient(data.readInt32());
825*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
826*ec779b8eSAndroid Build Coastguard Worker     }
827*ec779b8eSAndroid Build Coastguard Worker 
828*ec779b8eSAndroid Build Coastguard Worker     case REMOVE_CLIENT:
829*ec779b8eSAndroid Build Coastguard Worker     {
830*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :REMOVE_CLIENT");
831*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
832*ec779b8eSAndroid Build Coastguard Worker         removeClient(data.readInt32());
833*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
834*ec779b8eSAndroid Build Coastguard Worker     }
835*ec779b8eSAndroid Build Coastguard Worker 
836*ec779b8eSAndroid Build Coastguard Worker     case SET_DRM_SERVICE_LISTENER:
837*ec779b8eSAndroid Build Coastguard Worker     {
838*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER");
839*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
840*ec779b8eSAndroid Build Coastguard Worker 
841*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
842*ec779b8eSAndroid Build Coastguard Worker         const sp<IDrmServiceListener> drmServiceListener
843*ec779b8eSAndroid Build Coastguard Worker             = interface_cast<IDrmServiceListener> (data.readStrongBinder());
844*ec779b8eSAndroid Build Coastguard Worker 
845*ec779b8eSAndroid Build Coastguard Worker         status_t status = setDrmServiceListener(uniqueId, drmServiceListener);
846*ec779b8eSAndroid Build Coastguard Worker 
847*ec779b8eSAndroid Build Coastguard Worker         reply->writeInt32(status);
848*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
849*ec779b8eSAndroid Build Coastguard Worker     }
850*ec779b8eSAndroid Build Coastguard Worker 
851*ec779b8eSAndroid Build Coastguard Worker     case GET_CONSTRAINTS_FROM_CONTENT:
852*ec779b8eSAndroid Build Coastguard Worker     {
853*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT");
854*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
855*ec779b8eSAndroid Build Coastguard Worker 
856*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
857*ec779b8eSAndroid Build Coastguard Worker         const String8 path = data.readString8();
858*ec779b8eSAndroid Build Coastguard Worker 
859*ec779b8eSAndroid Build Coastguard Worker         DrmConstraints* drmConstraints
860*ec779b8eSAndroid Build Coastguard Worker             = getConstraints(uniqueId, &path, data.readInt32());
861*ec779b8eSAndroid Build Coastguard Worker 
862*ec779b8eSAndroid Build Coastguard Worker         if (NULL != drmConstraints) {
863*ec779b8eSAndroid Build Coastguard Worker             //Filling DRM Constraints contents
864*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(drmConstraints->getCount());
865*ec779b8eSAndroid Build Coastguard Worker 
866*ec779b8eSAndroid Build Coastguard Worker             DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator();
867*ec779b8eSAndroid Build Coastguard Worker             while (keyIt.hasNext()) {
868*ec779b8eSAndroid Build Coastguard Worker                 const String8 key = keyIt.next();
869*ec779b8eSAndroid Build Coastguard Worker                 reply->writeString8(key);
870*ec779b8eSAndroid Build Coastguard Worker                 const char* value = drmConstraints->getAsByteArray(&key);
871*ec779b8eSAndroid Build Coastguard Worker                 int bufferSize = 0;
872*ec779b8eSAndroid Build Coastguard Worker                 if (NULL != value) {
873*ec779b8eSAndroid Build Coastguard Worker                     bufferSize = strlen(value);
874*ec779b8eSAndroid Build Coastguard Worker                     reply->writeInt32(bufferSize + 1);
875*ec779b8eSAndroid Build Coastguard Worker                     reply->write(value, bufferSize + 1);
876*ec779b8eSAndroid Build Coastguard Worker                 } else {
877*ec779b8eSAndroid Build Coastguard Worker                     reply->writeInt32(0);
878*ec779b8eSAndroid Build Coastguard Worker                 }
879*ec779b8eSAndroid Build Coastguard Worker             }
880*ec779b8eSAndroid Build Coastguard Worker         }
881*ec779b8eSAndroid Build Coastguard Worker         delete drmConstraints; drmConstraints = NULL;
882*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
883*ec779b8eSAndroid Build Coastguard Worker     }
884*ec779b8eSAndroid Build Coastguard Worker 
885*ec779b8eSAndroid Build Coastguard Worker     case GET_METADATA_FROM_CONTENT:
886*ec779b8eSAndroid Build Coastguard Worker     {
887*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :GET_METADATA_FROM_CONTENT");
888*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
889*ec779b8eSAndroid Build Coastguard Worker 
890*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
891*ec779b8eSAndroid Build Coastguard Worker         const String8 path = data.readString8();
892*ec779b8eSAndroid Build Coastguard Worker 
893*ec779b8eSAndroid Build Coastguard Worker         DrmMetadata* drmMetadata = getMetadata(uniqueId, &path);
894*ec779b8eSAndroid Build Coastguard Worker         if (NULL != drmMetadata) {
895*ec779b8eSAndroid Build Coastguard Worker             //Filling DRM Metadata contents
896*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(drmMetadata->getCount());
897*ec779b8eSAndroid Build Coastguard Worker 
898*ec779b8eSAndroid Build Coastguard Worker             DrmMetadata::KeyIterator keyIt = drmMetadata->keyIterator();
899*ec779b8eSAndroid Build Coastguard Worker             while (keyIt.hasNext()) {
900*ec779b8eSAndroid Build Coastguard Worker                 const String8 key = keyIt.next();
901*ec779b8eSAndroid Build Coastguard Worker                 reply->writeString8(key);
902*ec779b8eSAndroid Build Coastguard Worker                 const char* value = drmMetadata->getAsByteArray(&key);
903*ec779b8eSAndroid Build Coastguard Worker                 int bufferSize = 0;
904*ec779b8eSAndroid Build Coastguard Worker                 if (NULL != value) {
905*ec779b8eSAndroid Build Coastguard Worker                     bufferSize = strlen(value);
906*ec779b8eSAndroid Build Coastguard Worker                     reply->writeInt32(bufferSize + 1);
907*ec779b8eSAndroid Build Coastguard Worker                     reply->write(value, bufferSize + 1);
908*ec779b8eSAndroid Build Coastguard Worker                 } else {
909*ec779b8eSAndroid Build Coastguard Worker                     reply->writeInt32(0);
910*ec779b8eSAndroid Build Coastguard Worker                 }
911*ec779b8eSAndroid Build Coastguard Worker             }
912*ec779b8eSAndroid Build Coastguard Worker         }
913*ec779b8eSAndroid Build Coastguard Worker         delete drmMetadata; drmMetadata = NULL;
914*ec779b8eSAndroid Build Coastguard Worker         return NO_ERROR;
915*ec779b8eSAndroid Build Coastguard Worker     }
916*ec779b8eSAndroid Build Coastguard Worker 
917*ec779b8eSAndroid Build Coastguard Worker     case CAN_HANDLE:
918*ec779b8eSAndroid Build Coastguard Worker     {
919*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :CAN_HANDLE");
920*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
921*ec779b8eSAndroid Build Coastguard Worker 
922*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
923*ec779b8eSAndroid Build Coastguard Worker         const String8 path = data.readString8();
924*ec779b8eSAndroid Build Coastguard Worker         const String8 mimeType = data.readString8();
925*ec779b8eSAndroid Build Coastguard Worker 
926*ec779b8eSAndroid Build Coastguard Worker         bool result = canHandle(uniqueId, path, mimeType);
927*ec779b8eSAndroid Build Coastguard Worker 
928*ec779b8eSAndroid Build Coastguard Worker         reply->writeInt32(result);
929*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
930*ec779b8eSAndroid Build Coastguard Worker     }
931*ec779b8eSAndroid Build Coastguard Worker 
932*ec779b8eSAndroid Build Coastguard Worker     case PROCESS_DRM_INFO:
933*ec779b8eSAndroid Build Coastguard Worker     {
934*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO");
935*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
936*ec779b8eSAndroid Build Coastguard Worker 
937*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
938*ec779b8eSAndroid Build Coastguard Worker 
939*ec779b8eSAndroid Build Coastguard Worker         //Filling DRM info
940*ec779b8eSAndroid Build Coastguard Worker         const int infoType = data.readInt32();
941*ec779b8eSAndroid Build Coastguard Worker         const uint32_t bufferSize = data.readInt32();
942*ec779b8eSAndroid Build Coastguard Worker 
943*ec779b8eSAndroid Build Coastguard Worker         if (bufferSize > data.dataAvail()) {
944*ec779b8eSAndroid Build Coastguard Worker             return BAD_VALUE;
945*ec779b8eSAndroid Build Coastguard Worker         }
946*ec779b8eSAndroid Build Coastguard Worker 
947*ec779b8eSAndroid Build Coastguard Worker         char* buffer = NULL;
948*ec779b8eSAndroid Build Coastguard Worker         if (0 < bufferSize) {
949*ec779b8eSAndroid Build Coastguard Worker             buffer = (char *)data.readInplace(bufferSize);
950*ec779b8eSAndroid Build Coastguard Worker         }
951*ec779b8eSAndroid Build Coastguard Worker         const DrmBuffer drmBuffer(buffer, bufferSize);
952*ec779b8eSAndroid Build Coastguard Worker         DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8());
953*ec779b8eSAndroid Build Coastguard Worker 
954*ec779b8eSAndroid Build Coastguard Worker         const int size = data.readInt32();
955*ec779b8eSAndroid Build Coastguard Worker         for (int index = 0; index < size; ++index) {
956*ec779b8eSAndroid Build Coastguard Worker             const String8 key(data.readString8());
957*ec779b8eSAndroid Build Coastguard Worker             const String8 value(data.readString8());
958*ec779b8eSAndroid Build Coastguard Worker             drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
959*ec779b8eSAndroid Build Coastguard Worker         }
960*ec779b8eSAndroid Build Coastguard Worker 
961*ec779b8eSAndroid Build Coastguard Worker         DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo);
962*ec779b8eSAndroid Build Coastguard Worker 
963*ec779b8eSAndroid Build Coastguard Worker         if (NULL != drmInfoStatus) {
964*ec779b8eSAndroid Build Coastguard Worker             //Filling DRM Info Status contents
965*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(drmInfoStatus->statusCode);
966*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(drmInfoStatus->infoType);
967*ec779b8eSAndroid Build Coastguard Worker             reply->writeString8(drmInfoStatus->mimeType);
968*ec779b8eSAndroid Build Coastguard Worker 
969*ec779b8eSAndroid Build Coastguard Worker             if (NULL != drmInfoStatus->drmBuffer) {
970*ec779b8eSAndroid Build Coastguard Worker                 const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer;
971*ec779b8eSAndroid Build Coastguard Worker                 const int bufferSize = drmBuffer->length;
972*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32(bufferSize);
973*ec779b8eSAndroid Build Coastguard Worker                 if (0 < bufferSize) {
974*ec779b8eSAndroid Build Coastguard Worker                     reply->write(drmBuffer->data, bufferSize);
975*ec779b8eSAndroid Build Coastguard Worker                 }
976*ec779b8eSAndroid Build Coastguard Worker                 delete [] drmBuffer->data;
977*ec779b8eSAndroid Build Coastguard Worker                 delete drmBuffer; drmBuffer = NULL;
978*ec779b8eSAndroid Build Coastguard Worker             }
979*ec779b8eSAndroid Build Coastguard Worker         }
980*ec779b8eSAndroid Build Coastguard Worker         delete drmInfo; drmInfo = NULL;
981*ec779b8eSAndroid Build Coastguard Worker         delete drmInfoStatus; drmInfoStatus = NULL;
982*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
983*ec779b8eSAndroid Build Coastguard Worker     }
984*ec779b8eSAndroid Build Coastguard Worker 
985*ec779b8eSAndroid Build Coastguard Worker     case ACQUIRE_DRM_INFO:
986*ec779b8eSAndroid Build Coastguard Worker     {
987*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO");
988*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
989*ec779b8eSAndroid Build Coastguard Worker 
990*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
991*ec779b8eSAndroid Build Coastguard Worker 
992*ec779b8eSAndroid Build Coastguard Worker         //Filling DRM info Request
993*ec779b8eSAndroid Build Coastguard Worker         const int infoType = data.readInt32();
994*ec779b8eSAndroid Build Coastguard Worker         const String8 mimeType = data.readString8();
995*ec779b8eSAndroid Build Coastguard Worker         DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(infoType, mimeType);
996*ec779b8eSAndroid Build Coastguard Worker 
997*ec779b8eSAndroid Build Coastguard Worker         const int size = data.readInt32();
998*ec779b8eSAndroid Build Coastguard Worker         for (int index = 0; index < size; ++index) {
999*ec779b8eSAndroid Build Coastguard Worker             if (!data.dataAvail()) {
1000*ec779b8eSAndroid Build Coastguard Worker                 break;
1001*ec779b8eSAndroid Build Coastguard Worker             }
1002*ec779b8eSAndroid Build Coastguard Worker             const String8 key(data.readString8());
1003*ec779b8eSAndroid Build Coastguard Worker             if (key == String8("FileDescriptorKey")) {
1004*ec779b8eSAndroid Build Coastguard Worker                 char buffer[16];
1005*ec779b8eSAndroid Build Coastguard Worker                 int fd = data.readFileDescriptor();
1006*ec779b8eSAndroid Build Coastguard Worker                 sprintf(buffer, "%lu", (unsigned long)fd);
1007*ec779b8eSAndroid Build Coastguard Worker                 drmInfoRequest->put(key, String8(buffer));
1008*ec779b8eSAndroid Build Coastguard Worker             } else {
1009*ec779b8eSAndroid Build Coastguard Worker                 const String8 value(data.readString8());
1010*ec779b8eSAndroid Build Coastguard Worker                 drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value);
1011*ec779b8eSAndroid Build Coastguard Worker             }
1012*ec779b8eSAndroid Build Coastguard Worker         }
1013*ec779b8eSAndroid Build Coastguard Worker 
1014*ec779b8eSAndroid Build Coastguard Worker         DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest);
1015*ec779b8eSAndroid Build Coastguard Worker 
1016*ec779b8eSAndroid Build Coastguard Worker         if (NULL != drmInfo) {
1017*ec779b8eSAndroid Build Coastguard Worker             //Filling DRM Info
1018*ec779b8eSAndroid Build Coastguard Worker             const DrmBuffer drmBuffer = drmInfo->getData();
1019*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(drmInfo->getInfoType());
1020*ec779b8eSAndroid Build Coastguard Worker 
1021*ec779b8eSAndroid Build Coastguard Worker             const int bufferSize = drmBuffer.length;
1022*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(bufferSize);
1023*ec779b8eSAndroid Build Coastguard Worker             if (0 < bufferSize) {
1024*ec779b8eSAndroid Build Coastguard Worker                 reply->write(drmBuffer.data, bufferSize);
1025*ec779b8eSAndroid Build Coastguard Worker             }
1026*ec779b8eSAndroid Build Coastguard Worker             reply->writeString8(drmInfo->getMimeType());
1027*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(drmInfo->getCount());
1028*ec779b8eSAndroid Build Coastguard Worker 
1029*ec779b8eSAndroid Build Coastguard Worker             DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
1030*ec779b8eSAndroid Build Coastguard Worker             while (keyIt.hasNext()) {
1031*ec779b8eSAndroid Build Coastguard Worker                 const String8 key = keyIt.next();
1032*ec779b8eSAndroid Build Coastguard Worker                 reply->writeString8(key);
1033*ec779b8eSAndroid Build Coastguard Worker                 const String8 value = drmInfo->get(key);
1034*ec779b8eSAndroid Build Coastguard Worker                 reply->writeString8((value == String8("")) ? String8("NULL") : value);
1035*ec779b8eSAndroid Build Coastguard Worker             }
1036*ec779b8eSAndroid Build Coastguard Worker             delete [] drmBuffer.data;
1037*ec779b8eSAndroid Build Coastguard Worker         }
1038*ec779b8eSAndroid Build Coastguard Worker         delete drmInfoRequest; drmInfoRequest = NULL;
1039*ec779b8eSAndroid Build Coastguard Worker         delete drmInfo; drmInfo = NULL;
1040*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1041*ec779b8eSAndroid Build Coastguard Worker     }
1042*ec779b8eSAndroid Build Coastguard Worker 
1043*ec779b8eSAndroid Build Coastguard Worker     case SAVE_RIGHTS:
1044*ec779b8eSAndroid Build Coastguard Worker     {
1045*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS");
1046*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1047*ec779b8eSAndroid Build Coastguard Worker 
1048*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
1049*ec779b8eSAndroid Build Coastguard Worker 
1050*ec779b8eSAndroid Build Coastguard Worker         //Filling DRM Rights
1051*ec779b8eSAndroid Build Coastguard Worker         const uint32_t bufferSize = data.readInt32();
1052*ec779b8eSAndroid Build Coastguard Worker         if (bufferSize > data.dataAvail()) {
1053*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(BAD_VALUE);
1054*ec779b8eSAndroid Build Coastguard Worker             return DRM_NO_ERROR;
1055*ec779b8eSAndroid Build Coastguard Worker         }
1056*ec779b8eSAndroid Build Coastguard Worker 
1057*ec779b8eSAndroid Build Coastguard Worker         const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1058*ec779b8eSAndroid Build Coastguard Worker 
1059*ec779b8eSAndroid Build Coastguard Worker         const String8 mimeType(data.readString8());
1060*ec779b8eSAndroid Build Coastguard Worker         const String8 accountId(data.readString8());
1061*ec779b8eSAndroid Build Coastguard Worker         const String8 subscriptionId(data.readString8());
1062*ec779b8eSAndroid Build Coastguard Worker         const String8 rightsPath(data.readString8());
1063*ec779b8eSAndroid Build Coastguard Worker         const String8 contentPath(data.readString8());
1064*ec779b8eSAndroid Build Coastguard Worker 
1065*ec779b8eSAndroid Build Coastguard Worker         DrmRights drmRights(drmBuffer,
1066*ec779b8eSAndroid Build Coastguard Worker                             ((mimeType == String8("NULL")) ? String8("") : mimeType),
1067*ec779b8eSAndroid Build Coastguard Worker                             ((accountId == String8("NULL")) ? String8("") : accountId),
1068*ec779b8eSAndroid Build Coastguard Worker                             ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId));
1069*ec779b8eSAndroid Build Coastguard Worker 
1070*ec779b8eSAndroid Build Coastguard Worker         const status_t status = saveRights(uniqueId, drmRights,
1071*ec779b8eSAndroid Build Coastguard Worker                             ((rightsPath == String8("NULL")) ? String8("") : rightsPath),
1072*ec779b8eSAndroid Build Coastguard Worker                             ((contentPath == String8("NULL")) ? String8("") : contentPath));
1073*ec779b8eSAndroid Build Coastguard Worker 
1074*ec779b8eSAndroid Build Coastguard Worker         reply->writeInt32(status);
1075*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1076*ec779b8eSAndroid Build Coastguard Worker     }
1077*ec779b8eSAndroid Build Coastguard Worker 
1078*ec779b8eSAndroid Build Coastguard Worker     case GET_ORIGINAL_MIMETYPE:
1079*ec779b8eSAndroid Build Coastguard Worker     {
1080*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE");
1081*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1082*ec779b8eSAndroid Build Coastguard Worker 
1083*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
1084*ec779b8eSAndroid Build Coastguard Worker         const String8 path = data.readString8();
1085*ec779b8eSAndroid Build Coastguard Worker         const int32_t isFdValid = data.readInt32();
1086*ec779b8eSAndroid Build Coastguard Worker         int fd = -1;
1087*ec779b8eSAndroid Build Coastguard Worker         if (isFdValid) {
1088*ec779b8eSAndroid Build Coastguard Worker             fd = data.readFileDescriptor();
1089*ec779b8eSAndroid Build Coastguard Worker         }
1090*ec779b8eSAndroid Build Coastguard Worker         const String8 originalMimeType = getOriginalMimeType(uniqueId, path, fd);
1091*ec779b8eSAndroid Build Coastguard Worker 
1092*ec779b8eSAndroid Build Coastguard Worker         reply->writeString8(originalMimeType);
1093*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1094*ec779b8eSAndroid Build Coastguard Worker     }
1095*ec779b8eSAndroid Build Coastguard Worker 
1096*ec779b8eSAndroid Build Coastguard Worker     case GET_DRM_OBJECT_TYPE:
1097*ec779b8eSAndroid Build Coastguard Worker     {
1098*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE");
1099*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1100*ec779b8eSAndroid Build Coastguard Worker 
1101*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
1102*ec779b8eSAndroid Build Coastguard Worker         const String8 path = data.readString8();
1103*ec779b8eSAndroid Build Coastguard Worker         const String8 mimeType = data.readString8();
1104*ec779b8eSAndroid Build Coastguard Worker         const int drmObjectType = getDrmObjectType(uniqueId, path, mimeType);
1105*ec779b8eSAndroid Build Coastguard Worker 
1106*ec779b8eSAndroid Build Coastguard Worker         reply->writeInt32(drmObjectType);
1107*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1108*ec779b8eSAndroid Build Coastguard Worker     }
1109*ec779b8eSAndroid Build Coastguard Worker 
1110*ec779b8eSAndroid Build Coastguard Worker     case CHECK_RIGHTS_STATUS:
1111*ec779b8eSAndroid Build Coastguard Worker     {
1112*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS");
1113*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1114*ec779b8eSAndroid Build Coastguard Worker 
1115*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
1116*ec779b8eSAndroid Build Coastguard Worker         const String8 path = data.readString8();
1117*ec779b8eSAndroid Build Coastguard Worker         const int action = data.readInt32();
1118*ec779b8eSAndroid Build Coastguard Worker         const int result = checkRightsStatus(uniqueId, path, action);
1119*ec779b8eSAndroid Build Coastguard Worker 
1120*ec779b8eSAndroid Build Coastguard Worker         reply->writeInt32(result);
1121*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1122*ec779b8eSAndroid Build Coastguard Worker     }
1123*ec779b8eSAndroid Build Coastguard Worker 
1124*ec779b8eSAndroid Build Coastguard Worker     case CONSUME_RIGHTS:
1125*ec779b8eSAndroid Build Coastguard Worker     {
1126*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS");
1127*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1128*ec779b8eSAndroid Build Coastguard Worker 
1129*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
1130*ec779b8eSAndroid Build Coastguard Worker 
1131*ec779b8eSAndroid Build Coastguard Worker         sp<DecryptHandle> handle = new DecryptHandle();
1132*ec779b8eSAndroid Build Coastguard Worker         readDecryptHandleFromParcelData(handle, data);
1133*ec779b8eSAndroid Build Coastguard Worker 
1134*ec779b8eSAndroid Build Coastguard Worker         const int action = data.readInt32();
1135*ec779b8eSAndroid Build Coastguard Worker         const bool reserve = static_cast<bool>(data.readInt32());
1136*ec779b8eSAndroid Build Coastguard Worker         const status_t status
1137*ec779b8eSAndroid Build Coastguard Worker             = consumeRights(uniqueId, handle, action, reserve);
1138*ec779b8eSAndroid Build Coastguard Worker         reply->writeInt32(status);
1139*ec779b8eSAndroid Build Coastguard Worker 
1140*ec779b8eSAndroid Build Coastguard Worker         clearDecryptHandle(handle);
1141*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1142*ec779b8eSAndroid Build Coastguard Worker     }
1143*ec779b8eSAndroid Build Coastguard Worker 
1144*ec779b8eSAndroid Build Coastguard Worker     case SET_PLAYBACK_STATUS:
1145*ec779b8eSAndroid Build Coastguard Worker     {
1146*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS");
1147*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1148*ec779b8eSAndroid Build Coastguard Worker 
1149*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
1150*ec779b8eSAndroid Build Coastguard Worker 
1151*ec779b8eSAndroid Build Coastguard Worker         sp<DecryptHandle> handle = new DecryptHandle();
1152*ec779b8eSAndroid Build Coastguard Worker         readDecryptHandleFromParcelData(handle, data);
1153*ec779b8eSAndroid Build Coastguard Worker 
1154*ec779b8eSAndroid Build Coastguard Worker         const int playbackStatus = data.readInt32();
1155*ec779b8eSAndroid Build Coastguard Worker         const int64_t position = data.readInt64();
1156*ec779b8eSAndroid Build Coastguard Worker         const status_t status
1157*ec779b8eSAndroid Build Coastguard Worker             = setPlaybackStatus(uniqueId, handle, playbackStatus, position);
1158*ec779b8eSAndroid Build Coastguard Worker         reply->writeInt32(status);
1159*ec779b8eSAndroid Build Coastguard Worker 
1160*ec779b8eSAndroid Build Coastguard Worker         clearDecryptHandle(handle);
1161*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1162*ec779b8eSAndroid Build Coastguard Worker     }
1163*ec779b8eSAndroid Build Coastguard Worker 
1164*ec779b8eSAndroid Build Coastguard Worker     case VALIDATE_ACTION:
1165*ec779b8eSAndroid Build Coastguard Worker     {
1166*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION");
1167*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1168*ec779b8eSAndroid Build Coastguard Worker 
1169*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
1170*ec779b8eSAndroid Build Coastguard Worker         const String8 path = data.readString8();
1171*ec779b8eSAndroid Build Coastguard Worker         const int action = data.readInt32();
1172*ec779b8eSAndroid Build Coastguard Worker         const int outputType = data.readInt32();
1173*ec779b8eSAndroid Build Coastguard Worker         const int configuration = data.readInt32();
1174*ec779b8eSAndroid Build Coastguard Worker         bool result = validateAction(uniqueId, path, action,
1175*ec779b8eSAndroid Build Coastguard Worker                 ActionDescription(outputType, configuration));
1176*ec779b8eSAndroid Build Coastguard Worker 
1177*ec779b8eSAndroid Build Coastguard Worker         reply->writeInt32(result);
1178*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1179*ec779b8eSAndroid Build Coastguard Worker     }
1180*ec779b8eSAndroid Build Coastguard Worker 
1181*ec779b8eSAndroid Build Coastguard Worker     case REMOVE_RIGHTS:
1182*ec779b8eSAndroid Build Coastguard Worker     {
1183*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS");
1184*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1185*ec779b8eSAndroid Build Coastguard Worker 
1186*ec779b8eSAndroid Build Coastguard Worker         int uniqueId = data.readInt32();
1187*ec779b8eSAndroid Build Coastguard Worker         String8 path = data.readString8();
1188*ec779b8eSAndroid Build Coastguard Worker         const status_t status = removeRights(uniqueId, path);
1189*ec779b8eSAndroid Build Coastguard Worker         reply->writeInt32(status);
1190*ec779b8eSAndroid Build Coastguard Worker 
1191*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1192*ec779b8eSAndroid Build Coastguard Worker     }
1193*ec779b8eSAndroid Build Coastguard Worker 
1194*ec779b8eSAndroid Build Coastguard Worker     case REMOVE_ALL_RIGHTS:
1195*ec779b8eSAndroid Build Coastguard Worker     {
1196*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS");
1197*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1198*ec779b8eSAndroid Build Coastguard Worker 
1199*ec779b8eSAndroid Build Coastguard Worker         const status_t status = removeAllRights(data.readInt32());
1200*ec779b8eSAndroid Build Coastguard Worker         reply->writeInt32(status);
1201*ec779b8eSAndroid Build Coastguard Worker 
1202*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1203*ec779b8eSAndroid Build Coastguard Worker     }
1204*ec779b8eSAndroid Build Coastguard Worker 
1205*ec779b8eSAndroid Build Coastguard Worker     case OPEN_CONVERT_SESSION:
1206*ec779b8eSAndroid Build Coastguard Worker     {
1207*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION");
1208*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1209*ec779b8eSAndroid Build Coastguard Worker 
1210*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
1211*ec779b8eSAndroid Build Coastguard Worker         const String8 mimeType = data.readString8();
1212*ec779b8eSAndroid Build Coastguard Worker         const int convertId = openConvertSession(uniqueId, mimeType);
1213*ec779b8eSAndroid Build Coastguard Worker 
1214*ec779b8eSAndroid Build Coastguard Worker         reply->writeInt32(convertId);
1215*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1216*ec779b8eSAndroid Build Coastguard Worker     }
1217*ec779b8eSAndroid Build Coastguard Worker 
1218*ec779b8eSAndroid Build Coastguard Worker     case CONVERT_DATA:
1219*ec779b8eSAndroid Build Coastguard Worker     {
1220*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :CONVERT_DATA");
1221*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1222*ec779b8eSAndroid Build Coastguard Worker 
1223*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
1224*ec779b8eSAndroid Build Coastguard Worker         const int convertId = data.readInt32();
1225*ec779b8eSAndroid Build Coastguard Worker 
1226*ec779b8eSAndroid Build Coastguard Worker         //Filling input data
1227*ec779b8eSAndroid Build Coastguard Worker         const uint32_t bufferSize = data.readInt32();
1228*ec779b8eSAndroid Build Coastguard Worker         if (bufferSize > data.dataAvail()) {
1229*ec779b8eSAndroid Build Coastguard Worker             return BAD_VALUE;
1230*ec779b8eSAndroid Build Coastguard Worker         }
1231*ec779b8eSAndroid Build Coastguard Worker         DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1232*ec779b8eSAndroid Build Coastguard Worker 
1233*ec779b8eSAndroid Build Coastguard Worker         DrmConvertedStatus* drmConvertedStatus = convertData(uniqueId, convertId, inputData);
1234*ec779b8eSAndroid Build Coastguard Worker 
1235*ec779b8eSAndroid Build Coastguard Worker         if (NULL != drmConvertedStatus) {
1236*ec779b8eSAndroid Build Coastguard Worker             //Filling Drm Converted Ststus
1237*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(drmConvertedStatus->statusCode);
1238*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt64(drmConvertedStatus->offset);
1239*ec779b8eSAndroid Build Coastguard Worker 
1240*ec779b8eSAndroid Build Coastguard Worker             if (NULL != drmConvertedStatus->convertedData) {
1241*ec779b8eSAndroid Build Coastguard Worker                 const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
1242*ec779b8eSAndroid Build Coastguard Worker                 const int bufferSize = convertedData->length;
1243*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32(bufferSize);
1244*ec779b8eSAndroid Build Coastguard Worker                 if (0 < bufferSize) {
1245*ec779b8eSAndroid Build Coastguard Worker                     reply->write(convertedData->data, bufferSize);
1246*ec779b8eSAndroid Build Coastguard Worker                 }
1247*ec779b8eSAndroid Build Coastguard Worker                 delete [] convertedData->data;
1248*ec779b8eSAndroid Build Coastguard Worker                 delete convertedData; convertedData = NULL;
1249*ec779b8eSAndroid Build Coastguard Worker             }
1250*ec779b8eSAndroid Build Coastguard Worker         }
1251*ec779b8eSAndroid Build Coastguard Worker         delete inputData; inputData = NULL;
1252*ec779b8eSAndroid Build Coastguard Worker         delete drmConvertedStatus; drmConvertedStatus = NULL;
1253*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1254*ec779b8eSAndroid Build Coastguard Worker     }
1255*ec779b8eSAndroid Build Coastguard Worker 
1256*ec779b8eSAndroid Build Coastguard Worker     case CLOSE_CONVERT_SESSION:
1257*ec779b8eSAndroid Build Coastguard Worker     {
1258*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION");
1259*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1260*ec779b8eSAndroid Build Coastguard Worker 
1261*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
1262*ec779b8eSAndroid Build Coastguard Worker         const int convertId = data.readInt32();
1263*ec779b8eSAndroid Build Coastguard Worker         DrmConvertedStatus* drmConvertedStatus
1264*ec779b8eSAndroid Build Coastguard Worker             = closeConvertSession(uniqueId, convertId);
1265*ec779b8eSAndroid Build Coastguard Worker 
1266*ec779b8eSAndroid Build Coastguard Worker         if (NULL != drmConvertedStatus) {
1267*ec779b8eSAndroid Build Coastguard Worker             //Filling Drm Converted Ststus
1268*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(drmConvertedStatus->statusCode);
1269*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt64(drmConvertedStatus->offset);
1270*ec779b8eSAndroid Build Coastguard Worker 
1271*ec779b8eSAndroid Build Coastguard Worker             if (NULL != drmConvertedStatus->convertedData) {
1272*ec779b8eSAndroid Build Coastguard Worker                 const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
1273*ec779b8eSAndroid Build Coastguard Worker                 const int bufferSize = convertedData->length;
1274*ec779b8eSAndroid Build Coastguard Worker                 reply->writeInt32(bufferSize);
1275*ec779b8eSAndroid Build Coastguard Worker                 if (0 < bufferSize) {
1276*ec779b8eSAndroid Build Coastguard Worker                     reply->write(convertedData->data, bufferSize);
1277*ec779b8eSAndroid Build Coastguard Worker                 }
1278*ec779b8eSAndroid Build Coastguard Worker                 delete [] convertedData->data;
1279*ec779b8eSAndroid Build Coastguard Worker                 delete convertedData; convertedData = NULL;
1280*ec779b8eSAndroid Build Coastguard Worker             }
1281*ec779b8eSAndroid Build Coastguard Worker         }
1282*ec779b8eSAndroid Build Coastguard Worker         delete drmConvertedStatus; drmConvertedStatus = NULL;
1283*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1284*ec779b8eSAndroid Build Coastguard Worker     }
1285*ec779b8eSAndroid Build Coastguard Worker 
1286*ec779b8eSAndroid Build Coastguard Worker     case GET_ALL_SUPPORT_INFO:
1287*ec779b8eSAndroid Build Coastguard Worker     {
1288*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO");
1289*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1290*ec779b8eSAndroid Build Coastguard Worker 
1291*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
1292*ec779b8eSAndroid Build Coastguard Worker         int length = 0;
1293*ec779b8eSAndroid Build Coastguard Worker         DrmSupportInfo* drmSupportInfoArray = NULL;
1294*ec779b8eSAndroid Build Coastguard Worker 
1295*ec779b8eSAndroid Build Coastguard Worker         status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray);
1296*ec779b8eSAndroid Build Coastguard Worker 
1297*ec779b8eSAndroid Build Coastguard Worker         reply->writeInt32(length);
1298*ec779b8eSAndroid Build Coastguard Worker         for (int i = 0; i < length; ++i) {
1299*ec779b8eSAndroid Build Coastguard Worker             DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i];
1300*ec779b8eSAndroid Build Coastguard Worker 
1301*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(drmSupportInfo.getFileSuffixCount());
1302*ec779b8eSAndroid Build Coastguard Worker             DrmSupportInfo::FileSuffixIterator fileSuffixIt
1303*ec779b8eSAndroid Build Coastguard Worker                 = drmSupportInfo.getFileSuffixIterator();
1304*ec779b8eSAndroid Build Coastguard Worker             while (fileSuffixIt.hasNext()) {
1305*ec779b8eSAndroid Build Coastguard Worker                 reply->writeString8(fileSuffixIt.next());
1306*ec779b8eSAndroid Build Coastguard Worker             }
1307*ec779b8eSAndroid Build Coastguard Worker 
1308*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(drmSupportInfo.getMimeTypeCount());
1309*ec779b8eSAndroid Build Coastguard Worker             DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator();
1310*ec779b8eSAndroid Build Coastguard Worker             while (mimeTypeIt.hasNext()) {
1311*ec779b8eSAndroid Build Coastguard Worker                 reply->writeString8(mimeTypeIt.next());
1312*ec779b8eSAndroid Build Coastguard Worker             }
1313*ec779b8eSAndroid Build Coastguard Worker             reply->writeString8(drmSupportInfo.getDescription());
1314*ec779b8eSAndroid Build Coastguard Worker         }
1315*ec779b8eSAndroid Build Coastguard Worker         delete [] drmSupportInfoArray; drmSupportInfoArray = NULL;
1316*ec779b8eSAndroid Build Coastguard Worker         reply->writeInt32(status);
1317*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1318*ec779b8eSAndroid Build Coastguard Worker     }
1319*ec779b8eSAndroid Build Coastguard Worker 
1320*ec779b8eSAndroid Build Coastguard Worker     case OPEN_DECRYPT_SESSION:
1321*ec779b8eSAndroid Build Coastguard Worker     {
1322*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION");
1323*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1324*ec779b8eSAndroid Build Coastguard Worker 
1325*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
1326*ec779b8eSAndroid Build Coastguard Worker         const int fd = data.readFileDescriptor();
1327*ec779b8eSAndroid Build Coastguard Worker 
1328*ec779b8eSAndroid Build Coastguard Worker         const off64_t offset = data.readInt64();
1329*ec779b8eSAndroid Build Coastguard Worker         const off64_t length = data.readInt64();
1330*ec779b8eSAndroid Build Coastguard Worker         const String8 mime = data.readString8();
1331*ec779b8eSAndroid Build Coastguard Worker 
1332*ec779b8eSAndroid Build Coastguard Worker         sp<DecryptHandle> handle
1333*ec779b8eSAndroid Build Coastguard Worker             = openDecryptSession(uniqueId, fd, offset, length, mime.c_str());
1334*ec779b8eSAndroid Build Coastguard Worker 
1335*ec779b8eSAndroid Build Coastguard Worker         if (NULL != handle.get()) {
1336*ec779b8eSAndroid Build Coastguard Worker             writeDecryptHandleToParcelData(handle.get(), reply);
1337*ec779b8eSAndroid Build Coastguard Worker             clearDecryptHandle(handle);
1338*ec779b8eSAndroid Build Coastguard Worker             handle.clear();
1339*ec779b8eSAndroid Build Coastguard Worker         }
1340*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1341*ec779b8eSAndroid Build Coastguard Worker     }
1342*ec779b8eSAndroid Build Coastguard Worker 
1343*ec779b8eSAndroid Build Coastguard Worker     case OPEN_DECRYPT_SESSION_FROM_URI:
1344*ec779b8eSAndroid Build Coastguard Worker     {
1345*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI");
1346*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1347*ec779b8eSAndroid Build Coastguard Worker 
1348*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
1349*ec779b8eSAndroid Build Coastguard Worker         const String8 uri = data.readString8();
1350*ec779b8eSAndroid Build Coastguard Worker         const String8 mime = data.readString8();
1351*ec779b8eSAndroid Build Coastguard Worker 
1352*ec779b8eSAndroid Build Coastguard Worker         sp<DecryptHandle> handle = openDecryptSession(uniqueId, uri.c_str(), mime.c_str());
1353*ec779b8eSAndroid Build Coastguard Worker 
1354*ec779b8eSAndroid Build Coastguard Worker         if (NULL != handle.get()) {
1355*ec779b8eSAndroid Build Coastguard Worker             writeDecryptHandleToParcelData(handle.get(), reply);
1356*ec779b8eSAndroid Build Coastguard Worker 
1357*ec779b8eSAndroid Build Coastguard Worker             clearDecryptHandle(handle);
1358*ec779b8eSAndroid Build Coastguard Worker             handle.clear();
1359*ec779b8eSAndroid Build Coastguard Worker         } else {
1360*ec779b8eSAndroid Build Coastguard Worker             ALOGV("NULL decryptHandle is returned");
1361*ec779b8eSAndroid Build Coastguard Worker         }
1362*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1363*ec779b8eSAndroid Build Coastguard Worker     }
1364*ec779b8eSAndroid Build Coastguard Worker 
1365*ec779b8eSAndroid Build Coastguard Worker     case OPEN_DECRYPT_SESSION_FOR_STREAMING:
1366*ec779b8eSAndroid Build Coastguard Worker     {
1367*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FOR_STREAMING");
1368*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1369*ec779b8eSAndroid Build Coastguard Worker 
1370*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
1371*ec779b8eSAndroid Build Coastguard Worker         const int bufferSize = data.readInt32();
1372*ec779b8eSAndroid Build Coastguard Worker         DrmBuffer buf((bufferSize > 0) ? (char *)data.readInplace(bufferSize) : NULL,
1373*ec779b8eSAndroid Build Coastguard Worker                 bufferSize);
1374*ec779b8eSAndroid Build Coastguard Worker         const String8 mimeType(data.readString8());
1375*ec779b8eSAndroid Build Coastguard Worker 
1376*ec779b8eSAndroid Build Coastguard Worker         sp<DecryptHandle> handle = openDecryptSession(uniqueId, buf, mimeType);
1377*ec779b8eSAndroid Build Coastguard Worker 
1378*ec779b8eSAndroid Build Coastguard Worker         if (handle != NULL) {
1379*ec779b8eSAndroid Build Coastguard Worker             writeDecryptHandleToParcelData(handle, reply);
1380*ec779b8eSAndroid Build Coastguard Worker             clearDecryptHandle(handle);
1381*ec779b8eSAndroid Build Coastguard Worker             handle.clear();
1382*ec779b8eSAndroid Build Coastguard Worker         } else {
1383*ec779b8eSAndroid Build Coastguard Worker             ALOGV("NULL decryptHandle is returned");
1384*ec779b8eSAndroid Build Coastguard Worker         }
1385*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1386*ec779b8eSAndroid Build Coastguard Worker     }
1387*ec779b8eSAndroid Build Coastguard Worker 
1388*ec779b8eSAndroid Build Coastguard Worker     case CLOSE_DECRYPT_SESSION:
1389*ec779b8eSAndroid Build Coastguard Worker     {
1390*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION");
1391*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1392*ec779b8eSAndroid Build Coastguard Worker 
1393*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
1394*ec779b8eSAndroid Build Coastguard Worker 
1395*ec779b8eSAndroid Build Coastguard Worker         sp<DecryptHandle> handle = new DecryptHandle();
1396*ec779b8eSAndroid Build Coastguard Worker         readDecryptHandleFromParcelData(handle, data);
1397*ec779b8eSAndroid Build Coastguard Worker 
1398*ec779b8eSAndroid Build Coastguard Worker         const status_t status = closeDecryptSession(uniqueId, handle);
1399*ec779b8eSAndroid Build Coastguard Worker         reply->writeInt32(status);
1400*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1401*ec779b8eSAndroid Build Coastguard Worker     }
1402*ec779b8eSAndroid Build Coastguard Worker 
1403*ec779b8eSAndroid Build Coastguard Worker     case INITIALIZE_DECRYPT_UNIT:
1404*ec779b8eSAndroid Build Coastguard Worker     {
1405*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT");
1406*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1407*ec779b8eSAndroid Build Coastguard Worker 
1408*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
1409*ec779b8eSAndroid Build Coastguard Worker 
1410*ec779b8eSAndroid Build Coastguard Worker         sp<DecryptHandle> handle = new DecryptHandle();
1411*ec779b8eSAndroid Build Coastguard Worker         readDecryptHandleFromParcelData(handle, data);
1412*ec779b8eSAndroid Build Coastguard Worker 
1413*ec779b8eSAndroid Build Coastguard Worker         const int decryptUnitId = data.readInt32();
1414*ec779b8eSAndroid Build Coastguard Worker 
1415*ec779b8eSAndroid Build Coastguard Worker         //Filling Header info
1416*ec779b8eSAndroid Build Coastguard Worker         const uint32_t bufferSize = data.readInt32();
1417*ec779b8eSAndroid Build Coastguard Worker         if (bufferSize > data.dataAvail()) {
1418*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(BAD_VALUE);
1419*ec779b8eSAndroid Build Coastguard Worker             clearDecryptHandle(handle);
1420*ec779b8eSAndroid Build Coastguard Worker             return DRM_NO_ERROR;
1421*ec779b8eSAndroid Build Coastguard Worker         }
1422*ec779b8eSAndroid Build Coastguard Worker         DrmBuffer* headerInfo = NULL;
1423*ec779b8eSAndroid Build Coastguard Worker         headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1424*ec779b8eSAndroid Build Coastguard Worker 
1425*ec779b8eSAndroid Build Coastguard Worker         const status_t status
1426*ec779b8eSAndroid Build Coastguard Worker             = initializeDecryptUnit(uniqueId, handle, decryptUnitId, headerInfo);
1427*ec779b8eSAndroid Build Coastguard Worker         reply->writeInt32(status);
1428*ec779b8eSAndroid Build Coastguard Worker 
1429*ec779b8eSAndroid Build Coastguard Worker         clearDecryptHandle(handle);
1430*ec779b8eSAndroid Build Coastguard Worker         delete headerInfo; headerInfo = NULL;
1431*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1432*ec779b8eSAndroid Build Coastguard Worker     }
1433*ec779b8eSAndroid Build Coastguard Worker 
1434*ec779b8eSAndroid Build Coastguard Worker     case DECRYPT:
1435*ec779b8eSAndroid Build Coastguard Worker     {
1436*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :DECRYPT");
1437*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1438*ec779b8eSAndroid Build Coastguard Worker 
1439*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
1440*ec779b8eSAndroid Build Coastguard Worker 
1441*ec779b8eSAndroid Build Coastguard Worker         sp<DecryptHandle> handle = new DecryptHandle;
1442*ec779b8eSAndroid Build Coastguard Worker         readDecryptHandleFromParcelData(handle, data);
1443*ec779b8eSAndroid Build Coastguard Worker 
1444*ec779b8eSAndroid Build Coastguard Worker         const int decryptUnitId = data.readInt32();
1445*ec779b8eSAndroid Build Coastguard Worker         const uint32_t decBufferSize = data.readInt32();
1446*ec779b8eSAndroid Build Coastguard Worker         const uint32_t encBufferSize = data.readInt32();
1447*ec779b8eSAndroid Build Coastguard Worker 
1448*ec779b8eSAndroid Build Coastguard Worker         if (encBufferSize > data.dataAvail() ||
1449*ec779b8eSAndroid Build Coastguard Worker             decBufferSize > MAX_BINDER_TRANSACTION_SIZE) {
1450*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(BAD_VALUE);
1451*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(0);
1452*ec779b8eSAndroid Build Coastguard Worker             clearDecryptHandle(handle);
1453*ec779b8eSAndroid Build Coastguard Worker             return DRM_NO_ERROR;
1454*ec779b8eSAndroid Build Coastguard Worker         }
1455*ec779b8eSAndroid Build Coastguard Worker 
1456*ec779b8eSAndroid Build Coastguard Worker         DrmBuffer* encBuffer
1457*ec779b8eSAndroid Build Coastguard Worker             = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize);
1458*ec779b8eSAndroid Build Coastguard Worker 
1459*ec779b8eSAndroid Build Coastguard Worker         char* buffer = NULL;
1460*ec779b8eSAndroid Build Coastguard Worker         buffer = new char[decBufferSize];
1461*ec779b8eSAndroid Build Coastguard Worker         DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize);
1462*ec779b8eSAndroid Build Coastguard Worker 
1463*ec779b8eSAndroid Build Coastguard Worker         DrmBuffer* IV = NULL;
1464*ec779b8eSAndroid Build Coastguard Worker         if (0 != data.dataAvail()) {
1465*ec779b8eSAndroid Build Coastguard Worker             const uint32_t ivBufferlength = data.readInt32();
1466*ec779b8eSAndroid Build Coastguard Worker             if (ivBufferlength <= data.dataAvail()) {
1467*ec779b8eSAndroid Build Coastguard Worker                 IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength);
1468*ec779b8eSAndroid Build Coastguard Worker             }
1469*ec779b8eSAndroid Build Coastguard Worker         }
1470*ec779b8eSAndroid Build Coastguard Worker 
1471*ec779b8eSAndroid Build Coastguard Worker         const status_t status
1472*ec779b8eSAndroid Build Coastguard Worker             = decrypt(uniqueId, handle, decryptUnitId, encBuffer, &decBuffer, IV);
1473*ec779b8eSAndroid Build Coastguard Worker 
1474*ec779b8eSAndroid Build Coastguard Worker         reply->writeInt32(status);
1475*ec779b8eSAndroid Build Coastguard Worker 
1476*ec779b8eSAndroid Build Coastguard Worker         if (status == NO_ERROR) {
1477*ec779b8eSAndroid Build Coastguard Worker             const int size = decBuffer->length;
1478*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(size);
1479*ec779b8eSAndroid Build Coastguard Worker             reply->write(decBuffer->data, size);
1480*ec779b8eSAndroid Build Coastguard Worker         }
1481*ec779b8eSAndroid Build Coastguard Worker 
1482*ec779b8eSAndroid Build Coastguard Worker         clearDecryptHandle(handle);
1483*ec779b8eSAndroid Build Coastguard Worker         delete encBuffer; encBuffer = NULL;
1484*ec779b8eSAndroid Build Coastguard Worker         delete decBuffer; decBuffer = NULL;
1485*ec779b8eSAndroid Build Coastguard Worker         delete [] buffer; buffer = NULL;
1486*ec779b8eSAndroid Build Coastguard Worker         delete IV; IV = NULL;
1487*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1488*ec779b8eSAndroid Build Coastguard Worker     }
1489*ec779b8eSAndroid Build Coastguard Worker 
1490*ec779b8eSAndroid Build Coastguard Worker     case FINALIZE_DECRYPT_UNIT:
1491*ec779b8eSAndroid Build Coastguard Worker     {
1492*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT");
1493*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1494*ec779b8eSAndroid Build Coastguard Worker 
1495*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
1496*ec779b8eSAndroid Build Coastguard Worker 
1497*ec779b8eSAndroid Build Coastguard Worker         sp<DecryptHandle> handle = new DecryptHandle();
1498*ec779b8eSAndroid Build Coastguard Worker         readDecryptHandleFromParcelData(handle, data);
1499*ec779b8eSAndroid Build Coastguard Worker 
1500*ec779b8eSAndroid Build Coastguard Worker         const status_t status = finalizeDecryptUnit(uniqueId, handle, data.readInt32());
1501*ec779b8eSAndroid Build Coastguard Worker         reply->writeInt32(status);
1502*ec779b8eSAndroid Build Coastguard Worker 
1503*ec779b8eSAndroid Build Coastguard Worker         clearDecryptHandle(handle);
1504*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1505*ec779b8eSAndroid Build Coastguard Worker     }
1506*ec779b8eSAndroid Build Coastguard Worker 
1507*ec779b8eSAndroid Build Coastguard Worker     case PREAD:
1508*ec779b8eSAndroid Build Coastguard Worker     {
1509*ec779b8eSAndroid Build Coastguard Worker         ALOGV("BnDrmManagerService::onTransact :READ");
1510*ec779b8eSAndroid Build Coastguard Worker         CHECK_INTERFACE(IDrmManagerService, data, reply);
1511*ec779b8eSAndroid Build Coastguard Worker 
1512*ec779b8eSAndroid Build Coastguard Worker         const int uniqueId = data.readInt32();
1513*ec779b8eSAndroid Build Coastguard Worker 
1514*ec779b8eSAndroid Build Coastguard Worker         sp<DecryptHandle> handle = new DecryptHandle();
1515*ec779b8eSAndroid Build Coastguard Worker         readDecryptHandleFromParcelData(handle, data);
1516*ec779b8eSAndroid Build Coastguard Worker 
1517*ec779b8eSAndroid Build Coastguard Worker         const uint32_t numBytes = data.readInt32();
1518*ec779b8eSAndroid Build Coastguard Worker         if (numBytes > MAX_BINDER_TRANSACTION_SIZE) {
1519*ec779b8eSAndroid Build Coastguard Worker             reply->writeInt32(BAD_VALUE);
1520*ec779b8eSAndroid Build Coastguard Worker             return DRM_NO_ERROR;
1521*ec779b8eSAndroid Build Coastguard Worker         }
1522*ec779b8eSAndroid Build Coastguard Worker         char* buffer = new char[numBytes];
1523*ec779b8eSAndroid Build Coastguard Worker 
1524*ec779b8eSAndroid Build Coastguard Worker         const off64_t offset = data.readInt64();
1525*ec779b8eSAndroid Build Coastguard Worker 
1526*ec779b8eSAndroid Build Coastguard Worker         ssize_t result = pread(uniqueId, handle, buffer, numBytes, offset);
1527*ec779b8eSAndroid Build Coastguard Worker         reply->writeInt32(result);
1528*ec779b8eSAndroid Build Coastguard Worker         if (0 < result) {
1529*ec779b8eSAndroid Build Coastguard Worker             reply->write(buffer, result);
1530*ec779b8eSAndroid Build Coastguard Worker         }
1531*ec779b8eSAndroid Build Coastguard Worker 
1532*ec779b8eSAndroid Build Coastguard Worker         clearDecryptHandle(handle);
1533*ec779b8eSAndroid Build Coastguard Worker         delete [] buffer, buffer = NULL;
1534*ec779b8eSAndroid Build Coastguard Worker         return DRM_NO_ERROR;
1535*ec779b8eSAndroid Build Coastguard Worker     }
1536*ec779b8eSAndroid Build Coastguard Worker 
1537*ec779b8eSAndroid Build Coastguard Worker     default:
1538*ec779b8eSAndroid Build Coastguard Worker         return BBinder::onTransact(code, data, reply, flags);
1539*ec779b8eSAndroid Build Coastguard Worker     }
1540*ec779b8eSAndroid Build Coastguard Worker }
1541