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