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