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