IDrmManagerService.cpp revision cba7b32d8f2c47632313f54118ed3733b4b02cc8
1155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/*
2155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Copyright (C) 2010 The Android Open Source Project
3155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *
4155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Licensed under the Apache License, Version 2.0 (the "License");
5155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * you may not use this file except in compliance with the License.
6155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * You may obtain a copy of the License at
7155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *
8155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *      http://www.apache.org/licenses/LICENSE-2.0
9155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande *
10155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Unless required by applicable law or agreed to in writing, software
11155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * distributed under the License is distributed on an "AS IS" BASIS,
12155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * See the License for the specific language governing permissions and
14155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * limitations under the License.
15155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */
16155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
17a8367288377cbaed6371256ca837b7aa22280706Mitchell Wills//#define LOG_NDEBUG 0
18e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde#define LOG_TAG "IDrmManagerService(Native)"
19ed3f1ddf197602340e675ae4357cd0fbb145f078Vinit Deshpande#include <utils/Log.h>
20e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
21e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde#include <stdint.h>
22e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde#include <sys/types.h>
23e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde#include <binder/IPCThreadState.h>
24e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
25cbf5c1792df8509c1b0de0a1b73d1c004a83e4bfdcashman#include <drm/DrmInfo.h>
26e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde#include <drm/DrmConstraints.h>
27e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde#include <drm/DrmMetadata.h>
28e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde#include <drm/DrmRights.h>
29e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde#include <drm/DrmInfoStatus.h>
30bb6942c6b6d129fd8904e341c9ce4a4118ed3e0bVinit Deshpande#include <drm/DrmConvertedStatus.h>
319153bd67d51b305ffdd61355e0748e3c332c2cafRoshan Pius#include <drm/DrmInfoRequest.h>
32bb6942c6b6d129fd8904e341c9ce4a4118ed3e0bVinit Deshpande#include <drm/DrmSupportInfo.h>
33e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
34cbf5c1792df8509c1b0de0a1b73d1c004a83e4bfdcashman#include "IDrmManagerService.h"
35efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande
36e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde#define INVALID_BUFFER_LENGTH -1
37e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
38e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndeusing namespace android;
39e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
406c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silbersteinstatic void writeDecryptHandleToParcelData(
41fc42a2cd2d461dc39b6853c130bae7dc69ed68e3Vinit Deshpande        const DecryptHandle* handle, Parcel* data) {
42297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    data->writeInt32(handle->decryptId);
43d7cbebf7fa9081e294ecab38cfe82709f381e1c9Vinit Deshpande    data->writeString8(handle->mimeType);
44e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    data->writeInt32(handle->decryptApiType);
458adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data->writeInt32(handle->status);
46e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
47e7ebc3fba71f4f996794bc5fa939674f8b4b2c5aSohani Rao    int size = handle->copyControlVector.size();
48fc42a2cd2d461dc39b6853c130bae7dc69ed68e3Vinit Deshpande    data->writeInt32(size);
498a9a103245ecfaf2c596603ccef884b870509566Ningyuan Wang    for (int i = 0; i < size; i++) {
50e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        data->writeInt32(handle->copyControlVector.keyAt(i));
51e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        data->writeInt32(handle->copyControlVector.valueAt(i));
52e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
539ec71f6499e0e3d6f52310a41ff4a59d2fa4f8b2Mitchell Wills
54ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius    size = handle->extendedData.size();
55e7ebc3fba71f4f996794bc5fa939674f8b4b2c5aSohani Rao    data->writeInt32(size);
56a8367288377cbaed6371256ca837b7aa22280706Mitchell Wills    for (int i = 0; i < size; i++) {
574fbaf3821bd5c3056c7c4cdd1aee3e17ac7046d0Sohani Rao        data->writeString8(handle->extendedData.keyAt(i));
58a8367288377cbaed6371256ca837b7aa22280706Mitchell Wills        data->writeString8(handle->extendedData.valueAt(i));
59a8367288377cbaed6371256ca837b7aa22280706Mitchell Wills    }
60a8367288377cbaed6371256ca837b7aa22280706Mitchell Wills
61da94688198c864bb29be2e9603ebbe9ae6492a87Tamas Berghammer    if (NULL != handle->decryptInfo) {
628adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        data->writeInt32(handle->decryptInfo->decryptBufferLength);
634fbaf3821bd5c3056c7c4cdd1aee3e17ac7046d0Sohani Rao    } else {
64fc42a2cd2d461dc39b6853c130bae7dc69ed68e3Vinit Deshpande        data->writeInt32(INVALID_BUFFER_LENGTH);
65e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
66e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde}
67e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
68a049f83a308e7753b68c1a5036ab67d9806807ecRebecca Silbersteinstatic void readDecryptHandleFromParcelData(
69e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        DecryptHandle* handle, const Parcel& data) {
70e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    if (0 == data.dataAvail()) {
716259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius        return;
72e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
73e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
74e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    handle->decryptId = data.readInt32();
75297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    handle->mimeType = data.readString8();
7684e718d76c7412121b64ed9ac497c8071f0ef5e9Vinit Deshpande    handle->decryptApiType = data.readInt32();
77716921f71ceeda2dc00bdd997f54fe7010b3ed0axinhe    handle->status = data.readInt32();
7812836d34cc6c4497c1fa5adbb956684ecec7578eVinit Deshpande
79ed3f1ddf197602340e675ae4357cd0fbb145f078Vinit Deshpande    int size = data.readInt32();
80e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    for (int i = 0; i < size; i++) {
811e911c92133843fc0a50a1b1c6f654f62e7c98a8Randy Pan        DrmCopyControl key = (DrmCopyControl)data.readInt32();
82d7cbebf7fa9081e294ecab38cfe82709f381e1c9Vinit Deshpande        int value = data.readInt32();
834fbaf3821bd5c3056c7c4cdd1aee3e17ac7046d0Sohani Rao        handle->copyControlVector.add(key, value);
844fbaf3821bd5c3056c7c4cdd1aee3e17ac7046d0Sohani Rao    }
85d36b93b07ee7a3f6116cc7ae7a1a1e6b687a9d3cMitchell Wills
86d7cbebf7fa9081e294ecab38cfe82709f381e1c9Vinit Deshpande    size = data.readInt32();
87d7cbebf7fa9081e294ecab38cfe82709f381e1c9Vinit Deshpande    for (int i = 0; i < size; i++) {
88d7cbebf7fa9081e294ecab38cfe82709f381e1c9Vinit Deshpande        String8 key = data.readString8();
89d36b93b07ee7a3f6116cc7ae7a1a1e6b687a9d3cMitchell Wills        String8 value = data.readString8();
90d7cbebf7fa9081e294ecab38cfe82709f381e1c9Vinit Deshpande        handle->extendedData.add(key, value);
91d7cbebf7fa9081e294ecab38cfe82709f381e1c9Vinit Deshpande    }
92d7cbebf7fa9081e294ecab38cfe82709f381e1c9Vinit Deshpande
93d7cbebf7fa9081e294ecab38cfe82709f381e1c9Vinit Deshpande    handle->decryptInfo = NULL;
94d36b93b07ee7a3f6116cc7ae7a1a1e6b687a9d3cMitchell Wills    const int bufferLen = data.readInt32();
95d7cbebf7fa9081e294ecab38cfe82709f381e1c9Vinit Deshpande    if (INVALID_BUFFER_LENGTH != bufferLen) {
96d7cbebf7fa9081e294ecab38cfe82709f381e1c9Vinit Deshpande        handle->decryptInfo = new DecryptInfo();
97d7cbebf7fa9081e294ecab38cfe82709f381e1c9Vinit Deshpande        handle->decryptInfo->decryptBufferLength = bufferLen;
98d7cbebf7fa9081e294ecab38cfe82709f381e1c9Vinit Deshpande    }
999ec71f6499e0e3d6f52310a41ff4a59d2fa4f8b2Mitchell Wills}
1009ec71f6499e0e3d6f52310a41ff4a59d2fa4f8b2Mitchell Wills
101e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatic void clearDecryptHandle(DecryptHandle* handle) {
102e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    if (handle == NULL) {
103dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle        return;
1044fbaf3821bd5c3056c7c4cdd1aee3e17ac7046d0Sohani Rao    }
105dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle    if (handle->decryptInfo) {
106dd490cf1df37b70a8625dc4ec8e712f740dd1e4aPierre Vandwalle        delete handle->decryptInfo;
1074fbaf3821bd5c3056c7c4cdd1aee3e17ac7046d0Sohani Rao        handle->decryptInfo = NULL;
1084fbaf3821bd5c3056c7c4cdd1aee3e17ac7046d0Sohani Rao    }
109e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    handle->copyControlVector.clear();
110e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    handle->extendedData.clear();
111efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande}
112efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande
113e6d8fa5fb50afdfc04922f7f87c2cac08db5bbecMitchell Willsint BpDrmManagerService::addUniqueId(bool isNative) {
1147e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills    ALOGV("add uniqueid");
115efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande    Parcel data, reply;
116bb6942c6b6d129fd8904e341c9ce4a4118ed3e0bVinit Deshpande    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
117efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande    data.writeInt32(isNative);
118efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande    remote()->transact(ADD_UNIQUEID, data, &reply);
119efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande    return reply.readInt32();
120efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande}
1214fbaf3821bd5c3056c7c4cdd1aee3e17ac7046d0Sohani Rao
122efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpandevoid BpDrmManagerService::removeUniqueId(int uniqueId) {
123efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande    ALOGV("remove uniqueid");
124efa77c1826499b0a3e57998bd6b3073b107e45d7Vinit Deshpande    Parcel data, reply;
125ed3f1ddf197602340e675ae4357cd0fbb145f078Vinit Deshpande    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
126ed3f1ddf197602340e675ae4357cd0fbb145f078Vinit Deshpande    data.writeInt32(uniqueId);
127ed3f1ddf197602340e675ae4357cd0fbb145f078Vinit Deshpande    remote()->transact(REMOVE_UNIQUEID, data, &reply);
128ed3f1ddf197602340e675ae4357cd0fbb145f078Vinit Deshpande}
129ed3f1ddf197602340e675ae4357cd0fbb145f078Vinit Deshpande
13046d6b0ac6d466002e868627488796ce3d6a154aaVinit Deshpandevoid BpDrmManagerService::addClient(int uniqueId) {
13146d6b0ac6d466002e868627488796ce3d6a154aaVinit Deshpande    Parcel data, reply;
1324fbaf3821bd5c3056c7c4cdd1aee3e17ac7046d0Sohani Rao    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
133e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    data.writeInt32(uniqueId);
1344fbaf3821bd5c3056c7c4cdd1aee3e17ac7046d0Sohani Rao    remote()->transact(ADD_CLIENT, data, &reply);
1354fbaf3821bd5c3056c7c4cdd1aee3e17ac7046d0Sohani Rao}
136e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
137e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndevoid BpDrmManagerService::removeClient(int uniqueId) {
138e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    Parcel data, reply;
139e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
1404fbaf3821bd5c3056c7c4cdd1aee3e17ac7046d0Sohani Rao    data.writeInt32(uniqueId);
141e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    remote()->transact(REMOVE_CLIENT, data, &reply);
142297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills}
143a91494208927643d011b4fa62db2064d9e8228c1Roshan Pius
144297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Willsstatus_t BpDrmManagerService::setDrmServiceListener(
1459e7f5e0a47a9a4aa519a50d9a0959547c1c604f1Mitchell Wills            int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) {
1469e7f5e0a47a9a4aa519a50d9a0959547c1c604f1Mitchell Wills    ALOGV("setDrmServiceListener");
147297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    Parcel data, reply;
148297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
149297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
150e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    data.writeInt32(uniqueId);
151297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    data.writeStrongBinder(drmServiceListener->asBinder());
152e7ebc3fba71f4f996794bc5fa939674f8b4b2c5aSohani Rao    remote()->transact(SET_DRM_SERVICE_LISTENER, data, &reply);
153297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    return reply.readInt32();
154297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills}
155a91494208927643d011b4fa62db2064d9e8228c1Roshan Pius
156a91494208927643d011b4fa62db2064d9e8228c1Roshan Piusstatus_t BpDrmManagerService::installDrmEngine(int uniqueId, const String8& drmEngineFile) {
157297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    ALOGV("Install DRM Engine");
158297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    Parcel data, reply;
159297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
1609e7f5e0a47a9a4aa519a50d9a0959547c1c604f1Mitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
161fc42a2cd2d461dc39b6853c130bae7dc69ed68e3Vinit Deshpande    data.writeInt32(uniqueId);
162297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    data.writeString8(drmEngineFile);
163297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
164a91494208927643d011b4fa62db2064d9e8228c1Roshan Pius    remote()->transact(INSTALL_DRM_ENGINE, data, &reply);
165297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    return reply.readInt32();
166297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills}
167e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
168297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell WillsDrmConstraints* BpDrmManagerService::getConstraints(
169297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            int uniqueId, const String8* path, const int action) {
170297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    ALOGV("Get Constraints");
171a91494208927643d011b4fa62db2064d9e8228c1Roshan Pius    Parcel data, reply;
172c9c91fd93350151a33d87fca768921520c256256Mitchell Wills
173c9c91fd93350151a33d87fca768921520c256256Mitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
174c9c91fd93350151a33d87fca768921520c256256Mitchell Wills    data.writeInt32(uniqueId);
1759e7f5e0a47a9a4aa519a50d9a0959547c1c604f1Mitchell Wills    data.writeString8(*path);
176a91494208927643d011b4fa62db2064d9e8228c1Roshan Pius    data.writeInt32(action);
17728c7065e2af36064a230d2647782c5cdadaff2d8Vinit Deshpande
178e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    remote()->transact(GET_CONSTRAINTS_FROM_CONTENT, data, &reply);
179297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
180e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    DrmConstraints* drmConstraints = NULL;
181e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    if (0 != reply.dataAvail()) {
18246d6b0ac6d466002e868627488796ce3d6a154aaVinit Deshpande        //Filling Drm Constraints
183ed3f1ddf197602340e675ae4357cd0fbb145f078Vinit Deshpande        drmConstraints = new DrmConstraints();
18446d6b0ac6d466002e868627488796ce3d6a154aaVinit Deshpande
185716921f71ceeda2dc00bdd997f54fe7010b3ed0axinhe        const int size = reply.readInt32();
18646d6b0ac6d466002e868627488796ce3d6a154aaVinit Deshpande        for (int index = 0; index < size; ++index) {
18746d6b0ac6d466002e868627488796ce3d6a154aaVinit Deshpande            const String8 key(reply.readString8());
18846d6b0ac6d466002e868627488796ce3d6a154aaVinit Deshpande            const int bufferSize = reply.readInt32();
18946d6b0ac6d466002e868627488796ce3d6a154aaVinit Deshpande            char* data = NULL;
190d94a62ffdf0e7f282948109d05d96e682eb32eefRebecca Silberstein            if (0 < bufferSize) {
191d94a62ffdf0e7f282948109d05d96e682eb32eefRebecca Silberstein                data = new char[bufferSize];
192d94a62ffdf0e7f282948109d05d96e682eb32eefRebecca Silberstein                reply.read(data, bufferSize);
193d94a62ffdf0e7f282948109d05d96e682eb32eefRebecca Silberstein            }
19414aadf3997f007f53f12e8bec3efaea1a66b44bdNavtej Singh Mann            drmConstraints->put(&key, data);
1958adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        }
19614aadf3997f007f53f12e8bec3efaea1a66b44bdNavtej Singh Mann    }
19714aadf3997f007f53f12e8bec3efaea1a66b44bdNavtej Singh Mann    return drmConstraints;
198d94a62ffdf0e7f282948109d05d96e682eb32eefRebecca Silberstein}
199d94a62ffdf0e7f282948109d05d96e682eb32eefRebecca Silberstein
200d94a62ffdf0e7f282948109d05d96e682eb32eefRebecca SilbersteinDrmMetadata* BpDrmManagerService::getMetadata(int uniqueId, const String8* path) {
201d94a62ffdf0e7f282948109d05d96e682eb32eefRebecca Silberstein    ALOGV("Get Metadata");
202a91494208927643d011b4fa62db2064d9e8228c1Roshan Pius    Parcel data, reply;
20314aadf3997f007f53f12e8bec3efaea1a66b44bdNavtej Singh Mann    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
20414aadf3997f007f53f12e8bec3efaea1a66b44bdNavtej Singh Mann    data.writeInt32(uniqueId);
2051581a6e6da810df4173dcbb62a1c51eb624ad427Mitchell Wills
206daac2ad767f6047409987bb22812ab5f295e54dfVinit Deshpande    DrmMetadata* drmMetadata = NULL;
207e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    data.writeString8(*path);
208e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    remote()->transact(GET_METADATA_FROM_CONTENT, data, &reply);
209e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
21094bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Wills    if (0 != reply.dataAvail()) {
21194bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Wills        //Filling Drm Metadata
21294bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Wills        drmMetadata = new DrmMetadata();
2138adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
2148adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        const int size = reply.readInt32();
215c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        for (int index = 0; index < size; ++index) {
216c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius            const String8 key(reply.readString8());
217c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius            const int bufferSize = reply.readInt32();
218c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius            char* data = NULL;
21994bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Wills            if (0 < bufferSize) {
22094bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Wills                data = new char[bufferSize];
2218adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills                reply.read(data, bufferSize);
2228adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills            }
2231ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills            drmMetadata->put(&key, data);
2241ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills        }
2251ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills    }
2261ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills    return drmMetadata;
2271ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills}
2281ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills
2291ba04405f98489f0fbd66b6566c64324be11111aMitchell Willsbool BpDrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) {
2301ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills    ALOGV("Can Handle");
2311ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills    Parcel data, reply;
23294bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Wills
23394bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
2348adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt32(uniqueId);
235e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
236e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    data.writeString8(path);
237e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    data.writeString8(mimeType);
238e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
239e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    remote()->transact(CAN_HANDLE, data, &reply);
240e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
241e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    return static_cast<bool>(reply.readInt32());
242e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde}
243e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
244e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit DeshapndeDrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) {
245578f7a33d0085559485bccfe7d1e26f813dc081dMitchell Wills    ALOGV("Process DRM Info");
246a91494208927643d011b4fa62db2064d9e8228c1Roshan Pius    Parcel data, reply;
247a91494208927643d011b4fa62db2064d9e8228c1Roshan Pius
248a91494208927643d011b4fa62db2064d9e8228c1Roshan Pius    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
249a91494208927643d011b4fa62db2064d9e8228c1Roshan Pius    data.writeInt32(uniqueId);
250a91494208927643d011b4fa62db2064d9e8228c1Roshan Pius
251a91494208927643d011b4fa62db2064d9e8228c1Roshan Pius    //Filling DRM info
252a91494208927643d011b4fa62db2064d9e8228c1Roshan Pius    data.writeInt32(drmInfo->getInfoType());
253a91494208927643d011b4fa62db2064d9e8228c1Roshan Pius    const DrmBuffer dataBuffer = drmInfo->getData();
254e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    const int dataBufferSize = dataBuffer.length;
25518786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    data.writeInt32(dataBufferSize);
25694bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Wills    if (0 < dataBufferSize) {
25794bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Wills        data.write(dataBuffer.data, dataBufferSize);
258297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
259297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    data.writeString8(drmInfo->getMimeType());
2601ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills
2611ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills    data.writeInt32(drmInfo->getCount());
2627e3e85327ca82a83de84b4750e793f2e3d1b3bfcMitchell Wills    DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
263985df17909a5703a86f3e665abc9dd964d9623d9Mitchell Wills
264297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    while (keyIt.hasNext()) {
265297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        const String8 key = keyIt.next();
2668adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        data.writeString8(key);
2678adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        const String8 value = drmInfo->get(key);
268c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        data.writeString8((value == String8("")) ? String8("NULL") : value);
269e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
270297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
2718adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    remote()->transact(PROCESS_DRM_INFO, data, &reply);
272ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius
273ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius    DrmInfoStatus* drmInfoStatus = NULL;
274e7ebc3fba71f4f996794bc5fa939674f8b4b2c5aSohani Rao    if (0 != reply.dataAvail()) {
275e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        //Filling DRM Info Status
27694bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Wills        const int statusCode = reply.readInt32();
277c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        const int infoType = reply.readInt32();
278c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        const String8 mimeType = reply.readString8();
279e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
28094bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Wills        DrmBuffer* drmBuffer = NULL;
28194bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Wills        if (0 != reply.dataAvail()) {
28294bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Wills            const int bufferSize = reply.readInt32();
283297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            char* data = NULL;
2848adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills            if (0 < bufferSize) {
285c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                data = new char[bufferSize];
286ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius                reply.read(data, bufferSize);
2874fbaf3821bd5c3056c7c4cdd1aee3e17ac7046d0Sohani Rao            }
288e7ebc3fba71f4f996794bc5fa939674f8b4b2c5aSohani Rao            drmBuffer = new DrmBuffer(data, bufferSize);
289297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
290e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        drmInfoStatus = new DrmInfoStatus(statusCode, infoType, drmBuffer, mimeType);
291e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
29218786eca942042388748b0d98979f21c9dff4a89Mitchell Wills    return drmInfoStatus;
2934fbaf3821bd5c3056c7c4cdd1aee3e17ac7046d0Sohani Rao}
2948adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
2958adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell WillsDrmInfo* BpDrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) {
296c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius    ALOGV("Acquire DRM Info");
297e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    Parcel data, reply;
298e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
299e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
300e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    data.writeInt32(uniqueId);
301e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
302e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    //Filling DRM Info Request
303e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    data.writeInt32(drmInforequest->getInfoType());
304716921f71ceeda2dc00bdd997f54fe7010b3ed0axinhe    data.writeString8(drmInforequest->getMimeType());
305e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
3068adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt32(drmInforequest->getCount());
3078adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    DrmInfoRequest::KeyIterator keyIt = drmInforequest->keyIterator();
308c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
309e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    while (keyIt.hasNext()) {
3108adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        const String8 key = keyIt.next();
3118adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        data.writeString8(key);
312c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        const String8 value = drmInforequest->get(key);
313e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        data.writeString8((value == String8("")) ? String8("NULL") : value);
314e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
315e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
316e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    remote()->transact(ACQUIRE_DRM_INFO, data, &reply);
3178adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
3188adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    DrmInfo* drmInfo = NULL;
319c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius    if (0 != reply.dataAvail()) {
320e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        //Filling DRM Info
321e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const int infoType = reply.readInt32();
322e7ebc3fba71f4f996794bc5fa939674f8b4b2c5aSohani Rao        const int bufferSize = reply.readInt32();
323e7ebc3fba71f4f996794bc5fa939674f8b4b2c5aSohani Rao        char* data = NULL;
324e7ebc3fba71f4f996794bc5fa939674f8b4b2c5aSohani Rao
325e7ebc3fba71f4f996794bc5fa939674f8b4b2c5aSohani Rao        if (0 < bufferSize) {
326e7ebc3fba71f4f996794bc5fa939674f8b4b2c5aSohani Rao            data = new char[bufferSize];
327e7ebc3fba71f4f996794bc5fa939674f8b4b2c5aSohani Rao            reply.read(data, bufferSize);
328e7ebc3fba71f4f996794bc5fa939674f8b4b2c5aSohani Rao        }
329e7ebc3fba71f4f996794bc5fa939674f8b4b2c5aSohani Rao        drmInfo = new DrmInfo(infoType, DrmBuffer(data, bufferSize), reply.readString8());
330e7ebc3fba71f4f996794bc5fa939674f8b4b2c5aSohani Rao
33144f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills        const int size = reply.readInt32();
33244f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills        for (int index = 0; index < size; ++index) {
33344f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills            const String8 key(reply.readString8());
33444f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills            const String8 value(reply.readString8());
335d36b93b07ee7a3f6116cc7ae7a1a1e6b687a9d3cMitchell Wills            drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
33644f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills        }
33744f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    }
33848444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills    return drmInfo;
33948444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills}
34048444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills
34144f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Willsstatus_t BpDrmManagerService::saveRights(
34244f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills            int uniqueId, const DrmRights& drmRights,
34344f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills            const String8& rightsPath, const String8& contentPath) {
34444f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    ALOGV("Save Rights");
34544f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    Parcel data, reply;
34644f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
34744f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
34844f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    data.writeInt32(uniqueId);
34944f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
35044f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    //Filling Drm Rights
35144f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    const DrmBuffer dataBuffer = drmRights.getData();
35244f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    data.writeInt32(dataBuffer.length);
35344f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    data.write(dataBuffer.data, dataBuffer.length);
35444f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
35544f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    const String8 mimeType = drmRights.getMimeType();
356d36b93b07ee7a3f6116cc7ae7a1a1e6b687a9d3cMitchell Wills    data.writeString8((mimeType == String8("")) ? String8("NULL") : mimeType);
35744f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
35844f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    const String8 accountId = drmRights.getAccountId();
35944f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    data.writeString8((accountId == String8("")) ? String8("NULL") : accountId);
36044f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
36144f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    const String8 subscriptionId = drmRights.getSubscriptionId();
36244f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    data.writeString8((subscriptionId == String8("")) ? String8("NULL") : subscriptionId);
36344f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
36444f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    data.writeString8((rightsPath == String8("")) ? String8("NULL") : rightsPath);
36544f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    data.writeString8((contentPath == String8("")) ? String8("NULL") : contentPath);
36644f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
36744f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    remote()->transact(SAVE_RIGHTS, data, &reply);
36844f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    return reply.readInt32();
36944f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills}
37044f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
37144f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell WillsString8 BpDrmManagerService::getOriginalMimeType(int uniqueId, const String8& path) {
37244f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    ALOGV("Get Original MimeType");
37344f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    Parcel data, reply;
37444f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
375d36b93b07ee7a3f6116cc7ae7a1a1e6b687a9d3cMitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
376f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius    data.writeInt32(uniqueId);
377f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius    data.writeString8(path);
378f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius
379f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius    remote()->transact(GET_ORIGINAL_MIMETYPE, data, &reply);
380f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius    return reply.readString8();
381f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius}
38244f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
38344f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Willsint BpDrmManagerService::getDrmObjectType(
38444f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills            int uniqueId, const String8& path, const String8& mimeType) {
38544f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    ALOGV("Get Drm object type");
386f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius    Parcel data, reply;
38744f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
38844f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
38944f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    data.writeInt32(uniqueId);
390f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius    data.writeString8(path);
391f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius    data.writeString8(mimeType);
392f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius
393f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius    remote()->transact(GET_DRM_OBJECT_TYPE, data, &reply);
394f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius
39544f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    return reply.readInt32();
39644f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills}
39744f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
398f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Piusint BpDrmManagerService::checkRightsStatus(int uniqueId, const String8& path, int action) {
399f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius    ALOGV("checkRightsStatus");
400f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius    Parcel data, reply;
401f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius
402f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
403f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius    data.writeInt32(uniqueId);
404f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius    data.writeString8(path);
40544f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    data.writeInt32(action);
40644f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
40744f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    remote()->transact(CHECK_RIGHTS_STATUS, data, &reply);
40844f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
409f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius    return reply.readInt32();
410f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius}
411f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius
412f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Piusstatus_t BpDrmManagerService::consumeRights(
41344f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills            int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) {
41444f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    ALOGV("consumeRights");
41544f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    Parcel data, reply;
41644f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
41744f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
41844f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    data.writeInt32(uniqueId);
41944f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
42044f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    writeDecryptHandleToParcelData(decryptHandle, &data);
42144f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
42244f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    data.writeInt32(action);
42344f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    data.writeInt32(static_cast< int>(reserve));
42444f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
42544f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    remote()->transact(CONSUME_RIGHTS, data, &reply);
42644f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    return reply.readInt32();
42744f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills}
42844f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
42944f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Willsstatus_t BpDrmManagerService::setPlaybackStatus(
43044f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills            int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) {
43144f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    ALOGV("setPlaybackStatus");
43244f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    Parcel data, reply;
43344f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
4348adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
4358adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt32(uniqueId);
4368adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
4378adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    writeDecryptHandleToParcelData(decryptHandle, &data);
4388adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
4398adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt32(playbackStatus);
4408adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt64(position);
44123216ca333dc411e6ce0829f777ca29992388443Roshan Pius
44223216ca333dc411e6ce0829f777ca29992388443Roshan Pius    remote()->transact(SET_PLAYBACK_STATUS, data, &reply);
44323216ca333dc411e6ce0829f777ca29992388443Roshan Pius    return reply.readInt32();
44423216ca333dc411e6ce0829f777ca29992388443Roshan Pius}
44523216ca333dc411e6ce0829f777ca29992388443Roshan Pius
44623216ca333dc411e6ce0829f777ca29992388443Roshan Piusbool BpDrmManagerService::validateAction(
44723216ca333dc411e6ce0829f777ca29992388443Roshan Pius            int uniqueId, const String8& path,
44823216ca333dc411e6ce0829f777ca29992388443Roshan Pius            int action, const ActionDescription& description) {
44923216ca333dc411e6ce0829f777ca29992388443Roshan Pius    ALOGV("validateAction");
4508adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    Parcel data, reply;
4518adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
4528adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
4538adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt32(uniqueId);
4548adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeString8(path);
4555751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    data.writeInt32(action);
45644f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    data.writeInt32(description.outputType);
45744f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    data.writeInt32(description.configuration);
4588adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
45923216ca333dc411e6ce0829f777ca29992388443Roshan Pius    remote()->transact(VALIDATE_ACTION, data, &reply);
46023216ca333dc411e6ce0829f777ca29992388443Roshan Pius
4616c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein    return static_cast<bool>(reply.readInt32());
4628adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills}
4638adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
4648adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Willsstatus_t BpDrmManagerService::removeRights(int uniqueId, const String8& path) {
4658adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    ALOGV("removeRights");
4668adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    Parcel data, reply;
4678adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
4688adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
4698adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt32(uniqueId);
4708adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeString8(path);
4718adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
4728adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    remote()->transact(REMOVE_RIGHTS, data, &reply);
4738adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    return reply.readInt32();
474e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde}
475e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
476e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapndestatus_t BpDrmManagerService::removeAllRights(int uniqueId) {
477e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    ALOGV("removeAllRights");
4788adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    Parcel data, reply;
4798adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
4808adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
4818adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt32(uniqueId);
482e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
48363539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills    remote()->transact(REMOVE_ALL_RIGHTS, data, &reply);
48463539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills    return reply.readInt32();
48563539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills}
48663539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills
48763539f1283899fbbf83ab90757961b4be51d5034Mitchell Willsint BpDrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) {
48863539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills    ALOGV("openConvertSession");
48963539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills    Parcel data, reply;
49063539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills
49163539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
49263539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills    data.writeInt32(uniqueId);
49363539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills    data.writeString8(mimeType);
49463539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills
49563539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills    remote()->transact(OPEN_CONVERT_SESSION, data, &reply);
49663539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills    return reply.readInt32();
49763539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills}
498b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande
499b7cc309f06da8a18224057c21ba086f8550367d6Vinit DeshpandeDrmConvertedStatus* BpDrmManagerService::convertData(
5008adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills            int uniqueId, int convertId, const DrmBuffer* inputData) {
5018adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    ALOGV("convertData");
5028adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    Parcel data, reply;
5038adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
504c9e6069eb941d282af213dc20b171877db6b567bMitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
5058adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt32(uniqueId);
506c9e6069eb941d282af213dc20b171877db6b567bMitchell Wills    data.writeInt32(convertId);
5078adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt32(inputData->length);
5088adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.write(inputData->data, inputData->length);
5098adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
5108adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    remote()->transact(CONVERT_DATA, data, &reply);
5118adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
5128adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    DrmConvertedStatus* drmConvertedStatus = NULL;
513b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande
514b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    if (0 != reply.dataAvail()) {
515b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande        //Filling DRM Converted Status
516b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande        const int statusCode = reply.readInt32();
5178adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        const off64_t offset = reply.readInt64();
5188adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
519d4762401ec14be6bdd2d27aff2478ddbf8d6ce2aVinit Deshpande        DrmBuffer* convertedData = NULL;
520d4762401ec14be6bdd2d27aff2478ddbf8d6ce2aVinit Deshpande        if (0 != reply.dataAvail()) {
521e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde            const int bufferSize = reply.readInt32();
522e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde            char* data = NULL;
523e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde            if (0 < bufferSize) {
5248adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills                data = new char[bufferSize];
5258adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills                reply.read(data, bufferSize);
526e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde            }
527e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde            convertedData = new DrmBuffer(data, bufferSize);
528e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        }
529e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
530e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
5318adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    return drmConvertedStatus;
5328adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills}
5338adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
5348adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell WillsDrmConvertedStatus* BpDrmManagerService::closeConvertSession(int uniqueId, int convertId) {
5358adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    ALOGV("closeConvertSession");
5368adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    Parcel data, reply;
5378adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
5388adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
5398adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt32(uniqueId);
5408adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt32(convertId);
5418adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
5428adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    remote()->transact(CLOSE_CONVERT_SESSION, data, &reply);
5438adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
5448adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    DrmConvertedStatus* drmConvertedStatus = NULL;
5458adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
546d94a62ffdf0e7f282948109d05d96e682eb32eefRebecca Silberstein    if (0 != reply.dataAvail()) {
54723216ca333dc411e6ce0829f777ca29992388443Roshan Pius        //Filling DRM Converted Status
54823216ca333dc411e6ce0829f777ca29992388443Roshan Pius        const int statusCode = reply.readInt32();
549d94a62ffdf0e7f282948109d05d96e682eb32eefRebecca Silberstein        const off64_t offset = reply.readInt64();
550d94a62ffdf0e7f282948109d05d96e682eb32eefRebecca Silberstein
551e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        DrmBuffer* convertedData = NULL;
552e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        if (0 != reply.dataAvail()) {
553e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde            const int bufferSize = reply.readInt32();
55423216ca333dc411e6ce0829f777ca29992388443Roshan Pius            char* data = NULL;
5558adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills            if (0 < bufferSize) {
55623216ca333dc411e6ce0829f777ca29992388443Roshan Pius                data = new char[bufferSize];
55723216ca333dc411e6ce0829f777ca29992388443Roshan Pius                reply.read(data, bufferSize);
55823216ca333dc411e6ce0829f777ca29992388443Roshan Pius            }
55923216ca333dc411e6ce0829f777ca29992388443Roshan Pius            convertedData = new DrmBuffer(data, bufferSize);
56023216ca333dc411e6ce0829f777ca29992388443Roshan Pius        }
56123216ca333dc411e6ce0829f777ca29992388443Roshan Pius        drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
56223216ca333dc411e6ce0829f777ca29992388443Roshan Pius    }
56323216ca333dc411e6ce0829f777ca29992388443Roshan Pius    return drmConvertedStatus;
56423216ca333dc411e6ce0829f777ca29992388443Roshan Pius}
56523216ca333dc411e6ce0829f777ca29992388443Roshan Pius
56623216ca333dc411e6ce0829f777ca29992388443Roshan Piusstatus_t BpDrmManagerService::getAllSupportInfo(
56723216ca333dc411e6ce0829f777ca29992388443Roshan Pius            int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) {
56823216ca333dc411e6ce0829f777ca29992388443Roshan Pius    ALOGV("Get All Support Info");
56923216ca333dc411e6ce0829f777ca29992388443Roshan Pius    Parcel data, reply;
57023216ca333dc411e6ce0829f777ca29992388443Roshan Pius
5718adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
5728adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt32(uniqueId);
5738adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
5748adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    remote()->transact(GET_ALL_SUPPORT_INFO, data, &reply);
5758adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
5768adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    //Filling DRM Support Info
5778adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    const int arraySize = reply.readInt32();
5788adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    if (0 < arraySize) {
5798adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        *drmSupportInfoArray = new DrmSupportInfo[arraySize];
5808adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
5818adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        for (int index = 0; index < arraySize; ++index) {
5826c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein            DrmSupportInfo drmSupportInfo;
58323216ca333dc411e6ce0829f777ca29992388443Roshan Pius
5846c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein            const int fileSuffixVectorSize = reply.readInt32();
585c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            for (int i = 0; i < fileSuffixVectorSize; ++i) {
586c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                drmSupportInfo.addFileSuffix(reply.readString8());
587c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            }
5888adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
5898adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills            const int mimeTypeVectorSize = reply.readInt32();
590e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde            for (int i = 0; i < mimeTypeVectorSize; ++i) {
591e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde                drmSupportInfo.addMimeType(reply.readString8());
592e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde            }
593e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
594e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde            drmSupportInfo.setDescription(reply.readString8());
595e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde            (*drmSupportInfoArray)[index] = drmSupportInfo;
596e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        }
5978adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    }
598c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    *length = arraySize;
59956820e92fd4b1a0cee83f552905fc76fc8290146Mitchell Wills    return reply.readInt32();
6000ea5062316013cd4173faf16c2a0f3ecd1b9ed43Mitchell Wills}
601720aba804a5c7fa5e4cc92af60b129e3e0013666Mitchell Wills
60256820e92fd4b1a0cee83f552905fc76fc8290146Mitchell WillsDecryptHandle* BpDrmManagerService::openDecryptSession(
603720aba804a5c7fa5e4cc92af60b129e3e0013666Mitchell Wills            int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) {
604720aba804a5c7fa5e4cc92af60b129e3e0013666Mitchell Wills    ALOGV("Entering BpDrmManagerService::openDecryptSession");
605720aba804a5c7fa5e4cc92af60b129e3e0013666Mitchell Wills    Parcel data, reply;
606720aba804a5c7fa5e4cc92af60b129e3e0013666Mitchell Wills
6070ea5062316013cd4173faf16c2a0f3ecd1b9ed43Mitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
6080ea5062316013cd4173faf16c2a0f3ecd1b9ed43Mitchell Wills    data.writeInt32(uniqueId);
6090ea5062316013cd4173faf16c2a0f3ecd1b9ed43Mitchell Wills    data.writeFileDescriptor(fd);
6100ea5062316013cd4173faf16c2a0f3ecd1b9ed43Mitchell Wills    data.writeInt64(offset);
6115751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    data.writeInt64(length);
6125751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    String8 mimeType;
6135751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    if (mime) {
6148adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        mimeType = mime;
6155751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    }
6165751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    data.writeString8(mimeType);
6175751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills
6188adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    remote()->transact(OPEN_DECRYPT_SESSION, data, &reply);
6198adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
6208adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    DecryptHandle* handle = NULL;
6215751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    if (0 != reply.dataAvail()) {
6225751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills        handle = new DecryptHandle();
6235751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills        readDecryptHandleFromParcelData(handle, reply);
6245751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    }
6255751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    return handle;
6265751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills}
6275751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills
6285751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell WillsDecryptHandle* BpDrmManagerService::openDecryptSession(
6298adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        int uniqueId, const char* uri, const char* mime) {
6308adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
6318adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    ALOGV("Entering BpDrmManagerService::openDecryptSession: mime=%s", mime? mime: "NULL");
63256820e92fd4b1a0cee83f552905fc76fc8290146Mitchell Wills    Parcel data, reply;
6338adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
634c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
635c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    data.writeInt32(uniqueId);
6368adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeString8(String8(uri));
6378adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    String8 mimeType;
6388adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    if (mime) {
6398adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        mimeType = mime;
6408adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    }
641e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    data.writeString8(mimeType);
642e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
643e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    remote()->transact(OPEN_DECRYPT_SESSION_FROM_URI, data, &reply);
6448adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
6458adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    DecryptHandle* handle = NULL;
6468adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    if (0 != reply.dataAvail()) {
6478adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        handle = new DecryptHandle();
6488adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        readDecryptHandleFromParcelData(handle, reply);
6498adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    } else {
6508adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        ALOGV("no decryptHandle is generated in service side");
651e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
652e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    return handle;
653e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde}
654e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
6558adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell WillsDecryptHandle* BpDrmManagerService::openDecryptSession(
6568adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills            int uniqueId, const DrmBuffer& buf, const String8& mimeType) {
6578adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    ALOGV("Entering BpDrmManagerService::openDecryptSession");
6588adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    Parcel data, reply;
6598adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
66048444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
66148444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills    data.writeInt32(uniqueId);
66248444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills    if (buf.data != NULL && buf.length > 0) {
66348444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills        data.writeInt32(buf.length);
66448444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills        data.write(buf.data, buf.length);
66548444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills    } else {
66648444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills        data.writeInt32(0);
66748444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills    }
66848444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills    data.writeString8(mimeType);
66948444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills
67048444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills    remote()->transact(OPEN_DECRYPT_SESSION_FOR_STREAMING, data, &reply);
67148444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills
6728adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    DecryptHandle* handle = NULL;
6738adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    if (0 != reply.dataAvail()) {
6745751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills        handle = new DecryptHandle();
67548444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills        readDecryptHandleFromParcelData(handle, reply);
67648444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills    } else {
67748444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills        ALOGV("no decryptHandle is generated in service side");
67848444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills    }
67948444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills    return handle;
68048444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills}
6818adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
682c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhnestatus_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) {
683c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    ALOGV("closeDecryptSession");
684c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    Parcel data, reply;
6858adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
6868adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
6878adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt32(uniqueId);
6888adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
689e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    writeDecryptHandleToParcelData(decryptHandle, &data);
690e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
691e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply);
6928adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
693c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    return reply.readInt32();
694c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne}
695c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
6968adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Willsstatus_t BpDrmManagerService::initializeDecryptUnit(
6978adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills            int uniqueId, DecryptHandle* decryptHandle,
6988adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills            int decryptUnitId, const DrmBuffer* headerInfo) {
6998adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    ALOGV("initializeDecryptUnit");
7008adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    Parcel data, reply;
701c9e6069eb941d282af213dc20b171877db6b567bMitchell Wills
7028adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
7038adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt32(uniqueId);
704c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
705c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne    writeDecryptHandleToParcelData(decryptHandle, &data);
7066c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein
7078adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt32(decryptUnitId);
7088adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
7098adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt32(headerInfo->length);
7108adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.write(headerInfo->data, headerInfo->length);
7118adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
7128adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply);
7138adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    return reply.readInt32();
7148adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills}
7158adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
7168adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Willsstatus_t BpDrmManagerService::decrypt(
7175751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills            int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,
7180ea5062316013cd4173faf16c2a0f3ecd1b9ed43Mitchell Wills            const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) {
7198adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    ALOGV("decrypt");
7208adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    Parcel data, reply;
7218adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
7228adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
7238adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt32(uniqueId);
7248adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
7258adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    writeDecryptHandleToParcelData(decryptHandle, &data);
7268adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
7278adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt32(decryptUnitId);
7288adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt32((*decBuffer)->length);
7295751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills
7305751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    data.writeInt32(encBuffer->length);
7315751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    data.write(encBuffer->data, encBuffer->length);
7325751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills
7335751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    if (NULL != IV) {
7345751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills        data.writeInt32(IV->length);
7355751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills        data.write(IV->data, IV->length);
7365751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    }
7375751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills
7385751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    remote()->transact(DECRYPT, data, &reply);
7395751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills
7405751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    const status_t status = reply.readInt32();
7415751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    ALOGV("Return value of decrypt() is %d", status);
7425751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills
7435751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    const int size = reply.readInt32();
7445751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    (*decBuffer)->length = size;
7455751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    reply.read((void *)(*decBuffer)->data, size);
7465751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills
7475751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    return status;
7485751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills}
7495751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills
7505751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Willsstatus_t BpDrmManagerService::finalizeDecryptUnit(
7515751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills            int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) {
7525751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    ALOGV("finalizeDecryptUnit");
7535751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    Parcel data, reply;
7548a9a103245ecfaf2c596603ccef884b870509566Ningyuan Wang
7558a9a103245ecfaf2c596603ccef884b870509566Ningyuan Wang    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
756ed70365e5a3a6e2b06c2d4d06603f97596f1124bMitchell Wills    data.writeInt32(uniqueId);
757ed70365e5a3a6e2b06c2d4d06603f97596f1124bMitchell Wills
7586259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius    writeDecryptHandleToParcelData(decryptHandle, &data);
7596259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius
7606259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius    data.writeInt32(decryptUnitId);
7615751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills
7626259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius    remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply);
7636259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius    return reply.readInt32();
7646259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius}
7656259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius
7665751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Willsssize_t BpDrmManagerService::pread(
7675751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills            int uniqueId, DecryptHandle* decryptHandle, void* buffer,
7685751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills            ssize_t numBytes, off64_t offset) {
7695751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    ALOGV("read");
7705751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    Parcel data, reply;
7718adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    int result;
7728adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
7738adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
7748adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    data.writeInt32(uniqueId);
7758adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
77644f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    writeDecryptHandleToParcelData(decryptHandle, &data);
777f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius
778f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius    data.writeInt32(numBytes);
77944f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    data.writeInt64(offset);
78044f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
78144f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    remote()->transact(PREAD, data, &reply);
78244f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    result = reply.readInt32();
78344f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    if (0 < result) {
78444f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills        reply.read(buffer, result);
78544f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    }
78644f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    return result;
7878adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills}
7888adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
7898adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell WillsIMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService");
7908adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
7918adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Willsstatus_t BnDrmManagerService::onTransact(
7928adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills            uint32_t code, const Parcel& data,
7938adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills            Parcel* reply, uint32_t flags) {
7948adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    ALOGV("Entering BnDrmManagerService::onTransact with code %d", code);
7958adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
7968adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    switch (code) {
7978adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    case ADD_UNIQUEID:
7988adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    {
7998adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        ALOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID");
8008adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        CHECK_INTERFACE(IDrmManagerService, data, reply);
80144f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills        int uniqueId = addUniqueId(data.readInt32());
8028adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        reply->writeInt32(uniqueId);
8038adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        return DRM_NO_ERROR;
8046259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius    }
80544f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
80644f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    case REMOVE_UNIQUEID:
8076259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius    {
8086259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius        ALOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID");
8096259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius        CHECK_INTERFACE(IDrmManagerService, data, reply);
8106259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius        removeUniqueId(data.readInt32());
8116259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius        return DRM_NO_ERROR;
8128adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    }
8138adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
81444f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills    case ADD_CLIENT:
8158adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    {
8168adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        ALOGV("BnDrmManagerService::onTransact :ADD_CLIENT");
8178adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        CHECK_INTERFACE(IDrmManagerService, data, reply);
8188adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        addClient(data.readInt32());
8196259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius        return DRM_NO_ERROR;
8206259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius    }
8218adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
8226259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius    case REMOVE_CLIENT:
8236259b630ddb59b642729a2d2113d81ed8e33a0e3Roshan Pius    {
8248adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        ALOGV("BnDrmManagerService::onTransact :REMOVE_CLIENT");
8258adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        CHECK_INTERFACE(IDrmManagerService, data, reply);
8268adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        removeClient(data.readInt32());
8278adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        return DRM_NO_ERROR;
8288adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    }
8298adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
8308adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    case SET_DRM_SERVICE_LISTENER:
8315751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills    {
8325751e82f645ab5b4366c63e0fbc561534c1cb3b8Mitchell Wills        ALOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER");
8338adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        CHECK_INTERFACE(IDrmManagerService, data, reply);
83444f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
8358adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        const int uniqueId = data.readInt32();
8368adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        const sp<IDrmServiceListener> drmServiceListener
8378adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills            = interface_cast<IDrmServiceListener> (data.readStrongBinder());
8388adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
8398adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        status_t status = setDrmServiceListener(uniqueId, drmServiceListener);
8408adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
841c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        reply->writeInt32(status);
842c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        return DRM_NO_ERROR;
8438adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    }
8448adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
8458adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    case INSTALL_DRM_ENGINE:
8468adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    {
8478adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        ALOGV("BnDrmManagerService::onTransact :INSTALL_DRM_ENGINE");
8488adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        CHECK_INTERFACE(IDrmManagerService, data, reply);
84944f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
8508adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        const int uniqueId = data.readInt32();
85144f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills        const String8 engineFile = data.readString8();
85256820e92fd4b1a0cee83f552905fc76fc8290146Mitchell Wills        status_t status = installDrmEngine(uniqueId, engineFile);
85356820e92fd4b1a0cee83f552905fc76fc8290146Mitchell Wills
85444f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills        reply->writeInt32(status);
8558adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        return DRM_NO_ERROR;
8568adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    }
8578adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
8588adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    case GET_CONSTRAINTS_FROM_CONTENT:
8598adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    {
860c9e6069eb941d282af213dc20b171877db6b567bMitchell Wills        ALOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT");
86144f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills        CHECK_INTERFACE(IDrmManagerService, data, reply);
8624e54617758f86acef751bc8588257a58ed985b0fMitchell Wills
86344f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills        const int uniqueId = data.readInt32();
86444f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills        const String8 path = data.readString8();
8658adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
8668adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        DrmConstraints* drmConstraints
8671ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills            = getConstraints(uniqueId, &path, data.readInt32());
8681ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills
8691ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills        if (NULL != drmConstraints) {
8701ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills            //Filling DRM Constraints contents
8718adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills            reply->writeInt32(drmConstraints->getCount());
8728adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
8736c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein            DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator();
8746c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein            while (keyIt.hasNext()) {
8756c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein                const String8 key = keyIt.next();
8766c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein                reply->writeString8(key);
8776c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein                const char* value = drmConstraints->getAsByteArray(&key);
8786c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein                int bufferSize = 0;
8796c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein                if (NULL != value) {
8808adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills                    bufferSize = strlen(value);
881c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                }
882c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                reply->writeInt32(bufferSize + 1);
883c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne                reply->write(value, bufferSize + 1);
884c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            }
885c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
886c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        delete drmConstraints; drmConstraints = NULL;
887c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        return DRM_NO_ERROR;
8881ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills    }
88944f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
8904e54617758f86acef751bc8588257a58ed985b0fMitchell Wills    case GET_METADATA_FROM_CONTENT:
8911ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills    {
8921ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills        ALOGV("BnDrmManagerService::onTransact :GET_METADATA_FROM_CONTENT");
8938adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        CHECK_INTERFACE(IDrmManagerService, data, reply);
89459298c7cfffdf856e32879ec967fe27c7e977a49Mitchell Wills
89559298c7cfffdf856e32879ec967fe27c7e977a49Mitchell Wills        const int uniqueId = data.readInt32();
8961ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills        const String8 path = data.readString8();
8978adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
89844f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills        DrmMetadata* drmMetadata = getMetadata(uniqueId, &path);
8998adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        if (NULL != drmMetadata) {
9001ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills            //Filling DRM Metadata contents
9011ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills            reply->writeInt32(drmMetadata->getCount());
9021ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills
9031ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills            DrmMetadata::KeyIterator keyIt = drmMetadata->keyIterator();
9041ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills            while (keyIt.hasNext()) {
9051ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills                const String8 key = keyIt.next();
9061ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills                reply->writeString8(key);
9071ba04405f98489f0fbd66b6566c64324be11111aMitchell Wills                const char* value = drmMetadata->getAsByteArray(&key);
9086c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein                int bufferSize = 0;
90923216ca333dc411e6ce0829f777ca29992388443Roshan Pius                if (NULL != value) {
91023216ca333dc411e6ce0829f777ca29992388443Roshan Pius                    bufferSize = strlen(value);
91123216ca333dc411e6ce0829f777ca29992388443Roshan Pius                    reply->writeInt32(bufferSize + 1);
91223216ca333dc411e6ce0829f777ca29992388443Roshan Pius                    reply->write(value, bufferSize + 1);
91323216ca333dc411e6ce0829f777ca29992388443Roshan Pius                } else {
9148adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills                    reply->writeInt32(0);
915a049f83a308e7753b68c1a5036ab67d9806807ecRebecca Silberstein                }
916a049f83a308e7753b68c1a5036ab67d9806807ecRebecca Silberstein            }
91723216ca333dc411e6ce0829f777ca29992388443Roshan Pius        }
918a049f83a308e7753b68c1a5036ab67d9806807ecRebecca Silberstein        delete drmMetadata; drmMetadata = NULL;
9198adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        return NO_ERROR;
9208adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills    }
9218adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
922bb9016d1e5f7c2b27502e7d7db13b55460bca88bMichael Plass    case CAN_HANDLE:
923e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    {
924e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        ALOGV("BnDrmManagerService::onTransact :CAN_HANDLE");
925e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        CHECK_INTERFACE(IDrmManagerService, data, reply);
926b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande
927e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const int uniqueId = data.readInt32();
928f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius        const String8 path = data.readString8();
9291fa40005d82db21b2cc1c7e06d249b09c674ab8bRoshan Pius        const String8 mimeType = data.readString8();
9308adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
931799f1c026941c9183657ffb99f0fb34ff643a0ddRoshan Pius        bool result = canHandle(uniqueId, path, mimeType);
932e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
933e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        reply->writeInt32(result);
934e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        return DRM_NO_ERROR;
935e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
9368adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
937e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    case PROCESS_DRM_INFO:
938e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    {
939b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande        ALOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO");
9408adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        CHECK_INTERFACE(IDrmManagerService, data, reply);
941e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
942e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const int uniqueId = data.readInt32();
943e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
944e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        //Filling DRM info
94519a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius        const int infoType = data.readInt32();
946f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius        const int bufferSize = data.readInt32();
94780640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        char* buffer = NULL;
94880640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        if (0 < bufferSize) {
94919a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius            buffer = (char *)data.readInplace(bufferSize);
950f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius        }
95119a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius        const DrmBuffer drmBuffer(buffer, bufferSize);
95280640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8());
95380640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
954e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const int size = data.readInt32();
95563539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills        for (int index = 0; index < size; ++index) {
95663539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills            const String8 key(data.readString8());
95763539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills            const String8 value(data.readString8());
95863539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills            drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
95963539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills        }
96063539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills
96163539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills        DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo);
96263539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills
96363539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills        if (NULL != drmInfoStatus) {
96463539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills            //Filling DRM Info Status contents
96563539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills            reply->writeInt32(drmInfoStatus->statusCode);
96663539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills            reply->writeInt32(drmInfoStatus->infoType);
96763539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills            reply->writeString8(drmInfoStatus->mimeType);
96863539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills
96963539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills            if (NULL != drmInfoStatus->drmBuffer) {
970b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande                const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer;
971b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande                const int bufferSize = drmBuffer->length;
972b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande                reply->writeInt32(bufferSize);
973c9e6069eb941d282af213dc20b171877db6b567bMitchell Wills                if (0 < bufferSize) {
974297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                    reply->write(drmBuffer->data, bufferSize);
975c9e6069eb941d282af213dc20b171877db6b567bMitchell Wills                }
976e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde                delete [] drmBuffer->data;
977e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde                delete drmBuffer; drmBuffer = NULL;
978e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde            }
979bb6942c6b6d129fd8904e341c9ce4a4118ed3e0bVinit Deshpande        }
980297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        delete drmInfo; drmInfo = NULL;
98183a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande        delete drmInfoStatus; drmInfoStatus = NULL;
982b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande        return DRM_NO_ERROR;
983b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    }
984b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande
985b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    case ACQUIRE_DRM_INFO:
986297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    {
987b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande        ALOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO");
988b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande        CHECK_INTERFACE(IDrmManagerService, data, reply);
989b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande
990e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const int uniqueId = data.readInt32();
991e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
992e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        //Filling DRM info Request
993716921f71ceeda2dc00bdd997f54fe7010b3ed0axinhe        const int infoType = data.readInt32();
99480640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        const String8 mimeType = data.readString8();
995e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(infoType, mimeType);
996a91494208927643d011b4fa62db2064d9e8228c1Roshan Pius
997e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const int size = data.readInt32();
998e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        for (int index = 0; index < size; ++index) {
999e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde            const String8 key(data.readString8());
1000e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde            const String8 value(data.readString8());
10018adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills            drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value);
1002c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        }
10038adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
10049ec71f6499e0e3d6f52310a41ff4a59d2fa4f8b2Mitchell Wills        DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest);
1005ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius
1006017307e0d7133f3b2523090136b919c6f494098eMitchell Wills        if (NULL != drmInfo) {
10079ec71f6499e0e3d6f52310a41ff4a59d2fa4f8b2Mitchell Wills            //Filling DRM Info
1008017307e0d7133f3b2523090136b919c6f494098eMitchell Wills            const DrmBuffer drmBuffer = drmInfo->getData();
1009985df17909a5703a86f3e665abc9dd964d9623d9Mitchell Wills            reply->writeInt32(drmInfo->getInfoType());
1010017307e0d7133f3b2523090136b919c6f494098eMitchell Wills
101194bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Wills            const int bufferSize = drmBuffer.length;
101294bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Wills            reply->writeInt32(bufferSize);
1013297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            if (0 < bufferSize) {
1014297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                reply->write(drmBuffer.data, bufferSize);
1015297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            }
1016e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde            reply->writeString8(drmInfo->getMimeType());
10171b76ca405029249b41b38424a253a8c5fa72dab1Roshan Pius            reply->writeInt32(drmInfo->getCount());
10181b76ca405029249b41b38424a253a8c5fa72dab1Roshan Pius
10191b76ca405029249b41b38424a253a8c5fa72dab1Roshan Pius            DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
10201b76ca405029249b41b38424a253a8c5fa72dab1Roshan Pius            while (keyIt.hasNext()) {
10211b76ca405029249b41b38424a253a8c5fa72dab1Roshan Pius                const String8 key = keyIt.next();
1022985df17909a5703a86f3e665abc9dd964d9623d9Mitchell Wills                reply->writeString8(key);
1023985df17909a5703a86f3e665abc9dd964d9623d9Mitchell Wills                const String8 value = drmInfo->get(key);
1024297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                reply->writeString8((value == String8("")) ? String8("NULL") : value);
102594bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Wills            }
1026297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            delete [] drmBuffer.data;
1027297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        }
1028297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        delete drmInfoRequest; drmInfoRequest = NULL;
1029297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        delete drmInfo; drmInfo = NULL;
1030297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        return DRM_NO_ERROR;
1031297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    }
1032297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
1033e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    case SAVE_RIGHTS:
1034e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    {
1035e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        ALOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS");
103683a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande        CHECK_INTERFACE(IDrmManagerService, data, reply);
103783a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande
103814aadf3997f007f53f12e8bec3efaea1a66b44bdNavtej Singh Mann        const int uniqueId = data.readInt32();
1039daac2ad767f6047409987bb22812ab5f295e54dfVinit Deshpande
1040e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        //Filling DRM Rights
1041e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const int bufferSize = data.readInt32();
1042e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1043716921f71ceeda2dc00bdd997f54fe7010b3ed0axinhe
1044e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const String8 mimeType(data.readString8());
1045e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const String8 accountId(data.readString8());
1046f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde        const String8 subscriptionId(data.readString8());
1047716921f71ceeda2dc00bdd997f54fe7010b3ed0axinhe        const String8 rightsPath(data.readString8());
1048f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde        const String8 contentPath(data.readString8());
1049f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde
1050e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        DrmRights drmRights(drmBuffer,
1051e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde                            ((mimeType == String8("NULL")) ? String8("") : mimeType),
1052e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde                            ((accountId == String8("NULL")) ? String8("") : accountId),
1053e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde                            ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId));
1054e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1055e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const status_t status = saveRights(uniqueId, drmRights,
1056e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde                            ((rightsPath == String8("NULL")) ? String8("") : rightsPath),
1057e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde                            ((contentPath == String8("NULL")) ? String8("") : contentPath));
1058e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1059e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        reply->writeInt32(status);
1060e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        return DRM_NO_ERROR;
1061e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
1062716921f71ceeda2dc00bdd997f54fe7010b3ed0axinhe
1063e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    case GET_ORIGINAL_MIMETYPE:
1064e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    {
1065e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        ALOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE");
10661fa40005d82db21b2cc1c7e06d249b09c674ab8bRoshan Pius        CHECK_INTERFACE(IDrmManagerService, data, reply);
106780640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
106880640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        const int uniqueId = data.readInt32();
10691e806a7aac77f6f65ba299329e1fc452e0148b8dMitchell Wills        const String8 path = data.readString8();
10701fa40005d82db21b2cc1c7e06d249b09c674ab8bRoshan Pius        const String8 originalMimeType = getOriginalMimeType(uniqueId, path);
10711fa40005d82db21b2cc1c7e06d249b09c674ab8bRoshan Pius
10721fa40005d82db21b2cc1c7e06d249b09c674ab8bRoshan Pius        reply->writeString8(originalMimeType);
1073e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        return DRM_NO_ERROR;
1074e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
1075e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1076e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    case GET_DRM_OBJECT_TYPE:
1077297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    {
1078297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        ALOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE");
1079e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        CHECK_INTERFACE(IDrmManagerService, data, reply);
1080297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
10810ea5062316013cd4173faf16c2a0f3ecd1b9ed43Mitchell Wills        const int uniqueId = data.readInt32();
1082c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        const String8 path = data.readString8();
10830ea5062316013cd4173faf16c2a0f3ecd1b9ed43Mitchell Wills        const String8 mimeType = data.readString8();
1084720aba804a5c7fa5e4cc92af60b129e3e0013666Mitchell Wills        const int drmObjectType = getDrmObjectType(uniqueId, path, mimeType);
1085720aba804a5c7fa5e4cc92af60b129e3e0013666Mitchell Wills
1086720aba804a5c7fa5e4cc92af60b129e3e0013666Mitchell Wills        reply->writeInt32(drmObjectType);
1087720aba804a5c7fa5e4cc92af60b129e3e0013666Mitchell Wills        return DRM_NO_ERROR;
1088720aba804a5c7fa5e4cc92af60b129e3e0013666Mitchell Wills    }
10890ea5062316013cd4173faf16c2a0f3ecd1b9ed43Mitchell Wills
10900ea5062316013cd4173faf16c2a0f3ecd1b9ed43Mitchell Wills    case CHECK_RIGHTS_STATUS:
10910ea5062316013cd4173faf16c2a0f3ecd1b9ed43Mitchell Wills    {
10920ea5062316013cd4173faf16c2a0f3ecd1b9ed43Mitchell Wills        ALOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS");
10930ea5062316013cd4173faf16c2a0f3ecd1b9ed43Mitchell Wills        CHECK_INTERFACE(IDrmManagerService, data, reply);
109483a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande
109512836d34cc6c4497c1fa5adbb956684ecec7578eVinit Deshpande        const int uniqueId = data.readInt32();
109612836d34cc6c4497c1fa5adbb956684ecec7578eVinit Deshpande        const String8 path = data.readString8();
109712836d34cc6c4497c1fa5adbb956684ecec7578eVinit Deshpande        const int action = data.readInt32();
1098e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const int result = checkRightsStatus(uniqueId, path, action);
10990ea5062316013cd4173faf16c2a0f3ecd1b9ed43Mitchell Wills
1100e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        reply->writeInt32(result);
11018adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        return DRM_NO_ERROR;
1102e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
110314aadf3997f007f53f12e8bec3efaea1a66b44bdNavtej Singh Mann
1104297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills    case CONSUME_RIGHTS:
110514aadf3997f007f53f12e8bec3efaea1a66b44bdNavtej Singh Mann    {
110614aadf3997f007f53f12e8bec3efaea1a66b44bdNavtej Singh Mann        ALOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS");
1107297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        CHECK_INTERFACE(IDrmManagerService, data, reply);
1108297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
1109e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const int uniqueId = data.readInt32();
1110297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
1111c9e6069eb941d282af213dc20b171877db6b567bMitchell Wills        DecryptHandle handle;
1112f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde        readDecryptHandleFromParcelData(&handle, data);
1113297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills
1114297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        const int action = data.readInt32();
1115297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        const bool reserve = static_cast<bool>(data.readInt32());
111683a674a18c84ff4f01377bbfd8988699dec93bc2Vinit Deshpande        const status_t status
111763539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills            = consumeRights(uniqueId, &handle, action, reserve);
11188adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        reply->writeInt32(status);
111980640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
112080640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        clearDecryptHandle(&handle);
112163539f1283899fbbf83ab90757961b4be51d5034Mitchell Wills        return DRM_NO_ERROR;
1122e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
1123e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1124e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    case SET_PLAYBACK_STATUS:
1125e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    {
1126e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        ALOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS");
1127e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        CHECK_INTERFACE(IDrmManagerService, data, reply);
1128e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1129e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const int uniqueId = data.readInt32();
1130b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande
1131b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande        DecryptHandle handle;
1132b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande        readDecryptHandleFromParcelData(&handle, data);
1133716921f71ceeda2dc00bdd997f54fe7010b3ed0axinhe
1134b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande        const int playbackStatus = data.readInt32();
1135b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande        const int64_t position = data.readInt64();
1136b7cc309f06da8a18224057c21ba086f8550367d6Vinit Deshpande        const status_t status
1137b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande            = setPlaybackStatus(uniqueId, &handle, playbackStatus, position);
1138b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande        reply->writeInt32(status);
1139b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande
1140b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande        clearDecryptHandle(&handle);
1141b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande        return DRM_NO_ERROR;
1142b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    }
1143b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande
1144b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    case VALIDATE_ACTION:
1145b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande    {
1146b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande        ALOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION");
1147b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande        CHECK_INTERFACE(IDrmManagerService, data, reply);
1148b0b1d59786de7ff1fc98e31a16a7d710458bf549Vinit Deshpande
11491fa40005d82db21b2cc1c7e06d249b09c674ab8bRoshan Pius        const int uniqueId = data.readInt32();
115080640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        const String8 path = data.readString8();
11510ea5062316013cd4173faf16c2a0f3ecd1b9ed43Mitchell Wills        const int action = data.readInt32();
115280640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        const int outputType = data.readInt32();
115380640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        const int configuration = data.readInt32();
115480640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        bool result = validateAction(uniqueId, path, action,
115580640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius                ActionDescription(outputType, configuration));
115680640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
115780640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        reply->writeInt32(result);
115880640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        return DRM_NO_ERROR;
115980640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius    }
116080640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
116180640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius    case REMOVE_RIGHTS:
116280640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius    {
116380640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        ALOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS");
116480640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        CHECK_INTERFACE(IDrmManagerService, data, reply);
116580640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
116680640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        int uniqueId = data.readInt32();
116780640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        String8 path = data.readString8();
116880640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        const status_t status = removeRights(uniqueId, path);
116980640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        reply->writeInt32(status);
117080640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
117180640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        return DRM_NO_ERROR;
117280640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius    }
117380640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
117480640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius    case REMOVE_ALL_RIGHTS:
117580640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius    {
117680640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        ALOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS");
117780640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        CHECK_INTERFACE(IDrmManagerService, data, reply);
117880640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
117980640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        const status_t status = removeAllRights(data.readInt32());
118080640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        reply->writeInt32(status);
118180640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
118280640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        return DRM_NO_ERROR;
118380640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius    }
118480640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
118580640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius    case OPEN_CONVERT_SESSION:
118680640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius    {
118780640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        ALOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION");
118880640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        CHECK_INTERFACE(IDrmManagerService, data, reply);
118980640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
119080640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        const int uniqueId = data.readInt32();
119180640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        const String8 mimeType = data.readString8();
119280640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        const int convertId = openConvertSession(uniqueId, mimeType);
119380640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
119480640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        reply->writeInt32(convertId);
119580640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        return DRM_NO_ERROR;
119680640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius    }
119780640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
119880640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius    case CONVERT_DATA:
119980640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius    {
120080640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        ALOGV("BnDrmManagerService::onTransact :CONVERT_DATA");
120144f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills        CHECK_INTERFACE(IDrmManagerService, data, reply);
1202f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius
120380640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        const int uniqueId = data.readInt32();
120480640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        const int convertId = data.readInt32();
120580640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
120680640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        //Filling input data
1207f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius        const int bufferSize = data.readInt32();
120880640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
120980640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
121080640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        DrmConvertedStatus*    drmConvertedStatus = convertData(uniqueId, convertId, inputData);
121180640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
121280640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        if (NULL != drmConvertedStatus) {
121319a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius            //Filling Drm Converted Ststus
12143040b86393a04bc939a5a94cda4169b0293dfac7Mitchell Wills            reply->writeInt32(drmConvertedStatus->statusCode);
12153040b86393a04bc939a5a94cda4169b0293dfac7Mitchell Wills            reply->writeInt64(drmConvertedStatus->offset);
12163040b86393a04bc939a5a94cda4169b0293dfac7Mitchell Wills
12173040b86393a04bc939a5a94cda4169b0293dfac7Mitchell Wills            if (NULL != drmConvertedStatus->convertedData) {
121819a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius                const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
1219f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius                const int bufferSize = convertedData->length;
122019a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius                reply->writeInt32(bufferSize);
1221985df17909a5703a86f3e665abc9dd964d9623d9Mitchell Wills                if (0 < bufferSize) {
1222985df17909a5703a86f3e665abc9dd964d9623d9Mitchell Wills                    reply->write(convertedData->data, bufferSize);
122319a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius                }
122419a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius                delete [] convertedData->data;
122519a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius                delete convertedData; convertedData = NULL;
122619a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius            }
122719a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius        }
122819a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius        delete inputData; inputData = NULL;
122919a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius        delete drmConvertedStatus; drmConvertedStatus = NULL;
123019a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius        return DRM_NO_ERROR;
123119a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius    }
123219a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius
123319a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius    case CLOSE_CONVERT_SESSION:
123419a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius    {
123519a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius        ALOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION");
12369e7f5e0a47a9a4aa519a50d9a0959547c1c604f1Mitchell Wills        CHECK_INTERFACE(IDrmManagerService, data, reply);
123719a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius
123819a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius        const int uniqueId = data.readInt32();
123919a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius        const int convertId = data.readInt32();
124019a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius        DrmConvertedStatus* drmConvertedStatus
124119a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius            = closeConvertSession(uniqueId, convertId);
12429e7f5e0a47a9a4aa519a50d9a0959547c1c604f1Mitchell Wills
1243297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills        if (NULL != drmConvertedStatus) {
124454e2c84547e22622ba4a08bddd1c632d1d937be3Mitchell Wills            //Filling Drm Converted Ststus
1245297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            reply->writeInt32(drmConvertedStatus->statusCode);
124619a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius            reply->writeInt64(drmConvertedStatus->offset);
124719a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius
124819a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius            if (NULL != drmConvertedStatus->convertedData) {
124919a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius                const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
125019a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius                const int bufferSize = convertedData->length;
125119a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius                reply->writeInt32(bufferSize);
125219a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius                if (0 < bufferSize) {
125319a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius                    reply->write(convertedData->data, bufferSize);
125419a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius                }
125519a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius                delete [] convertedData->data;
125619a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius                delete convertedData; convertedData = NULL;
125719a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius            }
125819a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius        }
125919a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius        delete drmConvertedStatus; drmConvertedStatus = NULL;
126019a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius        return DRM_NO_ERROR;
126119a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius    }
126219a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius
126319a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius    case GET_ALL_SUPPORT_INFO:
126419a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius    {
126519a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius        ALOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO");
126619a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius        CHECK_INTERFACE(IDrmManagerService, data, reply);
126719a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius
126819a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius        const int uniqueId = data.readInt32();
126919a7b07a44c1ce4cf2500d277ef31e3344868142Roshan Pius        int length = 0;
127080640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        DrmSupportInfo* drmSupportInfoArray = NULL;
127180640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
1272f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius        status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray);
127344f8fc30974fa61a5a64be81874f6002ca0368f3Mitchell Wills
127480640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        reply->writeInt32(length);
127580640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        for (int i = 0; i < length; ++i) {
127680640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius            DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i];
127780640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
1278c9e6069eb941d282af213dc20b171877db6b567bMitchell Wills            reply->writeInt32(drmSupportInfo.getFileSuffixCount());
1279f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius            DrmSupportInfo::FileSuffixIterator fileSuffixIt
1280f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius                = drmSupportInfo.getFileSuffixIterator();
1281f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius            while (fileSuffixIt.hasNext()) {
1282f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius                reply->writeString8(fileSuffixIt.next());
1283985df17909a5703a86f3e665abc9dd964d9623d9Mitchell Wills            }
1284c9e6069eb941d282af213dc20b171877db6b567bMitchell Wills
1285297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            reply->writeInt32(drmSupportInfo.getMimeTypeCount());
1286297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator();
1287297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            while (mimeTypeIt.hasNext()) {
1288297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills                reply->writeString8(mimeTypeIt.next());
1289297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            }
1290297c3acabe7a85eb87240fe3ccf772e57ce6aef7Mitchell Wills            reply->writeString8(drmSupportInfo.getDescription());
1291f1daf9342b66bf134d13fa0a42e929a008f1ca62Vinit Deshapnde        }
1292a91494208927643d011b4fa62db2064d9e8228c1Roshan Pius        delete [] drmSupportInfoArray; drmSupportInfoArray = NULL;
129380640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        reply->writeInt32(status);
129480640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        return DRM_NO_ERROR;
129580640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius    }
129680640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
129780640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius    case OPEN_DECRYPT_SESSION:
1298909a6e58d5cb6222f329ac8b3f2083db2345eed7songjinshi    {
1299909a6e58d5cb6222f329ac8b3f2083db2345eed7songjinshi        ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION");
1300909a6e58d5cb6222f329ac8b3f2083db2345eed7songjinshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
1301909a6e58d5cb6222f329ac8b3f2083db2345eed7songjinshi
1302c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        const int uniqueId = data.readInt32();
1303c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        const int fd = data.readFileDescriptor();
1304c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
1305c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        const off64_t offset = data.readInt64();
1306c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        const off64_t length = data.readInt64();
1307c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        const String8 mime = data.readString8();
1308c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne
1309c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne        DecryptHandle* handle
1310c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne            = openDecryptSession(uniqueId, fd, offset, length, mime.string());
1311f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius
1312f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius        if (NULL != handle) {
1313f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius            writeDecryptHandleToParcelData(handle, reply);
1314f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius            clearDecryptHandle(handle);
131580640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius            delete handle; handle = NULL;
1316985df17909a5703a86f3e665abc9dd964d9623d9Mitchell Wills        }
131780640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        return DRM_NO_ERROR;
131859298c7cfffdf856e32879ec967fe27c7e977a49Mitchell Wills    }
131959298c7cfffdf856e32879ec967fe27c7e977a49Mitchell Wills
1320c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius    case OPEN_DECRYPT_SESSION_FROM_URI:
1321c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius    {
1322c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI");
132380640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        CHECK_INTERFACE(IDrmManagerService, data, reply);
132480640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius
132580640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        const int uniqueId = data.readInt32();
132680640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        const String8 uri = data.readString8();
132780640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius        const String8 mime = data.readString8();
1328f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius
1329f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius        DecryptHandle* handle = openDecryptSession(uniqueId, uri.string(), mime.string());
1330f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius
1331a91494208927643d011b4fa62db2064d9e8228c1Roshan Pius        if (NULL != handle) {
13321fa40005d82db21b2cc1c7e06d249b09c674ab8bRoshan Pius            writeDecryptHandleToParcelData(handle, reply);
13331fa40005d82db21b2cc1c7e06d249b09c674ab8bRoshan Pius
133480640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius            clearDecryptHandle(handle);
133580640ff4d13e252f0a5637ec16ca2d626070e751Roshan Pius            delete handle; handle = NULL;
1336e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        } else {
1337e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde            ALOGV("NULL decryptHandle is returned");
1338c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        }
1339c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        return DRM_NO_ERROR;
1340c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius    }
1341c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
1342c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius    case OPEN_DECRYPT_SESSION_FOR_STREAMING:
1343c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius    {
1344c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FOR_STREAMING");
1345c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        CHECK_INTERFACE(IDrmManagerService, data, reply);
1346c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
1347c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        const int uniqueId = data.readInt32();
1348c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        const int bufferSize = data.readInt32();
1349c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        DrmBuffer buf((bufferSize > 0) ? (char *)data.readInplace(bufferSize) : NULL,
1350c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius                bufferSize);
135105d51a2d8eb67ea2eaf4cae43280d1cf9fe92645Ningyuan Wang        const String8 mimeType(data.readString8());
1352c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
1353c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        DecryptHandle* handle = openDecryptSession(uniqueId, buf, mimeType);
1354c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
1355c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        if (handle != NULL) {
1356c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius            writeDecryptHandleToParcelData(handle, reply);
1357c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius            clearDecryptHandle(handle);
135805d51a2d8eb67ea2eaf4cae43280d1cf9fe92645Ningyuan Wang            delete handle;
1359c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius            handle = NULL;
1360c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        } else {
1361c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius            ALOGV("NULL decryptHandle is returned");
1362c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        }
1363c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        return DRM_NO_ERROR;
1364c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius    }
1365c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
1366c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius    case CLOSE_DECRYPT_SESSION:
1367e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    {
1368e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        ALOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION");
1369e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        CHECK_INTERFACE(IDrmManagerService, data, reply);
1370c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
1371c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        const int uniqueId = data.readInt32();
1372c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
1373c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        DecryptHandle* handle = new DecryptHandle();
1374c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        readDecryptHandleFromParcelData(handle, data);
1375f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius
1376f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius        const status_t status = closeDecryptSession(uniqueId, handle);
1377c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        reply->writeInt32(status);
1378c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        return DRM_NO_ERROR;
1379799f1c026941c9183657ffb99f0fb34ff643a0ddRoshan Pius    }
1380c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
1381e29b548574b1dac325038659834d0a8fd28da01fNingyuan Wang    case INITIALIZE_DECRYPT_UNIT:
1382e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    {
1383e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        ALOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT");
13848adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills        CHECK_INTERFACE(IDrmManagerService, data, reply);
1385e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1386e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const int uniqueId = data.readInt32();
1387c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
1388c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        DecryptHandle handle;
1389c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        readDecryptHandleFromParcelData(&handle, data);
13908adb4e72f58e3e25918f33e0b2687e6acc14c47dMitchell Wills
1391e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const int decryptUnitId = data.readInt32();
1392e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1393e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        //Filling Header info
1394e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const int bufferSize = data.readInt32();
1395c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        DrmBuffer* headerInfo = NULL;
1396f8f5cb07ca2ead74f7f8bb03621fe0157aeba373Roshan Pius        headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1397c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
1398d4762401ec14be6bdd2d27aff2478ddbf8d6ce2aVinit Deshpande        const status_t status
1399d4762401ec14be6bdd2d27aff2478ddbf8d6ce2aVinit Deshpande            = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo);
1400578f7a33d0085559485bccfe7d1e26f813dc081dMitchell Wills        reply->writeInt32(status);
14019153bd67d51b305ffdd61355e0748e3c332c2cafRoshan Pius
14029153bd67d51b305ffdd61355e0748e3c332c2cafRoshan Pius        clearDecryptHandle(&handle);
14039153bd67d51b305ffdd61355e0748e3c332c2cafRoshan Pius        delete headerInfo; headerInfo = NULL;
14049153bd67d51b305ffdd61355e0748e3c332c2cafRoshan Pius        return DRM_NO_ERROR;
14059153bd67d51b305ffdd61355e0748e3c332c2cafRoshan Pius    }
1406063cfc7e3eef78fcbda24a66f0c473828b39c854Roshan Pius
1407063cfc7e3eef78fcbda24a66f0c473828b39c854Roshan Pius    case DECRYPT:
1408063cfc7e3eef78fcbda24a66f0c473828b39c854Roshan Pius    {
1409063cfc7e3eef78fcbda24a66f0c473828b39c854Roshan Pius        ALOGV("BnDrmManagerService::onTransact :DECRYPT");
1410063cfc7e3eef78fcbda24a66f0c473828b39c854Roshan Pius        CHECK_INTERFACE(IDrmManagerService, data, reply);
1411063cfc7e3eef78fcbda24a66f0c473828b39c854Roshan Pius
1412e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const int uniqueId = data.readInt32();
1413e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1414e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        DecryptHandle handle;
1415716921f71ceeda2dc00bdd997f54fe7010b3ed0axinhe        readDecryptHandleFromParcelData(&handle, data);
1416e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1417a91494208927643d011b4fa62db2064d9e8228c1Roshan Pius        const int decryptUnitId = data.readInt32();
1418e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const int decBufferSize = data.readInt32();
1419e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1420e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const int encBufferSize = data.readInt32();
1421e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        DrmBuffer* encBuffer
1422c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius            = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize);
1423c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
1424c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        char* buffer = NULL;
1425c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        buffer = new char[decBufferSize];
1426c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize);
1427c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
1428c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        DrmBuffer* IV = NULL;
1429c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        if (0 != data.dataAvail()) {
1430c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius            const int ivBufferlength = data.readInt32();
1431c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius            IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength);
1432c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        }
1433c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
1434c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        const status_t status
1435c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius            = decrypt(uniqueId, &handle, decryptUnitId, encBuffer, &decBuffer, IV);
1436063cfc7e3eef78fcbda24a66f0c473828b39c854Roshan Pius
1437e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        reply->writeInt32(status);
1438e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1439e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const int size = decBuffer->length;
1440e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        reply->writeInt32(size);
1441e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        reply->write(decBuffer->data, size);
1442e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1443e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        clearDecryptHandle(&handle);
1444e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        delete encBuffer; encBuffer = NULL;
1445e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        delete decBuffer; decBuffer = NULL;
1446e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        delete [] buffer; buffer = NULL;
1447716921f71ceeda2dc00bdd997f54fe7010b3ed0axinhe        delete IV; IV = NULL;
1448e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        return DRM_NO_ERROR;
1449e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde    }
1450e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
14511fa40005d82db21b2cc1c7e06d249b09c674ab8bRoshan Pius    case FINALIZE_DECRYPT_UNIT:
14521fa40005d82db21b2cc1c7e06d249b09c674ab8bRoshan Pius    {
14531fa40005d82db21b2cc1c7e06d249b09c674ab8bRoshan Pius        ALOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT");
1454e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        CHECK_INTERFACE(IDrmManagerService, data, reply);
1455e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1456e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const int uniqueId = data.readInt32();
1457e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1458e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        DecryptHandle handle;
1459c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        readDecryptHandleFromParcelData(&handle, data);
1460c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
1461c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32());
1462720aba804a5c7fa5e4cc92af60b129e3e0013666Mitchell Wills        reply->writeInt32(status);
1463720aba804a5c7fa5e4cc92af60b129e3e0013666Mitchell Wills
1464720aba804a5c7fa5e4cc92af60b129e3e0013666Mitchell Wills        clearDecryptHandle(&handle);
1465720aba804a5c7fa5e4cc92af60b129e3e0013666Mitchell Wills        return DRM_NO_ERROR;
1466720aba804a5c7fa5e4cc92af60b129e3e0013666Mitchell Wills    }
1467c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
1468c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius    case PREAD:
1469c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius    {
1470c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        ALOGV("BnDrmManagerService::onTransact :READ");
1471c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        CHECK_INTERFACE(IDrmManagerService, data, reply);
1472c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
1473c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        const int uniqueId = data.readInt32();
1474c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
1475c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        DecryptHandle handle;
1476c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        readDecryptHandleFromParcelData(&handle, data);
1477c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
1478c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        const int numBytes = data.readInt32();
1479063cfc7e3eef78fcbda24a66f0c473828b39c854Roshan Pius        char* buffer = new char[numBytes];
1480e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1481e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde        const off64_t offset = data.readInt64();
1482e4e3750390bec0a849a9153348b7c21b2cc8b843Vinit Deshapnde
1483c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        ssize_t result = pread(uniqueId, &handle, buffer, numBytes, offset);
1484c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        reply->writeInt32(result);
1485c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        if (0 < result) {
1486c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius            reply->write(buffer, result);
1487c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        }
1488c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
1489c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        clearDecryptHandle(&handle);
1490c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        delete [] buffer, buffer = NULL;
1491c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius        return DRM_NO_ERROR;
1492c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius    }
1493c343aec32e1d3fe320eb97c527b0bcfb2d334e45Roshan Pius
14940e4f6ab00e1f2bd64f17302dae279c77c4cf7d8eRoshan Pius    default:
14950e4f6ab00e1f2bd64f17302dae279c77c4cf7d8eRoshan Pius        return BBinder::onTransact(code, data, reply, flags);
14960e4f6ab00e1f2bd64f17302dae279c77c4cf7d8eRoshan Pius    }
14970e4f6ab00e1f2bd64f17302dae279c77c4cf7d8eRoshan Pius}
14980e4f6ab00e1f2bd64f17302dae279c77c4cf7d8eRoshan Pius
14990e4f6ab00e1f2bd64f17302dae279c77c4cf7d8eRoshan Pius