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