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