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