blob: ccff2573b6fea17fb929e575cba7df1ab85d94a7 [file] [log] [blame]
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Takeshi Aimi2272ee22010-09-20 23:40:41 +090017//#define LOG_NDEBUG 0
aimitakeshi27ed8ad2010-07-29 10:12:27 +090018#define LOG_TAG "IDrmManagerService(Native)"
19#include <utils/Log.h>
20
21#include <stdint.h>
22#include <sys/types.h>
23#include <binder/IPCThreadState.h>
24
25#include <drm/DrmInfo.h>
26#include <drm/DrmConstraints.h>
Takeshi Aimi34738462010-11-16 13:56:11 +090027#include <drm/DrmMetadata.h>
aimitakeshi27ed8ad2010-07-29 10:12:27 +090028#include <drm/DrmRights.h>
29#include <drm/DrmInfoStatus.h>
30#include <drm/DrmConvertedStatus.h>
31#include <drm/DrmInfoRequest.h>
32#include <drm/DrmSupportInfo.h>
33
34#include "IDrmManagerService.h"
35
36#define INVALID_BUFFER_LENGTH -1
37
38using namespace android;
39
Gloria Wangc10ce332011-06-15 10:27:52 -070040static void writeDecryptHandleToParcelData(
Gloria Wang1da9aa62011-03-20 10:25:16 -070041 const DecryptHandle* handle, Parcel* data) {
42 data->writeInt32(handle->decryptId);
43 data->writeString8(handle->mimeType);
44 data->writeInt32(handle->decryptApiType);
45 data->writeInt32(handle->status);
46
47 int size = handle->copyControlVector.size();
48 data->writeInt32(size);
Gloria Wangc10ce332011-06-15 10:27:52 -070049 for (int i = 0; i < size; i++) {
Gloria Wang1da9aa62011-03-20 10:25:16 -070050 data->writeInt32(handle->copyControlVector.keyAt(i));
51 data->writeInt32(handle->copyControlVector.valueAt(i));
52 }
53
Gloria Wang6b2a35b2011-03-21 17:22:13 -070054 size = handle->extendedData.size();
55 data->writeInt32(size);
Gloria Wangc10ce332011-06-15 10:27:52 -070056 for (int i = 0; i < size; i++) {
Gloria Wang6b2a35b2011-03-21 17:22:13 -070057 data->writeString8(handle->extendedData.keyAt(i));
58 data->writeString8(handle->extendedData.valueAt(i));
59 }
60
Gloria Wang1da9aa62011-03-20 10:25:16 -070061 if (NULL != handle->decryptInfo) {
62 data->writeInt32(handle->decryptInfo->decryptBufferLength);
63 } else {
64 data->writeInt32(INVALID_BUFFER_LENGTH);
65 }
66}
67
68static void readDecryptHandleFromParcelData(
69 DecryptHandle* handle, const Parcel& data) {
70 if (0 == data.dataAvail()) {
71 return;
72 }
73
74 handle->decryptId = data.readInt32();
75 handle->mimeType = data.readString8();
76 handle->decryptApiType = data.readInt32();
77 handle->status = data.readInt32();
78
79 int size = data.readInt32();
Gloria Wangc10ce332011-06-15 10:27:52 -070080 for (int i = 0; i < size; i++) {
Gloria Wang6b2a35b2011-03-21 17:22:13 -070081 DrmCopyControl key = (DrmCopyControl)data.readInt32();
82 int value = data.readInt32();
83 handle->copyControlVector.add(key, value);
84 }
85
86 size = data.readInt32();
Gloria Wangc10ce332011-06-15 10:27:52 -070087 for (int i = 0; i < size; i++) {
Gloria Wang6b2a35b2011-03-21 17:22:13 -070088 String8 key = data.readString8();
89 String8 value = data.readString8();
90 handle->extendedData.add(key, value);
Gloria Wang1da9aa62011-03-20 10:25:16 -070091 }
92
93 handle->decryptInfo = NULL;
94 const int bufferLen = data.readInt32();
95 if (INVALID_BUFFER_LENGTH != bufferLen) {
96 handle->decryptInfo = new DecryptInfo();
97 handle->decryptInfo->decryptBufferLength = bufferLen;
98 }
99}
100
101static void clearDecryptHandle(DecryptHandle* handle) {
102 if (handle == NULL) {
103 return;
104 }
105 if (handle->decryptInfo) {
106 delete handle->decryptInfo;
107 handle->decryptInfo = NULL;
108 }
109 handle->copyControlVector.clear();
Gloria Wangab00df42011-06-22 14:55:16 -0700110 handle->extendedData.clear();
Gloria Wang1da9aa62011-03-20 10:25:16 -0700111}
112
Gloria Wang8f001512011-07-21 15:10:22 -0700113int BpDrmManagerService::addUniqueId(bool isNative) {
Steve Block3856b092011-10-20 11:56:00 +0100114 ALOGV("add uniqueid");
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900115 Parcel data, reply;
116 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
Gloria Wang8f001512011-07-21 15:10:22 -0700117 data.writeInt32(isNative);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900118 remote()->transact(ADD_UNIQUEID, data, &reply);
119 return reply.readInt32();
120}
121
122void BpDrmManagerService::removeUniqueId(int uniqueId) {
Steve Block3856b092011-10-20 11:56:00 +0100123 ALOGV("remove uniqueid");
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900124 Parcel data, reply;
125 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
126 data.writeInt32(uniqueId);
127 remote()->transact(REMOVE_UNIQUEID, data, &reply);
128}
129
Takeshi Aimie943f842010-10-08 23:05:49 +0900130void BpDrmManagerService::addClient(int uniqueId) {
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900131 Parcel data, reply;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900132 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
133 data.writeInt32(uniqueId);
Takeshi Aimie943f842010-10-08 23:05:49 +0900134 remote()->transact(ADD_CLIENT, data, &reply);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900135}
136
Takeshi Aimie943f842010-10-08 23:05:49 +0900137void BpDrmManagerService::removeClient(int uniqueId) {
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900138 Parcel data, reply;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900139 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
140 data.writeInt32(uniqueId);
Takeshi Aimie943f842010-10-08 23:05:49 +0900141 remote()->transact(REMOVE_CLIENT, data, &reply);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900142}
143
144status_t BpDrmManagerService::setDrmServiceListener(
145 int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) {
Steve Block3856b092011-10-20 11:56:00 +0100146 ALOGV("setDrmServiceListener");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900147 Parcel data, reply;
148
149 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
150 data.writeInt32(uniqueId);
151 data.writeStrongBinder(drmServiceListener->asBinder());
152 remote()->transact(SET_DRM_SERVICE_LISTENER, data, &reply);
153 return reply.readInt32();
154}
155
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900156status_t BpDrmManagerService::installDrmEngine(int uniqueId, const String8& drmEngineFile) {
Steve Block3856b092011-10-20 11:56:00 +0100157 ALOGV("Install DRM Engine");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900158 Parcel data, reply;
159
160 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
161 data.writeInt32(uniqueId);
162 data.writeString8(drmEngineFile);
163
164 remote()->transact(INSTALL_DRM_ENGINE, data, &reply);
165 return reply.readInt32();
166}
167
168DrmConstraints* BpDrmManagerService::getConstraints(
169 int uniqueId, const String8* path, const int action) {
Steve Block3856b092011-10-20 11:56:00 +0100170 ALOGV("Get Constraints");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900171 Parcel data, reply;
172
173 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
174 data.writeInt32(uniqueId);
175 data.writeString8(*path);
176 data.writeInt32(action);
177
178 remote()->transact(GET_CONSTRAINTS_FROM_CONTENT, data, &reply);
179
180 DrmConstraints* drmConstraints = NULL;
181 if (0 != reply.dataAvail()) {
182 //Filling Drm Constraints
183 drmConstraints = new DrmConstraints();
184
185 const int size = reply.readInt32();
186 for (int index = 0; index < size; ++index) {
187 const String8 key(reply.readString8());
188 const int bufferSize = reply.readInt32();
189 char* data = NULL;
190 if (0 < bufferSize) {
191 data = new char[bufferSize];
192 reply.read(data, bufferSize);
193 }
194 drmConstraints->put(&key, data);
195 }
196 }
197 return drmConstraints;
198}
199
Takeshi Aimi34738462010-11-16 13:56:11 +0900200DrmMetadata* BpDrmManagerService::getMetadata(int uniqueId, const String8* path) {
Steve Block3856b092011-10-20 11:56:00 +0100201 ALOGV("Get Metadata");
Takeshi Aimi34738462010-11-16 13:56:11 +0900202 Parcel data, reply;
203 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
204 data.writeInt32(uniqueId);
205
206 DrmMetadata* drmMetadata = NULL;
207 data.writeString8(*path);
208 remote()->transact(GET_METADATA_FROM_CONTENT, data, &reply);
209
210 if (0 != reply.dataAvail()) {
211 //Filling Drm Metadata
212 drmMetadata = new DrmMetadata();
213
214 const int size = reply.readInt32();
215 for (int index = 0; index < size; ++index) {
216 const String8 key(reply.readString8());
217 const int bufferSize = reply.readInt32();
218 char* data = NULL;
219 if (0 < bufferSize) {
220 data = new char[bufferSize];
221 reply.read(data, bufferSize);
222 }
223 drmMetadata->put(&key, data);
224 }
225 }
226 return drmMetadata;
227}
228
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900229bool BpDrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) {
Steve Block3856b092011-10-20 11:56:00 +0100230 ALOGV("Can Handle");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900231 Parcel data, reply;
232
233 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
234 data.writeInt32(uniqueId);
235
236 data.writeString8(path);
237 data.writeString8(mimeType);
238
239 remote()->transact(CAN_HANDLE, data, &reply);
240
241 return static_cast<bool>(reply.readInt32());
242}
243
244DrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) {
Steve Block3856b092011-10-20 11:56:00 +0100245 ALOGV("Process DRM Info");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900246 Parcel data, reply;
247
248 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
249 data.writeInt32(uniqueId);
250
251 //Filling DRM info
252 data.writeInt32(drmInfo->getInfoType());
253 const DrmBuffer dataBuffer = drmInfo->getData();
254 const int dataBufferSize = dataBuffer.length;
255 data.writeInt32(dataBufferSize);
256 if (0 < dataBufferSize) {
257 data.write(dataBuffer.data, dataBufferSize);
258 }
259 data.writeString8(drmInfo->getMimeType());
260
261 data.writeInt32(drmInfo->getCount());
262 DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
263
264 while (keyIt.hasNext()) {
265 const String8 key = keyIt.next();
266 data.writeString8(key);
267 const String8 value = drmInfo->get(key);
268 data.writeString8((value == String8("")) ? String8("NULL") : value);
269 }
270
271 remote()->transact(PROCESS_DRM_INFO, data, &reply);
272
273 DrmInfoStatus* drmInfoStatus = NULL;
274 if (0 != reply.dataAvail()) {
275 //Filling DRM Info Status
276 const int statusCode = reply.readInt32();
Takeshi Aimie943f842010-10-08 23:05:49 +0900277 const int infoType = reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900278 const String8 mimeType = reply.readString8();
279
280 DrmBuffer* drmBuffer = NULL;
281 if (0 != reply.dataAvail()) {
282 const int bufferSize = reply.readInt32();
283 char* data = NULL;
284 if (0 < bufferSize) {
285 data = new char[bufferSize];
286 reply.read(data, bufferSize);
287 }
288 drmBuffer = new DrmBuffer(data, bufferSize);
289 }
Takeshi Aimie943f842010-10-08 23:05:49 +0900290 drmInfoStatus = new DrmInfoStatus(statusCode, infoType, drmBuffer, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900291 }
292 return drmInfoStatus;
293}
294
295DrmInfo* BpDrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) {
Steve Block3856b092011-10-20 11:56:00 +0100296 ALOGV("Acquire DRM Info");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900297 Parcel data, reply;
298
299 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
300 data.writeInt32(uniqueId);
301
302 //Filling DRM Info Request
303 data.writeInt32(drmInforequest->getInfoType());
304 data.writeString8(drmInforequest->getMimeType());
305
306 data.writeInt32(drmInforequest->getCount());
307 DrmInfoRequest::KeyIterator keyIt = drmInforequest->keyIterator();
308
309 while (keyIt.hasNext()) {
310 const String8 key = keyIt.next();
311 data.writeString8(key);
312 const String8 value = drmInforequest->get(key);
313 data.writeString8((value == String8("")) ? String8("NULL") : value);
314 }
315
316 remote()->transact(ACQUIRE_DRM_INFO, data, &reply);
317
318 DrmInfo* drmInfo = NULL;
319 if (0 != reply.dataAvail()) {
320 //Filling DRM Info
321 const int infoType = reply.readInt32();
322 const int bufferSize = reply.readInt32();
323 char* data = NULL;
324
325 if (0 < bufferSize) {
326 data = new char[bufferSize];
327 reply.read(data, bufferSize);
328 }
329 drmInfo = new DrmInfo(infoType, DrmBuffer(data, bufferSize), reply.readString8());
330
331 const int size = reply.readInt32();
332 for (int index = 0; index < size; ++index) {
333 const String8 key(reply.readString8());
334 const String8 value(reply.readString8());
335 drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
336 }
337 }
338 return drmInfo;
339}
340
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900341status_t BpDrmManagerService::saveRights(
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900342 int uniqueId, const DrmRights& drmRights,
343 const String8& rightsPath, const String8& contentPath) {
Steve Block3856b092011-10-20 11:56:00 +0100344 ALOGV("Save Rights");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900345 Parcel data, reply;
346
347 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
348 data.writeInt32(uniqueId);
349
350 //Filling Drm Rights
351 const DrmBuffer dataBuffer = drmRights.getData();
352 data.writeInt32(dataBuffer.length);
353 data.write(dataBuffer.data, dataBuffer.length);
354
355 const String8 mimeType = drmRights.getMimeType();
356 data.writeString8((mimeType == String8("")) ? String8("NULL") : mimeType);
357
358 const String8 accountId = drmRights.getAccountId();
359 data.writeString8((accountId == String8("")) ? String8("NULL") : accountId);
360
361 const String8 subscriptionId = drmRights.getSubscriptionId();
362 data.writeString8((subscriptionId == String8("")) ? String8("NULL") : subscriptionId);
363
364 data.writeString8((rightsPath == String8("")) ? String8("NULL") : rightsPath);
365 data.writeString8((contentPath == String8("")) ? String8("NULL") : contentPath);
366
367 remote()->transact(SAVE_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900368 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900369}
370
371String8 BpDrmManagerService::getOriginalMimeType(int uniqueId, const String8& path) {
Steve Block3856b092011-10-20 11:56:00 +0100372 ALOGV("Get Original MimeType");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900373 Parcel data, reply;
374
375 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
376 data.writeInt32(uniqueId);
377 data.writeString8(path);
378
379 remote()->transact(GET_ORIGINAL_MIMETYPE, data, &reply);
380 return reply.readString8();
381}
382
383int BpDrmManagerService::getDrmObjectType(
384 int uniqueId, const String8& path, const String8& mimeType) {
Steve Block3856b092011-10-20 11:56:00 +0100385 ALOGV("Get Drm object type");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900386 Parcel data, reply;
387
388 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
389 data.writeInt32(uniqueId);
390 data.writeString8(path);
391 data.writeString8(mimeType);
392
393 remote()->transact(GET_DRM_OBJECT_TYPE, data, &reply);
394
395 return reply.readInt32();
396}
397
398int BpDrmManagerService::checkRightsStatus(int uniqueId, const String8& path, int action) {
Steve Block3856b092011-10-20 11:56:00 +0100399 ALOGV("checkRightsStatus");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900400 Parcel data, reply;
401
402 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
403 data.writeInt32(uniqueId);
404 data.writeString8(path);
405 data.writeInt32(action);
406
407 remote()->transact(CHECK_RIGHTS_STATUS, data, &reply);
408
409 return reply.readInt32();
410}
411
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900412status_t BpDrmManagerService::consumeRights(
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900413 int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) {
Steve Block3856b092011-10-20 11:56:00 +0100414 ALOGV("consumeRights");
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900415 Parcel data, reply;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900416
417 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
418 data.writeInt32(uniqueId);
419
Gloria Wangc10ce332011-06-15 10:27:52 -0700420 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900421
422 data.writeInt32(action);
423 data.writeInt32(static_cast< int>(reserve));
424
425 remote()->transact(CONSUME_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900426 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900427}
428
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900429status_t BpDrmManagerService::setPlaybackStatus(
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800430 int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) {
Steve Block3856b092011-10-20 11:56:00 +0100431 ALOGV("setPlaybackStatus");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900432 Parcel data, reply;
433
434 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
435 data.writeInt32(uniqueId);
436
Gloria Wangc10ce332011-06-15 10:27:52 -0700437 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900438
439 data.writeInt32(playbackStatus);
Gloria Wang2ed8a922011-01-19 15:38:16 -0800440 data.writeInt64(position);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900441
442 remote()->transact(SET_PLAYBACK_STATUS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900443 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900444}
445
446bool BpDrmManagerService::validateAction(
447 int uniqueId, const String8& path,
448 int action, const ActionDescription& description) {
Steve Block3856b092011-10-20 11:56:00 +0100449 ALOGV("validateAction");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900450 Parcel data, reply;
451
452 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
453 data.writeInt32(uniqueId);
454 data.writeString8(path);
455 data.writeInt32(action);
456 data.writeInt32(description.outputType);
457 data.writeInt32(description.configuration);
458
459 remote()->transact(VALIDATE_ACTION, data, &reply);
460
461 return static_cast<bool>(reply.readInt32());
462}
463
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900464status_t BpDrmManagerService::removeRights(int uniqueId, const String8& path) {
Steve Block3856b092011-10-20 11:56:00 +0100465 ALOGV("removeRights");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900466 Parcel data, reply;
467
468 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
469 data.writeInt32(uniqueId);
470 data.writeString8(path);
471
472 remote()->transact(REMOVE_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900473 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900474}
475
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900476status_t BpDrmManagerService::removeAllRights(int uniqueId) {
Steve Block3856b092011-10-20 11:56:00 +0100477 ALOGV("removeAllRights");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900478 Parcel data, reply;
479
480 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
481 data.writeInt32(uniqueId);
482
483 remote()->transact(REMOVE_ALL_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900484 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900485}
486
487int BpDrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) {
Steve Block3856b092011-10-20 11:56:00 +0100488 ALOGV("openConvertSession");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900489 Parcel data, reply;
490
491 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
492 data.writeInt32(uniqueId);
493 data.writeString8(mimeType);
494
495 remote()->transact(OPEN_CONVERT_SESSION, data, &reply);
496 return reply.readInt32();
497}
498
499DrmConvertedStatus* BpDrmManagerService::convertData(
500 int uniqueId, int convertId, const DrmBuffer* inputData) {
Steve Block3856b092011-10-20 11:56:00 +0100501 ALOGV("convertData");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900502 Parcel data, reply;
503
504 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
505 data.writeInt32(uniqueId);
506 data.writeInt32(convertId);
507 data.writeInt32(inputData->length);
508 data.write(inputData->data, inputData->length);
509
510 remote()->transact(CONVERT_DATA, data, &reply);
511
512 DrmConvertedStatus* drmConvertedStatus = NULL;
513
514 if (0 != reply.dataAvail()) {
515 //Filling DRM Converted Status
516 const int statusCode = reply.readInt32();
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800517 const off64_t offset = reply.readInt64();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900518
519 DrmBuffer* convertedData = NULL;
520 if (0 != reply.dataAvail()) {
521 const int bufferSize = reply.readInt32();
522 char* data = NULL;
523 if (0 < bufferSize) {
524 data = new char[bufferSize];
525 reply.read(data, bufferSize);
526 }
527 convertedData = new DrmBuffer(data, bufferSize);
528 }
529 drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
530 }
531 return drmConvertedStatus;
532}
533
534DrmConvertedStatus* BpDrmManagerService::closeConvertSession(int uniqueId, int convertId) {
Steve Block3856b092011-10-20 11:56:00 +0100535 ALOGV("closeConvertSession");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900536 Parcel data, reply;
537
538 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
539 data.writeInt32(uniqueId);
540 data.writeInt32(convertId);
541
542 remote()->transact(CLOSE_CONVERT_SESSION, data, &reply);
543
544 DrmConvertedStatus* drmConvertedStatus = NULL;
545
546 if (0 != reply.dataAvail()) {
547 //Filling DRM Converted Status
548 const int statusCode = reply.readInt32();
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800549 const off64_t offset = reply.readInt64();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900550
551 DrmBuffer* convertedData = NULL;
552 if (0 != reply.dataAvail()) {
553 const int bufferSize = reply.readInt32();
554 char* data = NULL;
555 if (0 < bufferSize) {
556 data = new char[bufferSize];
557 reply.read(data, bufferSize);
558 }
559 convertedData = new DrmBuffer(data, bufferSize);
560 }
561 drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
562 }
563 return drmConvertedStatus;
564}
565
566status_t BpDrmManagerService::getAllSupportInfo(
567 int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) {
Steve Block3856b092011-10-20 11:56:00 +0100568 ALOGV("Get All Support Info");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900569 Parcel data, reply;
570
571 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
572 data.writeInt32(uniqueId);
573
574 remote()->transact(GET_ALL_SUPPORT_INFO, data, &reply);
575
576 //Filling DRM Support Info
577 const int arraySize = reply.readInt32();
578 if (0 < arraySize) {
579 *drmSupportInfoArray = new DrmSupportInfo[arraySize];
580
581 for (int index = 0; index < arraySize; ++index) {
582 DrmSupportInfo drmSupportInfo;
583
584 const int fileSuffixVectorSize = reply.readInt32();
585 for (int i = 0; i < fileSuffixVectorSize; ++i) {
586 drmSupportInfo.addFileSuffix(reply.readString8());
587 }
588
589 const int mimeTypeVectorSize = reply.readInt32();
590 for (int i = 0; i < mimeTypeVectorSize; ++i) {
591 drmSupportInfo.addMimeType(reply.readString8());
592 }
593
594 drmSupportInfo.setDescription(reply.readString8());
595 (*drmSupportInfoArray)[index] = drmSupportInfo;
596 }
597 }
598 *length = arraySize;
599 return reply.readInt32();
600}
601
602DecryptHandle* BpDrmManagerService::openDecryptSession(
James Dong9d2f3862012-01-10 08:24:37 -0800603 int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) {
Steve Block3856b092011-10-20 11:56:00 +0100604 ALOGV("Entering BpDrmManagerService::openDecryptSession");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900605 Parcel data, reply;
606
Takeshi Aimie943f842010-10-08 23:05:49 +0900607 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900608 data.writeInt32(uniqueId);
609 data.writeFileDescriptor(fd);
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800610 data.writeInt64(offset);
611 data.writeInt64(length);
James Dong9d2f3862012-01-10 08:24:37 -0800612 String8 mimeType;
613 if (mime) {
614 mimeType = mime;
615 }
616 data.writeString8(mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900617
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900618 remote()->transact(OPEN_DECRYPT_SESSION, data, &reply);
619
620 DecryptHandle* handle = NULL;
621 if (0 != reply.dataAvail()) {
622 handle = new DecryptHandle();
Gloria Wang1da9aa62011-03-20 10:25:16 -0700623 readDecryptHandleFromParcelData(handle, reply);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900624 }
625 return handle;
626}
627
James Dong9d2f3862012-01-10 08:24:37 -0800628DecryptHandle* BpDrmManagerService::openDecryptSession(
629 int uniqueId, const char* uri, const char* mime) {
630
631 ALOGV("Entering BpDrmManagerService::openDecryptSession: mime=%s", mime? mime: "NULL");
Takeshi Aimie943f842010-10-08 23:05:49 +0900632 Parcel data, reply;
633
634 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
635 data.writeInt32(uniqueId);
636 data.writeString8(String8(uri));
James Dong9d2f3862012-01-10 08:24:37 -0800637 String8 mimeType;
638 if (mime) {
639 mimeType = mime;
640 }
641 data.writeString8(mimeType);
Takeshi Aimie943f842010-10-08 23:05:49 +0900642
643 remote()->transact(OPEN_DECRYPT_SESSION_FROM_URI, data, &reply);
644
645 DecryptHandle* handle = NULL;
646 if (0 != reply.dataAvail()) {
647 handle = new DecryptHandle();
Gloria Wang1da9aa62011-03-20 10:25:16 -0700648 readDecryptHandleFromParcelData(handle, reply);
Takeshi Aimie943f842010-10-08 23:05:49 +0900649 } else {
Steve Block3856b092011-10-20 11:56:00 +0100650 ALOGV("no decryptHandle is generated in service side");
Takeshi Aimie943f842010-10-08 23:05:49 +0900651 }
652 return handle;
653}
654
Kei Takahashicba7b322012-01-18 17:10:19 +0900655DecryptHandle* BpDrmManagerService::openDecryptSession(
656 int uniqueId, const DrmBuffer& buf, const String8& mimeType) {
657 ALOGV("Entering BpDrmManagerService::openDecryptSession");
658 Parcel data, reply;
659
660 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
661 data.writeInt32(uniqueId);
662 if (buf.data != NULL && buf.length > 0) {
663 data.writeInt32(buf.length);
664 data.write(buf.data, buf.length);
665 } else {
666 data.writeInt32(0);
667 }
668 data.writeString8(mimeType);
669
670 remote()->transact(OPEN_DECRYPT_SESSION_FOR_STREAMING, data, &reply);
671
672 DecryptHandle* handle = NULL;
673 if (0 != reply.dataAvail()) {
674 handle = new DecryptHandle();
675 readDecryptHandleFromParcelData(handle, reply);
676 } else {
677 ALOGV("no decryptHandle is generated in service side");
678 }
679 return handle;
680}
681
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900682status_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) {
Steve Block3856b092011-10-20 11:56:00 +0100683 ALOGV("closeDecryptSession");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900684 Parcel data, reply;
685
686 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
687 data.writeInt32(uniqueId);
688
Gloria Wangc10ce332011-06-15 10:27:52 -0700689 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900690
691 remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply);
692
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900693 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900694}
695
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900696status_t BpDrmManagerService::initializeDecryptUnit(
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900697 int uniqueId, DecryptHandle* decryptHandle,
698 int decryptUnitId, const DrmBuffer* headerInfo) {
Steve Block3856b092011-10-20 11:56:00 +0100699 ALOGV("initializeDecryptUnit");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900700 Parcel data, reply;
701
702 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
703 data.writeInt32(uniqueId);
704
Gloria Wangc10ce332011-06-15 10:27:52 -0700705 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900706
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900707 data.writeInt32(decryptUnitId);
708
709 data.writeInt32(headerInfo->length);
710 data.write(headerInfo->data, headerInfo->length);
711
712 remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900713 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900714}
715
716status_t BpDrmManagerService::decrypt(
717 int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900718 const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) {
Steve Block3856b092011-10-20 11:56:00 +0100719 ALOGV("decrypt");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900720 Parcel data, reply;
721
722 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
723 data.writeInt32(uniqueId);
724
Gloria Wangc10ce332011-06-15 10:27:52 -0700725 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900726
727 data.writeInt32(decryptUnitId);
728 data.writeInt32((*decBuffer)->length);
729
730 data.writeInt32(encBuffer->length);
731 data.write(encBuffer->data, encBuffer->length);
732
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900733 if (NULL != IV) {
734 data.writeInt32(IV->length);
735 data.write(IV->data, IV->length);
736 }
737
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900738 remote()->transact(DECRYPT, data, &reply);
739
740 const status_t status = reply.readInt32();
Steve Block3856b092011-10-20 11:56:00 +0100741 ALOGV("Return value of decrypt() is %d", status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900742
743 const int size = reply.readInt32();
744 (*decBuffer)->length = size;
745 reply.read((void *)(*decBuffer)->data, size);
746
747 return status;
748}
749
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900750status_t BpDrmManagerService::finalizeDecryptUnit(
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900751 int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) {
Steve Block3856b092011-10-20 11:56:00 +0100752 ALOGV("finalizeDecryptUnit");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900753 Parcel data, reply;
754
755 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
756 data.writeInt32(uniqueId);
757
Gloria Wangc10ce332011-06-15 10:27:52 -0700758 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900759
760 data.writeInt32(decryptUnitId);
761
762 remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900763 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900764}
765
766ssize_t BpDrmManagerService::pread(
767 int uniqueId, DecryptHandle* decryptHandle, void* buffer,
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800768 ssize_t numBytes, off64_t offset) {
Steve Block3856b092011-10-20 11:56:00 +0100769 ALOGV("read");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900770 Parcel data, reply;
771 int result;
772
773 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
774 data.writeInt32(uniqueId);
775
Gloria Wangc10ce332011-06-15 10:27:52 -0700776 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900777
778 data.writeInt32(numBytes);
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800779 data.writeInt64(offset);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900780
781 remote()->transact(PREAD, data, &reply);
782 result = reply.readInt32();
783 if (0 < result) {
784 reply.read(buffer, result);
785 }
786 return result;
787}
788
789IMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService");
790
791status_t BnDrmManagerService::onTransact(
792 uint32_t code, const Parcel& data,
793 Parcel* reply, uint32_t flags) {
Steve Block3856b092011-10-20 11:56:00 +0100794 ALOGV("Entering BnDrmManagerService::onTransact with code %d", code);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900795
796 switch (code) {
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900797 case ADD_UNIQUEID:
798 {
Steve Block3856b092011-10-20 11:56:00 +0100799 ALOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID");
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900800 CHECK_INTERFACE(IDrmManagerService, data, reply);
801 int uniqueId = addUniqueId(data.readInt32());
802 reply->writeInt32(uniqueId);
803 return DRM_NO_ERROR;
804 }
805
806 case REMOVE_UNIQUEID:
807 {
Steve Block3856b092011-10-20 11:56:00 +0100808 ALOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID");
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900809 CHECK_INTERFACE(IDrmManagerService, data, reply);
810 removeUniqueId(data.readInt32());
811 return DRM_NO_ERROR;
812 }
813
Takeshi Aimie943f842010-10-08 23:05:49 +0900814 case ADD_CLIENT:
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900815 {
Steve Block3856b092011-10-20 11:56:00 +0100816 ALOGV("BnDrmManagerService::onTransact :ADD_CLIENT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900817 CHECK_INTERFACE(IDrmManagerService, data, reply);
Takeshi Aimie943f842010-10-08 23:05:49 +0900818 addClient(data.readInt32());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900819 return DRM_NO_ERROR;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900820 }
821
Takeshi Aimie943f842010-10-08 23:05:49 +0900822 case REMOVE_CLIENT:
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900823 {
Steve Block3856b092011-10-20 11:56:00 +0100824 ALOGV("BnDrmManagerService::onTransact :REMOVE_CLIENT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900825 CHECK_INTERFACE(IDrmManagerService, data, reply);
Takeshi Aimie943f842010-10-08 23:05:49 +0900826 removeClient(data.readInt32());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900827 return DRM_NO_ERROR;
828 }
829
830 case SET_DRM_SERVICE_LISTENER:
831 {
Steve Block3856b092011-10-20 11:56:00 +0100832 ALOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900833 CHECK_INTERFACE(IDrmManagerService, data, reply);
834
835 const int uniqueId = data.readInt32();
836 const sp<IDrmServiceListener> drmServiceListener
837 = interface_cast<IDrmServiceListener> (data.readStrongBinder());
838
839 status_t status = setDrmServiceListener(uniqueId, drmServiceListener);
840
841 reply->writeInt32(status);
842 return DRM_NO_ERROR;
843 }
844
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900845 case INSTALL_DRM_ENGINE:
846 {
Steve Block3856b092011-10-20 11:56:00 +0100847 ALOGV("BnDrmManagerService::onTransact :INSTALL_DRM_ENGINE");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900848 CHECK_INTERFACE(IDrmManagerService, data, reply);
849
Gloria Wang197f0472011-08-01 10:31:24 -0700850 const int uniqueId = data.readInt32();
851 const String8 engineFile = data.readString8();
852 status_t status = installDrmEngine(uniqueId, engineFile);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900853
854 reply->writeInt32(status);
855 return DRM_NO_ERROR;
856 }
857
858 case GET_CONSTRAINTS_FROM_CONTENT:
859 {
Steve Block3856b092011-10-20 11:56:00 +0100860 ALOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900861 CHECK_INTERFACE(IDrmManagerService, data, reply);
862
863 const int uniqueId = data.readInt32();
864 const String8 path = data.readString8();
865
Gloria Wang197f0472011-08-01 10:31:24 -0700866 DrmConstraints* drmConstraints
867 = getConstraints(uniqueId, &path, data.readInt32());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900868
869 if (NULL != drmConstraints) {
870 //Filling DRM Constraints contents
871 reply->writeInt32(drmConstraints->getCount());
872
873 DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator();
874 while (keyIt.hasNext()) {
875 const String8 key = keyIt.next();
876 reply->writeString8(key);
877 const char* value = drmConstraints->getAsByteArray(&key);
878 int bufferSize = 0;
879 if (NULL != value) {
880 bufferSize = strlen(value);
881 }
882 reply->writeInt32(bufferSize + 1);
883 reply->write(value, bufferSize + 1);
884 }
885 }
886 delete drmConstraints; drmConstraints = NULL;
887 return DRM_NO_ERROR;
888 }
889
Takeshi Aimi34738462010-11-16 13:56:11 +0900890 case GET_METADATA_FROM_CONTENT:
891 {
Steve Block3856b092011-10-20 11:56:00 +0100892 ALOGV("BnDrmManagerService::onTransact :GET_METADATA_FROM_CONTENT");
Takeshi Aimi34738462010-11-16 13:56:11 +0900893 CHECK_INTERFACE(IDrmManagerService, data, reply);
894
895 const int uniqueId = data.readInt32();
896 const String8 path = data.readString8();
897
898 DrmMetadata* drmMetadata = getMetadata(uniqueId, &path);
899 if (NULL != drmMetadata) {
900 //Filling DRM Metadata contents
901 reply->writeInt32(drmMetadata->getCount());
902
903 DrmMetadata::KeyIterator keyIt = drmMetadata->keyIterator();
904 while (keyIt.hasNext()) {
905 const String8 key = keyIt.next();
906 reply->writeString8(key);
907 const char* value = drmMetadata->getAsByteArray(&key);
908 int bufferSize = 0;
909 if (NULL != value) {
910 bufferSize = strlen(value);
911 reply->writeInt32(bufferSize + 1);
912 reply->write(value, bufferSize + 1);
913 } else {
914 reply->writeInt32(0);
915 }
916 }
917 }
918 delete drmMetadata; drmMetadata = NULL;
919 return NO_ERROR;
920 }
921
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900922 case CAN_HANDLE:
923 {
Steve Block3856b092011-10-20 11:56:00 +0100924 ALOGV("BnDrmManagerService::onTransact :CAN_HANDLE");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900925 CHECK_INTERFACE(IDrmManagerService, data, reply);
926
927 const int uniqueId = data.readInt32();
928 const String8 path = data.readString8();
929 const String8 mimeType = data.readString8();
930
931 bool result = canHandle(uniqueId, path, mimeType);
932
933 reply->writeInt32(result);
934 return DRM_NO_ERROR;
935 }
936
937 case PROCESS_DRM_INFO:
938 {
Steve Block3856b092011-10-20 11:56:00 +0100939 ALOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900940 CHECK_INTERFACE(IDrmManagerService, data, reply);
941
942 const int uniqueId = data.readInt32();
943
944 //Filling DRM info
945 const int infoType = data.readInt32();
946 const int bufferSize = data.readInt32();
947 char* buffer = NULL;
948 if (0 < bufferSize) {
949 buffer = (char *)data.readInplace(bufferSize);
950 }
951 const DrmBuffer drmBuffer(buffer, bufferSize);
952 DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8());
953
954 const int size = data.readInt32();
955 for (int index = 0; index < size; ++index) {
956 const String8 key(data.readString8());
957 const String8 value(data.readString8());
958 drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
959 }
960
961 DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo);
962
963 if (NULL != drmInfoStatus) {
964 //Filling DRM Info Status contents
965 reply->writeInt32(drmInfoStatus->statusCode);
Takeshi Aimie943f842010-10-08 23:05:49 +0900966 reply->writeInt32(drmInfoStatus->infoType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900967 reply->writeString8(drmInfoStatus->mimeType);
968
969 if (NULL != drmInfoStatus->drmBuffer) {
970 const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer;
971 const int bufferSize = drmBuffer->length;
972 reply->writeInt32(bufferSize);
973 if (0 < bufferSize) {
974 reply->write(drmBuffer->data, bufferSize);
975 }
976 delete [] drmBuffer->data;
977 delete drmBuffer; drmBuffer = NULL;
978 }
979 }
980 delete drmInfo; drmInfo = NULL;
981 delete drmInfoStatus; drmInfoStatus = NULL;
982 return DRM_NO_ERROR;
983 }
984
985 case ACQUIRE_DRM_INFO:
986 {
Steve Block3856b092011-10-20 11:56:00 +0100987 ALOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900988 CHECK_INTERFACE(IDrmManagerService, data, reply);
989
990 const int uniqueId = data.readInt32();
991
992 //Filling DRM info Request
Gloria Wang197f0472011-08-01 10:31:24 -0700993 const int infoType = data.readInt32();
994 const String8 mimeType = data.readString8();
995 DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(infoType, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900996
997 const int size = data.readInt32();
998 for (int index = 0; index < size; ++index) {
999 const String8 key(data.readString8());
1000 const String8 value(data.readString8());
1001 drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value);
1002 }
1003
1004 DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest);
1005
1006 if (NULL != drmInfo) {
1007 //Filling DRM Info
1008 const DrmBuffer drmBuffer = drmInfo->getData();
1009 reply->writeInt32(drmInfo->getInfoType());
1010
1011 const int bufferSize = drmBuffer.length;
1012 reply->writeInt32(bufferSize);
1013 if (0 < bufferSize) {
1014 reply->write(drmBuffer.data, bufferSize);
1015 }
1016 reply->writeString8(drmInfo->getMimeType());
1017 reply->writeInt32(drmInfo->getCount());
1018
1019 DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
1020 while (keyIt.hasNext()) {
1021 const String8 key = keyIt.next();
1022 reply->writeString8(key);
1023 const String8 value = drmInfo->get(key);
1024 reply->writeString8((value == String8("")) ? String8("NULL") : value);
1025 }
1026 delete [] drmBuffer.data;
1027 }
1028 delete drmInfoRequest; drmInfoRequest = NULL;
1029 delete drmInfo; drmInfo = NULL;
1030 return DRM_NO_ERROR;
1031 }
1032
1033 case SAVE_RIGHTS:
1034 {
Steve Block3856b092011-10-20 11:56:00 +01001035 ALOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001036 CHECK_INTERFACE(IDrmManagerService, data, reply);
1037
1038 const int uniqueId = data.readInt32();
1039
1040 //Filling DRM Rights
1041 const int bufferSize = data.readInt32();
1042 const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1043
1044 const String8 mimeType(data.readString8());
1045 const String8 accountId(data.readString8());
1046 const String8 subscriptionId(data.readString8());
1047 const String8 rightsPath(data.readString8());
1048 const String8 contentPath(data.readString8());
1049
1050 DrmRights drmRights(drmBuffer,
1051 ((mimeType == String8("NULL")) ? String8("") : mimeType),
1052 ((accountId == String8("NULL")) ? String8("") : accountId),
1053 ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId));
1054
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001055 const status_t status = saveRights(uniqueId, drmRights,
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001056 ((rightsPath == String8("NULL")) ? String8("") : rightsPath),
1057 ((contentPath == String8("NULL")) ? String8("") : contentPath));
1058
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001059 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001060 return DRM_NO_ERROR;
1061 }
1062
1063 case GET_ORIGINAL_MIMETYPE:
1064 {
Steve Block3856b092011-10-20 11:56:00 +01001065 ALOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001066 CHECK_INTERFACE(IDrmManagerService, data, reply);
1067
Gloria Wang197f0472011-08-01 10:31:24 -07001068 const int uniqueId = data.readInt32();
1069 const String8 path = data.readString8();
1070 const String8 originalMimeType = getOriginalMimeType(uniqueId, path);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001071
1072 reply->writeString8(originalMimeType);
1073 return DRM_NO_ERROR;
1074 }
1075
1076 case GET_DRM_OBJECT_TYPE:
1077 {
Steve Block3856b092011-10-20 11:56:00 +01001078 ALOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001079 CHECK_INTERFACE(IDrmManagerService, data, reply);
1080
Gloria Wang197f0472011-08-01 10:31:24 -07001081 const int uniqueId = data.readInt32();
1082 const String8 path = data.readString8();
1083 const String8 mimeType = data.readString8();
1084 const int drmObjectType = getDrmObjectType(uniqueId, path, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001085
1086 reply->writeInt32(drmObjectType);
1087 return DRM_NO_ERROR;
1088 }
1089
1090 case CHECK_RIGHTS_STATUS:
1091 {
Steve Block3856b092011-10-20 11:56:00 +01001092 ALOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001093 CHECK_INTERFACE(IDrmManagerService, data, reply);
1094
Gloria Wang197f0472011-08-01 10:31:24 -07001095 const int uniqueId = data.readInt32();
1096 const String8 path = data.readString8();
1097 const int action = data.readInt32();
1098 const int result = checkRightsStatus(uniqueId, path, action);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001099
1100 reply->writeInt32(result);
1101 return DRM_NO_ERROR;
1102 }
1103
1104 case CONSUME_RIGHTS:
1105 {
Steve Block3856b092011-10-20 11:56:00 +01001106 ALOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001107 CHECK_INTERFACE(IDrmManagerService, data, reply);
1108
1109 const int uniqueId = data.readInt32();
1110
1111 DecryptHandle handle;
Gloria Wang1da9aa62011-03-20 10:25:16 -07001112 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001113
Gloria Wang197f0472011-08-01 10:31:24 -07001114 const int action = data.readInt32();
1115 const bool reserve = static_cast<bool>(data.readInt32());
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001116 const status_t status
Gloria Wang197f0472011-08-01 10:31:24 -07001117 = consumeRights(uniqueId, &handle, action, reserve);
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001118 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001119
Gloria Wang1da9aa62011-03-20 10:25:16 -07001120 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001121 return DRM_NO_ERROR;
1122 }
1123
1124 case SET_PLAYBACK_STATUS:
1125 {
Steve Block3856b092011-10-20 11:56:00 +01001126 ALOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001127 CHECK_INTERFACE(IDrmManagerService, data, reply);
1128
1129 const int uniqueId = data.readInt32();
1130
1131 DecryptHandle handle;
Gloria Wang1da9aa62011-03-20 10:25:16 -07001132 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001133
Gloria Wang197f0472011-08-01 10:31:24 -07001134 const int playbackStatus = data.readInt32();
1135 const int64_t position = data.readInt64();
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001136 const status_t status
Gloria Wang197f0472011-08-01 10:31:24 -07001137 = setPlaybackStatus(uniqueId, &handle, playbackStatus, position);
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001138 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001139
Gloria Wang1da9aa62011-03-20 10:25:16 -07001140 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001141 return DRM_NO_ERROR;
1142 }
1143
1144 case VALIDATE_ACTION:
1145 {
Steve Block3856b092011-10-20 11:56:00 +01001146 ALOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001147 CHECK_INTERFACE(IDrmManagerService, data, reply);
1148
Gloria Wang197f0472011-08-01 10:31:24 -07001149 const int uniqueId = data.readInt32();
1150 const String8 path = data.readString8();
1151 const int action = data.readInt32();
1152 const int outputType = data.readInt32();
1153 const int configuration = data.readInt32();
1154 bool result = validateAction(uniqueId, path, action,
1155 ActionDescription(outputType, configuration));
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001156
1157 reply->writeInt32(result);
1158 return DRM_NO_ERROR;
1159 }
1160
1161 case REMOVE_RIGHTS:
1162 {
Steve Block3856b092011-10-20 11:56:00 +01001163 ALOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001164 CHECK_INTERFACE(IDrmManagerService, data, reply);
1165
Gloria Wang197f0472011-08-01 10:31:24 -07001166 int uniqueId = data.readInt32();
1167 String8 path = data.readString8();
1168 const status_t status = removeRights(uniqueId, path);
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001169 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001170
1171 return DRM_NO_ERROR;
1172 }
1173
1174 case REMOVE_ALL_RIGHTS:
1175 {
Steve Block3856b092011-10-20 11:56:00 +01001176 ALOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001177 CHECK_INTERFACE(IDrmManagerService, data, reply);
1178
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001179 const status_t status = removeAllRights(data.readInt32());
1180 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001181
1182 return DRM_NO_ERROR;
1183 }
1184
1185 case OPEN_CONVERT_SESSION:
1186 {
Steve Block3856b092011-10-20 11:56:00 +01001187 ALOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001188 CHECK_INTERFACE(IDrmManagerService, data, reply);
1189
Gloria Wang197f0472011-08-01 10:31:24 -07001190 const int uniqueId = data.readInt32();
1191 const String8 mimeType = data.readString8();
1192 const int convertId = openConvertSession(uniqueId, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001193
1194 reply->writeInt32(convertId);
1195 return DRM_NO_ERROR;
1196 }
1197
1198 case CONVERT_DATA:
1199 {
Steve Block3856b092011-10-20 11:56:00 +01001200 ALOGV("BnDrmManagerService::onTransact :CONVERT_DATA");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001201 CHECK_INTERFACE(IDrmManagerService, data, reply);
1202
1203 const int uniqueId = data.readInt32();
1204 const int convertId = data.readInt32();
1205
1206 //Filling input data
1207 const int bufferSize = data.readInt32();
1208 DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1209
1210 DrmConvertedStatus* drmConvertedStatus = convertData(uniqueId, convertId, inputData);
1211
1212 if (NULL != drmConvertedStatus) {
1213 //Filling Drm Converted Ststus
1214 reply->writeInt32(drmConvertedStatus->statusCode);
Gloria Wanga2cd44c2010-11-19 15:19:36 -08001215 reply->writeInt64(drmConvertedStatus->offset);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001216
1217 if (NULL != drmConvertedStatus->convertedData) {
1218 const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
1219 const int bufferSize = convertedData->length;
1220 reply->writeInt32(bufferSize);
1221 if (0 < bufferSize) {
1222 reply->write(convertedData->data, bufferSize);
1223 }
1224 delete [] convertedData->data;
1225 delete convertedData; convertedData = NULL;
1226 }
1227 }
1228 delete inputData; inputData = NULL;
1229 delete drmConvertedStatus; drmConvertedStatus = NULL;
1230 return DRM_NO_ERROR;
1231 }
1232
1233 case CLOSE_CONVERT_SESSION:
1234 {
Steve Block3856b092011-10-20 11:56:00 +01001235 ALOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001236 CHECK_INTERFACE(IDrmManagerService, data, reply);
1237
Gloria Wang197f0472011-08-01 10:31:24 -07001238 const int uniqueId = data.readInt32();
1239 const int convertId = data.readInt32();
1240 DrmConvertedStatus* drmConvertedStatus
1241 = closeConvertSession(uniqueId, convertId);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001242
1243 if (NULL != drmConvertedStatus) {
1244 //Filling Drm Converted Ststus
1245 reply->writeInt32(drmConvertedStatus->statusCode);
Gloria Wanga2cd44c2010-11-19 15:19:36 -08001246 reply->writeInt64(drmConvertedStatus->offset);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001247
1248 if (NULL != drmConvertedStatus->convertedData) {
1249 const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
1250 const int bufferSize = convertedData->length;
1251 reply->writeInt32(bufferSize);
1252 if (0 < bufferSize) {
1253 reply->write(convertedData->data, bufferSize);
1254 }
1255 delete [] convertedData->data;
1256 delete convertedData; convertedData = NULL;
1257 }
1258 }
1259 delete drmConvertedStatus; drmConvertedStatus = NULL;
1260 return DRM_NO_ERROR;
1261 }
1262
1263 case GET_ALL_SUPPORT_INFO:
1264 {
Steve Block3856b092011-10-20 11:56:00 +01001265 ALOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001266 CHECK_INTERFACE(IDrmManagerService, data, reply);
1267
1268 const int uniqueId = data.readInt32();
1269 int length = 0;
1270 DrmSupportInfo* drmSupportInfoArray = NULL;
1271
1272 status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray);
1273
1274 reply->writeInt32(length);
1275 for (int i = 0; i < length; ++i) {
1276 DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i];
1277
1278 reply->writeInt32(drmSupportInfo.getFileSuffixCount());
1279 DrmSupportInfo::FileSuffixIterator fileSuffixIt
1280 = drmSupportInfo.getFileSuffixIterator();
1281 while (fileSuffixIt.hasNext()) {
1282 reply->writeString8(fileSuffixIt.next());
1283 }
1284
1285 reply->writeInt32(drmSupportInfo.getMimeTypeCount());
1286 DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator();
1287 while (mimeTypeIt.hasNext()) {
1288 reply->writeString8(mimeTypeIt.next());
1289 }
1290 reply->writeString8(drmSupportInfo.getDescription());
1291 }
1292 delete [] drmSupportInfoArray; drmSupportInfoArray = NULL;
1293 reply->writeInt32(status);
1294 return DRM_NO_ERROR;
1295 }
1296
1297 case OPEN_DECRYPT_SESSION:
1298 {
Steve Block3856b092011-10-20 11:56:00 +01001299 ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001300 CHECK_INTERFACE(IDrmManagerService, data, reply);
1301
1302 const int uniqueId = data.readInt32();
1303 const int fd = data.readFileDescriptor();
1304
Gloria Wang197f0472011-08-01 10:31:24 -07001305 const off64_t offset = data.readInt64();
1306 const off64_t length = data.readInt64();
James Dong9d2f3862012-01-10 08:24:37 -08001307 const String8 mime = data.readString8();
1308
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001309 DecryptHandle* handle
James Dong9d2f3862012-01-10 08:24:37 -08001310 = openDecryptSession(uniqueId, fd, offset, length, mime.string());
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001311
1312 if (NULL != handle) {
Gloria Wangc10ce332011-06-15 10:27:52 -07001313 writeDecryptHandleToParcelData(handle, reply);
Gloria Wang1da9aa62011-03-20 10:25:16 -07001314 clearDecryptHandle(handle);
1315 delete handle; handle = NULL;
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001316 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001317 return DRM_NO_ERROR;
1318 }
1319
Takeshi Aimie943f842010-10-08 23:05:49 +09001320 case OPEN_DECRYPT_SESSION_FROM_URI:
1321 {
Steve Block3856b092011-10-20 11:56:00 +01001322 ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI");
Takeshi Aimie943f842010-10-08 23:05:49 +09001323 CHECK_INTERFACE(IDrmManagerService, data, reply);
1324
1325 const int uniqueId = data.readInt32();
1326 const String8 uri = data.readString8();
James Dong9d2f3862012-01-10 08:24:37 -08001327 const String8 mime = data.readString8();
Takeshi Aimie943f842010-10-08 23:05:49 +09001328
James Dong9d2f3862012-01-10 08:24:37 -08001329 DecryptHandle* handle = openDecryptSession(uniqueId, uri.string(), mime.string());
Takeshi Aimie943f842010-10-08 23:05:49 +09001330
1331 if (NULL != handle) {
Gloria Wangc10ce332011-06-15 10:27:52 -07001332 writeDecryptHandleToParcelData(handle, reply);
Gloria Wang1da9aa62011-03-20 10:25:16 -07001333
1334 clearDecryptHandle(handle);
1335 delete handle; handle = NULL;
Takeshi Aimie943f842010-10-08 23:05:49 +09001336 } else {
Steve Block3856b092011-10-20 11:56:00 +01001337 ALOGV("NULL decryptHandle is returned");
Takeshi Aimie943f842010-10-08 23:05:49 +09001338 }
Takeshi Aimie943f842010-10-08 23:05:49 +09001339 return DRM_NO_ERROR;
1340 }
1341
Kei Takahashicba7b322012-01-18 17:10:19 +09001342 case OPEN_DECRYPT_SESSION_FOR_STREAMING:
1343 {
1344 ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FOR_STREAMING");
1345 CHECK_INTERFACE(IDrmManagerService, data, reply);
1346
1347 const int uniqueId = data.readInt32();
1348 const int bufferSize = data.readInt32();
1349 DrmBuffer buf((bufferSize > 0) ? (char *)data.readInplace(bufferSize) : NULL,
1350 bufferSize);
1351 const String8 mimeType(data.readString8());
1352
1353 DecryptHandle* handle = openDecryptSession(uniqueId, buf, mimeType);
1354
1355 if (handle != NULL) {
1356 writeDecryptHandleToParcelData(handle, reply);
1357 clearDecryptHandle(handle);
1358 delete handle;
1359 handle = NULL;
1360 } else {
1361 ALOGV("NULL decryptHandle is returned");
1362 }
1363 return DRM_NO_ERROR;
1364 }
1365
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001366 case CLOSE_DECRYPT_SESSION:
1367 {
Steve Block3856b092011-10-20 11:56:00 +01001368 ALOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001369 CHECK_INTERFACE(IDrmManagerService, data, reply);
1370
1371 const int uniqueId = data.readInt32();
1372
1373 DecryptHandle* handle = new DecryptHandle();
Gloria Wang1da9aa62011-03-20 10:25:16 -07001374 readDecryptHandleFromParcelData(handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001375
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001376 const status_t status = closeDecryptSession(uniqueId, handle);
1377 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001378 return DRM_NO_ERROR;
1379 }
1380
1381 case INITIALIZE_DECRYPT_UNIT:
1382 {
Steve Block3856b092011-10-20 11:56:00 +01001383 ALOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001384 CHECK_INTERFACE(IDrmManagerService, data, reply);
1385
1386 const int uniqueId = data.readInt32();
1387
1388 DecryptHandle handle;
Gloria Wang1da9aa62011-03-20 10:25:16 -07001389 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001390
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001391 const int decryptUnitId = data.readInt32();
1392
1393 //Filling Header info
1394 const int bufferSize = data.readInt32();
1395 DrmBuffer* headerInfo = NULL;
1396 headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1397
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001398 const status_t status
1399 = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo);
1400 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001401
Gloria Wang1da9aa62011-03-20 10:25:16 -07001402 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001403 delete headerInfo; headerInfo = NULL;
1404 return DRM_NO_ERROR;
1405 }
1406
1407 case DECRYPT:
1408 {
Steve Block3856b092011-10-20 11:56:00 +01001409 ALOGV("BnDrmManagerService::onTransact :DECRYPT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001410 CHECK_INTERFACE(IDrmManagerService, data, reply);
1411
1412 const int uniqueId = data.readInt32();
1413
1414 DecryptHandle handle;
Gloria Wang1da9aa62011-03-20 10:25:16 -07001415 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001416
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001417 const int decryptUnitId = data.readInt32();
1418 const int decBufferSize = data.readInt32();
1419
1420 const int encBufferSize = data.readInt32();
1421 DrmBuffer* encBuffer
1422 = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize);
1423
1424 char* buffer = NULL;
1425 buffer = new char[decBufferSize];
1426 DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize);
1427
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001428 DrmBuffer* IV = NULL;
1429 if (0 != data.dataAvail()) {
1430 const int ivBufferlength = data.readInt32();
1431 IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength);
1432 }
1433
1434 const status_t status
1435 = decrypt(uniqueId, &handle, decryptUnitId, encBuffer, &decBuffer, IV);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001436
1437 reply->writeInt32(status);
1438
1439 const int size = decBuffer->length;
1440 reply->writeInt32(size);
1441 reply->write(decBuffer->data, size);
1442
Gloria Wang1da9aa62011-03-20 10:25:16 -07001443 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001444 delete encBuffer; encBuffer = NULL;
1445 delete decBuffer; decBuffer = NULL;
1446 delete [] buffer; buffer = NULL;
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001447 delete IV; IV = NULL;
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001448 return DRM_NO_ERROR;
1449 }
1450
1451 case FINALIZE_DECRYPT_UNIT:
1452 {
Steve Block3856b092011-10-20 11:56:00 +01001453 ALOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001454 CHECK_INTERFACE(IDrmManagerService, data, reply);
1455
1456 const int uniqueId = data.readInt32();
1457
1458 DecryptHandle handle;
Gloria Wang1da9aa62011-03-20 10:25:16 -07001459 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001460
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001461 const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32());
1462 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001463
Gloria Wang1da9aa62011-03-20 10:25:16 -07001464 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001465 return DRM_NO_ERROR;
1466 }
1467
1468 case PREAD:
1469 {
Steve Block3856b092011-10-20 11:56:00 +01001470 ALOGV("BnDrmManagerService::onTransact :READ");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001471 CHECK_INTERFACE(IDrmManagerService, data, reply);
1472
1473 const int uniqueId = data.readInt32();
1474
1475 DecryptHandle handle;
Gloria Wang1da9aa62011-03-20 10:25:16 -07001476 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001477
1478 const int numBytes = data.readInt32();
1479 char* buffer = new char[numBytes];
1480
Gloria Wanga2cd44c2010-11-19 15:19:36 -08001481 const off64_t offset = data.readInt64();
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001482
1483 ssize_t result = pread(uniqueId, &handle, buffer, numBytes, offset);
1484 reply->writeInt32(result);
1485 if (0 < result) {
1486 reply->write(buffer, result);
1487 }
1488
Gloria Wang1da9aa62011-03-20 10:25:16 -07001489 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001490 delete [] buffer, buffer = NULL;
1491 return DRM_NO_ERROR;
1492 }
1493
1494 default:
1495 return BBinder::onTransact(code, data, reply, flags);
1496 }
1497}
1498