blob: 5c84bb5b09926d3d647e847ddb095d6f39776b9d [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 +0900156DrmConstraints* BpDrmManagerService::getConstraints(
157 int uniqueId, const String8* path, const int action) {
Steve Block3856b092011-10-20 11:56:00 +0100158 ALOGV("Get Constraints");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900159 Parcel data, reply;
160
161 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
162 data.writeInt32(uniqueId);
163 data.writeString8(*path);
164 data.writeInt32(action);
165
166 remote()->transact(GET_CONSTRAINTS_FROM_CONTENT, data, &reply);
167
168 DrmConstraints* drmConstraints = NULL;
169 if (0 != reply.dataAvail()) {
170 //Filling Drm Constraints
171 drmConstraints = new DrmConstraints();
172
173 const int size = reply.readInt32();
174 for (int index = 0; index < size; ++index) {
175 const String8 key(reply.readString8());
176 const int bufferSize = reply.readInt32();
177 char* data = NULL;
178 if (0 < bufferSize) {
179 data = new char[bufferSize];
180 reply.read(data, bufferSize);
181 }
182 drmConstraints->put(&key, data);
183 }
184 }
185 return drmConstraints;
186}
187
Takeshi Aimi34738462010-11-16 13:56:11 +0900188DrmMetadata* BpDrmManagerService::getMetadata(int uniqueId, const String8* path) {
Steve Block3856b092011-10-20 11:56:00 +0100189 ALOGV("Get Metadata");
Takeshi Aimi34738462010-11-16 13:56:11 +0900190 Parcel data, reply;
191 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
192 data.writeInt32(uniqueId);
193
194 DrmMetadata* drmMetadata = NULL;
195 data.writeString8(*path);
196 remote()->transact(GET_METADATA_FROM_CONTENT, data, &reply);
197
198 if (0 != reply.dataAvail()) {
199 //Filling Drm Metadata
200 drmMetadata = new DrmMetadata();
201
202 const int size = reply.readInt32();
203 for (int index = 0; index < size; ++index) {
204 const String8 key(reply.readString8());
205 const int bufferSize = reply.readInt32();
206 char* data = NULL;
207 if (0 < bufferSize) {
208 data = new char[bufferSize];
209 reply.read(data, bufferSize);
210 }
211 drmMetadata->put(&key, data);
212 }
213 }
214 return drmMetadata;
215}
216
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900217bool BpDrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) {
Steve Block3856b092011-10-20 11:56:00 +0100218 ALOGV("Can Handle");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900219 Parcel data, reply;
220
221 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
222 data.writeInt32(uniqueId);
223
224 data.writeString8(path);
225 data.writeString8(mimeType);
226
227 remote()->transact(CAN_HANDLE, data, &reply);
228
229 return static_cast<bool>(reply.readInt32());
230}
231
232DrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) {
Steve Block3856b092011-10-20 11:56:00 +0100233 ALOGV("Process DRM Info");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900234 Parcel data, reply;
235
236 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
237 data.writeInt32(uniqueId);
238
239 //Filling DRM info
240 data.writeInt32(drmInfo->getInfoType());
241 const DrmBuffer dataBuffer = drmInfo->getData();
242 const int dataBufferSize = dataBuffer.length;
243 data.writeInt32(dataBufferSize);
244 if (0 < dataBufferSize) {
245 data.write(dataBuffer.data, dataBufferSize);
246 }
247 data.writeString8(drmInfo->getMimeType());
248
249 data.writeInt32(drmInfo->getCount());
250 DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
251
252 while (keyIt.hasNext()) {
253 const String8 key = keyIt.next();
254 data.writeString8(key);
255 const String8 value = drmInfo->get(key);
256 data.writeString8((value == String8("")) ? String8("NULL") : value);
257 }
258
259 remote()->transact(PROCESS_DRM_INFO, data, &reply);
260
261 DrmInfoStatus* drmInfoStatus = NULL;
262 if (0 != reply.dataAvail()) {
263 //Filling DRM Info Status
264 const int statusCode = reply.readInt32();
Takeshi Aimie943f842010-10-08 23:05:49 +0900265 const int infoType = reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900266 const String8 mimeType = reply.readString8();
267
268 DrmBuffer* drmBuffer = NULL;
269 if (0 != reply.dataAvail()) {
270 const int bufferSize = reply.readInt32();
271 char* data = NULL;
272 if (0 < bufferSize) {
273 data = new char[bufferSize];
274 reply.read(data, bufferSize);
275 }
276 drmBuffer = new DrmBuffer(data, bufferSize);
277 }
Takeshi Aimie943f842010-10-08 23:05:49 +0900278 drmInfoStatus = new DrmInfoStatus(statusCode, infoType, drmBuffer, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900279 }
280 return drmInfoStatus;
281}
282
283DrmInfo* BpDrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) {
Steve Block3856b092011-10-20 11:56:00 +0100284 ALOGV("Acquire DRM Info");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900285 Parcel data, reply;
286
287 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
288 data.writeInt32(uniqueId);
289
290 //Filling DRM Info Request
291 data.writeInt32(drmInforequest->getInfoType());
292 data.writeString8(drmInforequest->getMimeType());
293
294 data.writeInt32(drmInforequest->getCount());
295 DrmInfoRequest::KeyIterator keyIt = drmInforequest->keyIterator();
296
297 while (keyIt.hasNext()) {
298 const String8 key = keyIt.next();
299 data.writeString8(key);
300 const String8 value = drmInforequest->get(key);
301 data.writeString8((value == String8("")) ? String8("NULL") : value);
302 }
303
304 remote()->transact(ACQUIRE_DRM_INFO, data, &reply);
305
306 DrmInfo* drmInfo = NULL;
307 if (0 != reply.dataAvail()) {
308 //Filling DRM Info
309 const int infoType = reply.readInt32();
310 const int bufferSize = reply.readInt32();
311 char* data = NULL;
312
313 if (0 < bufferSize) {
314 data = new char[bufferSize];
315 reply.read(data, bufferSize);
316 }
317 drmInfo = new DrmInfo(infoType, DrmBuffer(data, bufferSize), reply.readString8());
318
319 const int size = reply.readInt32();
320 for (int index = 0; index < size; ++index) {
321 const String8 key(reply.readString8());
322 const String8 value(reply.readString8());
323 drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
324 }
325 }
326 return drmInfo;
327}
328
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900329status_t BpDrmManagerService::saveRights(
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900330 int uniqueId, const DrmRights& drmRights,
331 const String8& rightsPath, const String8& contentPath) {
Steve Block3856b092011-10-20 11:56:00 +0100332 ALOGV("Save Rights");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900333 Parcel data, reply;
334
335 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
336 data.writeInt32(uniqueId);
337
338 //Filling Drm Rights
339 const DrmBuffer dataBuffer = drmRights.getData();
340 data.writeInt32(dataBuffer.length);
341 data.write(dataBuffer.data, dataBuffer.length);
342
343 const String8 mimeType = drmRights.getMimeType();
344 data.writeString8((mimeType == String8("")) ? String8("NULL") : mimeType);
345
346 const String8 accountId = drmRights.getAccountId();
347 data.writeString8((accountId == String8("")) ? String8("NULL") : accountId);
348
349 const String8 subscriptionId = drmRights.getSubscriptionId();
350 data.writeString8((subscriptionId == String8("")) ? String8("NULL") : subscriptionId);
351
352 data.writeString8((rightsPath == String8("")) ? String8("NULL") : rightsPath);
353 data.writeString8((contentPath == String8("")) ? String8("NULL") : contentPath);
354
355 remote()->transact(SAVE_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900356 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900357}
358
359String8 BpDrmManagerService::getOriginalMimeType(int uniqueId, const String8& path) {
Steve Block3856b092011-10-20 11:56:00 +0100360 ALOGV("Get Original MimeType");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900361 Parcel data, reply;
362
363 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
364 data.writeInt32(uniqueId);
365 data.writeString8(path);
366
367 remote()->transact(GET_ORIGINAL_MIMETYPE, data, &reply);
368 return reply.readString8();
369}
370
371int BpDrmManagerService::getDrmObjectType(
372 int uniqueId, const String8& path, const String8& mimeType) {
Steve Block3856b092011-10-20 11:56:00 +0100373 ALOGV("Get Drm object type");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900374 Parcel data, reply;
375
376 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
377 data.writeInt32(uniqueId);
378 data.writeString8(path);
379 data.writeString8(mimeType);
380
381 remote()->transact(GET_DRM_OBJECT_TYPE, data, &reply);
382
383 return reply.readInt32();
384}
385
386int BpDrmManagerService::checkRightsStatus(int uniqueId, const String8& path, int action) {
Steve Block3856b092011-10-20 11:56:00 +0100387 ALOGV("checkRightsStatus");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900388 Parcel data, reply;
389
390 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
391 data.writeInt32(uniqueId);
392 data.writeString8(path);
393 data.writeInt32(action);
394
395 remote()->transact(CHECK_RIGHTS_STATUS, data, &reply);
396
397 return reply.readInt32();
398}
399
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900400status_t BpDrmManagerService::consumeRights(
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900401 int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) {
Steve Block3856b092011-10-20 11:56:00 +0100402 ALOGV("consumeRights");
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900403 Parcel data, reply;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900404
405 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
406 data.writeInt32(uniqueId);
407
Gloria Wangc10ce332011-06-15 10:27:52 -0700408 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900409
410 data.writeInt32(action);
411 data.writeInt32(static_cast< int>(reserve));
412
413 remote()->transact(CONSUME_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900414 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900415}
416
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900417status_t BpDrmManagerService::setPlaybackStatus(
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800418 int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) {
Steve Block3856b092011-10-20 11:56:00 +0100419 ALOGV("setPlaybackStatus");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900420 Parcel data, reply;
421
422 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
423 data.writeInt32(uniqueId);
424
Gloria Wangc10ce332011-06-15 10:27:52 -0700425 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900426
427 data.writeInt32(playbackStatus);
Gloria Wang2ed8a922011-01-19 15:38:16 -0800428 data.writeInt64(position);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900429
430 remote()->transact(SET_PLAYBACK_STATUS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900431 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900432}
433
434bool BpDrmManagerService::validateAction(
435 int uniqueId, const String8& path,
436 int action, const ActionDescription& description) {
Steve Block3856b092011-10-20 11:56:00 +0100437 ALOGV("validateAction");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900438 Parcel data, reply;
439
440 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
441 data.writeInt32(uniqueId);
442 data.writeString8(path);
443 data.writeInt32(action);
444 data.writeInt32(description.outputType);
445 data.writeInt32(description.configuration);
446
447 remote()->transact(VALIDATE_ACTION, data, &reply);
448
449 return static_cast<bool>(reply.readInt32());
450}
451
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900452status_t BpDrmManagerService::removeRights(int uniqueId, const String8& path) {
Steve Block3856b092011-10-20 11:56:00 +0100453 ALOGV("removeRights");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900454 Parcel data, reply;
455
456 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
457 data.writeInt32(uniqueId);
458 data.writeString8(path);
459
460 remote()->transact(REMOVE_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900461 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900462}
463
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900464status_t BpDrmManagerService::removeAllRights(int uniqueId) {
Steve Block3856b092011-10-20 11:56:00 +0100465 ALOGV("removeAllRights");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900466 Parcel data, reply;
467
468 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
469 data.writeInt32(uniqueId);
470
471 remote()->transact(REMOVE_ALL_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900472 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900473}
474
475int BpDrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) {
Steve Block3856b092011-10-20 11:56:00 +0100476 ALOGV("openConvertSession");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900477 Parcel data, reply;
478
479 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
480 data.writeInt32(uniqueId);
481 data.writeString8(mimeType);
482
483 remote()->transact(OPEN_CONVERT_SESSION, data, &reply);
484 return reply.readInt32();
485}
486
487DrmConvertedStatus* BpDrmManagerService::convertData(
488 int uniqueId, int convertId, const DrmBuffer* inputData) {
Steve Block3856b092011-10-20 11:56:00 +0100489 ALOGV("convertData");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900490 Parcel data, reply;
491
492 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
493 data.writeInt32(uniqueId);
494 data.writeInt32(convertId);
495 data.writeInt32(inputData->length);
496 data.write(inputData->data, inputData->length);
497
498 remote()->transact(CONVERT_DATA, data, &reply);
499
500 DrmConvertedStatus* drmConvertedStatus = NULL;
501
502 if (0 != reply.dataAvail()) {
503 //Filling DRM Converted Status
504 const int statusCode = reply.readInt32();
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800505 const off64_t offset = reply.readInt64();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900506
507 DrmBuffer* convertedData = NULL;
508 if (0 != reply.dataAvail()) {
509 const int bufferSize = reply.readInt32();
510 char* data = NULL;
511 if (0 < bufferSize) {
512 data = new char[bufferSize];
513 reply.read(data, bufferSize);
514 }
515 convertedData = new DrmBuffer(data, bufferSize);
516 }
517 drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
518 }
519 return drmConvertedStatus;
520}
521
522DrmConvertedStatus* BpDrmManagerService::closeConvertSession(int uniqueId, int convertId) {
Steve Block3856b092011-10-20 11:56:00 +0100523 ALOGV("closeConvertSession");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900524 Parcel data, reply;
525
526 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
527 data.writeInt32(uniqueId);
528 data.writeInt32(convertId);
529
530 remote()->transact(CLOSE_CONVERT_SESSION, data, &reply);
531
532 DrmConvertedStatus* drmConvertedStatus = NULL;
533
534 if (0 != reply.dataAvail()) {
535 //Filling DRM Converted Status
536 const int statusCode = reply.readInt32();
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800537 const off64_t offset = reply.readInt64();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900538
539 DrmBuffer* convertedData = NULL;
540 if (0 != reply.dataAvail()) {
541 const int bufferSize = reply.readInt32();
542 char* data = NULL;
543 if (0 < bufferSize) {
544 data = new char[bufferSize];
545 reply.read(data, bufferSize);
546 }
547 convertedData = new DrmBuffer(data, bufferSize);
548 }
549 drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
550 }
551 return drmConvertedStatus;
552}
553
554status_t BpDrmManagerService::getAllSupportInfo(
555 int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) {
Steve Block3856b092011-10-20 11:56:00 +0100556 ALOGV("Get All Support Info");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900557 Parcel data, reply;
558
559 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
560 data.writeInt32(uniqueId);
561
562 remote()->transact(GET_ALL_SUPPORT_INFO, data, &reply);
563
564 //Filling DRM Support Info
565 const int arraySize = reply.readInt32();
566 if (0 < arraySize) {
567 *drmSupportInfoArray = new DrmSupportInfo[arraySize];
568
569 for (int index = 0; index < arraySize; ++index) {
570 DrmSupportInfo drmSupportInfo;
571
572 const int fileSuffixVectorSize = reply.readInt32();
573 for (int i = 0; i < fileSuffixVectorSize; ++i) {
574 drmSupportInfo.addFileSuffix(reply.readString8());
575 }
576
577 const int mimeTypeVectorSize = reply.readInt32();
578 for (int i = 0; i < mimeTypeVectorSize; ++i) {
579 drmSupportInfo.addMimeType(reply.readString8());
580 }
581
582 drmSupportInfo.setDescription(reply.readString8());
583 (*drmSupportInfoArray)[index] = drmSupportInfo;
584 }
585 }
586 *length = arraySize;
587 return reply.readInt32();
588}
589
590DecryptHandle* BpDrmManagerService::openDecryptSession(
James Dong9d2f3862012-01-10 08:24:37 -0800591 int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) {
Steve Block3856b092011-10-20 11:56:00 +0100592 ALOGV("Entering BpDrmManagerService::openDecryptSession");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900593 Parcel data, reply;
594
Takeshi Aimie943f842010-10-08 23:05:49 +0900595 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900596 data.writeInt32(uniqueId);
597 data.writeFileDescriptor(fd);
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800598 data.writeInt64(offset);
599 data.writeInt64(length);
James Dong9d2f3862012-01-10 08:24:37 -0800600 String8 mimeType;
601 if (mime) {
602 mimeType = mime;
603 }
604 data.writeString8(mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900605
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900606 remote()->transact(OPEN_DECRYPT_SESSION, data, &reply);
607
608 DecryptHandle* handle = NULL;
609 if (0 != reply.dataAvail()) {
610 handle = new DecryptHandle();
Gloria Wang1da9aa62011-03-20 10:25:16 -0700611 readDecryptHandleFromParcelData(handle, reply);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900612 }
613 return handle;
614}
615
James Dong9d2f3862012-01-10 08:24:37 -0800616DecryptHandle* BpDrmManagerService::openDecryptSession(
617 int uniqueId, const char* uri, const char* mime) {
618
619 ALOGV("Entering BpDrmManagerService::openDecryptSession: mime=%s", mime? mime: "NULL");
Takeshi Aimie943f842010-10-08 23:05:49 +0900620 Parcel data, reply;
621
622 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
623 data.writeInt32(uniqueId);
624 data.writeString8(String8(uri));
James Dong9d2f3862012-01-10 08:24:37 -0800625 String8 mimeType;
626 if (mime) {
627 mimeType = mime;
628 }
629 data.writeString8(mimeType);
Takeshi Aimie943f842010-10-08 23:05:49 +0900630
631 remote()->transact(OPEN_DECRYPT_SESSION_FROM_URI, data, &reply);
632
633 DecryptHandle* handle = NULL;
634 if (0 != reply.dataAvail()) {
635 handle = new DecryptHandle();
Gloria Wang1da9aa62011-03-20 10:25:16 -0700636 readDecryptHandleFromParcelData(handle, reply);
Takeshi Aimie943f842010-10-08 23:05:49 +0900637 } else {
Steve Block3856b092011-10-20 11:56:00 +0100638 ALOGV("no decryptHandle is generated in service side");
Takeshi Aimie943f842010-10-08 23:05:49 +0900639 }
640 return handle;
641}
642
Kei Takahashicba7b322012-01-18 17:10:19 +0900643DecryptHandle* BpDrmManagerService::openDecryptSession(
644 int uniqueId, const DrmBuffer& buf, const String8& mimeType) {
645 ALOGV("Entering BpDrmManagerService::openDecryptSession");
646 Parcel data, reply;
647
648 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
649 data.writeInt32(uniqueId);
650 if (buf.data != NULL && buf.length > 0) {
651 data.writeInt32(buf.length);
652 data.write(buf.data, buf.length);
653 } else {
654 data.writeInt32(0);
655 }
656 data.writeString8(mimeType);
657
658 remote()->transact(OPEN_DECRYPT_SESSION_FOR_STREAMING, data, &reply);
659
660 DecryptHandle* handle = NULL;
661 if (0 != reply.dataAvail()) {
662 handle = new DecryptHandle();
663 readDecryptHandleFromParcelData(handle, reply);
664 } else {
665 ALOGV("no decryptHandle is generated in service side");
666 }
667 return handle;
668}
669
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900670status_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) {
Steve Block3856b092011-10-20 11:56:00 +0100671 ALOGV("closeDecryptSession");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900672 Parcel data, reply;
673
674 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
675 data.writeInt32(uniqueId);
676
Gloria Wangc10ce332011-06-15 10:27:52 -0700677 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900678
679 remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply);
680
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900681 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900682}
683
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900684status_t BpDrmManagerService::initializeDecryptUnit(
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900685 int uniqueId, DecryptHandle* decryptHandle,
686 int decryptUnitId, const DrmBuffer* headerInfo) {
Steve Block3856b092011-10-20 11:56:00 +0100687 ALOGV("initializeDecryptUnit");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900688 Parcel data, reply;
689
690 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
691 data.writeInt32(uniqueId);
692
Gloria Wangc10ce332011-06-15 10:27:52 -0700693 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900694
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900695 data.writeInt32(decryptUnitId);
696
697 data.writeInt32(headerInfo->length);
698 data.write(headerInfo->data, headerInfo->length);
699
700 remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900701 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900702}
703
704status_t BpDrmManagerService::decrypt(
705 int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900706 const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) {
Steve Block3856b092011-10-20 11:56:00 +0100707 ALOGV("decrypt");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900708 Parcel data, reply;
709
710 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
711 data.writeInt32(uniqueId);
712
Gloria Wangc10ce332011-06-15 10:27:52 -0700713 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900714
715 data.writeInt32(decryptUnitId);
716 data.writeInt32((*decBuffer)->length);
717
718 data.writeInt32(encBuffer->length);
719 data.write(encBuffer->data, encBuffer->length);
720
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900721 if (NULL != IV) {
722 data.writeInt32(IV->length);
723 data.write(IV->data, IV->length);
724 }
725
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900726 remote()->transact(DECRYPT, data, &reply);
727
728 const status_t status = reply.readInt32();
Steve Block3856b092011-10-20 11:56:00 +0100729 ALOGV("Return value of decrypt() is %d", status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900730
731 const int size = reply.readInt32();
732 (*decBuffer)->length = size;
733 reply.read((void *)(*decBuffer)->data, size);
734
735 return status;
736}
737
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900738status_t BpDrmManagerService::finalizeDecryptUnit(
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900739 int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) {
Steve Block3856b092011-10-20 11:56:00 +0100740 ALOGV("finalizeDecryptUnit");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900741 Parcel data, reply;
742
743 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
744 data.writeInt32(uniqueId);
745
Gloria Wangc10ce332011-06-15 10:27:52 -0700746 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900747
748 data.writeInt32(decryptUnitId);
749
750 remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900751 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900752}
753
754ssize_t BpDrmManagerService::pread(
755 int uniqueId, DecryptHandle* decryptHandle, void* buffer,
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800756 ssize_t numBytes, off64_t offset) {
Steve Block3856b092011-10-20 11:56:00 +0100757 ALOGV("read");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900758 Parcel data, reply;
759 int result;
760
761 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
762 data.writeInt32(uniqueId);
763
Gloria Wangc10ce332011-06-15 10:27:52 -0700764 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900765
766 data.writeInt32(numBytes);
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800767 data.writeInt64(offset);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900768
769 remote()->transact(PREAD, data, &reply);
770 result = reply.readInt32();
771 if (0 < result) {
772 reply.read(buffer, result);
773 }
774 return result;
775}
776
777IMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService");
778
779status_t BnDrmManagerService::onTransact(
780 uint32_t code, const Parcel& data,
781 Parcel* reply, uint32_t flags) {
Steve Block3856b092011-10-20 11:56:00 +0100782 ALOGV("Entering BnDrmManagerService::onTransact with code %d", code);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900783
784 switch (code) {
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900785 case ADD_UNIQUEID:
786 {
Steve Block3856b092011-10-20 11:56:00 +0100787 ALOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID");
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900788 CHECK_INTERFACE(IDrmManagerService, data, reply);
789 int uniqueId = addUniqueId(data.readInt32());
790 reply->writeInt32(uniqueId);
791 return DRM_NO_ERROR;
792 }
793
794 case REMOVE_UNIQUEID:
795 {
Steve Block3856b092011-10-20 11:56:00 +0100796 ALOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID");
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900797 CHECK_INTERFACE(IDrmManagerService, data, reply);
798 removeUniqueId(data.readInt32());
799 return DRM_NO_ERROR;
800 }
801
Takeshi Aimie943f842010-10-08 23:05:49 +0900802 case ADD_CLIENT:
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900803 {
Steve Block3856b092011-10-20 11:56:00 +0100804 ALOGV("BnDrmManagerService::onTransact :ADD_CLIENT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900805 CHECK_INTERFACE(IDrmManagerService, data, reply);
Takeshi Aimie943f842010-10-08 23:05:49 +0900806 addClient(data.readInt32());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900807 return DRM_NO_ERROR;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900808 }
809
Takeshi Aimie943f842010-10-08 23:05:49 +0900810 case REMOVE_CLIENT:
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900811 {
Steve Block3856b092011-10-20 11:56:00 +0100812 ALOGV("BnDrmManagerService::onTransact :REMOVE_CLIENT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900813 CHECK_INTERFACE(IDrmManagerService, data, reply);
Takeshi Aimie943f842010-10-08 23:05:49 +0900814 removeClient(data.readInt32());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900815 return DRM_NO_ERROR;
816 }
817
818 case SET_DRM_SERVICE_LISTENER:
819 {
Steve Block3856b092011-10-20 11:56:00 +0100820 ALOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900821 CHECK_INTERFACE(IDrmManagerService, data, reply);
822
823 const int uniqueId = data.readInt32();
824 const sp<IDrmServiceListener> drmServiceListener
825 = interface_cast<IDrmServiceListener> (data.readStrongBinder());
826
827 status_t status = setDrmServiceListener(uniqueId, drmServiceListener);
828
829 reply->writeInt32(status);
830 return DRM_NO_ERROR;
831 }
832
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900833 case GET_CONSTRAINTS_FROM_CONTENT:
834 {
Steve Block3856b092011-10-20 11:56:00 +0100835 ALOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900836 CHECK_INTERFACE(IDrmManagerService, data, reply);
837
838 const int uniqueId = data.readInt32();
839 const String8 path = data.readString8();
840
Gloria Wang197f0472011-08-01 10:31:24 -0700841 DrmConstraints* drmConstraints
842 = getConstraints(uniqueId, &path, data.readInt32());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900843
844 if (NULL != drmConstraints) {
845 //Filling DRM Constraints contents
846 reply->writeInt32(drmConstraints->getCount());
847
848 DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator();
849 while (keyIt.hasNext()) {
850 const String8 key = keyIt.next();
851 reply->writeString8(key);
852 const char* value = drmConstraints->getAsByteArray(&key);
853 int bufferSize = 0;
854 if (NULL != value) {
855 bufferSize = strlen(value);
856 }
857 reply->writeInt32(bufferSize + 1);
858 reply->write(value, bufferSize + 1);
859 }
860 }
861 delete drmConstraints; drmConstraints = NULL;
862 return DRM_NO_ERROR;
863 }
864
Takeshi Aimi34738462010-11-16 13:56:11 +0900865 case GET_METADATA_FROM_CONTENT:
866 {
Steve Block3856b092011-10-20 11:56:00 +0100867 ALOGV("BnDrmManagerService::onTransact :GET_METADATA_FROM_CONTENT");
Takeshi Aimi34738462010-11-16 13:56:11 +0900868 CHECK_INTERFACE(IDrmManagerService, data, reply);
869
870 const int uniqueId = data.readInt32();
871 const String8 path = data.readString8();
872
873 DrmMetadata* drmMetadata = getMetadata(uniqueId, &path);
874 if (NULL != drmMetadata) {
875 //Filling DRM Metadata contents
876 reply->writeInt32(drmMetadata->getCount());
877
878 DrmMetadata::KeyIterator keyIt = drmMetadata->keyIterator();
879 while (keyIt.hasNext()) {
880 const String8 key = keyIt.next();
881 reply->writeString8(key);
882 const char* value = drmMetadata->getAsByteArray(&key);
883 int bufferSize = 0;
884 if (NULL != value) {
885 bufferSize = strlen(value);
886 reply->writeInt32(bufferSize + 1);
887 reply->write(value, bufferSize + 1);
888 } else {
889 reply->writeInt32(0);
890 }
891 }
892 }
893 delete drmMetadata; drmMetadata = NULL;
894 return NO_ERROR;
895 }
896
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900897 case CAN_HANDLE:
898 {
Steve Block3856b092011-10-20 11:56:00 +0100899 ALOGV("BnDrmManagerService::onTransact :CAN_HANDLE");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900900 CHECK_INTERFACE(IDrmManagerService, data, reply);
901
902 const int uniqueId = data.readInt32();
903 const String8 path = data.readString8();
904 const String8 mimeType = data.readString8();
905
906 bool result = canHandle(uniqueId, path, mimeType);
907
908 reply->writeInt32(result);
909 return DRM_NO_ERROR;
910 }
911
912 case PROCESS_DRM_INFO:
913 {
Steve Block3856b092011-10-20 11:56:00 +0100914 ALOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900915 CHECK_INTERFACE(IDrmManagerService, data, reply);
916
917 const int uniqueId = data.readInt32();
918
919 //Filling DRM info
920 const int infoType = data.readInt32();
921 const int bufferSize = data.readInt32();
922 char* buffer = NULL;
923 if (0 < bufferSize) {
924 buffer = (char *)data.readInplace(bufferSize);
925 }
926 const DrmBuffer drmBuffer(buffer, bufferSize);
927 DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8());
928
929 const int size = data.readInt32();
930 for (int index = 0; index < size; ++index) {
931 const String8 key(data.readString8());
932 const String8 value(data.readString8());
933 drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
934 }
935
936 DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo);
937
938 if (NULL != drmInfoStatus) {
939 //Filling DRM Info Status contents
940 reply->writeInt32(drmInfoStatus->statusCode);
Takeshi Aimie943f842010-10-08 23:05:49 +0900941 reply->writeInt32(drmInfoStatus->infoType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900942 reply->writeString8(drmInfoStatus->mimeType);
943
944 if (NULL != drmInfoStatus->drmBuffer) {
945 const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer;
946 const int bufferSize = drmBuffer->length;
947 reply->writeInt32(bufferSize);
948 if (0 < bufferSize) {
949 reply->write(drmBuffer->data, bufferSize);
950 }
951 delete [] drmBuffer->data;
952 delete drmBuffer; drmBuffer = NULL;
953 }
954 }
955 delete drmInfo; drmInfo = NULL;
956 delete drmInfoStatus; drmInfoStatus = NULL;
957 return DRM_NO_ERROR;
958 }
959
960 case ACQUIRE_DRM_INFO:
961 {
Steve Block3856b092011-10-20 11:56:00 +0100962 ALOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900963 CHECK_INTERFACE(IDrmManagerService, data, reply);
964
965 const int uniqueId = data.readInt32();
966
967 //Filling DRM info Request
Gloria Wang197f0472011-08-01 10:31:24 -0700968 const int infoType = data.readInt32();
969 const String8 mimeType = data.readString8();
970 DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(infoType, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900971
972 const int size = data.readInt32();
973 for (int index = 0; index < size; ++index) {
974 const String8 key(data.readString8());
975 const String8 value(data.readString8());
976 drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value);
977 }
978
979 DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest);
980
981 if (NULL != drmInfo) {
982 //Filling DRM Info
983 const DrmBuffer drmBuffer = drmInfo->getData();
984 reply->writeInt32(drmInfo->getInfoType());
985
986 const int bufferSize = drmBuffer.length;
987 reply->writeInt32(bufferSize);
988 if (0 < bufferSize) {
989 reply->write(drmBuffer.data, bufferSize);
990 }
991 reply->writeString8(drmInfo->getMimeType());
992 reply->writeInt32(drmInfo->getCount());
993
994 DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
995 while (keyIt.hasNext()) {
996 const String8 key = keyIt.next();
997 reply->writeString8(key);
998 const String8 value = drmInfo->get(key);
999 reply->writeString8((value == String8("")) ? String8("NULL") : value);
1000 }
1001 delete [] drmBuffer.data;
1002 }
1003 delete drmInfoRequest; drmInfoRequest = NULL;
1004 delete drmInfo; drmInfo = NULL;
1005 return DRM_NO_ERROR;
1006 }
1007
1008 case SAVE_RIGHTS:
1009 {
Steve Block3856b092011-10-20 11:56:00 +01001010 ALOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001011 CHECK_INTERFACE(IDrmManagerService, data, reply);
1012
1013 const int uniqueId = data.readInt32();
1014
1015 //Filling DRM Rights
1016 const int bufferSize = data.readInt32();
1017 const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1018
1019 const String8 mimeType(data.readString8());
1020 const String8 accountId(data.readString8());
1021 const String8 subscriptionId(data.readString8());
1022 const String8 rightsPath(data.readString8());
1023 const String8 contentPath(data.readString8());
1024
1025 DrmRights drmRights(drmBuffer,
1026 ((mimeType == String8("NULL")) ? String8("") : mimeType),
1027 ((accountId == String8("NULL")) ? String8("") : accountId),
1028 ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId));
1029
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001030 const status_t status = saveRights(uniqueId, drmRights,
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001031 ((rightsPath == String8("NULL")) ? String8("") : rightsPath),
1032 ((contentPath == String8("NULL")) ? String8("") : contentPath));
1033
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001034 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001035 return DRM_NO_ERROR;
1036 }
1037
1038 case GET_ORIGINAL_MIMETYPE:
1039 {
Steve Block3856b092011-10-20 11:56:00 +01001040 ALOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001041 CHECK_INTERFACE(IDrmManagerService, data, reply);
1042
Gloria Wang197f0472011-08-01 10:31:24 -07001043 const int uniqueId = data.readInt32();
1044 const String8 path = data.readString8();
1045 const String8 originalMimeType = getOriginalMimeType(uniqueId, path);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001046
1047 reply->writeString8(originalMimeType);
1048 return DRM_NO_ERROR;
1049 }
1050
1051 case GET_DRM_OBJECT_TYPE:
1052 {
Steve Block3856b092011-10-20 11:56:00 +01001053 ALOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001054 CHECK_INTERFACE(IDrmManagerService, data, reply);
1055
Gloria Wang197f0472011-08-01 10:31:24 -07001056 const int uniqueId = data.readInt32();
1057 const String8 path = data.readString8();
1058 const String8 mimeType = data.readString8();
1059 const int drmObjectType = getDrmObjectType(uniqueId, path, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001060
1061 reply->writeInt32(drmObjectType);
1062 return DRM_NO_ERROR;
1063 }
1064
1065 case CHECK_RIGHTS_STATUS:
1066 {
Steve Block3856b092011-10-20 11:56:00 +01001067 ALOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001068 CHECK_INTERFACE(IDrmManagerService, data, reply);
1069
Gloria Wang197f0472011-08-01 10:31:24 -07001070 const int uniqueId = data.readInt32();
1071 const String8 path = data.readString8();
1072 const int action = data.readInt32();
1073 const int result = checkRightsStatus(uniqueId, path, action);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001074
1075 reply->writeInt32(result);
1076 return DRM_NO_ERROR;
1077 }
1078
1079 case CONSUME_RIGHTS:
1080 {
Steve Block3856b092011-10-20 11:56:00 +01001081 ALOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001082 CHECK_INTERFACE(IDrmManagerService, data, reply);
1083
1084 const int uniqueId = data.readInt32();
1085
1086 DecryptHandle handle;
Gloria Wang1da9aa62011-03-20 10:25:16 -07001087 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001088
Gloria Wang197f0472011-08-01 10:31:24 -07001089 const int action = data.readInt32();
1090 const bool reserve = static_cast<bool>(data.readInt32());
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001091 const status_t status
Gloria Wang197f0472011-08-01 10:31:24 -07001092 = consumeRights(uniqueId, &handle, action, reserve);
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001093 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001094
Gloria Wang1da9aa62011-03-20 10:25:16 -07001095 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001096 return DRM_NO_ERROR;
1097 }
1098
1099 case SET_PLAYBACK_STATUS:
1100 {
Steve Block3856b092011-10-20 11:56:00 +01001101 ALOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001102 CHECK_INTERFACE(IDrmManagerService, data, reply);
1103
1104 const int uniqueId = data.readInt32();
1105
1106 DecryptHandle handle;
Gloria Wang1da9aa62011-03-20 10:25:16 -07001107 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001108
Gloria Wang197f0472011-08-01 10:31:24 -07001109 const int playbackStatus = data.readInt32();
1110 const int64_t position = data.readInt64();
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001111 const status_t status
Gloria Wang197f0472011-08-01 10:31:24 -07001112 = setPlaybackStatus(uniqueId, &handle, playbackStatus, position);
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001113 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001114
Gloria Wang1da9aa62011-03-20 10:25:16 -07001115 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001116 return DRM_NO_ERROR;
1117 }
1118
1119 case VALIDATE_ACTION:
1120 {
Steve Block3856b092011-10-20 11:56:00 +01001121 ALOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001122 CHECK_INTERFACE(IDrmManagerService, data, reply);
1123
Gloria Wang197f0472011-08-01 10:31:24 -07001124 const int uniqueId = data.readInt32();
1125 const String8 path = data.readString8();
1126 const int action = data.readInt32();
1127 const int outputType = data.readInt32();
1128 const int configuration = data.readInt32();
1129 bool result = validateAction(uniqueId, path, action,
1130 ActionDescription(outputType, configuration));
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001131
1132 reply->writeInt32(result);
1133 return DRM_NO_ERROR;
1134 }
1135
1136 case REMOVE_RIGHTS:
1137 {
Steve Block3856b092011-10-20 11:56:00 +01001138 ALOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001139 CHECK_INTERFACE(IDrmManagerService, data, reply);
1140
Gloria Wang197f0472011-08-01 10:31:24 -07001141 int uniqueId = data.readInt32();
1142 String8 path = data.readString8();
1143 const status_t status = removeRights(uniqueId, path);
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001144 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001145
1146 return DRM_NO_ERROR;
1147 }
1148
1149 case REMOVE_ALL_RIGHTS:
1150 {
Steve Block3856b092011-10-20 11:56:00 +01001151 ALOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001152 CHECK_INTERFACE(IDrmManagerService, data, reply);
1153
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001154 const status_t status = removeAllRights(data.readInt32());
1155 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001156
1157 return DRM_NO_ERROR;
1158 }
1159
1160 case OPEN_CONVERT_SESSION:
1161 {
Steve Block3856b092011-10-20 11:56:00 +01001162 ALOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001163 CHECK_INTERFACE(IDrmManagerService, data, reply);
1164
Gloria Wang197f0472011-08-01 10:31:24 -07001165 const int uniqueId = data.readInt32();
1166 const String8 mimeType = data.readString8();
1167 const int convertId = openConvertSession(uniqueId, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001168
1169 reply->writeInt32(convertId);
1170 return DRM_NO_ERROR;
1171 }
1172
1173 case CONVERT_DATA:
1174 {
Steve Block3856b092011-10-20 11:56:00 +01001175 ALOGV("BnDrmManagerService::onTransact :CONVERT_DATA");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001176 CHECK_INTERFACE(IDrmManagerService, data, reply);
1177
1178 const int uniqueId = data.readInt32();
1179 const int convertId = data.readInt32();
1180
1181 //Filling input data
1182 const int bufferSize = data.readInt32();
1183 DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1184
1185 DrmConvertedStatus* drmConvertedStatus = convertData(uniqueId, convertId, inputData);
1186
1187 if (NULL != drmConvertedStatus) {
1188 //Filling Drm Converted Ststus
1189 reply->writeInt32(drmConvertedStatus->statusCode);
Gloria Wanga2cd44c2010-11-19 15:19:36 -08001190 reply->writeInt64(drmConvertedStatus->offset);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001191
1192 if (NULL != drmConvertedStatus->convertedData) {
1193 const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
1194 const int bufferSize = convertedData->length;
1195 reply->writeInt32(bufferSize);
1196 if (0 < bufferSize) {
1197 reply->write(convertedData->data, bufferSize);
1198 }
1199 delete [] convertedData->data;
1200 delete convertedData; convertedData = NULL;
1201 }
1202 }
1203 delete inputData; inputData = NULL;
1204 delete drmConvertedStatus; drmConvertedStatus = NULL;
1205 return DRM_NO_ERROR;
1206 }
1207
1208 case CLOSE_CONVERT_SESSION:
1209 {
Steve Block3856b092011-10-20 11:56:00 +01001210 ALOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001211 CHECK_INTERFACE(IDrmManagerService, data, reply);
1212
Gloria Wang197f0472011-08-01 10:31:24 -07001213 const int uniqueId = data.readInt32();
1214 const int convertId = data.readInt32();
1215 DrmConvertedStatus* drmConvertedStatus
1216 = closeConvertSession(uniqueId, convertId);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001217
1218 if (NULL != drmConvertedStatus) {
1219 //Filling Drm Converted Ststus
1220 reply->writeInt32(drmConvertedStatus->statusCode);
Gloria Wanga2cd44c2010-11-19 15:19:36 -08001221 reply->writeInt64(drmConvertedStatus->offset);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001222
1223 if (NULL != drmConvertedStatus->convertedData) {
1224 const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
1225 const int bufferSize = convertedData->length;
1226 reply->writeInt32(bufferSize);
1227 if (0 < bufferSize) {
1228 reply->write(convertedData->data, bufferSize);
1229 }
1230 delete [] convertedData->data;
1231 delete convertedData; convertedData = NULL;
1232 }
1233 }
1234 delete drmConvertedStatus; drmConvertedStatus = NULL;
1235 return DRM_NO_ERROR;
1236 }
1237
1238 case GET_ALL_SUPPORT_INFO:
1239 {
Steve Block3856b092011-10-20 11:56:00 +01001240 ALOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001241 CHECK_INTERFACE(IDrmManagerService, data, reply);
1242
1243 const int uniqueId = data.readInt32();
1244 int length = 0;
1245 DrmSupportInfo* drmSupportInfoArray = NULL;
1246
1247 status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray);
1248
1249 reply->writeInt32(length);
1250 for (int i = 0; i < length; ++i) {
1251 DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i];
1252
1253 reply->writeInt32(drmSupportInfo.getFileSuffixCount());
1254 DrmSupportInfo::FileSuffixIterator fileSuffixIt
1255 = drmSupportInfo.getFileSuffixIterator();
1256 while (fileSuffixIt.hasNext()) {
1257 reply->writeString8(fileSuffixIt.next());
1258 }
1259
1260 reply->writeInt32(drmSupportInfo.getMimeTypeCount());
1261 DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator();
1262 while (mimeTypeIt.hasNext()) {
1263 reply->writeString8(mimeTypeIt.next());
1264 }
1265 reply->writeString8(drmSupportInfo.getDescription());
1266 }
1267 delete [] drmSupportInfoArray; drmSupportInfoArray = NULL;
1268 reply->writeInt32(status);
1269 return DRM_NO_ERROR;
1270 }
1271
1272 case OPEN_DECRYPT_SESSION:
1273 {
Steve Block3856b092011-10-20 11:56:00 +01001274 ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001275 CHECK_INTERFACE(IDrmManagerService, data, reply);
1276
1277 const int uniqueId = data.readInt32();
1278 const int fd = data.readFileDescriptor();
1279
Gloria Wang197f0472011-08-01 10:31:24 -07001280 const off64_t offset = data.readInt64();
1281 const off64_t length = data.readInt64();
James Dong9d2f3862012-01-10 08:24:37 -08001282 const String8 mime = data.readString8();
1283
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001284 DecryptHandle* handle
James Dong9d2f3862012-01-10 08:24:37 -08001285 = openDecryptSession(uniqueId, fd, offset, length, mime.string());
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001286
1287 if (NULL != handle) {
Gloria Wangc10ce332011-06-15 10:27:52 -07001288 writeDecryptHandleToParcelData(handle, reply);
Gloria Wang1da9aa62011-03-20 10:25:16 -07001289 clearDecryptHandle(handle);
1290 delete handle; handle = NULL;
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001291 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001292 return DRM_NO_ERROR;
1293 }
1294
Takeshi Aimie943f842010-10-08 23:05:49 +09001295 case OPEN_DECRYPT_SESSION_FROM_URI:
1296 {
Steve Block3856b092011-10-20 11:56:00 +01001297 ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI");
Takeshi Aimie943f842010-10-08 23:05:49 +09001298 CHECK_INTERFACE(IDrmManagerService, data, reply);
1299
1300 const int uniqueId = data.readInt32();
1301 const String8 uri = data.readString8();
James Dong9d2f3862012-01-10 08:24:37 -08001302 const String8 mime = data.readString8();
Takeshi Aimie943f842010-10-08 23:05:49 +09001303
James Dong9d2f3862012-01-10 08:24:37 -08001304 DecryptHandle* handle = openDecryptSession(uniqueId, uri.string(), mime.string());
Takeshi Aimie943f842010-10-08 23:05:49 +09001305
1306 if (NULL != handle) {
Gloria Wangc10ce332011-06-15 10:27:52 -07001307 writeDecryptHandleToParcelData(handle, reply);
Gloria Wang1da9aa62011-03-20 10:25:16 -07001308
1309 clearDecryptHandle(handle);
1310 delete handle; handle = NULL;
Takeshi Aimie943f842010-10-08 23:05:49 +09001311 } else {
Steve Block3856b092011-10-20 11:56:00 +01001312 ALOGV("NULL decryptHandle is returned");
Takeshi Aimie943f842010-10-08 23:05:49 +09001313 }
Takeshi Aimie943f842010-10-08 23:05:49 +09001314 return DRM_NO_ERROR;
1315 }
1316
Kei Takahashicba7b322012-01-18 17:10:19 +09001317 case OPEN_DECRYPT_SESSION_FOR_STREAMING:
1318 {
1319 ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FOR_STREAMING");
1320 CHECK_INTERFACE(IDrmManagerService, data, reply);
1321
1322 const int uniqueId = data.readInt32();
1323 const int bufferSize = data.readInt32();
1324 DrmBuffer buf((bufferSize > 0) ? (char *)data.readInplace(bufferSize) : NULL,
1325 bufferSize);
1326 const String8 mimeType(data.readString8());
1327
1328 DecryptHandle* handle = openDecryptSession(uniqueId, buf, mimeType);
1329
1330 if (handle != NULL) {
1331 writeDecryptHandleToParcelData(handle, reply);
1332 clearDecryptHandle(handle);
1333 delete handle;
1334 handle = NULL;
1335 } else {
1336 ALOGV("NULL decryptHandle is returned");
1337 }
1338 return DRM_NO_ERROR;
1339 }
1340
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001341 case CLOSE_DECRYPT_SESSION:
1342 {
Steve Block3856b092011-10-20 11:56:00 +01001343 ALOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001344 CHECK_INTERFACE(IDrmManagerService, data, reply);
1345
1346 const int uniqueId = data.readInt32();
1347
1348 DecryptHandle* handle = new DecryptHandle();
Gloria Wang1da9aa62011-03-20 10:25:16 -07001349 readDecryptHandleFromParcelData(handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001350
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001351 const status_t status = closeDecryptSession(uniqueId, handle);
1352 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001353 return DRM_NO_ERROR;
1354 }
1355
1356 case INITIALIZE_DECRYPT_UNIT:
1357 {
Steve Block3856b092011-10-20 11:56:00 +01001358 ALOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001359 CHECK_INTERFACE(IDrmManagerService, data, reply);
1360
1361 const int uniqueId = data.readInt32();
1362
1363 DecryptHandle handle;
Gloria Wang1da9aa62011-03-20 10:25:16 -07001364 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001365
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001366 const int decryptUnitId = data.readInt32();
1367
1368 //Filling Header info
1369 const int bufferSize = data.readInt32();
1370 DrmBuffer* headerInfo = NULL;
1371 headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1372
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001373 const status_t status
1374 = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo);
1375 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001376
Gloria Wang1da9aa62011-03-20 10:25:16 -07001377 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001378 delete headerInfo; headerInfo = NULL;
1379 return DRM_NO_ERROR;
1380 }
1381
1382 case DECRYPT:
1383 {
Steve Block3856b092011-10-20 11:56:00 +01001384 ALOGV("BnDrmManagerService::onTransact :DECRYPT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001385 CHECK_INTERFACE(IDrmManagerService, data, reply);
1386
1387 const int uniqueId = data.readInt32();
1388
1389 DecryptHandle handle;
Gloria Wang1da9aa62011-03-20 10:25:16 -07001390 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001391
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001392 const int decryptUnitId = data.readInt32();
1393 const int decBufferSize = data.readInt32();
1394
1395 const int encBufferSize = data.readInt32();
1396 DrmBuffer* encBuffer
1397 = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize);
1398
1399 char* buffer = NULL;
1400 buffer = new char[decBufferSize];
1401 DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize);
1402
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001403 DrmBuffer* IV = NULL;
1404 if (0 != data.dataAvail()) {
1405 const int ivBufferlength = data.readInt32();
1406 IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength);
1407 }
1408
1409 const status_t status
1410 = decrypt(uniqueId, &handle, decryptUnitId, encBuffer, &decBuffer, IV);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001411
1412 reply->writeInt32(status);
1413
1414 const int size = decBuffer->length;
1415 reply->writeInt32(size);
1416 reply->write(decBuffer->data, size);
1417
Gloria Wang1da9aa62011-03-20 10:25:16 -07001418 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001419 delete encBuffer; encBuffer = NULL;
1420 delete decBuffer; decBuffer = NULL;
1421 delete [] buffer; buffer = NULL;
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001422 delete IV; IV = NULL;
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001423 return DRM_NO_ERROR;
1424 }
1425
1426 case FINALIZE_DECRYPT_UNIT:
1427 {
Steve Block3856b092011-10-20 11:56:00 +01001428 ALOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001429 CHECK_INTERFACE(IDrmManagerService, data, reply);
1430
1431 const int uniqueId = data.readInt32();
1432
1433 DecryptHandle handle;
Gloria Wang1da9aa62011-03-20 10:25:16 -07001434 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001435
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001436 const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32());
1437 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001438
Gloria Wang1da9aa62011-03-20 10:25:16 -07001439 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001440 return DRM_NO_ERROR;
1441 }
1442
1443 case PREAD:
1444 {
Steve Block3856b092011-10-20 11:56:00 +01001445 ALOGV("BnDrmManagerService::onTransact :READ");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001446 CHECK_INTERFACE(IDrmManagerService, data, reply);
1447
1448 const int uniqueId = data.readInt32();
1449
1450 DecryptHandle handle;
Gloria Wang1da9aa62011-03-20 10:25:16 -07001451 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001452
1453 const int numBytes = data.readInt32();
1454 char* buffer = new char[numBytes];
1455
Gloria Wanga2cd44c2010-11-19 15:19:36 -08001456 const off64_t offset = data.readInt64();
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001457
1458 ssize_t result = pread(uniqueId, &handle, buffer, numBytes, offset);
1459 reply->writeInt32(result);
1460 if (0 < result) {
1461 reply->write(buffer, result);
1462 }
1463
Gloria Wang1da9aa62011-03-20 10:25:16 -07001464 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001465 delete [] buffer, buffer = NULL;
1466 return DRM_NO_ERROR;
1467 }
1468
1469 default:
1470 return BBinder::onTransact(code, data, reply, flags);
1471 }
1472}
1473