Home | History | Annotate | Download | only in common
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 //#define LOG_NDEBUG 0
     18 #define LOG_TAG "IDrmManagerService(Native)"
     19 #include <utils/Log.h>
     20 
     21 #include <stdint.h>
     22 #include <sys/types.h>
     23 #include <binder/IPCThreadState.h>
     24 
     25 #include <drm/DrmInfo.h>
     26 #include <drm/DrmConstraints.h>
     27 #include <drm/DrmMetadata.h>
     28 #include <drm/DrmRights.h>
     29 #include <drm/DrmInfoStatus.h>
     30 #include <drm/DrmConvertedStatus.h>
     31 #include <drm/DrmInfoRequest.h>
     32 #include <drm/DrmSupportInfo.h>
     33 
     34 #include "IDrmManagerService.h"
     35 
     36 #define INVALID_BUFFER_LENGTH -1
     37 
     38 using namespace android;
     39 
     40 static void writeDecryptHandleToParcelData(
     41         const DecryptHandle* handle, Parcel* data) {
     42     data->writeInt32(handle->decryptId);
     43     data->writeString8(handle->mimeType);
     44     data->writeInt32(handle->decryptApiType);
     45     data->writeInt32(handle->status);
     46 
     47     int size = handle->copyControlVector.size();
     48     data->writeInt32(size);
     49     for (int i = 0; i < size; i++) {
     50         data->writeInt32(handle->copyControlVector.keyAt(i));
     51         data->writeInt32(handle->copyControlVector.valueAt(i));
     52     }
     53 
     54     size = handle->extendedData.size();
     55     data->writeInt32(size);
     56     for (int i = 0; i < size; i++) {
     57         data->writeString8(handle->extendedData.keyAt(i));
     58         data->writeString8(handle->extendedData.valueAt(i));
     59     }
     60 
     61     if (NULL != handle->decryptInfo) {
     62         data->writeInt32(handle->decryptInfo->decryptBufferLength);
     63     } else {
     64         data->writeInt32(INVALID_BUFFER_LENGTH);
     65     }
     66 }
     67 
     68 static void readDecryptHandleFromParcelData(
     69         DecryptHandle* handle, const Parcel& data) {
     70     if (0 == data.dataAvail()) {
     71         return;
     72     }
     73 
     74     handle->decryptId = data.readInt32();
     75     handle->mimeType = data.readString8();
     76     handle->decryptApiType = data.readInt32();
     77     handle->status = data.readInt32();
     78 
     79     int size = data.readInt32();
     80     for (int i = 0; i < size; i++) {
     81         DrmCopyControl key = (DrmCopyControl)data.readInt32();
     82         int value = data.readInt32();
     83         handle->copyControlVector.add(key, value);
     84     }
     85 
     86     size = data.readInt32();
     87     for (int i = 0; i < size; i++) {
     88         String8 key = data.readString8();
     89         String8 value = data.readString8();
     90         handle->extendedData.add(key, value);
     91     }
     92 
     93     handle->decryptInfo = NULL;
     94     const int bufferLen = data.readInt32();
     95     if (INVALID_BUFFER_LENGTH != bufferLen) {
     96         handle->decryptInfo = new DecryptInfo();
     97         handle->decryptInfo->decryptBufferLength = bufferLen;
     98     }
     99 }
    100 
    101 static void clearDecryptHandle(DecryptHandle* handle) {
    102     if (handle == NULL) {
    103         return;
    104     }
    105     if (handle->decryptInfo) {
    106         delete handle->decryptInfo;
    107         handle->decryptInfo = NULL;
    108     }
    109     handle->copyControlVector.clear();
    110     handle->extendedData.clear();
    111 }
    112 
    113 int BpDrmManagerService::addUniqueId(bool isNative) {
    114     ALOGV("add uniqueid");
    115     Parcel data, reply;
    116     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    117     data.writeInt32(isNative);
    118     remote()->transact(ADD_UNIQUEID, data, &reply);
    119     return reply.readInt32();
    120 }
    121 
    122 void BpDrmManagerService::removeUniqueId(int uniqueId) {
    123     ALOGV("remove uniqueid");
    124     Parcel data, reply;
    125     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    126     data.writeInt32(uniqueId);
    127     remote()->transact(REMOVE_UNIQUEID, data, &reply);
    128 }
    129 
    130 void BpDrmManagerService::addClient(int uniqueId) {
    131     Parcel data, reply;
    132     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    133     data.writeInt32(uniqueId);
    134     remote()->transact(ADD_CLIENT, data, &reply);
    135 }
    136 
    137 void BpDrmManagerService::removeClient(int uniqueId) {
    138     Parcel data, reply;
    139     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    140     data.writeInt32(uniqueId);
    141     remote()->transact(REMOVE_CLIENT, data, &reply);
    142 }
    143 
    144 status_t BpDrmManagerService::setDrmServiceListener(
    145             int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) {
    146     ALOGV("setDrmServiceListener");
    147     Parcel data, reply;
    148 
    149     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    150     data.writeInt32(uniqueId);
    151     data.writeStrongBinder(drmServiceListener->asBinder());
    152     remote()->transact(SET_DRM_SERVICE_LISTENER, data, &reply);
    153     return reply.readInt32();
    154 }
    155 
    156 status_t BpDrmManagerService::installDrmEngine(int uniqueId, const String8& drmEngineFile) {
    157     ALOGV("Install DRM Engine");
    158     Parcel data, reply;
    159 
    160     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    161     data.writeInt32(uniqueId);
    162     data.writeString8(drmEngineFile);
    163 
    164     remote()->transact(INSTALL_DRM_ENGINE, data, &reply);
    165     return reply.readInt32();
    166 }
    167 
    168 DrmConstraints* BpDrmManagerService::getConstraints(
    169             int uniqueId, const String8* path, const int action) {
    170     ALOGV("Get Constraints");
    171     Parcel data, reply;
    172 
    173     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    174     data.writeInt32(uniqueId);
    175     data.writeString8(*path);
    176     data.writeInt32(action);
    177 
    178     remote()->transact(GET_CONSTRAINTS_FROM_CONTENT, data, &reply);
    179 
    180     DrmConstraints* drmConstraints = NULL;
    181     if (0 != reply.dataAvail()) {
    182         //Filling Drm Constraints
    183         drmConstraints = new DrmConstraints();
    184 
    185         const int size = reply.readInt32();
    186         for (int index = 0; index < size; ++index) {
    187             const String8 key(reply.readString8());
    188             const int bufferSize = reply.readInt32();
    189             char* data = NULL;
    190             if (0 < bufferSize) {
    191                 data = new char[bufferSize];
    192                 reply.read(data, bufferSize);
    193             }
    194             drmConstraints->put(&key, data);
    195         }
    196     }
    197     return drmConstraints;
    198 }
    199 
    200 DrmMetadata* 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 
    229 bool 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 
    244 DrmInfoStatus* 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 
    295 DrmInfo* 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 
    341 status_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 
    371 String8 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 
    383 int 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 
    398 int 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 
    412 status_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 
    429 status_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 
    446 bool 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 
    464 status_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 
    476 status_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 
    487 int 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 
    499 DrmConvertedStatus* 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 
    534 DrmConvertedStatus* 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 
    566 status_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 
    602 DecryptHandle* 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 
    628 DecryptHandle* 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 
    655 status_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) {
    656     ALOGV("closeDecryptSession");
    657     Parcel data, reply;
    658 
    659     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    660     data.writeInt32(uniqueId);
    661 
    662     writeDecryptHandleToParcelData(decryptHandle, &data);
    663 
    664     remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply);
    665 
    666     return reply.readInt32();
    667 }
    668 
    669 status_t BpDrmManagerService::initializeDecryptUnit(
    670             int uniqueId, DecryptHandle* decryptHandle,
    671             int decryptUnitId, const DrmBuffer* headerInfo) {
    672     ALOGV("initializeDecryptUnit");
    673     Parcel data, reply;
    674 
    675     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    676     data.writeInt32(uniqueId);
    677 
    678     writeDecryptHandleToParcelData(decryptHandle, &data);
    679 
    680     data.writeInt32(decryptUnitId);
    681 
    682     data.writeInt32(headerInfo->length);
    683     data.write(headerInfo->data, headerInfo->length);
    684 
    685     remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply);
    686     return reply.readInt32();
    687 }
    688 
    689 status_t BpDrmManagerService::decrypt(
    690             int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,
    691             const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) {
    692     ALOGV("decrypt");
    693     Parcel data, reply;
    694 
    695     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    696     data.writeInt32(uniqueId);
    697 
    698     writeDecryptHandleToParcelData(decryptHandle, &data);
    699 
    700     data.writeInt32(decryptUnitId);
    701     data.writeInt32((*decBuffer)->length);
    702 
    703     data.writeInt32(encBuffer->length);
    704     data.write(encBuffer->data, encBuffer->length);
    705 
    706     if (NULL != IV) {
    707         data.writeInt32(IV->length);
    708         data.write(IV->data, IV->length);
    709     }
    710 
    711     remote()->transact(DECRYPT, data, &reply);
    712 
    713     const status_t status = reply.readInt32();
    714     ALOGV("Return value of decrypt() is %d", status);
    715 
    716     const int size = reply.readInt32();
    717     (*decBuffer)->length = size;
    718     reply.read((void *)(*decBuffer)->data, size);
    719 
    720     return status;
    721 }
    722 
    723 status_t BpDrmManagerService::finalizeDecryptUnit(
    724             int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) {
    725     ALOGV("finalizeDecryptUnit");
    726     Parcel data, reply;
    727 
    728     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    729     data.writeInt32(uniqueId);
    730 
    731     writeDecryptHandleToParcelData(decryptHandle, &data);
    732 
    733     data.writeInt32(decryptUnitId);
    734 
    735     remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply);
    736     return reply.readInt32();
    737 }
    738 
    739 ssize_t BpDrmManagerService::pread(
    740             int uniqueId, DecryptHandle* decryptHandle, void* buffer,
    741             ssize_t numBytes, off64_t offset) {
    742     ALOGV("read");
    743     Parcel data, reply;
    744     int result;
    745 
    746     data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    747     data.writeInt32(uniqueId);
    748 
    749     writeDecryptHandleToParcelData(decryptHandle, &data);
    750 
    751     data.writeInt32(numBytes);
    752     data.writeInt64(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 
    762 IMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService");
    763 
    764 status_t BnDrmManagerService::onTransact(
    765             uint32_t code, const Parcel& data,
    766             Parcel* reply, uint32_t flags) {
    767     ALOGV("Entering BnDrmManagerService::onTransact with code %d", code);
    768 
    769     switch (code) {
    770     case ADD_UNIQUEID:
    771     {
    772         ALOGV("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         ALOGV("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         ALOGV("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         ALOGV("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         ALOGV("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         ALOGV("BnDrmManagerService::onTransact :INSTALL_DRM_ENGINE");
    821         CHECK_INTERFACE(IDrmManagerService, data, reply);
    822 
    823         const int uniqueId = data.readInt32();
    824         const String8 engineFile = data.readString8();
    825         status_t status = installDrmEngine(uniqueId, engineFile);
    826 
    827         reply->writeInt32(status);
    828         return DRM_NO_ERROR;
    829     }
    830 
    831     case GET_CONSTRAINTS_FROM_CONTENT:
    832     {
    833         ALOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT");
    834         CHECK_INTERFACE(IDrmManagerService, data, reply);
    835 
    836         const int uniqueId = data.readInt32();
    837         const String8 path = data.readString8();
    838 
    839         DrmConstraints* drmConstraints
    840             = getConstraints(uniqueId, &path, data.readInt32());
    841 
    842         if (NULL != drmConstraints) {
    843             //Filling DRM Constraints contents
    844             reply->writeInt32(drmConstraints->getCount());
    845 
    846             DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator();
    847             while (keyIt.hasNext()) {
    848                 const String8 key = keyIt.next();
    849                 reply->writeString8(key);
    850                 const char* value = drmConstraints->getAsByteArray(&key);
    851                 int bufferSize = 0;
    852                 if (NULL != value) {
    853                     bufferSize = strlen(value);
    854                 }
    855                 reply->writeInt32(bufferSize + 1);
    856                 reply->write(value, bufferSize + 1);
    857             }
    858         }
    859         delete drmConstraints; drmConstraints = NULL;
    860         return DRM_NO_ERROR;
    861     }
    862 
    863     case GET_METADATA_FROM_CONTENT:
    864     {
    865         ALOGV("BnDrmManagerService::onTransact :GET_METADATA_FROM_CONTENT");
    866         CHECK_INTERFACE(IDrmManagerService, data, reply);
    867 
    868         const int uniqueId = data.readInt32();
    869         const String8 path = data.readString8();
    870 
    871         DrmMetadata* drmMetadata = getMetadata(uniqueId, &path);
    872         if (NULL != drmMetadata) {
    873             //Filling DRM Metadata contents
    874             reply->writeInt32(drmMetadata->getCount());
    875 
    876             DrmMetadata::KeyIterator keyIt = drmMetadata->keyIterator();
    877             while (keyIt.hasNext()) {
    878                 const String8 key = keyIt.next();
    879                 reply->writeString8(key);
    880                 const char* value = drmMetadata->getAsByteArray(&key);
    881                 int bufferSize = 0;
    882                 if (NULL != value) {
    883                     bufferSize = strlen(value);
    884                     reply->writeInt32(bufferSize + 1);
    885                     reply->write(value, bufferSize + 1);
    886                 } else {
    887                     reply->writeInt32(0);
    888                 }
    889             }
    890         }
    891         delete drmMetadata; drmMetadata = NULL;
    892         return NO_ERROR;
    893     }
    894 
    895     case CAN_HANDLE:
    896     {
    897         ALOGV("BnDrmManagerService::onTransact :CAN_HANDLE");
    898         CHECK_INTERFACE(IDrmManagerService, data, reply);
    899 
    900         const int uniqueId = data.readInt32();
    901         const String8 path = data.readString8();
    902         const String8 mimeType = data.readString8();
    903 
    904         bool result = canHandle(uniqueId, path, mimeType);
    905 
    906         reply->writeInt32(result);
    907         return DRM_NO_ERROR;
    908     }
    909 
    910     case PROCESS_DRM_INFO:
    911     {
    912         ALOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO");
    913         CHECK_INTERFACE(IDrmManagerService, data, reply);
    914 
    915         const int uniqueId = data.readInt32();
    916 
    917         //Filling DRM info
    918         const int infoType = data.readInt32();
    919         const int bufferSize = data.readInt32();
    920         char* buffer = NULL;
    921         if (0 < bufferSize) {
    922             buffer = (char *)data.readInplace(bufferSize);
    923         }
    924         const DrmBuffer drmBuffer(buffer, bufferSize);
    925         DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8());
    926 
    927         const int size = data.readInt32();
    928         for (int index = 0; index < size; ++index) {
    929             const String8 key(data.readString8());
    930             const String8 value(data.readString8());
    931             drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
    932         }
    933 
    934         DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo);
    935 
    936         if (NULL != drmInfoStatus) {
    937             //Filling DRM Info Status contents
    938             reply->writeInt32(drmInfoStatus->statusCode);
    939             reply->writeInt32(drmInfoStatus->infoType);
    940             reply->writeString8(drmInfoStatus->mimeType);
    941 
    942             if (NULL != drmInfoStatus->drmBuffer) {
    943                 const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer;
    944                 const int bufferSize = drmBuffer->length;
    945                 reply->writeInt32(bufferSize);
    946                 if (0 < bufferSize) {
    947                     reply->write(drmBuffer->data, bufferSize);
    948                 }
    949                 delete [] drmBuffer->data;
    950                 delete drmBuffer; drmBuffer = NULL;
    951             }
    952         }
    953         delete drmInfo; drmInfo = NULL;
    954         delete drmInfoStatus; drmInfoStatus = NULL;
    955         return DRM_NO_ERROR;
    956     }
    957 
    958     case ACQUIRE_DRM_INFO:
    959     {
    960         ALOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO");
    961         CHECK_INTERFACE(IDrmManagerService, data, reply);
    962 
    963         const int uniqueId = data.readInt32();
    964 
    965         //Filling DRM info Request
    966         const int infoType = data.readInt32();
    967         const String8 mimeType = data.readString8();
    968         DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(infoType, mimeType);
    969 
    970         const int size = data.readInt32();
    971         for (int index = 0; index < size; ++index) {
    972             const String8 key(data.readString8());
    973             const String8 value(data.readString8());
    974             drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value);
    975         }
    976 
    977         DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest);
    978 
    979         if (NULL != drmInfo) {
    980             //Filling DRM Info
    981             const DrmBuffer drmBuffer = drmInfo->getData();
    982             reply->writeInt32(drmInfo->getInfoType());
    983 
    984             const int bufferSize = drmBuffer.length;
    985             reply->writeInt32(bufferSize);
    986             if (0 < bufferSize) {
    987                 reply->write(drmBuffer.data, bufferSize);
    988             }
    989             reply->writeString8(drmInfo->getMimeType());
    990             reply->writeInt32(drmInfo->getCount());
    991 
    992             DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
    993             while (keyIt.hasNext()) {
    994                 const String8 key = keyIt.next();
    995                 reply->writeString8(key);
    996                 const String8 value = drmInfo->get(key);
    997                 reply->writeString8((value == String8("")) ? String8("NULL") : value);
    998             }
    999             delete [] drmBuffer.data;
   1000         }
   1001         delete drmInfoRequest; drmInfoRequest = NULL;
   1002         delete drmInfo; drmInfo = NULL;
   1003         return DRM_NO_ERROR;
   1004     }
   1005 
   1006     case SAVE_RIGHTS:
   1007     {
   1008         ALOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS");
   1009         CHECK_INTERFACE(IDrmManagerService, data, reply);
   1010 
   1011         const int uniqueId = data.readInt32();
   1012 
   1013         //Filling DRM Rights
   1014         const int bufferSize = data.readInt32();
   1015         const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize);
   1016 
   1017         const String8 mimeType(data.readString8());
   1018         const String8 accountId(data.readString8());
   1019         const String8 subscriptionId(data.readString8());
   1020         const String8 rightsPath(data.readString8());
   1021         const String8 contentPath(data.readString8());
   1022 
   1023         DrmRights drmRights(drmBuffer,
   1024                             ((mimeType == String8("NULL")) ? String8("") : mimeType),
   1025                             ((accountId == String8("NULL")) ? String8("") : accountId),
   1026                             ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId));
   1027 
   1028         const status_t status = saveRights(uniqueId, drmRights,
   1029                             ((rightsPath == String8("NULL")) ? String8("") : rightsPath),
   1030                             ((contentPath == String8("NULL")) ? String8("") : contentPath));
   1031 
   1032         reply->writeInt32(status);
   1033         return DRM_NO_ERROR;
   1034     }
   1035 
   1036     case GET_ORIGINAL_MIMETYPE:
   1037     {
   1038         ALOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE");
   1039         CHECK_INTERFACE(IDrmManagerService, data, reply);
   1040 
   1041         const int uniqueId = data.readInt32();
   1042         const String8 path = data.readString8();
   1043         const String8 originalMimeType = getOriginalMimeType(uniqueId, path);
   1044 
   1045         reply->writeString8(originalMimeType);
   1046         return DRM_NO_ERROR;
   1047     }
   1048 
   1049     case GET_DRM_OBJECT_TYPE:
   1050     {
   1051         ALOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE");
   1052         CHECK_INTERFACE(IDrmManagerService, data, reply);
   1053 
   1054         const int uniqueId = data.readInt32();
   1055         const String8 path = data.readString8();
   1056         const String8 mimeType = data.readString8();
   1057         const int drmObjectType = getDrmObjectType(uniqueId, path, mimeType);
   1058 
   1059         reply->writeInt32(drmObjectType);
   1060         return DRM_NO_ERROR;
   1061     }
   1062 
   1063     case CHECK_RIGHTS_STATUS:
   1064     {
   1065         ALOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS");
   1066         CHECK_INTERFACE(IDrmManagerService, data, reply);
   1067 
   1068         const int uniqueId = data.readInt32();
   1069         const String8 path = data.readString8();
   1070         const int action = data.readInt32();
   1071         const int result = checkRightsStatus(uniqueId, path, action);
   1072 
   1073         reply->writeInt32(result);
   1074         return DRM_NO_ERROR;
   1075     }
   1076 
   1077     case CONSUME_RIGHTS:
   1078     {
   1079         ALOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS");
   1080         CHECK_INTERFACE(IDrmManagerService, data, reply);
   1081 
   1082         const int uniqueId = data.readInt32();
   1083 
   1084         DecryptHandle handle;
   1085         readDecryptHandleFromParcelData(&handle, data);
   1086 
   1087         const int action = data.readInt32();
   1088         const bool reserve = static_cast<bool>(data.readInt32());
   1089         const status_t status
   1090             = consumeRights(uniqueId, &handle, action, reserve);
   1091         reply->writeInt32(status);
   1092 
   1093         clearDecryptHandle(&handle);
   1094         return DRM_NO_ERROR;
   1095     }
   1096 
   1097     case SET_PLAYBACK_STATUS:
   1098     {
   1099         ALOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS");
   1100         CHECK_INTERFACE(IDrmManagerService, data, reply);
   1101 
   1102         const int uniqueId = data.readInt32();
   1103 
   1104         DecryptHandle handle;
   1105         readDecryptHandleFromParcelData(&handle, data);
   1106 
   1107         const int playbackStatus = data.readInt32();
   1108         const int64_t position = data.readInt64();
   1109         const status_t status
   1110             = setPlaybackStatus(uniqueId, &handle, playbackStatus, position);
   1111         reply->writeInt32(status);
   1112 
   1113         clearDecryptHandle(&handle);
   1114         return DRM_NO_ERROR;
   1115     }
   1116 
   1117     case VALIDATE_ACTION:
   1118     {
   1119         ALOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION");
   1120         CHECK_INTERFACE(IDrmManagerService, data, reply);
   1121 
   1122         const int uniqueId = data.readInt32();
   1123         const String8 path = data.readString8();
   1124         const int action = data.readInt32();
   1125         const int outputType = data.readInt32();
   1126         const int configuration = data.readInt32();
   1127         bool result = validateAction(uniqueId, path, action,
   1128                 ActionDescription(outputType, configuration));
   1129 
   1130         reply->writeInt32(result);
   1131         return DRM_NO_ERROR;
   1132     }
   1133 
   1134     case REMOVE_RIGHTS:
   1135     {
   1136         ALOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS");
   1137         CHECK_INTERFACE(IDrmManagerService, data, reply);
   1138 
   1139         int uniqueId = data.readInt32();
   1140         String8 path = data.readString8();
   1141         const status_t status = removeRights(uniqueId, path);
   1142         reply->writeInt32(status);
   1143 
   1144         return DRM_NO_ERROR;
   1145     }
   1146 
   1147     case REMOVE_ALL_RIGHTS:
   1148     {
   1149         ALOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS");
   1150         CHECK_INTERFACE(IDrmManagerService, data, reply);
   1151 
   1152         const status_t status = removeAllRights(data.readInt32());
   1153         reply->writeInt32(status);
   1154 
   1155         return DRM_NO_ERROR;
   1156     }
   1157 
   1158     case OPEN_CONVERT_SESSION:
   1159     {
   1160         ALOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION");
   1161         CHECK_INTERFACE(IDrmManagerService, data, reply);
   1162 
   1163         const int uniqueId = data.readInt32();
   1164         const String8 mimeType = data.readString8();
   1165         const int convertId = openConvertSession(uniqueId, mimeType);
   1166 
   1167         reply->writeInt32(convertId);
   1168         return DRM_NO_ERROR;
   1169     }
   1170 
   1171     case CONVERT_DATA:
   1172     {
   1173         ALOGV("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->writeInt64(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         ALOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION");
   1209         CHECK_INTERFACE(IDrmManagerService, data, reply);
   1210 
   1211         const int uniqueId = data.readInt32();
   1212         const int convertId = data.readInt32();
   1213         DrmConvertedStatus* drmConvertedStatus
   1214             = closeConvertSession(uniqueId, convertId);
   1215 
   1216         if (NULL != drmConvertedStatus) {
   1217             //Filling Drm Converted Ststus
   1218             reply->writeInt32(drmConvertedStatus->statusCode);
   1219             reply->writeInt64(drmConvertedStatus->offset);
   1220 
   1221             if (NULL != drmConvertedStatus->convertedData) {
   1222                 const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
   1223                 const int bufferSize = convertedData->length;
   1224                 reply->writeInt32(bufferSize);
   1225                 if (0 < bufferSize) {
   1226                     reply->write(convertedData->data, bufferSize);
   1227                 }
   1228                 delete [] convertedData->data;
   1229                 delete convertedData; convertedData = NULL;
   1230             }
   1231         }
   1232         delete drmConvertedStatus; drmConvertedStatus = NULL;
   1233         return DRM_NO_ERROR;
   1234     }
   1235 
   1236     case GET_ALL_SUPPORT_INFO:
   1237     {
   1238         ALOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO");
   1239         CHECK_INTERFACE(IDrmManagerService, data, reply);
   1240 
   1241         const int uniqueId = data.readInt32();
   1242         int length = 0;
   1243         DrmSupportInfo* drmSupportInfoArray = NULL;
   1244 
   1245         status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray);
   1246 
   1247         reply->writeInt32(length);
   1248         for (int i = 0; i < length; ++i) {
   1249             DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i];
   1250 
   1251             reply->writeInt32(drmSupportInfo.getFileSuffixCount());
   1252             DrmSupportInfo::FileSuffixIterator fileSuffixIt
   1253                 = drmSupportInfo.getFileSuffixIterator();
   1254             while (fileSuffixIt.hasNext()) {
   1255                 reply->writeString8(fileSuffixIt.next());
   1256             }
   1257 
   1258             reply->writeInt32(drmSupportInfo.getMimeTypeCount());
   1259             DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator();
   1260             while (mimeTypeIt.hasNext()) {
   1261                 reply->writeString8(mimeTypeIt.next());
   1262             }
   1263             reply->writeString8(drmSupportInfo.getDescription());
   1264         }
   1265         delete [] drmSupportInfoArray; drmSupportInfoArray = NULL;
   1266         reply->writeInt32(status);
   1267         return DRM_NO_ERROR;
   1268     }
   1269 
   1270     case OPEN_DECRYPT_SESSION:
   1271     {
   1272         ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION");
   1273         CHECK_INTERFACE(IDrmManagerService, data, reply);
   1274 
   1275         const int uniqueId = data.readInt32();
   1276         const int fd = data.readFileDescriptor();
   1277 
   1278         const off64_t offset = data.readInt64();
   1279         const off64_t length = data.readInt64();
   1280         const String8 mime = data.readString8();
   1281 
   1282         DecryptHandle* handle
   1283             = openDecryptSession(uniqueId, fd, offset, length, mime.string());
   1284 
   1285         if (NULL != handle) {
   1286             writeDecryptHandleToParcelData(handle, reply);
   1287             clearDecryptHandle(handle);
   1288             delete handle; handle = NULL;
   1289         }
   1290         return DRM_NO_ERROR;
   1291     }
   1292 
   1293     case OPEN_DECRYPT_SESSION_FROM_URI:
   1294     {
   1295         ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI");
   1296         CHECK_INTERFACE(IDrmManagerService, data, reply);
   1297 
   1298         const int uniqueId = data.readInt32();
   1299         const String8 uri = data.readString8();
   1300         const String8 mime = data.readString8();
   1301 
   1302         DecryptHandle* handle = openDecryptSession(uniqueId, uri.string(), mime.string());
   1303 
   1304         if (NULL != handle) {
   1305             writeDecryptHandleToParcelData(handle, reply);
   1306 
   1307             clearDecryptHandle(handle);
   1308             delete handle; handle = NULL;
   1309         } else {
   1310             ALOGV("NULL decryptHandle is returned");
   1311         }
   1312         return DRM_NO_ERROR;
   1313     }
   1314 
   1315     case CLOSE_DECRYPT_SESSION:
   1316     {
   1317         ALOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION");
   1318         CHECK_INTERFACE(IDrmManagerService, data, reply);
   1319 
   1320         const int uniqueId = data.readInt32();
   1321 
   1322         DecryptHandle* handle = new DecryptHandle();
   1323         readDecryptHandleFromParcelData(handle, data);
   1324 
   1325         const status_t status = closeDecryptSession(uniqueId, handle);
   1326         reply->writeInt32(status);
   1327         return DRM_NO_ERROR;
   1328     }
   1329 
   1330     case INITIALIZE_DECRYPT_UNIT:
   1331     {
   1332         ALOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT");
   1333         CHECK_INTERFACE(IDrmManagerService, data, reply);
   1334 
   1335         const int uniqueId = data.readInt32();
   1336 
   1337         DecryptHandle handle;
   1338         readDecryptHandleFromParcelData(&handle, data);
   1339 
   1340         const int decryptUnitId = data.readInt32();
   1341 
   1342         //Filling Header info
   1343         const int bufferSize = data.readInt32();
   1344         DrmBuffer* headerInfo = NULL;
   1345         headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
   1346 
   1347         const status_t status
   1348             = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo);
   1349         reply->writeInt32(status);
   1350 
   1351         clearDecryptHandle(&handle);
   1352         delete headerInfo; headerInfo = NULL;
   1353         return DRM_NO_ERROR;
   1354     }
   1355 
   1356     case DECRYPT:
   1357     {
   1358         ALOGV("BnDrmManagerService::onTransact :DECRYPT");
   1359         CHECK_INTERFACE(IDrmManagerService, data, reply);
   1360 
   1361         const int uniqueId = data.readInt32();
   1362 
   1363         DecryptHandle handle;
   1364         readDecryptHandleFromParcelData(&handle, data);
   1365 
   1366         const int decryptUnitId = data.readInt32();
   1367         const int decBufferSize = data.readInt32();
   1368 
   1369         const int encBufferSize = data.readInt32();
   1370         DrmBuffer* encBuffer
   1371             = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize);
   1372 
   1373         char* buffer = NULL;
   1374         buffer = new char[decBufferSize];
   1375         DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize);
   1376 
   1377         DrmBuffer* IV = NULL;
   1378         if (0 != data.dataAvail()) {
   1379             const int ivBufferlength = data.readInt32();
   1380             IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength);
   1381         }
   1382 
   1383         const status_t status
   1384             = decrypt(uniqueId, &handle, decryptUnitId, encBuffer, &decBuffer, IV);
   1385 
   1386         reply->writeInt32(status);
   1387 
   1388         const int size = decBuffer->length;
   1389         reply->writeInt32(size);
   1390         reply->write(decBuffer->data, size);
   1391 
   1392         clearDecryptHandle(&handle);
   1393         delete encBuffer; encBuffer = NULL;
   1394         delete decBuffer; decBuffer = NULL;
   1395         delete [] buffer; buffer = NULL;
   1396         delete IV; IV = NULL;
   1397         return DRM_NO_ERROR;
   1398     }
   1399 
   1400     case FINALIZE_DECRYPT_UNIT:
   1401     {
   1402         ALOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT");
   1403         CHECK_INTERFACE(IDrmManagerService, data, reply);
   1404 
   1405         const int uniqueId = data.readInt32();
   1406 
   1407         DecryptHandle handle;
   1408         readDecryptHandleFromParcelData(&handle, data);
   1409 
   1410         const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32());
   1411         reply->writeInt32(status);
   1412 
   1413         clearDecryptHandle(&handle);
   1414         return DRM_NO_ERROR;
   1415     }
   1416 
   1417     case PREAD:
   1418     {
   1419         ALOGV("BnDrmManagerService::onTransact :READ");
   1420         CHECK_INTERFACE(IDrmManagerService, data, reply);
   1421 
   1422         const int uniqueId = data.readInt32();
   1423 
   1424         DecryptHandle handle;
   1425         readDecryptHandleFromParcelData(&handle, data);
   1426 
   1427         const int numBytes = data.readInt32();
   1428         char* buffer = new char[numBytes];
   1429 
   1430         const off64_t offset = data.readInt64();
   1431 
   1432         ssize_t result = pread(uniqueId, &handle, buffer, numBytes, offset);
   1433         reply->writeInt32(result);
   1434         if (0 < result) {
   1435             reply->write(buffer, result);
   1436         }
   1437 
   1438         clearDecryptHandle(&handle);
   1439         delete [] buffer, buffer = NULL;
   1440         return DRM_NO_ERROR;
   1441     }
   1442 
   1443     default:
   1444         return BBinder::onTransact(code, data, reply, flags);
   1445     }
   1446 }
   1447 
   1448