blob: c235201796607e65476cecac8326c14b087f7dc3 [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);
Hung Nguyen0bf43842012-06-05 13:19:53 +0200181 drmConstraints->put(&key, data);
182 delete[] data;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900183 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900184 }
185 }
186 return drmConstraints;
187}
188
Takeshi Aimi34738462010-11-16 13:56:11 +0900189DrmMetadata* BpDrmManagerService::getMetadata(int uniqueId, const String8* path) {
Steve Block3856b092011-10-20 11:56:00 +0100190 ALOGV("Get Metadata");
Takeshi Aimi34738462010-11-16 13:56:11 +0900191 Parcel data, reply;
192 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
193 data.writeInt32(uniqueId);
194
195 DrmMetadata* drmMetadata = NULL;
196 data.writeString8(*path);
197 remote()->transact(GET_METADATA_FROM_CONTENT, data, &reply);
198
199 if (0 != reply.dataAvail()) {
200 //Filling Drm Metadata
201 drmMetadata = new DrmMetadata();
202
203 const int size = reply.readInt32();
204 for (int index = 0; index < size; ++index) {
205 const String8 key(reply.readString8());
206 const int bufferSize = reply.readInt32();
207 char* data = NULL;
208 if (0 < bufferSize) {
209 data = new char[bufferSize];
210 reply.read(data, bufferSize);
Hung Nguyen0bf43842012-06-05 13:19:53 +0200211 drmMetadata->put(&key, data);
212 delete[] data;
Takeshi Aimi34738462010-11-16 13:56:11 +0900213 }
Takeshi Aimi34738462010-11-16 13:56:11 +0900214 }
215 }
216 return drmMetadata;
217}
218
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900219bool BpDrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) {
Steve Block3856b092011-10-20 11:56:00 +0100220 ALOGV("Can Handle");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900221 Parcel data, reply;
222
223 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
224 data.writeInt32(uniqueId);
225
226 data.writeString8(path);
227 data.writeString8(mimeType);
228
229 remote()->transact(CAN_HANDLE, data, &reply);
230
231 return static_cast<bool>(reply.readInt32());
232}
233
234DrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) {
Steve Block3856b092011-10-20 11:56:00 +0100235 ALOGV("Process DRM Info");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900236 Parcel data, reply;
237
238 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
239 data.writeInt32(uniqueId);
240
241 //Filling DRM info
242 data.writeInt32(drmInfo->getInfoType());
243 const DrmBuffer dataBuffer = drmInfo->getData();
244 const int dataBufferSize = dataBuffer.length;
245 data.writeInt32(dataBufferSize);
246 if (0 < dataBufferSize) {
247 data.write(dataBuffer.data, dataBufferSize);
248 }
249 data.writeString8(drmInfo->getMimeType());
250
251 data.writeInt32(drmInfo->getCount());
252 DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
253
254 while (keyIt.hasNext()) {
255 const String8 key = keyIt.next();
256 data.writeString8(key);
257 const String8 value = drmInfo->get(key);
258 data.writeString8((value == String8("")) ? String8("NULL") : value);
259 }
260
261 remote()->transact(PROCESS_DRM_INFO, data, &reply);
262
263 DrmInfoStatus* drmInfoStatus = NULL;
264 if (0 != reply.dataAvail()) {
265 //Filling DRM Info Status
266 const int statusCode = reply.readInt32();
Takeshi Aimie943f842010-10-08 23:05:49 +0900267 const int infoType = reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900268 const String8 mimeType = reply.readString8();
269
270 DrmBuffer* drmBuffer = NULL;
271 if (0 != reply.dataAvail()) {
272 const int bufferSize = reply.readInt32();
273 char* data = NULL;
274 if (0 < bufferSize) {
275 data = new char[bufferSize];
276 reply.read(data, bufferSize);
277 }
278 drmBuffer = new DrmBuffer(data, bufferSize);
279 }
Takeshi Aimie943f842010-10-08 23:05:49 +0900280 drmInfoStatus = new DrmInfoStatus(statusCode, infoType, drmBuffer, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900281 }
282 return drmInfoStatus;
283}
284
285DrmInfo* BpDrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) {
Steve Block3856b092011-10-20 11:56:00 +0100286 ALOGV("Acquire DRM Info");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900287 Parcel data, reply;
288
289 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
290 data.writeInt32(uniqueId);
291
292 //Filling DRM Info Request
293 data.writeInt32(drmInforequest->getInfoType());
294 data.writeString8(drmInforequest->getMimeType());
295
296 data.writeInt32(drmInforequest->getCount());
297 DrmInfoRequest::KeyIterator keyIt = drmInforequest->keyIterator();
298
299 while (keyIt.hasNext()) {
300 const String8 key = keyIt.next();
301 data.writeString8(key);
302 const String8 value = drmInforequest->get(key);
Gene Morgan0abeaca2012-09-14 13:35:39 -0700303 if (key == String8("FileDescriptorKey")) {
304 int fd = -1;
305 sscanf(value.string(), "FileDescriptor[%d]", &fd);
306 data.writeFileDescriptor(fd);
307 } else {
308 data.writeString8((value == String8("")) ? String8("NULL") : value);
309 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900310 }
311
312 remote()->transact(ACQUIRE_DRM_INFO, data, &reply);
313
314 DrmInfo* drmInfo = NULL;
315 if (0 != reply.dataAvail()) {
316 //Filling DRM Info
317 const int infoType = reply.readInt32();
318 const int bufferSize = reply.readInt32();
319 char* data = NULL;
320
321 if (0 < bufferSize) {
322 data = new char[bufferSize];
323 reply.read(data, bufferSize);
324 }
325 drmInfo = new DrmInfo(infoType, DrmBuffer(data, bufferSize), reply.readString8());
326
327 const int size = reply.readInt32();
328 for (int index = 0; index < size; ++index) {
329 const String8 key(reply.readString8());
330 const String8 value(reply.readString8());
331 drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
332 }
333 }
334 return drmInfo;
335}
336
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900337status_t BpDrmManagerService::saveRights(
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900338 int uniqueId, const DrmRights& drmRights,
339 const String8& rightsPath, const String8& contentPath) {
Steve Block3856b092011-10-20 11:56:00 +0100340 ALOGV("Save Rights");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900341 Parcel data, reply;
342
343 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
344 data.writeInt32(uniqueId);
345
346 //Filling Drm Rights
347 const DrmBuffer dataBuffer = drmRights.getData();
348 data.writeInt32(dataBuffer.length);
349 data.write(dataBuffer.data, dataBuffer.length);
350
351 const String8 mimeType = drmRights.getMimeType();
352 data.writeString8((mimeType == String8("")) ? String8("NULL") : mimeType);
353
354 const String8 accountId = drmRights.getAccountId();
355 data.writeString8((accountId == String8("")) ? String8("NULL") : accountId);
356
357 const String8 subscriptionId = drmRights.getSubscriptionId();
358 data.writeString8((subscriptionId == String8("")) ? String8("NULL") : subscriptionId);
359
360 data.writeString8((rightsPath == String8("")) ? String8("NULL") : rightsPath);
361 data.writeString8((contentPath == String8("")) ? String8("NULL") : contentPath);
362
363 remote()->transact(SAVE_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900364 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900365}
366
James Dongbf5b3b22012-07-30 17:57:39 -0700367String8 BpDrmManagerService::getOriginalMimeType(int uniqueId, const String8& path, int fd) {
Steve Block3856b092011-10-20 11:56:00 +0100368 ALOGV("Get Original MimeType");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900369 Parcel data, reply;
370
371 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
372 data.writeInt32(uniqueId);
373 data.writeString8(path);
James Dongbf5b3b22012-07-30 17:57:39 -0700374 int32_t isFdValid = (fd >= 0);
375 data.writeInt32(isFdValid);
376 if (isFdValid) {
377 data.writeFileDescriptor(fd);
378 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900379
380 remote()->transact(GET_ORIGINAL_MIMETYPE, data, &reply);
381 return reply.readString8();
382}
383
384int BpDrmManagerService::getDrmObjectType(
385 int uniqueId, const String8& path, const String8& mimeType) {
Steve Block3856b092011-10-20 11:56:00 +0100386 ALOGV("Get Drm object type");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900387 Parcel data, reply;
388
389 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
390 data.writeInt32(uniqueId);
391 data.writeString8(path);
392 data.writeString8(mimeType);
393
394 remote()->transact(GET_DRM_OBJECT_TYPE, data, &reply);
395
396 return reply.readInt32();
397}
398
399int BpDrmManagerService::checkRightsStatus(int uniqueId, const String8& path, int action) {
Steve Block3856b092011-10-20 11:56:00 +0100400 ALOGV("checkRightsStatus");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900401 Parcel data, reply;
402
403 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
404 data.writeInt32(uniqueId);
405 data.writeString8(path);
406 data.writeInt32(action);
407
408 remote()->transact(CHECK_RIGHTS_STATUS, data, &reply);
409
410 return reply.readInt32();
411}
412
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900413status_t BpDrmManagerService::consumeRights(
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900414 int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) {
Steve Block3856b092011-10-20 11:56:00 +0100415 ALOGV("consumeRights");
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900416 Parcel data, reply;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900417
418 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
419 data.writeInt32(uniqueId);
420
Gloria Wangc10ce332011-06-15 10:27:52 -0700421 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900422
423 data.writeInt32(action);
424 data.writeInt32(static_cast< int>(reserve));
425
426 remote()->transact(CONSUME_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900427 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900428}
429
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900430status_t BpDrmManagerService::setPlaybackStatus(
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800431 int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) {
Steve Block3856b092011-10-20 11:56:00 +0100432 ALOGV("setPlaybackStatus");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900433 Parcel data, reply;
434
435 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
436 data.writeInt32(uniqueId);
437
Gloria Wangc10ce332011-06-15 10:27:52 -0700438 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900439
440 data.writeInt32(playbackStatus);
Gloria Wang2ed8a922011-01-19 15:38:16 -0800441 data.writeInt64(position);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900442
443 remote()->transact(SET_PLAYBACK_STATUS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900444 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900445}
446
447bool BpDrmManagerService::validateAction(
448 int uniqueId, const String8& path,
449 int action, const ActionDescription& description) {
Steve Block3856b092011-10-20 11:56:00 +0100450 ALOGV("validateAction");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900451 Parcel data, reply;
452
453 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
454 data.writeInt32(uniqueId);
455 data.writeString8(path);
456 data.writeInt32(action);
457 data.writeInt32(description.outputType);
458 data.writeInt32(description.configuration);
459
460 remote()->transact(VALIDATE_ACTION, data, &reply);
461
462 return static_cast<bool>(reply.readInt32());
463}
464
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900465status_t BpDrmManagerService::removeRights(int uniqueId, const String8& path) {
Steve Block3856b092011-10-20 11:56:00 +0100466 ALOGV("removeRights");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900467 Parcel data, reply;
468
469 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
470 data.writeInt32(uniqueId);
471 data.writeString8(path);
472
473 remote()->transact(REMOVE_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900474 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900475}
476
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900477status_t BpDrmManagerService::removeAllRights(int uniqueId) {
Steve Block3856b092011-10-20 11:56:00 +0100478 ALOGV("removeAllRights");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900479 Parcel data, reply;
480
481 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
482 data.writeInt32(uniqueId);
483
484 remote()->transact(REMOVE_ALL_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900485 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900486}
487
488int BpDrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) {
Steve Block3856b092011-10-20 11:56:00 +0100489 ALOGV("openConvertSession");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900490 Parcel data, reply;
491
492 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
493 data.writeInt32(uniqueId);
494 data.writeString8(mimeType);
495
496 remote()->transact(OPEN_CONVERT_SESSION, data, &reply);
497 return reply.readInt32();
498}
499
500DrmConvertedStatus* BpDrmManagerService::convertData(
501 int uniqueId, int convertId, const DrmBuffer* inputData) {
Steve Block3856b092011-10-20 11:56:00 +0100502 ALOGV("convertData");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900503 Parcel data, reply;
504
505 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
506 data.writeInt32(uniqueId);
507 data.writeInt32(convertId);
508 data.writeInt32(inputData->length);
509 data.write(inputData->data, inputData->length);
510
511 remote()->transact(CONVERT_DATA, data, &reply);
512
513 DrmConvertedStatus* drmConvertedStatus = NULL;
514
515 if (0 != reply.dataAvail()) {
516 //Filling DRM Converted Status
517 const int statusCode = reply.readInt32();
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800518 const off64_t offset = reply.readInt64();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900519
520 DrmBuffer* convertedData = NULL;
521 if (0 != reply.dataAvail()) {
522 const int bufferSize = reply.readInt32();
523 char* data = NULL;
524 if (0 < bufferSize) {
525 data = new char[bufferSize];
526 reply.read(data, bufferSize);
527 }
528 convertedData = new DrmBuffer(data, bufferSize);
529 }
530 drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
531 }
532 return drmConvertedStatus;
533}
534
535DrmConvertedStatus* BpDrmManagerService::closeConvertSession(int uniqueId, int convertId) {
Steve Block3856b092011-10-20 11:56:00 +0100536 ALOGV("closeConvertSession");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900537 Parcel data, reply;
538
539 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
540 data.writeInt32(uniqueId);
541 data.writeInt32(convertId);
542
543 remote()->transact(CLOSE_CONVERT_SESSION, data, &reply);
544
545 DrmConvertedStatus* drmConvertedStatus = NULL;
546
547 if (0 != reply.dataAvail()) {
548 //Filling DRM Converted Status
549 const int statusCode = reply.readInt32();
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800550 const off64_t offset = reply.readInt64();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900551
552 DrmBuffer* convertedData = NULL;
553 if (0 != reply.dataAvail()) {
554 const int bufferSize = reply.readInt32();
555 char* data = NULL;
556 if (0 < bufferSize) {
557 data = new char[bufferSize];
558 reply.read(data, bufferSize);
559 }
560 convertedData = new DrmBuffer(data, bufferSize);
561 }
562 drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
563 }
564 return drmConvertedStatus;
565}
566
567status_t BpDrmManagerService::getAllSupportInfo(
568 int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) {
Steve Block3856b092011-10-20 11:56:00 +0100569 ALOGV("Get All Support Info");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900570 Parcel data, reply;
571
572 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
573 data.writeInt32(uniqueId);
574
575 remote()->transact(GET_ALL_SUPPORT_INFO, data, &reply);
576
577 //Filling DRM Support Info
578 const int arraySize = reply.readInt32();
579 if (0 < arraySize) {
580 *drmSupportInfoArray = new DrmSupportInfo[arraySize];
581
582 for (int index = 0; index < arraySize; ++index) {
583 DrmSupportInfo drmSupportInfo;
584
585 const int fileSuffixVectorSize = reply.readInt32();
586 for (int i = 0; i < fileSuffixVectorSize; ++i) {
587 drmSupportInfo.addFileSuffix(reply.readString8());
588 }
589
590 const int mimeTypeVectorSize = reply.readInt32();
591 for (int i = 0; i < mimeTypeVectorSize; ++i) {
592 drmSupportInfo.addMimeType(reply.readString8());
593 }
594
595 drmSupportInfo.setDescription(reply.readString8());
596 (*drmSupportInfoArray)[index] = drmSupportInfo;
597 }
598 }
599 *length = arraySize;
600 return reply.readInt32();
601}
602
603DecryptHandle* BpDrmManagerService::openDecryptSession(
James Dong9d2f3862012-01-10 08:24:37 -0800604 int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) {
Steve Block3856b092011-10-20 11:56:00 +0100605 ALOGV("Entering BpDrmManagerService::openDecryptSession");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900606 Parcel data, reply;
607
Takeshi Aimie943f842010-10-08 23:05:49 +0900608 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900609 data.writeInt32(uniqueId);
610 data.writeFileDescriptor(fd);
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800611 data.writeInt64(offset);
612 data.writeInt64(length);
James Dong9d2f3862012-01-10 08:24:37 -0800613 String8 mimeType;
614 if (mime) {
615 mimeType = mime;
616 }
617 data.writeString8(mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900618
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900619 remote()->transact(OPEN_DECRYPT_SESSION, data, &reply);
620
621 DecryptHandle* handle = NULL;
622 if (0 != reply.dataAvail()) {
623 handle = new DecryptHandle();
Gloria Wang1da9aa62011-03-20 10:25:16 -0700624 readDecryptHandleFromParcelData(handle, reply);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900625 }
626 return handle;
627}
628
James Dong9d2f3862012-01-10 08:24:37 -0800629DecryptHandle* BpDrmManagerService::openDecryptSession(
630 int uniqueId, const char* uri, const char* mime) {
631
632 ALOGV("Entering BpDrmManagerService::openDecryptSession: mime=%s", mime? mime: "NULL");
Takeshi Aimie943f842010-10-08 23:05:49 +0900633 Parcel data, reply;
634
635 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
636 data.writeInt32(uniqueId);
637 data.writeString8(String8(uri));
James Dong9d2f3862012-01-10 08:24:37 -0800638 String8 mimeType;
639 if (mime) {
640 mimeType = mime;
641 }
642 data.writeString8(mimeType);
Takeshi Aimie943f842010-10-08 23:05:49 +0900643
644 remote()->transact(OPEN_DECRYPT_SESSION_FROM_URI, data, &reply);
645
646 DecryptHandle* handle = NULL;
647 if (0 != reply.dataAvail()) {
648 handle = new DecryptHandle();
Gloria Wang1da9aa62011-03-20 10:25:16 -0700649 readDecryptHandleFromParcelData(handle, reply);
Takeshi Aimie943f842010-10-08 23:05:49 +0900650 } else {
Steve Block3856b092011-10-20 11:56:00 +0100651 ALOGV("no decryptHandle is generated in service side");
Takeshi Aimie943f842010-10-08 23:05:49 +0900652 }
653 return handle;
654}
655
Kei Takahashicba7b322012-01-18 17:10:19 +0900656DecryptHandle* BpDrmManagerService::openDecryptSession(
657 int uniqueId, const DrmBuffer& buf, const String8& mimeType) {
658 ALOGV("Entering BpDrmManagerService::openDecryptSession");
659 Parcel data, reply;
660
661 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
662 data.writeInt32(uniqueId);
663 if (buf.data != NULL && buf.length > 0) {
664 data.writeInt32(buf.length);
665 data.write(buf.data, buf.length);
666 } else {
667 data.writeInt32(0);
668 }
669 data.writeString8(mimeType);
670
671 remote()->transact(OPEN_DECRYPT_SESSION_FOR_STREAMING, data, &reply);
672
673 DecryptHandle* handle = NULL;
674 if (0 != reply.dataAvail()) {
675 handle = new DecryptHandle();
676 readDecryptHandleFromParcelData(handle, reply);
677 } else {
678 ALOGV("no decryptHandle is generated in service side");
679 }
680 return handle;
681}
682
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900683status_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) {
Steve Block3856b092011-10-20 11:56:00 +0100684 ALOGV("closeDecryptSession");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900685 Parcel data, reply;
686
687 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
688 data.writeInt32(uniqueId);
689
Gloria Wangc10ce332011-06-15 10:27:52 -0700690 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900691
692 remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply);
693
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900694 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900695}
696
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900697status_t BpDrmManagerService::initializeDecryptUnit(
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900698 int uniqueId, DecryptHandle* decryptHandle,
699 int decryptUnitId, const DrmBuffer* headerInfo) {
Steve Block3856b092011-10-20 11:56:00 +0100700 ALOGV("initializeDecryptUnit");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900701 Parcel data, reply;
702
703 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
704 data.writeInt32(uniqueId);
705
Gloria Wangc10ce332011-06-15 10:27:52 -0700706 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900707
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900708 data.writeInt32(decryptUnitId);
709
710 data.writeInt32(headerInfo->length);
711 data.write(headerInfo->data, headerInfo->length);
712
713 remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900714 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900715}
716
717status_t BpDrmManagerService::decrypt(
718 int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900719 const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) {
Steve Block3856b092011-10-20 11:56:00 +0100720 ALOGV("decrypt");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900721 Parcel data, reply;
722
723 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
724 data.writeInt32(uniqueId);
725
Gloria Wangc10ce332011-06-15 10:27:52 -0700726 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900727
728 data.writeInt32(decryptUnitId);
729 data.writeInt32((*decBuffer)->length);
730
731 data.writeInt32(encBuffer->length);
732 data.write(encBuffer->data, encBuffer->length);
733
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900734 if (NULL != IV) {
735 data.writeInt32(IV->length);
736 data.write(IV->data, IV->length);
737 }
738
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900739 remote()->transact(DECRYPT, data, &reply);
740
741 const status_t status = reply.readInt32();
Steve Block3856b092011-10-20 11:56:00 +0100742 ALOGV("Return value of decrypt() is %d", status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900743
Jeff Tinker09ed70f2015-09-14 13:55:23 -0700744 if (status == NO_ERROR) {
745 const int size = reply.readInt32();
746 (*decBuffer)->length = size;
747 reply.read((void *)(*decBuffer)->data, size);
748 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900749
750 return status;
751}
752
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900753status_t BpDrmManagerService::finalizeDecryptUnit(
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900754 int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) {
Steve Block3856b092011-10-20 11:56:00 +0100755 ALOGV("finalizeDecryptUnit");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900756 Parcel data, reply;
757
758 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
759 data.writeInt32(uniqueId);
760
Gloria Wangc10ce332011-06-15 10:27:52 -0700761 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900762
763 data.writeInt32(decryptUnitId);
764
765 remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900766 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900767}
768
769ssize_t BpDrmManagerService::pread(
770 int uniqueId, DecryptHandle* decryptHandle, void* buffer,
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800771 ssize_t numBytes, off64_t offset) {
Steve Block3856b092011-10-20 11:56:00 +0100772 ALOGV("read");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900773 Parcel data, reply;
774 int result;
775
776 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
777 data.writeInt32(uniqueId);
778
Gloria Wangc10ce332011-06-15 10:27:52 -0700779 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900780
781 data.writeInt32(numBytes);
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800782 data.writeInt64(offset);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900783
784 remote()->transact(PREAD, data, &reply);
785 result = reply.readInt32();
786 if (0 < result) {
787 reply.read(buffer, result);
788 }
789 return result;
790}
791
792IMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService");
793
794status_t BnDrmManagerService::onTransact(
795 uint32_t code, const Parcel& data,
796 Parcel* reply, uint32_t flags) {
Steve Block3856b092011-10-20 11:56:00 +0100797 ALOGV("Entering BnDrmManagerService::onTransact with code %d", code);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900798
799 switch (code) {
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900800 case ADD_UNIQUEID:
801 {
Steve Block3856b092011-10-20 11:56:00 +0100802 ALOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID");
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900803 CHECK_INTERFACE(IDrmManagerService, data, reply);
804 int uniqueId = addUniqueId(data.readInt32());
805 reply->writeInt32(uniqueId);
806 return DRM_NO_ERROR;
807 }
808
809 case REMOVE_UNIQUEID:
810 {
Steve Block3856b092011-10-20 11:56:00 +0100811 ALOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID");
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900812 CHECK_INTERFACE(IDrmManagerService, data, reply);
813 removeUniqueId(data.readInt32());
814 return DRM_NO_ERROR;
815 }
816
Takeshi Aimie943f842010-10-08 23:05:49 +0900817 case ADD_CLIENT:
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900818 {
Steve Block3856b092011-10-20 11:56:00 +0100819 ALOGV("BnDrmManagerService::onTransact :ADD_CLIENT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900820 CHECK_INTERFACE(IDrmManagerService, data, reply);
Takeshi Aimie943f842010-10-08 23:05:49 +0900821 addClient(data.readInt32());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900822 return DRM_NO_ERROR;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900823 }
824
Takeshi Aimie943f842010-10-08 23:05:49 +0900825 case REMOVE_CLIENT:
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900826 {
Steve Block3856b092011-10-20 11:56:00 +0100827 ALOGV("BnDrmManagerService::onTransact :REMOVE_CLIENT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900828 CHECK_INTERFACE(IDrmManagerService, data, reply);
Takeshi Aimie943f842010-10-08 23:05:49 +0900829 removeClient(data.readInt32());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900830 return DRM_NO_ERROR;
831 }
832
833 case SET_DRM_SERVICE_LISTENER:
834 {
Steve Block3856b092011-10-20 11:56:00 +0100835 ALOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900836 CHECK_INTERFACE(IDrmManagerService, data, reply);
837
838 const int uniqueId = data.readInt32();
839 const sp<IDrmServiceListener> drmServiceListener
840 = interface_cast<IDrmServiceListener> (data.readStrongBinder());
841
842 status_t status = setDrmServiceListener(uniqueId, drmServiceListener);
843
844 reply->writeInt32(status);
845 return DRM_NO_ERROR;
846 }
847
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900848 case GET_CONSTRAINTS_FROM_CONTENT:
849 {
Steve Block3856b092011-10-20 11:56:00 +0100850 ALOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900851 CHECK_INTERFACE(IDrmManagerService, data, reply);
852
853 const int uniqueId = data.readInt32();
854 const String8 path = data.readString8();
855
Gloria Wang197f0472011-08-01 10:31:24 -0700856 DrmConstraints* drmConstraints
857 = getConstraints(uniqueId, &path, data.readInt32());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900858
859 if (NULL != drmConstraints) {
860 //Filling DRM Constraints contents
861 reply->writeInt32(drmConstraints->getCount());
862
863 DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator();
864 while (keyIt.hasNext()) {
865 const String8 key = keyIt.next();
866 reply->writeString8(key);
867 const char* value = drmConstraints->getAsByteArray(&key);
868 int bufferSize = 0;
869 if (NULL != value) {
870 bufferSize = strlen(value);
Hung Nguyen0bf43842012-06-05 13:19:53 +0200871 reply->writeInt32(bufferSize + 1);
872 reply->write(value, bufferSize + 1);
873 } else {
874 reply->writeInt32(0);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900875 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900876 }
877 }
878 delete drmConstraints; drmConstraints = NULL;
879 return DRM_NO_ERROR;
880 }
881
Takeshi Aimi34738462010-11-16 13:56:11 +0900882 case GET_METADATA_FROM_CONTENT:
883 {
Steve Block3856b092011-10-20 11:56:00 +0100884 ALOGV("BnDrmManagerService::onTransact :GET_METADATA_FROM_CONTENT");
Takeshi Aimi34738462010-11-16 13:56:11 +0900885 CHECK_INTERFACE(IDrmManagerService, data, reply);
886
887 const int uniqueId = data.readInt32();
888 const String8 path = data.readString8();
889
890 DrmMetadata* drmMetadata = getMetadata(uniqueId, &path);
891 if (NULL != drmMetadata) {
892 //Filling DRM Metadata contents
893 reply->writeInt32(drmMetadata->getCount());
894
895 DrmMetadata::KeyIterator keyIt = drmMetadata->keyIterator();
896 while (keyIt.hasNext()) {
897 const String8 key = keyIt.next();
898 reply->writeString8(key);
899 const char* value = drmMetadata->getAsByteArray(&key);
900 int bufferSize = 0;
901 if (NULL != value) {
902 bufferSize = strlen(value);
903 reply->writeInt32(bufferSize + 1);
904 reply->write(value, bufferSize + 1);
905 } else {
906 reply->writeInt32(0);
907 }
908 }
909 }
910 delete drmMetadata; drmMetadata = NULL;
911 return NO_ERROR;
912 }
913
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900914 case CAN_HANDLE:
915 {
Steve Block3856b092011-10-20 11:56:00 +0100916 ALOGV("BnDrmManagerService::onTransact :CAN_HANDLE");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900917 CHECK_INTERFACE(IDrmManagerService, data, reply);
918
919 const int uniqueId = data.readInt32();
920 const String8 path = data.readString8();
921 const String8 mimeType = data.readString8();
922
923 bool result = canHandle(uniqueId, path, mimeType);
924
925 reply->writeInt32(result);
926 return DRM_NO_ERROR;
927 }
928
929 case PROCESS_DRM_INFO:
930 {
Steve Block3856b092011-10-20 11:56:00 +0100931 ALOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900932 CHECK_INTERFACE(IDrmManagerService, data, reply);
933
934 const int uniqueId = data.readInt32();
935
936 //Filling DRM info
937 const int infoType = data.readInt32();
938 const int bufferSize = data.readInt32();
939 char* buffer = NULL;
940 if (0 < bufferSize) {
941 buffer = (char *)data.readInplace(bufferSize);
942 }
943 const DrmBuffer drmBuffer(buffer, bufferSize);
944 DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8());
945
946 const int size = data.readInt32();
947 for (int index = 0; index < size; ++index) {
948 const String8 key(data.readString8());
949 const String8 value(data.readString8());
950 drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
951 }
952
953 DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo);
954
955 if (NULL != drmInfoStatus) {
956 //Filling DRM Info Status contents
957 reply->writeInt32(drmInfoStatus->statusCode);
Takeshi Aimie943f842010-10-08 23:05:49 +0900958 reply->writeInt32(drmInfoStatus->infoType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900959 reply->writeString8(drmInfoStatus->mimeType);
960
961 if (NULL != drmInfoStatus->drmBuffer) {
962 const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer;
963 const int bufferSize = drmBuffer->length;
964 reply->writeInt32(bufferSize);
965 if (0 < bufferSize) {
966 reply->write(drmBuffer->data, bufferSize);
967 }
968 delete [] drmBuffer->data;
969 delete drmBuffer; drmBuffer = NULL;
970 }
971 }
972 delete drmInfo; drmInfo = NULL;
973 delete drmInfoStatus; drmInfoStatus = NULL;
974 return DRM_NO_ERROR;
975 }
976
977 case ACQUIRE_DRM_INFO:
978 {
Steve Block3856b092011-10-20 11:56:00 +0100979 ALOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900980 CHECK_INTERFACE(IDrmManagerService, data, reply);
981
982 const int uniqueId = data.readInt32();
983
984 //Filling DRM info Request
Gloria Wang197f0472011-08-01 10:31:24 -0700985 const int infoType = data.readInt32();
986 const String8 mimeType = data.readString8();
987 DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(infoType, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900988
989 const int size = data.readInt32();
990 for (int index = 0; index < size; ++index) {
991 const String8 key(data.readString8());
Gene Morgan0abeaca2012-09-14 13:35:39 -0700992 if (key == String8("FileDescriptorKey")) {
993 char buffer[16];
994 int fd = data.readFileDescriptor();
995 sprintf(buffer, "%lu", (unsigned long)fd);
996 drmInfoRequest->put(key, String8(buffer));
997 } else {
998 const String8 value(data.readString8());
999 drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value);
1000 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001001 }
1002
1003 DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest);
1004
1005 if (NULL != drmInfo) {
1006 //Filling DRM Info
1007 const DrmBuffer drmBuffer = drmInfo->getData();
1008 reply->writeInt32(drmInfo->getInfoType());
1009
1010 const int bufferSize = drmBuffer.length;
1011 reply->writeInt32(bufferSize);
1012 if (0 < bufferSize) {
1013 reply->write(drmBuffer.data, bufferSize);
1014 }
1015 reply->writeString8(drmInfo->getMimeType());
1016 reply->writeInt32(drmInfo->getCount());
1017
1018 DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
1019 while (keyIt.hasNext()) {
1020 const String8 key = keyIt.next();
1021 reply->writeString8(key);
1022 const String8 value = drmInfo->get(key);
1023 reply->writeString8((value == String8("")) ? String8("NULL") : value);
1024 }
1025 delete [] drmBuffer.data;
1026 }
1027 delete drmInfoRequest; drmInfoRequest = NULL;
1028 delete drmInfo; drmInfo = NULL;
1029 return DRM_NO_ERROR;
1030 }
1031
1032 case SAVE_RIGHTS:
1033 {
Steve Block3856b092011-10-20 11:56:00 +01001034 ALOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001035 CHECK_INTERFACE(IDrmManagerService, data, reply);
1036
1037 const int uniqueId = data.readInt32();
1038
1039 //Filling DRM Rights
1040 const int bufferSize = data.readInt32();
1041 const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1042
1043 const String8 mimeType(data.readString8());
1044 const String8 accountId(data.readString8());
1045 const String8 subscriptionId(data.readString8());
1046 const String8 rightsPath(data.readString8());
1047 const String8 contentPath(data.readString8());
1048
1049 DrmRights drmRights(drmBuffer,
1050 ((mimeType == String8("NULL")) ? String8("") : mimeType),
1051 ((accountId == String8("NULL")) ? String8("") : accountId),
1052 ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId));
1053
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001054 const status_t status = saveRights(uniqueId, drmRights,
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001055 ((rightsPath == String8("NULL")) ? String8("") : rightsPath),
1056 ((contentPath == String8("NULL")) ? String8("") : contentPath));
1057
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001058 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001059 return DRM_NO_ERROR;
1060 }
1061
1062 case GET_ORIGINAL_MIMETYPE:
1063 {
Steve Block3856b092011-10-20 11:56:00 +01001064 ALOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001065 CHECK_INTERFACE(IDrmManagerService, data, reply);
1066
Gloria Wang197f0472011-08-01 10:31:24 -07001067 const int uniqueId = data.readInt32();
1068 const String8 path = data.readString8();
James Dongbf5b3b22012-07-30 17:57:39 -07001069 const int32_t isFdValid = data.readInt32();
1070 int fd = -1;
1071 if (isFdValid) {
1072 fd = data.readFileDescriptor();
1073 }
1074 const String8 originalMimeType = getOriginalMimeType(uniqueId, path, fd);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001075
1076 reply->writeString8(originalMimeType);
1077 return DRM_NO_ERROR;
1078 }
1079
1080 case GET_DRM_OBJECT_TYPE:
1081 {
Steve Block3856b092011-10-20 11:56:00 +01001082 ALOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001083 CHECK_INTERFACE(IDrmManagerService, data, reply);
1084
Gloria Wang197f0472011-08-01 10:31:24 -07001085 const int uniqueId = data.readInt32();
1086 const String8 path = data.readString8();
1087 const String8 mimeType = data.readString8();
1088 const int drmObjectType = getDrmObjectType(uniqueId, path, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001089
1090 reply->writeInt32(drmObjectType);
1091 return DRM_NO_ERROR;
1092 }
1093
1094 case CHECK_RIGHTS_STATUS:
1095 {
Steve Block3856b092011-10-20 11:56:00 +01001096 ALOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001097 CHECK_INTERFACE(IDrmManagerService, data, reply);
1098
Gloria Wang197f0472011-08-01 10:31:24 -07001099 const int uniqueId = data.readInt32();
1100 const String8 path = data.readString8();
1101 const int action = data.readInt32();
1102 const int result = checkRightsStatus(uniqueId, path, action);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001103
1104 reply->writeInt32(result);
1105 return DRM_NO_ERROR;
1106 }
1107
1108 case CONSUME_RIGHTS:
1109 {
Steve Block3856b092011-10-20 11:56:00 +01001110 ALOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001111 CHECK_INTERFACE(IDrmManagerService, data, reply);
1112
1113 const int uniqueId = data.readInt32();
1114
1115 DecryptHandle handle;
Gloria Wang1da9aa62011-03-20 10:25:16 -07001116 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001117
Gloria Wang197f0472011-08-01 10:31:24 -07001118 const int action = data.readInt32();
1119 const bool reserve = static_cast<bool>(data.readInt32());
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001120 const status_t status
Gloria Wang197f0472011-08-01 10:31:24 -07001121 = consumeRights(uniqueId, &handle, action, reserve);
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001122 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001123
Gloria Wang1da9aa62011-03-20 10:25:16 -07001124 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001125 return DRM_NO_ERROR;
1126 }
1127
1128 case SET_PLAYBACK_STATUS:
1129 {
Steve Block3856b092011-10-20 11:56:00 +01001130 ALOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001131 CHECK_INTERFACE(IDrmManagerService, data, reply);
1132
1133 const int uniqueId = data.readInt32();
1134
1135 DecryptHandle handle;
Gloria Wang1da9aa62011-03-20 10:25:16 -07001136 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001137
Gloria Wang197f0472011-08-01 10:31:24 -07001138 const int playbackStatus = data.readInt32();
1139 const int64_t position = data.readInt64();
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001140 const status_t status
Gloria Wang197f0472011-08-01 10:31:24 -07001141 = setPlaybackStatus(uniqueId, &handle, playbackStatus, position);
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001142 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001143
Gloria Wang1da9aa62011-03-20 10:25:16 -07001144 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001145 return DRM_NO_ERROR;
1146 }
1147
1148 case VALIDATE_ACTION:
1149 {
Steve Block3856b092011-10-20 11:56:00 +01001150 ALOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001151 CHECK_INTERFACE(IDrmManagerService, data, reply);
1152
Gloria Wang197f0472011-08-01 10:31:24 -07001153 const int uniqueId = data.readInt32();
1154 const String8 path = data.readString8();
1155 const int action = data.readInt32();
1156 const int outputType = data.readInt32();
1157 const int configuration = data.readInt32();
1158 bool result = validateAction(uniqueId, path, action,
1159 ActionDescription(outputType, configuration));
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001160
1161 reply->writeInt32(result);
1162 return DRM_NO_ERROR;
1163 }
1164
1165 case REMOVE_RIGHTS:
1166 {
Steve Block3856b092011-10-20 11:56:00 +01001167 ALOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001168 CHECK_INTERFACE(IDrmManagerService, data, reply);
1169
Gloria Wang197f0472011-08-01 10:31:24 -07001170 int uniqueId = data.readInt32();
1171 String8 path = data.readString8();
1172 const status_t status = removeRights(uniqueId, path);
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001173 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001174
1175 return DRM_NO_ERROR;
1176 }
1177
1178 case REMOVE_ALL_RIGHTS:
1179 {
Steve Block3856b092011-10-20 11:56:00 +01001180 ALOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001181 CHECK_INTERFACE(IDrmManagerService, data, reply);
1182
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001183 const status_t status = removeAllRights(data.readInt32());
1184 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001185
1186 return DRM_NO_ERROR;
1187 }
1188
1189 case OPEN_CONVERT_SESSION:
1190 {
Steve Block3856b092011-10-20 11:56:00 +01001191 ALOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001192 CHECK_INTERFACE(IDrmManagerService, data, reply);
1193
Gloria Wang197f0472011-08-01 10:31:24 -07001194 const int uniqueId = data.readInt32();
1195 const String8 mimeType = data.readString8();
1196 const int convertId = openConvertSession(uniqueId, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001197
1198 reply->writeInt32(convertId);
1199 return DRM_NO_ERROR;
1200 }
1201
1202 case CONVERT_DATA:
1203 {
Steve Block3856b092011-10-20 11:56:00 +01001204 ALOGV("BnDrmManagerService::onTransact :CONVERT_DATA");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001205 CHECK_INTERFACE(IDrmManagerService, data, reply);
1206
1207 const int uniqueId = data.readInt32();
1208 const int convertId = data.readInt32();
1209
1210 //Filling input data
1211 const int bufferSize = data.readInt32();
1212 DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1213
1214 DrmConvertedStatus* drmConvertedStatus = convertData(uniqueId, convertId, inputData);
1215
1216 if (NULL != drmConvertedStatus) {
1217 //Filling Drm Converted Ststus
1218 reply->writeInt32(drmConvertedStatus->statusCode);
Gloria Wanga2cd44c2010-11-19 15:19:36 -08001219 reply->writeInt64(drmConvertedStatus->offset);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001220
1221 if (NULL != drmConvertedStatus->convertedData) {
1222 const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
1223 const int bufferSize = convertedData->length;
1224 reply->writeInt32(bufferSize);
1225 if (0 < bufferSize) {
1226 reply->write(convertedData->data, bufferSize);
1227 }
1228 delete [] convertedData->data;
1229 delete convertedData; convertedData = NULL;
1230 }
1231 }
1232 delete inputData; inputData = NULL;
1233 delete drmConvertedStatus; drmConvertedStatus = NULL;
1234 return DRM_NO_ERROR;
1235 }
1236
1237 case CLOSE_CONVERT_SESSION:
1238 {
Steve Block3856b092011-10-20 11:56:00 +01001239 ALOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001240 CHECK_INTERFACE(IDrmManagerService, data, reply);
1241
Gloria Wang197f0472011-08-01 10:31:24 -07001242 const int uniqueId = data.readInt32();
1243 const int convertId = data.readInt32();
1244 DrmConvertedStatus* drmConvertedStatus
1245 = closeConvertSession(uniqueId, convertId);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001246
1247 if (NULL != drmConvertedStatus) {
1248 //Filling Drm Converted Ststus
1249 reply->writeInt32(drmConvertedStatus->statusCode);
Gloria Wanga2cd44c2010-11-19 15:19:36 -08001250 reply->writeInt64(drmConvertedStatus->offset);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001251
1252 if (NULL != drmConvertedStatus->convertedData) {
1253 const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
1254 const int bufferSize = convertedData->length;
1255 reply->writeInt32(bufferSize);
1256 if (0 < bufferSize) {
1257 reply->write(convertedData->data, bufferSize);
1258 }
1259 delete [] convertedData->data;
1260 delete convertedData; convertedData = NULL;
1261 }
1262 }
1263 delete drmConvertedStatus; drmConvertedStatus = NULL;
1264 return DRM_NO_ERROR;
1265 }
1266
1267 case GET_ALL_SUPPORT_INFO:
1268 {
Steve Block3856b092011-10-20 11:56:00 +01001269 ALOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001270 CHECK_INTERFACE(IDrmManagerService, data, reply);
1271
1272 const int uniqueId = data.readInt32();
1273 int length = 0;
1274 DrmSupportInfo* drmSupportInfoArray = NULL;
1275
1276 status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray);
1277
1278 reply->writeInt32(length);
1279 for (int i = 0; i < length; ++i) {
1280 DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i];
1281
1282 reply->writeInt32(drmSupportInfo.getFileSuffixCount());
1283 DrmSupportInfo::FileSuffixIterator fileSuffixIt
1284 = drmSupportInfo.getFileSuffixIterator();
1285 while (fileSuffixIt.hasNext()) {
1286 reply->writeString8(fileSuffixIt.next());
1287 }
1288
1289 reply->writeInt32(drmSupportInfo.getMimeTypeCount());
1290 DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator();
1291 while (mimeTypeIt.hasNext()) {
1292 reply->writeString8(mimeTypeIt.next());
1293 }
1294 reply->writeString8(drmSupportInfo.getDescription());
1295 }
1296 delete [] drmSupportInfoArray; drmSupportInfoArray = NULL;
1297 reply->writeInt32(status);
1298 return DRM_NO_ERROR;
1299 }
1300
1301 case OPEN_DECRYPT_SESSION:
1302 {
Steve Block3856b092011-10-20 11:56:00 +01001303 ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001304 CHECK_INTERFACE(IDrmManagerService, data, reply);
1305
1306 const int uniqueId = data.readInt32();
1307 const int fd = data.readFileDescriptor();
1308
Gloria Wang197f0472011-08-01 10:31:24 -07001309 const off64_t offset = data.readInt64();
1310 const off64_t length = data.readInt64();
James Dong9d2f3862012-01-10 08:24:37 -08001311 const String8 mime = data.readString8();
1312
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001313 DecryptHandle* handle
James Dong9d2f3862012-01-10 08:24:37 -08001314 = openDecryptSession(uniqueId, fd, offset, length, mime.string());
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001315
1316 if (NULL != handle) {
Gloria Wangc10ce332011-06-15 10:27:52 -07001317 writeDecryptHandleToParcelData(handle, reply);
Gloria Wang1da9aa62011-03-20 10:25:16 -07001318 clearDecryptHandle(handle);
1319 delete handle; handle = NULL;
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001320 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001321 return DRM_NO_ERROR;
1322 }
1323
Takeshi Aimie943f842010-10-08 23:05:49 +09001324 case OPEN_DECRYPT_SESSION_FROM_URI:
1325 {
Steve Block3856b092011-10-20 11:56:00 +01001326 ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI");
Takeshi Aimie943f842010-10-08 23:05:49 +09001327 CHECK_INTERFACE(IDrmManagerService, data, reply);
1328
1329 const int uniqueId = data.readInt32();
1330 const String8 uri = data.readString8();
James Dong9d2f3862012-01-10 08:24:37 -08001331 const String8 mime = data.readString8();
Takeshi Aimie943f842010-10-08 23:05:49 +09001332
James Dong9d2f3862012-01-10 08:24:37 -08001333 DecryptHandle* handle = openDecryptSession(uniqueId, uri.string(), mime.string());
Takeshi Aimie943f842010-10-08 23:05:49 +09001334
1335 if (NULL != handle) {
Gloria Wangc10ce332011-06-15 10:27:52 -07001336 writeDecryptHandleToParcelData(handle, reply);
Gloria Wang1da9aa62011-03-20 10:25:16 -07001337
1338 clearDecryptHandle(handle);
1339 delete handle; handle = NULL;
Takeshi Aimie943f842010-10-08 23:05:49 +09001340 } else {
Steve Block3856b092011-10-20 11:56:00 +01001341 ALOGV("NULL decryptHandle is returned");
Takeshi Aimie943f842010-10-08 23:05:49 +09001342 }
Takeshi Aimie943f842010-10-08 23:05:49 +09001343 return DRM_NO_ERROR;
1344 }
1345
Kei Takahashicba7b322012-01-18 17:10:19 +09001346 case OPEN_DECRYPT_SESSION_FOR_STREAMING:
1347 {
1348 ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FOR_STREAMING");
1349 CHECK_INTERFACE(IDrmManagerService, data, reply);
1350
1351 const int uniqueId = data.readInt32();
1352 const int bufferSize = data.readInt32();
1353 DrmBuffer buf((bufferSize > 0) ? (char *)data.readInplace(bufferSize) : NULL,
1354 bufferSize);
1355 const String8 mimeType(data.readString8());
1356
1357 DecryptHandle* handle = openDecryptSession(uniqueId, buf, mimeType);
1358
1359 if (handle != NULL) {
1360 writeDecryptHandleToParcelData(handle, reply);
1361 clearDecryptHandle(handle);
1362 delete handle;
1363 handle = NULL;
1364 } else {
1365 ALOGV("NULL decryptHandle is returned");
1366 }
1367 return DRM_NO_ERROR;
1368 }
1369
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001370 case CLOSE_DECRYPT_SESSION:
1371 {
Steve Block3856b092011-10-20 11:56:00 +01001372 ALOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001373 CHECK_INTERFACE(IDrmManagerService, data, reply);
1374
1375 const int uniqueId = data.readInt32();
1376
1377 DecryptHandle* handle = new DecryptHandle();
Gloria Wang1da9aa62011-03-20 10:25:16 -07001378 readDecryptHandleFromParcelData(handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001379
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001380 const status_t status = closeDecryptSession(uniqueId, handle);
1381 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001382 return DRM_NO_ERROR;
1383 }
1384
1385 case INITIALIZE_DECRYPT_UNIT:
1386 {
Steve Block3856b092011-10-20 11:56:00 +01001387 ALOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001388 CHECK_INTERFACE(IDrmManagerService, data, reply);
1389
1390 const int uniqueId = data.readInt32();
1391
1392 DecryptHandle handle;
Gloria Wang1da9aa62011-03-20 10:25:16 -07001393 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001394
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001395 const int decryptUnitId = data.readInt32();
1396
1397 //Filling Header info
1398 const int bufferSize = data.readInt32();
1399 DrmBuffer* headerInfo = NULL;
1400 headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1401
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001402 const status_t status
1403 = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo);
1404 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001405
Gloria Wang1da9aa62011-03-20 10:25:16 -07001406 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001407 delete headerInfo; headerInfo = NULL;
1408 return DRM_NO_ERROR;
1409 }
1410
1411 case DECRYPT:
1412 {
Steve Block3856b092011-10-20 11:56:00 +01001413 ALOGV("BnDrmManagerService::onTransact :DECRYPT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001414 CHECK_INTERFACE(IDrmManagerService, data, reply);
1415
1416 const int uniqueId = data.readInt32();
1417
1418 DecryptHandle handle;
Gloria Wang1da9aa62011-03-20 10:25:16 -07001419 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001420
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001421 const int decryptUnitId = data.readInt32();
1422 const int decBufferSize = data.readInt32();
1423
1424 const int encBufferSize = data.readInt32();
1425 DrmBuffer* encBuffer
1426 = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize);
1427
1428 char* buffer = NULL;
1429 buffer = new char[decBufferSize];
1430 DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize);
1431
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001432 DrmBuffer* IV = NULL;
1433 if (0 != data.dataAvail()) {
1434 const int ivBufferlength = data.readInt32();
1435 IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength);
1436 }
1437
1438 const status_t status
1439 = decrypt(uniqueId, &handle, decryptUnitId, encBuffer, &decBuffer, IV);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001440
1441 reply->writeInt32(status);
1442
Jeff Tinker09ed70f2015-09-14 13:55:23 -07001443 if (status == NO_ERROR) {
1444 const int size = decBuffer->length;
1445 reply->writeInt32(size);
1446 reply->write(decBuffer->data, size);
1447 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001448
Gloria Wang1da9aa62011-03-20 10:25:16 -07001449 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001450 delete encBuffer; encBuffer = NULL;
1451 delete decBuffer; decBuffer = NULL;
1452 delete [] buffer; buffer = NULL;
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001453 delete IV; IV = NULL;
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001454 return DRM_NO_ERROR;
1455 }
1456
1457 case FINALIZE_DECRYPT_UNIT:
1458 {
Steve Block3856b092011-10-20 11:56:00 +01001459 ALOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001460 CHECK_INTERFACE(IDrmManagerService, data, reply);
1461
1462 const int uniqueId = data.readInt32();
1463
1464 DecryptHandle handle;
Gloria Wang1da9aa62011-03-20 10:25:16 -07001465 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001466
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001467 const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32());
1468 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001469
Gloria Wang1da9aa62011-03-20 10:25:16 -07001470 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001471 return DRM_NO_ERROR;
1472 }
1473
1474 case PREAD:
1475 {
Steve Block3856b092011-10-20 11:56:00 +01001476 ALOGV("BnDrmManagerService::onTransact :READ");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001477 CHECK_INTERFACE(IDrmManagerService, data, reply);
1478
1479 const int uniqueId = data.readInt32();
1480
1481 DecryptHandle handle;
Gloria Wang1da9aa62011-03-20 10:25:16 -07001482 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001483
1484 const int numBytes = data.readInt32();
1485 char* buffer = new char[numBytes];
1486
Gloria Wanga2cd44c2010-11-19 15:19:36 -08001487 const off64_t offset = data.readInt64();
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001488
1489 ssize_t result = pread(uniqueId, &handle, buffer, numBytes, offset);
1490 reply->writeInt32(result);
1491 if (0 < result) {
1492 reply->write(buffer, result);
1493 }
1494
Gloria Wang1da9aa62011-03-20 10:25:16 -07001495 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001496 delete [] buffer, buffer = NULL;
1497 return DRM_NO_ERROR;
1498 }
1499
1500 default:
1501 return BBinder::onTransact(code, data, reply, flags);
1502 }
1503}