IDrmManagerService.cpp revision b5ce361d19e69fe156f7188c9ee0f4734b259874
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        LOGV("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    return reply.readInt32();
625}
626
627status_t BpDrmManagerService::initializeDecryptUnit(
628            int uniqueId, DecryptHandle* decryptHandle,
629            int decryptUnitId, const DrmBuffer* headerInfo) {
630    LOGV("initializeDecryptUnit");
631    Parcel data, reply;
632
633    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
634    data.writeInt32(uniqueId);
635
636    data.writeInt32(decryptHandle->decryptId);
637    data.writeString8(decryptHandle->mimeType);
638    data.writeInt32(decryptHandle->decryptApiType);
639    data.writeInt32(decryptHandle->status);
640
641    if (NULL != decryptHandle->decryptInfo) {
642        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
643    } else {
644        data.writeInt32(INVALID_BUFFER_LENGTH);
645    }
646    data.writeInt32(decryptUnitId);
647
648    data.writeInt32(headerInfo->length);
649    data.write(headerInfo->data, headerInfo->length);
650
651    remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply);
652    return reply.readInt32();
653}
654
655status_t BpDrmManagerService::decrypt(
656            int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,
657            const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) {
658    LOGV("decrypt");
659    Parcel data, reply;
660
661    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
662    data.writeInt32(uniqueId);
663
664    data.writeInt32(decryptHandle->decryptId);
665    data.writeString8(decryptHandle->mimeType);
666    data.writeInt32(decryptHandle->decryptApiType);
667    data.writeInt32(decryptHandle->status);
668
669    if (NULL != decryptHandle->decryptInfo) {
670        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
671    } else {
672        data.writeInt32(INVALID_BUFFER_LENGTH);
673    }
674
675    data.writeInt32(decryptUnitId);
676    data.writeInt32((*decBuffer)->length);
677
678    data.writeInt32(encBuffer->length);
679    data.write(encBuffer->data, encBuffer->length);
680
681    if (NULL != IV) {
682        data.writeInt32(IV->length);
683        data.write(IV->data, IV->length);
684    }
685
686    remote()->transact(DECRYPT, data, &reply);
687
688    const status_t status = reply.readInt32();
689    LOGV("Return value of decrypt() is %d", status);
690
691    const int size = reply.readInt32();
692    (*decBuffer)->length = size;
693    reply.read((void *)(*decBuffer)->data, size);
694
695    return status;
696}
697
698status_t BpDrmManagerService::finalizeDecryptUnit(
699            int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) {
700    LOGV("finalizeDecryptUnit");
701    Parcel data, reply;
702
703    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
704    data.writeInt32(uniqueId);
705
706    data.writeInt32(decryptHandle->decryptId);
707    data.writeString8(decryptHandle->mimeType);
708    data.writeInt32(decryptHandle->decryptApiType);
709    data.writeInt32(decryptHandle->status);
710
711    if (NULL != decryptHandle->decryptInfo) {
712        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
713    } else {
714        data.writeInt32(INVALID_BUFFER_LENGTH);
715    }
716
717    data.writeInt32(decryptUnitId);
718
719    remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply);
720    return reply.readInt32();
721}
722
723ssize_t BpDrmManagerService::pread(
724            int uniqueId, DecryptHandle* decryptHandle, void* buffer,
725            ssize_t numBytes, off64_t offset) {
726    LOGV("read");
727    Parcel data, reply;
728    int result;
729
730    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
731    data.writeInt32(uniqueId);
732
733    data.writeInt32(decryptHandle->decryptId);
734    data.writeString8(decryptHandle->mimeType);
735    data.writeInt32(decryptHandle->decryptApiType);
736    data.writeInt32(decryptHandle->status);
737
738    if (NULL != decryptHandle->decryptInfo) {
739        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
740    } else {
741        data.writeInt32(INVALID_BUFFER_LENGTH);
742    }
743
744    data.writeInt32(numBytes);
745    data.writeInt64(offset);
746
747    remote()->transact(PREAD, data, &reply);
748    result = reply.readInt32();
749    if (0 < result) {
750        reply.read(buffer, result);
751    }
752    return result;
753}
754
755IMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService");
756
757status_t BnDrmManagerService::onTransact(
758            uint32_t code, const Parcel& data,
759            Parcel* reply, uint32_t flags) {
760    LOGV("Entering BnDrmManagerService::onTransact with code %d", code);
761
762    switch (code) {
763    case ADD_UNIQUEID:
764    {
765        LOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID");
766        CHECK_INTERFACE(IDrmManagerService, data, reply);
767        int uniqueId = addUniqueId(data.readInt32());
768        reply->writeInt32(uniqueId);
769        return DRM_NO_ERROR;
770    }
771
772    case REMOVE_UNIQUEID:
773    {
774        LOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID");
775        CHECK_INTERFACE(IDrmManagerService, data, reply);
776        removeUniqueId(data.readInt32());
777        return DRM_NO_ERROR;
778    }
779
780    case ADD_CLIENT:
781    {
782        LOGV("BnDrmManagerService::onTransact :ADD_CLIENT");
783        CHECK_INTERFACE(IDrmManagerService, data, reply);
784        addClient(data.readInt32());
785        return DRM_NO_ERROR;
786    }
787
788    case REMOVE_CLIENT:
789    {
790        LOGV("BnDrmManagerService::onTransact :REMOVE_CLIENT");
791        CHECK_INTERFACE(IDrmManagerService, data, reply);
792        removeClient(data.readInt32());
793        return DRM_NO_ERROR;
794    }
795
796    case SET_DRM_SERVICE_LISTENER:
797    {
798        LOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER");
799        CHECK_INTERFACE(IDrmManagerService, data, reply);
800
801        const int uniqueId = data.readInt32();
802        const sp<IDrmServiceListener> drmServiceListener
803            = interface_cast<IDrmServiceListener> (data.readStrongBinder());
804
805        status_t status = setDrmServiceListener(uniqueId, drmServiceListener);
806
807        reply->writeInt32(status);
808        return DRM_NO_ERROR;
809    }
810
811    case INSTALL_DRM_ENGINE:
812    {
813        LOGV("BnDrmManagerService::onTransact :INSTALL_DRM_ENGINE");
814        CHECK_INTERFACE(IDrmManagerService, data, reply);
815
816        status_t status = installDrmEngine(data.readInt32(), data.readString8());
817
818        reply->writeInt32(status);
819        return DRM_NO_ERROR;
820    }
821
822    case GET_CONSTRAINTS_FROM_CONTENT:
823    {
824        LOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT");
825        CHECK_INTERFACE(IDrmManagerService, data, reply);
826
827        const int uniqueId = data.readInt32();
828        const String8 path = data.readString8();
829
830        DrmConstraints* drmConstraints = getConstraints(uniqueId, &path, data.readInt32());
831
832        if (NULL != drmConstraints) {
833            //Filling DRM Constraints contents
834            reply->writeInt32(drmConstraints->getCount());
835
836            DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator();
837            while (keyIt.hasNext()) {
838                const String8 key = keyIt.next();
839                reply->writeString8(key);
840                const char* value = drmConstraints->getAsByteArray(&key);
841                int bufferSize = 0;
842                if (NULL != value) {
843                    bufferSize = strlen(value);
844                }
845                reply->writeInt32(bufferSize + 1);
846                reply->write(value, bufferSize + 1);
847            }
848        }
849        delete drmConstraints; drmConstraints = NULL;
850        return DRM_NO_ERROR;
851    }
852
853    case GET_METADATA_FROM_CONTENT:
854    {
855        LOGV("BnDrmManagerService::onTransact :GET_METADATA_FROM_CONTENT");
856        CHECK_INTERFACE(IDrmManagerService, data, reply);
857
858        const int uniqueId = data.readInt32();
859        const String8 path = data.readString8();
860
861        DrmMetadata* drmMetadata = getMetadata(uniqueId, &path);
862        if (NULL != drmMetadata) {
863            //Filling DRM Metadata contents
864            reply->writeInt32(drmMetadata->getCount());
865
866            DrmMetadata::KeyIterator keyIt = drmMetadata->keyIterator();
867            while (keyIt.hasNext()) {
868                const String8 key = keyIt.next();
869                reply->writeString8(key);
870                const char* value = drmMetadata->getAsByteArray(&key);
871                int bufferSize = 0;
872                if (NULL != value) {
873                    bufferSize = strlen(value);
874                    reply->writeInt32(bufferSize + 1);
875                    reply->write(value, bufferSize + 1);
876                } else {
877                    reply->writeInt32(0);
878                }
879            }
880        }
881        delete drmMetadata; drmMetadata = NULL;
882        return NO_ERROR;
883    }
884
885    case CAN_HANDLE:
886    {
887        LOGV("BnDrmManagerService::onTransact :CAN_HANDLE");
888        CHECK_INTERFACE(IDrmManagerService, data, reply);
889
890        const int uniqueId = data.readInt32();
891        const String8 path = data.readString8();
892        const String8 mimeType = data.readString8();
893
894        bool result = canHandle(uniqueId, path, mimeType);
895
896        reply->writeInt32(result);
897        return DRM_NO_ERROR;
898    }
899
900    case PROCESS_DRM_INFO:
901    {
902        LOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO");
903        CHECK_INTERFACE(IDrmManagerService, data, reply);
904
905        const int uniqueId = data.readInt32();
906
907        //Filling DRM info
908        const int infoType = data.readInt32();
909        const int bufferSize = data.readInt32();
910        char* buffer = NULL;
911        if (0 < bufferSize) {
912            buffer = (char *)data.readInplace(bufferSize);
913        }
914        const DrmBuffer drmBuffer(buffer, bufferSize);
915        DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8());
916
917        const int size = data.readInt32();
918        for (int index = 0; index < size; ++index) {
919            const String8 key(data.readString8());
920            const String8 value(data.readString8());
921            drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
922        }
923
924        DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo);
925
926        if (NULL != drmInfoStatus) {
927            //Filling DRM Info Status contents
928            reply->writeInt32(drmInfoStatus->statusCode);
929            reply->writeInt32(drmInfoStatus->infoType);
930            reply->writeString8(drmInfoStatus->mimeType);
931
932            if (NULL != drmInfoStatus->drmBuffer) {
933                const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer;
934                const int bufferSize = drmBuffer->length;
935                reply->writeInt32(bufferSize);
936                if (0 < bufferSize) {
937                    reply->write(drmBuffer->data, bufferSize);
938                }
939                delete [] drmBuffer->data;
940                delete drmBuffer; drmBuffer = NULL;
941            }
942        }
943        delete drmInfo; drmInfo = NULL;
944        delete drmInfoStatus; drmInfoStatus = NULL;
945        return DRM_NO_ERROR;
946    }
947
948    case ACQUIRE_DRM_INFO:
949    {
950        LOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO");
951        CHECK_INTERFACE(IDrmManagerService, data, reply);
952
953        const int uniqueId = data.readInt32();
954
955        //Filling DRM info Request
956        DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(data.readInt32(), data.readString8());
957
958        const int size = data.readInt32();
959        for (int index = 0; index < size; ++index) {
960            const String8 key(data.readString8());
961            const String8 value(data.readString8());
962            drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value);
963        }
964
965        DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest);
966
967        if (NULL != drmInfo) {
968            //Filling DRM Info
969            const DrmBuffer drmBuffer = drmInfo->getData();
970            reply->writeInt32(drmInfo->getInfoType());
971
972            const int bufferSize = drmBuffer.length;
973            reply->writeInt32(bufferSize);
974            if (0 < bufferSize) {
975                reply->write(drmBuffer.data, bufferSize);
976            }
977            reply->writeString8(drmInfo->getMimeType());
978            reply->writeInt32(drmInfo->getCount());
979
980            DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
981            while (keyIt.hasNext()) {
982                const String8 key = keyIt.next();
983                reply->writeString8(key);
984                const String8 value = drmInfo->get(key);
985                reply->writeString8((value == String8("")) ? String8("NULL") : value);
986            }
987            delete [] drmBuffer.data;
988        }
989        delete drmInfoRequest; drmInfoRequest = NULL;
990        delete drmInfo; drmInfo = NULL;
991        return DRM_NO_ERROR;
992    }
993
994    case SAVE_RIGHTS:
995    {
996        LOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS");
997        CHECK_INTERFACE(IDrmManagerService, data, reply);
998
999        const int uniqueId = data.readInt32();
1000
1001        //Filling DRM Rights
1002        const int bufferSize = data.readInt32();
1003        const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1004
1005        const String8 mimeType(data.readString8());
1006        const String8 accountId(data.readString8());
1007        const String8 subscriptionId(data.readString8());
1008        const String8 rightsPath(data.readString8());
1009        const String8 contentPath(data.readString8());
1010
1011        DrmRights drmRights(drmBuffer,
1012                            ((mimeType == String8("NULL")) ? String8("") : mimeType),
1013                            ((accountId == String8("NULL")) ? String8("") : accountId),
1014                            ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId));
1015
1016        const status_t status = saveRights(uniqueId, drmRights,
1017                            ((rightsPath == String8("NULL")) ? String8("") : rightsPath),
1018                            ((contentPath == String8("NULL")) ? String8("") : contentPath));
1019
1020        reply->writeInt32(status);
1021        return DRM_NO_ERROR;
1022    }
1023
1024    case GET_ORIGINAL_MIMETYPE:
1025    {
1026        LOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE");
1027        CHECK_INTERFACE(IDrmManagerService, data, reply);
1028
1029        const String8 originalMimeType = getOriginalMimeType(data.readInt32(), data.readString8());
1030
1031        reply->writeString8(originalMimeType);
1032        return DRM_NO_ERROR;
1033    }
1034
1035    case GET_DRM_OBJECT_TYPE:
1036    {
1037        LOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE");
1038        CHECK_INTERFACE(IDrmManagerService, data, reply);
1039
1040        const int drmObjectType
1041            = getDrmObjectType(data.readInt32(), data.readString8(), data.readString8());
1042
1043        reply->writeInt32(drmObjectType);
1044        return DRM_NO_ERROR;
1045    }
1046
1047    case CHECK_RIGHTS_STATUS:
1048    {
1049        LOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS");
1050        CHECK_INTERFACE(IDrmManagerService, data, reply);
1051
1052        const int result
1053            = checkRightsStatus(data.readInt32(), data.readString8(), data.readInt32());
1054
1055        reply->writeInt32(result);
1056        return DRM_NO_ERROR;
1057    }
1058
1059    case CONSUME_RIGHTS:
1060    {
1061        LOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS");
1062        CHECK_INTERFACE(IDrmManagerService, data, reply);
1063
1064        const int uniqueId = data.readInt32();
1065
1066        DecryptHandle handle;
1067        handle.decryptId = data.readInt32();
1068        handle.mimeType = data.readString8();
1069        handle.decryptApiType = data.readInt32();
1070        handle.status = data.readInt32();
1071        handle.decryptInfo = NULL;
1072
1073        const int bufferLength = data.readInt32();
1074        if (INVALID_BUFFER_LENGTH != bufferLength) {
1075            handle.decryptInfo = new DecryptInfo();
1076            handle.decryptInfo->decryptBufferLength = bufferLength;
1077        }
1078
1079        const status_t status
1080            = consumeRights(uniqueId, &handle, data.readInt32(),
1081                static_cast<bool>(data.readInt32()));
1082        reply->writeInt32(status);
1083
1084        delete handle.decryptInfo; handle.decryptInfo = NULL;
1085        return DRM_NO_ERROR;
1086    }
1087
1088    case SET_PLAYBACK_STATUS:
1089    {
1090        LOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS");
1091        CHECK_INTERFACE(IDrmManagerService, data, reply);
1092
1093        const int uniqueId = data.readInt32();
1094
1095        DecryptHandle handle;
1096        handle.decryptId = data.readInt32();
1097        handle.mimeType = data.readString8();
1098        handle.decryptApiType = data.readInt32();
1099        handle.status = data.readInt32();
1100        handle.decryptInfo = NULL;
1101
1102        const int bufferLength = data.readInt32();
1103        if (INVALID_BUFFER_LENGTH != bufferLength) {
1104            handle.decryptInfo = new DecryptInfo();
1105            handle.decryptInfo->decryptBufferLength = bufferLength;
1106        }
1107
1108        const status_t status
1109            = setPlaybackStatus(uniqueId, &handle, data.readInt32(), data.readInt64());
1110        reply->writeInt32(status);
1111
1112        delete handle.decryptInfo; handle.decryptInfo = NULL;
1113        return DRM_NO_ERROR;
1114    }
1115
1116    case VALIDATE_ACTION:
1117    {
1118        LOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION");
1119        CHECK_INTERFACE(IDrmManagerService, data, reply);
1120
1121        bool result = validateAction(
1122                                data.readInt32(),
1123                                data.readString8(),
1124                                data.readInt32(),
1125                                ActionDescription(data.readInt32(), data.readInt32()));
1126
1127        reply->writeInt32(result);
1128        return DRM_NO_ERROR;
1129    }
1130
1131    case REMOVE_RIGHTS:
1132    {
1133        LOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS");
1134        CHECK_INTERFACE(IDrmManagerService, data, reply);
1135
1136        const status_t status = removeRights(data.readInt32(), data.readString8());
1137        reply->writeInt32(status);
1138
1139        return DRM_NO_ERROR;
1140    }
1141
1142    case REMOVE_ALL_RIGHTS:
1143    {
1144        LOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS");
1145        CHECK_INTERFACE(IDrmManagerService, data, reply);
1146
1147        const status_t status = removeAllRights(data.readInt32());
1148        reply->writeInt32(status);
1149
1150        return DRM_NO_ERROR;
1151    }
1152
1153    case OPEN_CONVERT_SESSION:
1154    {
1155        LOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION");
1156        CHECK_INTERFACE(IDrmManagerService, data, reply);
1157
1158        const int convertId = openConvertSession(data.readInt32(), data.readString8());
1159
1160        reply->writeInt32(convertId);
1161        return DRM_NO_ERROR;
1162    }
1163
1164    case CONVERT_DATA:
1165    {
1166        LOGV("BnDrmManagerService::onTransact :CONVERT_DATA");
1167        CHECK_INTERFACE(IDrmManagerService, data, reply);
1168
1169        const int uniqueId = data.readInt32();
1170        const int convertId = data.readInt32();
1171
1172        //Filling input data
1173        const int bufferSize = data.readInt32();
1174        DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1175
1176        DrmConvertedStatus*    drmConvertedStatus = convertData(uniqueId, convertId, inputData);
1177
1178        if (NULL != drmConvertedStatus) {
1179            //Filling Drm Converted Ststus
1180            reply->writeInt32(drmConvertedStatus->statusCode);
1181            reply->writeInt64(drmConvertedStatus->offset);
1182
1183            if (NULL != drmConvertedStatus->convertedData) {
1184                const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
1185                const int bufferSize = convertedData->length;
1186                reply->writeInt32(bufferSize);
1187                if (0 < bufferSize) {
1188                    reply->write(convertedData->data, bufferSize);
1189                }
1190                delete [] convertedData->data;
1191                delete convertedData; convertedData = NULL;
1192            }
1193        }
1194        delete inputData; inputData = NULL;
1195        delete drmConvertedStatus; drmConvertedStatus = NULL;
1196        return DRM_NO_ERROR;
1197    }
1198
1199    case CLOSE_CONVERT_SESSION:
1200    {
1201        LOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION");
1202        CHECK_INTERFACE(IDrmManagerService, data, reply);
1203
1204        DrmConvertedStatus*    drmConvertedStatus
1205            = closeConvertSession(data.readInt32(), data.readInt32());
1206
1207        if (NULL != drmConvertedStatus) {
1208            //Filling Drm Converted Ststus
1209            reply->writeInt32(drmConvertedStatus->statusCode);
1210            reply->writeInt64(drmConvertedStatus->offset);
1211
1212            if (NULL != drmConvertedStatus->convertedData) {
1213                const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
1214                const int bufferSize = convertedData->length;
1215                reply->writeInt32(bufferSize);
1216                if (0 < bufferSize) {
1217                    reply->write(convertedData->data, bufferSize);
1218                }
1219                delete [] convertedData->data;
1220                delete convertedData; convertedData = NULL;
1221            }
1222        }
1223        delete drmConvertedStatus; drmConvertedStatus = NULL;
1224        return DRM_NO_ERROR;
1225    }
1226
1227    case GET_ALL_SUPPORT_INFO:
1228    {
1229        LOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO");
1230        CHECK_INTERFACE(IDrmManagerService, data, reply);
1231
1232        const int uniqueId = data.readInt32();
1233        int length = 0;
1234        DrmSupportInfo* drmSupportInfoArray = NULL;
1235
1236        status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray);
1237
1238        reply->writeInt32(length);
1239        for (int i = 0; i < length; ++i) {
1240            DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i];
1241
1242            reply->writeInt32(drmSupportInfo.getFileSuffixCount());
1243            DrmSupportInfo::FileSuffixIterator fileSuffixIt
1244                = drmSupportInfo.getFileSuffixIterator();
1245            while (fileSuffixIt.hasNext()) {
1246                reply->writeString8(fileSuffixIt.next());
1247            }
1248
1249            reply->writeInt32(drmSupportInfo.getMimeTypeCount());
1250            DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator();
1251            while (mimeTypeIt.hasNext()) {
1252                reply->writeString8(mimeTypeIt.next());
1253            }
1254            reply->writeString8(drmSupportInfo.getDescription());
1255        }
1256        delete [] drmSupportInfoArray; drmSupportInfoArray = NULL;
1257        reply->writeInt32(status);
1258        return DRM_NO_ERROR;
1259    }
1260
1261    case OPEN_DECRYPT_SESSION:
1262    {
1263        LOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION");
1264        CHECK_INTERFACE(IDrmManagerService, data, reply);
1265
1266        const int uniqueId = data.readInt32();
1267        const int fd = data.readFileDescriptor();
1268
1269        DecryptHandle* handle
1270            = openDecryptSession(uniqueId, fd, data.readInt64(), data.readInt64());
1271
1272        if (NULL != handle) {
1273            reply->writeInt32(handle->decryptId);
1274            reply->writeString8(handle->mimeType);
1275            reply->writeInt32(handle->decryptApiType);
1276            reply->writeInt32(handle->status);
1277            if (NULL != handle->decryptInfo) {
1278                reply->writeInt32(handle->decryptInfo->decryptBufferLength);
1279                delete handle->decryptInfo; handle->decryptInfo = NULL;
1280            }
1281        }
1282        delete handle; handle = NULL;
1283        return DRM_NO_ERROR;
1284    }
1285
1286    case OPEN_DECRYPT_SESSION_FROM_URI:
1287    {
1288        LOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI");
1289        CHECK_INTERFACE(IDrmManagerService, data, reply);
1290
1291        const int uniqueId = data.readInt32();
1292        const String8 uri = data.readString8();
1293
1294        DecryptHandle* handle = openDecryptSession(uniqueId, uri.string());
1295
1296        if (NULL != handle) {
1297            reply->writeInt32(handle->decryptId);
1298            reply->writeString8(handle->mimeType);
1299            reply->writeInt32(handle->decryptApiType);
1300            reply->writeInt32(handle->status);
1301            if (NULL != handle->decryptInfo) {
1302                reply->writeInt32(handle->decryptInfo->decryptBufferLength);
1303                delete handle->decryptInfo; handle->decryptInfo = NULL;
1304            }
1305        } else {
1306            LOGV("NULL decryptHandle is returned");
1307        }
1308        delete handle; handle = NULL;
1309        return DRM_NO_ERROR;
1310    }
1311
1312    case CLOSE_DECRYPT_SESSION:
1313    {
1314        LOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION");
1315        CHECK_INTERFACE(IDrmManagerService, data, reply);
1316
1317        const int uniqueId = data.readInt32();
1318
1319        DecryptHandle* handle = new DecryptHandle();
1320        handle->decryptId = data.readInt32();
1321        handle->mimeType = data.readString8();
1322        handle->decryptApiType = data.readInt32();
1323        handle->status = data.readInt32();
1324        handle->decryptInfo = NULL;
1325
1326        const int bufferLength = data.readInt32();
1327        if (INVALID_BUFFER_LENGTH != bufferLength) {
1328            handle->decryptInfo = new DecryptInfo();
1329            handle->decryptInfo->decryptBufferLength = bufferLength;
1330        }
1331
1332        const status_t status = closeDecryptSession(uniqueId, handle);
1333        reply->writeInt32(status);
1334        return DRM_NO_ERROR;
1335    }
1336
1337    case INITIALIZE_DECRYPT_UNIT:
1338    {
1339        LOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT");
1340        CHECK_INTERFACE(IDrmManagerService, data, reply);
1341
1342        const int uniqueId = data.readInt32();
1343
1344        DecryptHandle handle;
1345        handle.decryptId = data.readInt32();
1346        handle.mimeType = data.readString8();
1347        handle.decryptApiType = data.readInt32();
1348        handle.status = data.readInt32();
1349        handle.decryptInfo = NULL;
1350
1351        const int bufferLength = data.readInt32();
1352        if (INVALID_BUFFER_LENGTH != bufferLength) {
1353            handle.decryptInfo = new DecryptInfo();
1354            handle.decryptInfo->decryptBufferLength = bufferLength;
1355        }
1356        const int decryptUnitId = data.readInt32();
1357
1358        //Filling Header info
1359        const int bufferSize = data.readInt32();
1360        DrmBuffer* headerInfo = NULL;
1361        headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1362
1363        const status_t status
1364            = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo);
1365        reply->writeInt32(status);
1366
1367        delete handle.decryptInfo; handle.decryptInfo = NULL;
1368        delete headerInfo; headerInfo = NULL;
1369        return DRM_NO_ERROR;
1370    }
1371
1372    case DECRYPT:
1373    {
1374        LOGV("BnDrmManagerService::onTransact :DECRYPT");
1375        CHECK_INTERFACE(IDrmManagerService, data, reply);
1376
1377        const int uniqueId = data.readInt32();
1378
1379        DecryptHandle handle;
1380        handle.decryptId = data.readInt32();
1381        handle.mimeType = data.readString8();
1382        handle.decryptApiType = data.readInt32();
1383        handle.status = data.readInt32();
1384        handle.decryptInfo = NULL;
1385
1386        const int bufferLength = data.readInt32();
1387        if (INVALID_BUFFER_LENGTH != bufferLength) {
1388            handle.decryptInfo = new DecryptInfo();
1389            handle.decryptInfo->decryptBufferLength = bufferLength;
1390        }
1391        const int decryptUnitId = data.readInt32();
1392        const int decBufferSize = data.readInt32();
1393
1394        const int encBufferSize = data.readInt32();
1395        DrmBuffer* encBuffer
1396            = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize);
1397
1398        char* buffer = NULL;
1399        buffer = new char[decBufferSize];
1400        DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize);
1401
1402        DrmBuffer* IV = NULL;
1403        if (0 != data.dataAvail()) {
1404            const int ivBufferlength = data.readInt32();
1405            IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength);
1406        }
1407
1408        const status_t status
1409            = decrypt(uniqueId, &handle, decryptUnitId, encBuffer, &decBuffer, IV);
1410
1411        reply->writeInt32(status);
1412
1413        const int size = decBuffer->length;
1414        reply->writeInt32(size);
1415        reply->write(decBuffer->data, size);
1416
1417        delete handle.decryptInfo; handle.decryptInfo = NULL;
1418        delete encBuffer; encBuffer = NULL;
1419        delete decBuffer; decBuffer = NULL;
1420        delete [] buffer; buffer = NULL;
1421        delete IV; IV = NULL;
1422        return DRM_NO_ERROR;
1423    }
1424
1425    case FINALIZE_DECRYPT_UNIT:
1426    {
1427        LOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT");
1428        CHECK_INTERFACE(IDrmManagerService, data, reply);
1429
1430        const int uniqueId = data.readInt32();
1431
1432        DecryptHandle handle;
1433        handle.decryptId = data.readInt32();
1434        handle.mimeType = data.readString8();
1435        handle.decryptApiType = data.readInt32();
1436        handle.status = data.readInt32();
1437        handle.decryptInfo = NULL;
1438
1439        const int bufferLength = data.readInt32();
1440        if (INVALID_BUFFER_LENGTH != bufferLength) {
1441            handle.decryptInfo = new DecryptInfo();
1442            handle.decryptInfo->decryptBufferLength = bufferLength;
1443        }
1444
1445        const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32());
1446        reply->writeInt32(status);
1447
1448        delete handle.decryptInfo; handle.decryptInfo = NULL;
1449        return DRM_NO_ERROR;
1450    }
1451
1452    case PREAD:
1453    {
1454        LOGV("BnDrmManagerService::onTransact :READ");
1455        CHECK_INTERFACE(IDrmManagerService, data, reply);
1456
1457        const int uniqueId = data.readInt32();
1458
1459        DecryptHandle handle;
1460        handle.decryptId = data.readInt32();
1461        handle.mimeType = data.readString8();
1462        handle.decryptApiType = data.readInt32();
1463        handle.status = data.readInt32();
1464        handle.decryptInfo = NULL;
1465
1466        const int bufferLength = data.readInt32();
1467        if (INVALID_BUFFER_LENGTH != bufferLength) {
1468            handle.decryptInfo = new DecryptInfo();
1469            handle.decryptInfo->decryptBufferLength = bufferLength;
1470        }
1471
1472        const int numBytes = data.readInt32();
1473        char* buffer = new char[numBytes];
1474
1475        const off64_t offset = data.readInt64();
1476
1477        ssize_t result = pread(uniqueId, &handle, buffer, numBytes, offset);
1478        reply->writeInt32(result);
1479        if (0 < result) {
1480            reply->write(buffer, result);
1481        }
1482
1483        delete handle.decryptInfo; handle.decryptInfo = NULL;
1484        delete [] buffer, buffer = NULL;
1485        return DRM_NO_ERROR;
1486    }
1487
1488    default:
1489        return BBinder::onTransact(code, data, reply, flags);
1490    }
1491}
1492
1493