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