blob: 16f1dd0c190890ded32148afea4c723962ebd741 [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 Wang4dabc202011-03-21 16:53:14 -070040static void writeDecrptHandleToParcelData(
41 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);
49 for(int i = 0; i < size; i++) {
50 data->writeInt32(handle->copyControlVector.keyAt(i));
51 data->writeInt32(handle->copyControlVector.valueAt(i));
52 }
53
54 if (NULL != handle->decryptInfo) {
55 data->writeInt32(handle->decryptInfo->decryptBufferLength);
56 } else {
57 data->writeInt32(INVALID_BUFFER_LENGTH);
58 }
59}
60
61static void readDecryptHandleFromParcelData(
62 DecryptHandle* handle, const Parcel& data) {
63 if (0 == data.dataAvail()) {
64 return;
65 }
66
67 handle->decryptId = data.readInt32();
68 handle->mimeType = data.readString8();
69 handle->decryptApiType = data.readInt32();
70 handle->status = data.readInt32();
71
72 int size = data.readInt32();
73 for (int i = 0; i < size; i ++) {
74 handle->copyControlVector.add(
75 (DrmCopyControl)data.readInt32(), data.readInt32());
76 }
77
78 handle->decryptInfo = NULL;
79 const int bufferLen = data.readInt32();
80 if (INVALID_BUFFER_LENGTH != bufferLen) {
81 handle->decryptInfo = new DecryptInfo();
82 handle->decryptInfo->decryptBufferLength = bufferLen;
83 }
84}
85
86static void clearDecryptHandle(DecryptHandle* handle) {
87 if (handle == NULL) {
88 return;
89 }
90 if (handle->decryptInfo) {
91 delete handle->decryptInfo;
92 handle->decryptInfo = NULL;
93 }
94 handle->copyControlVector.clear();
95}
96
Takeshi Aimi2272ee22010-09-20 23:40:41 +090097int BpDrmManagerService::addUniqueId(int uniqueId) {
98 LOGV("add uniqueid");
99 Parcel data, reply;
100 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
101 data.writeInt32(uniqueId);
102 remote()->transact(ADD_UNIQUEID, data, &reply);
103 return reply.readInt32();
104}
105
106void BpDrmManagerService::removeUniqueId(int uniqueId) {
107 LOGV("remove uniqueid");
108 Parcel data, reply;
109 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
110 data.writeInt32(uniqueId);
111 remote()->transact(REMOVE_UNIQUEID, data, &reply);
112}
113
Takeshi Aimie943f842010-10-08 23:05:49 +0900114void BpDrmManagerService::addClient(int uniqueId) {
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900115 Parcel data, reply;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900116 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
117 data.writeInt32(uniqueId);
Takeshi Aimie943f842010-10-08 23:05:49 +0900118 remote()->transact(ADD_CLIENT, data, &reply);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900119}
120
Takeshi Aimie943f842010-10-08 23:05:49 +0900121void BpDrmManagerService::removeClient(int uniqueId) {
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900122 Parcel data, reply;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900123 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
124 data.writeInt32(uniqueId);
Takeshi Aimie943f842010-10-08 23:05:49 +0900125 remote()->transact(REMOVE_CLIENT, data, &reply);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900126}
127
128status_t BpDrmManagerService::setDrmServiceListener(
129 int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) {
130 LOGV("setDrmServiceListener");
131 Parcel data, reply;
132
133 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
134 data.writeInt32(uniqueId);
135 data.writeStrongBinder(drmServiceListener->asBinder());
136 remote()->transact(SET_DRM_SERVICE_LISTENER, data, &reply);
137 return reply.readInt32();
138}
139
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900140status_t BpDrmManagerService::installDrmEngine(int uniqueId, const String8& drmEngineFile) {
141 LOGV("Install DRM Engine");
142 Parcel data, reply;
143
144 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
145 data.writeInt32(uniqueId);
146 data.writeString8(drmEngineFile);
147
148 remote()->transact(INSTALL_DRM_ENGINE, data, &reply);
149 return reply.readInt32();
150}
151
152DrmConstraints* BpDrmManagerService::getConstraints(
153 int uniqueId, const String8* path, const int action) {
154 LOGV("Get Constraints");
155 Parcel data, reply;
156
157 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
158 data.writeInt32(uniqueId);
159 data.writeString8(*path);
160 data.writeInt32(action);
161
162 remote()->transact(GET_CONSTRAINTS_FROM_CONTENT, data, &reply);
163
164 DrmConstraints* drmConstraints = NULL;
165 if (0 != reply.dataAvail()) {
166 //Filling Drm Constraints
167 drmConstraints = new DrmConstraints();
168
169 const int size = reply.readInt32();
170 for (int index = 0; index < size; ++index) {
171 const String8 key(reply.readString8());
172 const int bufferSize = reply.readInt32();
173 char* data = NULL;
174 if (0 < bufferSize) {
175 data = new char[bufferSize];
176 reply.read(data, bufferSize);
177 }
178 drmConstraints->put(&key, data);
179 }
180 }
181 return drmConstraints;
182}
183
Takeshi Aimi34738462010-11-16 13:56:11 +0900184DrmMetadata* BpDrmManagerService::getMetadata(int uniqueId, const String8* path) {
185 LOGV("Get Metadata");
186 Parcel data, reply;
187 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
188 data.writeInt32(uniqueId);
189
190 DrmMetadata* drmMetadata = NULL;
191 data.writeString8(*path);
192 remote()->transact(GET_METADATA_FROM_CONTENT, data, &reply);
193
194 if (0 != reply.dataAvail()) {
195 //Filling Drm Metadata
196 drmMetadata = new DrmMetadata();
197
198 const int size = reply.readInt32();
199 for (int index = 0; index < size; ++index) {
200 const String8 key(reply.readString8());
201 const int bufferSize = reply.readInt32();
202 char* data = NULL;
203 if (0 < bufferSize) {
204 data = new char[bufferSize];
205 reply.read(data, bufferSize);
206 }
207 drmMetadata->put(&key, data);
208 }
209 }
210 return drmMetadata;
211}
212
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900213bool BpDrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) {
214 LOGV("Can Handle");
215 Parcel data, reply;
216
217 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
218 data.writeInt32(uniqueId);
219
220 data.writeString8(path);
221 data.writeString8(mimeType);
222
223 remote()->transact(CAN_HANDLE, data, &reply);
224
225 return static_cast<bool>(reply.readInt32());
226}
227
228DrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) {
229 LOGV("Process DRM Info");
230 Parcel data, reply;
231
232 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
233 data.writeInt32(uniqueId);
234
235 //Filling DRM info
236 data.writeInt32(drmInfo->getInfoType());
237 const DrmBuffer dataBuffer = drmInfo->getData();
238 const int dataBufferSize = dataBuffer.length;
239 data.writeInt32(dataBufferSize);
240 if (0 < dataBufferSize) {
241 data.write(dataBuffer.data, dataBufferSize);
242 }
243 data.writeString8(drmInfo->getMimeType());
244
245 data.writeInt32(drmInfo->getCount());
246 DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
247
248 while (keyIt.hasNext()) {
249 const String8 key = keyIt.next();
250 data.writeString8(key);
251 const String8 value = drmInfo->get(key);
252 data.writeString8((value == String8("")) ? String8("NULL") : value);
253 }
254
255 remote()->transact(PROCESS_DRM_INFO, data, &reply);
256
257 DrmInfoStatus* drmInfoStatus = NULL;
258 if (0 != reply.dataAvail()) {
259 //Filling DRM Info Status
260 const int statusCode = reply.readInt32();
Takeshi Aimie943f842010-10-08 23:05:49 +0900261 const int infoType = reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900262 const String8 mimeType = reply.readString8();
263
264 DrmBuffer* drmBuffer = NULL;
265 if (0 != reply.dataAvail()) {
266 const int bufferSize = reply.readInt32();
267 char* data = NULL;
268 if (0 < bufferSize) {
269 data = new char[bufferSize];
270 reply.read(data, bufferSize);
271 }
272 drmBuffer = new DrmBuffer(data, bufferSize);
273 }
Takeshi Aimie943f842010-10-08 23:05:49 +0900274 drmInfoStatus = new DrmInfoStatus(statusCode, infoType, drmBuffer, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900275 }
276 return drmInfoStatus;
277}
278
279DrmInfo* BpDrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) {
280 LOGV("Acquire DRM Info");
281 Parcel data, reply;
282
283 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
284 data.writeInt32(uniqueId);
285
286 //Filling DRM Info Request
287 data.writeInt32(drmInforequest->getInfoType());
288 data.writeString8(drmInforequest->getMimeType());
289
290 data.writeInt32(drmInforequest->getCount());
291 DrmInfoRequest::KeyIterator keyIt = drmInforequest->keyIterator();
292
293 while (keyIt.hasNext()) {
294 const String8 key = keyIt.next();
295 data.writeString8(key);
296 const String8 value = drmInforequest->get(key);
297 data.writeString8((value == String8("")) ? String8("NULL") : value);
298 }
299
300 remote()->transact(ACQUIRE_DRM_INFO, data, &reply);
301
302 DrmInfo* drmInfo = NULL;
303 if (0 != reply.dataAvail()) {
304 //Filling DRM Info
305 const int infoType = reply.readInt32();
306 const int bufferSize = reply.readInt32();
307 char* data = NULL;
308
309 if (0 < bufferSize) {
310 data = new char[bufferSize];
311 reply.read(data, bufferSize);
312 }
313 drmInfo = new DrmInfo(infoType, DrmBuffer(data, bufferSize), reply.readString8());
314
315 const int size = reply.readInt32();
316 for (int index = 0; index < size; ++index) {
317 const String8 key(reply.readString8());
318 const String8 value(reply.readString8());
319 drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
320 }
321 }
322 return drmInfo;
323}
324
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900325status_t BpDrmManagerService::saveRights(
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900326 int uniqueId, const DrmRights& drmRights,
327 const String8& rightsPath, const String8& contentPath) {
328 LOGV("Save Rights");
329 Parcel data, reply;
330
331 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
332 data.writeInt32(uniqueId);
333
334 //Filling Drm Rights
335 const DrmBuffer dataBuffer = drmRights.getData();
336 data.writeInt32(dataBuffer.length);
337 data.write(dataBuffer.data, dataBuffer.length);
338
339 const String8 mimeType = drmRights.getMimeType();
340 data.writeString8((mimeType == String8("")) ? String8("NULL") : mimeType);
341
342 const String8 accountId = drmRights.getAccountId();
343 data.writeString8((accountId == String8("")) ? String8("NULL") : accountId);
344
345 const String8 subscriptionId = drmRights.getSubscriptionId();
346 data.writeString8((subscriptionId == String8("")) ? String8("NULL") : subscriptionId);
347
348 data.writeString8((rightsPath == String8("")) ? String8("NULL") : rightsPath);
349 data.writeString8((contentPath == String8("")) ? String8("NULL") : contentPath);
350
351 remote()->transact(SAVE_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900352 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900353}
354
355String8 BpDrmManagerService::getOriginalMimeType(int uniqueId, const String8& path) {
356 LOGV("Get Original MimeType");
357 Parcel data, reply;
358
359 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
360 data.writeInt32(uniqueId);
361 data.writeString8(path);
362
363 remote()->transact(GET_ORIGINAL_MIMETYPE, data, &reply);
364 return reply.readString8();
365}
366
367int BpDrmManagerService::getDrmObjectType(
368 int uniqueId, const String8& path, const String8& mimeType) {
369 LOGV("Get Drm object type");
370 Parcel data, reply;
371
372 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
373 data.writeInt32(uniqueId);
374 data.writeString8(path);
375 data.writeString8(mimeType);
376
377 remote()->transact(GET_DRM_OBJECT_TYPE, data, &reply);
378
379 return reply.readInt32();
380}
381
382int BpDrmManagerService::checkRightsStatus(int uniqueId, const String8& path, int action) {
383 LOGV("checkRightsStatus");
384 Parcel data, reply;
385
386 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
387 data.writeInt32(uniqueId);
388 data.writeString8(path);
389 data.writeInt32(action);
390
391 remote()->transact(CHECK_RIGHTS_STATUS, data, &reply);
392
393 return reply.readInt32();
394}
395
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900396status_t BpDrmManagerService::consumeRights(
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900397 int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) {
398 LOGV("consumeRights");
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900399 Parcel data, reply;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900400
401 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
402 data.writeInt32(uniqueId);
403
Gloria Wang4dabc202011-03-21 16:53:14 -0700404 writeDecrptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900405
406 data.writeInt32(action);
407 data.writeInt32(static_cast< int>(reserve));
408
409 remote()->transact(CONSUME_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900410 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900411}
412
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900413status_t BpDrmManagerService::setPlaybackStatus(
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800414 int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) {
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900415 LOGV("setPlaybackStatus");
416 Parcel data, reply;
417
418 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
419 data.writeInt32(uniqueId);
420
Gloria Wang4dabc202011-03-21 16:53:14 -0700421 writeDecrptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900422
423 data.writeInt32(playbackStatus);
Gloria Wang2ed8a922011-01-19 15:38:16 -0800424 data.writeInt64(position);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900425
426 remote()->transact(SET_PLAYBACK_STATUS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900427 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900428}
429
430bool BpDrmManagerService::validateAction(
431 int uniqueId, const String8& path,
432 int action, const ActionDescription& description) {
433 LOGV("validateAction");
434 Parcel data, reply;
435
436 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
437 data.writeInt32(uniqueId);
438 data.writeString8(path);
439 data.writeInt32(action);
440 data.writeInt32(description.outputType);
441 data.writeInt32(description.configuration);
442
443 remote()->transact(VALIDATE_ACTION, data, &reply);
444
445 return static_cast<bool>(reply.readInt32());
446}
447
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900448status_t BpDrmManagerService::removeRights(int uniqueId, const String8& path) {
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900449 LOGV("removeRights");
450 Parcel data, reply;
451
452 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
453 data.writeInt32(uniqueId);
454 data.writeString8(path);
455
456 remote()->transact(REMOVE_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900457 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900458}
459
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900460status_t BpDrmManagerService::removeAllRights(int uniqueId) {
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900461 LOGV("removeAllRights");
462 Parcel data, reply;
463
464 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
465 data.writeInt32(uniqueId);
466
467 remote()->transact(REMOVE_ALL_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900468 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900469}
470
471int BpDrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) {
472 LOGV("openConvertSession");
473 Parcel data, reply;
474
475 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
476 data.writeInt32(uniqueId);
477 data.writeString8(mimeType);
478
479 remote()->transact(OPEN_CONVERT_SESSION, data, &reply);
480 return reply.readInt32();
481}
482
483DrmConvertedStatus* BpDrmManagerService::convertData(
484 int uniqueId, int convertId, const DrmBuffer* inputData) {
485 LOGV("convertData");
486 Parcel data, reply;
487
488 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
489 data.writeInt32(uniqueId);
490 data.writeInt32(convertId);
491 data.writeInt32(inputData->length);
492 data.write(inputData->data, inputData->length);
493
494 remote()->transact(CONVERT_DATA, data, &reply);
495
496 DrmConvertedStatus* drmConvertedStatus = NULL;
497
498 if (0 != reply.dataAvail()) {
499 //Filling DRM Converted Status
500 const int statusCode = reply.readInt32();
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800501 const off64_t offset = reply.readInt64();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900502
503 DrmBuffer* convertedData = NULL;
504 if (0 != reply.dataAvail()) {
505 const int bufferSize = reply.readInt32();
506 char* data = NULL;
507 if (0 < bufferSize) {
508 data = new char[bufferSize];
509 reply.read(data, bufferSize);
510 }
511 convertedData = new DrmBuffer(data, bufferSize);
512 }
513 drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
514 }
515 return drmConvertedStatus;
516}
517
518DrmConvertedStatus* BpDrmManagerService::closeConvertSession(int uniqueId, int convertId) {
519 LOGV("closeConvertSession");
520 Parcel data, reply;
521
522 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
523 data.writeInt32(uniqueId);
524 data.writeInt32(convertId);
525
526 remote()->transact(CLOSE_CONVERT_SESSION, data, &reply);
527
528 DrmConvertedStatus* drmConvertedStatus = NULL;
529
530 if (0 != reply.dataAvail()) {
531 //Filling DRM Converted Status
532 const int statusCode = reply.readInt32();
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800533 const off64_t offset = reply.readInt64();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900534
535 DrmBuffer* convertedData = NULL;
536 if (0 != reply.dataAvail()) {
537 const int bufferSize = reply.readInt32();
538 char* data = NULL;
539 if (0 < bufferSize) {
540 data = new char[bufferSize];
541 reply.read(data, bufferSize);
542 }
543 convertedData = new DrmBuffer(data, bufferSize);
544 }
545 drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
546 }
547 return drmConvertedStatus;
548}
549
550status_t BpDrmManagerService::getAllSupportInfo(
551 int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) {
552 LOGV("Get All Support Info");
553 Parcel data, reply;
554
555 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
556 data.writeInt32(uniqueId);
557
558 remote()->transact(GET_ALL_SUPPORT_INFO, data, &reply);
559
560 //Filling DRM Support Info
561 const int arraySize = reply.readInt32();
562 if (0 < arraySize) {
563 *drmSupportInfoArray = new DrmSupportInfo[arraySize];
564
565 for (int index = 0; index < arraySize; ++index) {
566 DrmSupportInfo drmSupportInfo;
567
568 const int fileSuffixVectorSize = reply.readInt32();
569 for (int i = 0; i < fileSuffixVectorSize; ++i) {
570 drmSupportInfo.addFileSuffix(reply.readString8());
571 }
572
573 const int mimeTypeVectorSize = reply.readInt32();
574 for (int i = 0; i < mimeTypeVectorSize; ++i) {
575 drmSupportInfo.addMimeType(reply.readString8());
576 }
577
578 drmSupportInfo.setDescription(reply.readString8());
579 (*drmSupportInfoArray)[index] = drmSupportInfo;
580 }
581 }
582 *length = arraySize;
583 return reply.readInt32();
584}
585
586DecryptHandle* BpDrmManagerService::openDecryptSession(
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800587 int uniqueId, int fd, off64_t offset, off64_t length) {
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900588 LOGV("Entering BpDrmManagerService::openDecryptSession");
589 Parcel data, reply;
590
Takeshi Aimie943f842010-10-08 23:05:49 +0900591 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900592 data.writeInt32(uniqueId);
593 data.writeFileDescriptor(fd);
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800594 data.writeInt64(offset);
595 data.writeInt64(length);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900596
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900597 remote()->transact(OPEN_DECRYPT_SESSION, data, &reply);
598
599 DecryptHandle* handle = NULL;
600 if (0 != reply.dataAvail()) {
601 handle = new DecryptHandle();
Gloria Wang4dabc202011-03-21 16:53:14 -0700602 readDecryptHandleFromParcelData(handle, reply);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900603 }
604 return handle;
605}
606
Takeshi Aimie943f842010-10-08 23:05:49 +0900607DecryptHandle* BpDrmManagerService::openDecryptSession(int uniqueId, const char* uri) {
608 LOGV("Entering BpDrmManagerService::openDecryptSession");
609 Parcel data, reply;
610
611 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
612 data.writeInt32(uniqueId);
613 data.writeString8(String8(uri));
614
615 remote()->transact(OPEN_DECRYPT_SESSION_FROM_URI, data, &reply);
616
617 DecryptHandle* handle = NULL;
618 if (0 != reply.dataAvail()) {
619 handle = new DecryptHandle();
Gloria Wang4dabc202011-03-21 16:53:14 -0700620 readDecryptHandleFromParcelData(handle, reply);
Takeshi Aimie943f842010-10-08 23:05:49 +0900621 } else {
Gloria Wang6b610a32011-03-04 14:45:03 -0800622 LOGV("no decryptHandle is generated in service side");
Takeshi Aimie943f842010-10-08 23:05:49 +0900623 }
624 return handle;
625}
626
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900627status_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) {
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900628 LOGV("closeDecryptSession");
629 Parcel data, reply;
630
631 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
632 data.writeInt32(uniqueId);
633
Gloria Wang4dabc202011-03-21 16:53:14 -0700634 writeDecrptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900635
636 remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply);
637
638 if (NULL != decryptHandle->decryptInfo) {
639 LOGV("deleting decryptInfo");
640 delete decryptHandle->decryptInfo; decryptHandle->decryptInfo = NULL;
641 }
642 delete decryptHandle; decryptHandle = NULL;
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900643 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900644}
645
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900646status_t BpDrmManagerService::initializeDecryptUnit(
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900647 int uniqueId, DecryptHandle* decryptHandle,
648 int decryptUnitId, const DrmBuffer* headerInfo) {
649 LOGV("initializeDecryptUnit");
650 Parcel data, reply;
651
652 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
653 data.writeInt32(uniqueId);
654
Gloria Wang4dabc202011-03-21 16:53:14 -0700655 writeDecrptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900656
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900657 data.writeInt32(decryptUnitId);
658
659 data.writeInt32(headerInfo->length);
660 data.write(headerInfo->data, headerInfo->length);
661
662 remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900663 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900664}
665
666status_t BpDrmManagerService::decrypt(
667 int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900668 const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) {
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900669 LOGV("decrypt");
670 Parcel data, reply;
671
672 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
673 data.writeInt32(uniqueId);
674
Gloria Wang4dabc202011-03-21 16:53:14 -0700675 writeDecrptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900676
677 data.writeInt32(decryptUnitId);
678 data.writeInt32((*decBuffer)->length);
679
680 data.writeInt32(encBuffer->length);
681 data.write(encBuffer->data, encBuffer->length);
682
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900683 if (NULL != IV) {
684 data.writeInt32(IV->length);
685 data.write(IV->data, IV->length);
686 }
687
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900688 remote()->transact(DECRYPT, data, &reply);
689
690 const status_t status = reply.readInt32();
691 LOGV("Return value of decrypt() is %d", status);
692
693 const int size = reply.readInt32();
694 (*decBuffer)->length = size;
695 reply.read((void *)(*decBuffer)->data, size);
696
697 return status;
698}
699
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900700status_t BpDrmManagerService::finalizeDecryptUnit(
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900701 int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) {
702 LOGV("finalizeDecryptUnit");
703 Parcel data, reply;
704
705 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
706 data.writeInt32(uniqueId);
707
Gloria Wang4dabc202011-03-21 16:53:14 -0700708 writeDecrptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900709
710 data.writeInt32(decryptUnitId);
711
712 remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900713 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900714}
715
716ssize_t BpDrmManagerService::pread(
717 int uniqueId, DecryptHandle* decryptHandle, void* buffer,
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800718 ssize_t numBytes, off64_t offset) {
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900719 LOGV("read");
720 Parcel data, reply;
721 int result;
722
723 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
724 data.writeInt32(uniqueId);
725
Gloria Wang4dabc202011-03-21 16:53:14 -0700726 writeDecrptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900727
728 data.writeInt32(numBytes);
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800729 data.writeInt64(offset);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900730
731 remote()->transact(PREAD, data, &reply);
732 result = reply.readInt32();
733 if (0 < result) {
734 reply.read(buffer, result);
735 }
736 return result;
737}
738
739IMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService");
740
741status_t BnDrmManagerService::onTransact(
742 uint32_t code, const Parcel& data,
743 Parcel* reply, uint32_t flags) {
744 LOGV("Entering BnDrmManagerService::onTransact with code %d", code);
745
746 switch (code) {
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900747 case ADD_UNIQUEID:
748 {
749 LOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID");
750 CHECK_INTERFACE(IDrmManagerService, data, reply);
751 int uniqueId = addUniqueId(data.readInt32());
752 reply->writeInt32(uniqueId);
753 return DRM_NO_ERROR;
754 }
755
756 case REMOVE_UNIQUEID:
757 {
758 LOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID");
759 CHECK_INTERFACE(IDrmManagerService, data, reply);
760 removeUniqueId(data.readInt32());
761 return DRM_NO_ERROR;
762 }
763
Takeshi Aimie943f842010-10-08 23:05:49 +0900764 case ADD_CLIENT:
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900765 {
Takeshi Aimie943f842010-10-08 23:05:49 +0900766 LOGV("BnDrmManagerService::onTransact :ADD_CLIENT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900767 CHECK_INTERFACE(IDrmManagerService, data, reply);
Takeshi Aimie943f842010-10-08 23:05:49 +0900768 addClient(data.readInt32());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900769 return DRM_NO_ERROR;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900770 }
771
Takeshi Aimie943f842010-10-08 23:05:49 +0900772 case REMOVE_CLIENT:
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900773 {
Takeshi Aimie943f842010-10-08 23:05:49 +0900774 LOGV("BnDrmManagerService::onTransact :REMOVE_CLIENT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900775 CHECK_INTERFACE(IDrmManagerService, data, reply);
Takeshi Aimie943f842010-10-08 23:05:49 +0900776 removeClient(data.readInt32());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900777 return DRM_NO_ERROR;
778 }
779
780 case SET_DRM_SERVICE_LISTENER:
781 {
782 LOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER");
783 CHECK_INTERFACE(IDrmManagerService, data, reply);
784
785 const int uniqueId = data.readInt32();
786 const sp<IDrmServiceListener> drmServiceListener
787 = interface_cast<IDrmServiceListener> (data.readStrongBinder());
788
789 status_t status = setDrmServiceListener(uniqueId, drmServiceListener);
790
791 reply->writeInt32(status);
792 return DRM_NO_ERROR;
793 }
794
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900795 case INSTALL_DRM_ENGINE:
796 {
797 LOGV("BnDrmManagerService::onTransact :INSTALL_DRM_ENGINE");
798 CHECK_INTERFACE(IDrmManagerService, data, reply);
799
800 status_t status = installDrmEngine(data.readInt32(), data.readString8());
801
802 reply->writeInt32(status);
803 return DRM_NO_ERROR;
804 }
805
806 case GET_CONSTRAINTS_FROM_CONTENT:
807 {
808 LOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT");
809 CHECK_INTERFACE(IDrmManagerService, data, reply);
810
811 const int uniqueId = data.readInt32();
812 const String8 path = data.readString8();
813
814 DrmConstraints* drmConstraints = getConstraints(uniqueId, &path, data.readInt32());
815
816 if (NULL != drmConstraints) {
817 //Filling DRM Constraints contents
818 reply->writeInt32(drmConstraints->getCount());
819
820 DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator();
821 while (keyIt.hasNext()) {
822 const String8 key = keyIt.next();
823 reply->writeString8(key);
824 const char* value = drmConstraints->getAsByteArray(&key);
825 int bufferSize = 0;
826 if (NULL != value) {
827 bufferSize = strlen(value);
828 }
829 reply->writeInt32(bufferSize + 1);
830 reply->write(value, bufferSize + 1);
831 }
832 }
833 delete drmConstraints; drmConstraints = NULL;
834 return DRM_NO_ERROR;
835 }
836
Takeshi Aimi34738462010-11-16 13:56:11 +0900837 case GET_METADATA_FROM_CONTENT:
838 {
839 LOGV("BnDrmManagerService::onTransact :GET_METADATA_FROM_CONTENT");
840 CHECK_INTERFACE(IDrmManagerService, data, reply);
841
842 const int uniqueId = data.readInt32();
843 const String8 path = data.readString8();
844
845 DrmMetadata* drmMetadata = getMetadata(uniqueId, &path);
846 if (NULL != drmMetadata) {
847 //Filling DRM Metadata contents
848 reply->writeInt32(drmMetadata->getCount());
849
850 DrmMetadata::KeyIterator keyIt = drmMetadata->keyIterator();
851 while (keyIt.hasNext()) {
852 const String8 key = keyIt.next();
853 reply->writeString8(key);
854 const char* value = drmMetadata->getAsByteArray(&key);
855 int bufferSize = 0;
856 if (NULL != value) {
857 bufferSize = strlen(value);
858 reply->writeInt32(bufferSize + 1);
859 reply->write(value, bufferSize + 1);
860 } else {
861 reply->writeInt32(0);
862 }
863 }
864 }
865 delete drmMetadata; drmMetadata = NULL;
866 return NO_ERROR;
867 }
868
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900869 case CAN_HANDLE:
870 {
871 LOGV("BnDrmManagerService::onTransact :CAN_HANDLE");
872 CHECK_INTERFACE(IDrmManagerService, data, reply);
873
874 const int uniqueId = data.readInt32();
875 const String8 path = data.readString8();
876 const String8 mimeType = data.readString8();
877
878 bool result = canHandle(uniqueId, path, mimeType);
879
880 reply->writeInt32(result);
881 return DRM_NO_ERROR;
882 }
883
884 case PROCESS_DRM_INFO:
885 {
886 LOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO");
887 CHECK_INTERFACE(IDrmManagerService, data, reply);
888
889 const int uniqueId = data.readInt32();
890
891 //Filling DRM info
892 const int infoType = data.readInt32();
893 const int bufferSize = data.readInt32();
894 char* buffer = NULL;
895 if (0 < bufferSize) {
896 buffer = (char *)data.readInplace(bufferSize);
897 }
898 const DrmBuffer drmBuffer(buffer, bufferSize);
899 DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8());
900
901 const int size = data.readInt32();
902 for (int index = 0; index < size; ++index) {
903 const String8 key(data.readString8());
904 const String8 value(data.readString8());
905 drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
906 }
907
908 DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo);
909
910 if (NULL != drmInfoStatus) {
911 //Filling DRM Info Status contents
912 reply->writeInt32(drmInfoStatus->statusCode);
Takeshi Aimie943f842010-10-08 23:05:49 +0900913 reply->writeInt32(drmInfoStatus->infoType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900914 reply->writeString8(drmInfoStatus->mimeType);
915
916 if (NULL != drmInfoStatus->drmBuffer) {
917 const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer;
918 const int bufferSize = drmBuffer->length;
919 reply->writeInt32(bufferSize);
920 if (0 < bufferSize) {
921 reply->write(drmBuffer->data, bufferSize);
922 }
923 delete [] drmBuffer->data;
924 delete drmBuffer; drmBuffer = NULL;
925 }
926 }
927 delete drmInfo; drmInfo = NULL;
928 delete drmInfoStatus; drmInfoStatus = NULL;
929 return DRM_NO_ERROR;
930 }
931
932 case ACQUIRE_DRM_INFO:
933 {
934 LOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO");
935 CHECK_INTERFACE(IDrmManagerService, data, reply);
936
937 const int uniqueId = data.readInt32();
938
939 //Filling DRM info Request
940 DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(data.readInt32(), data.readString8());
941
942 const int size = data.readInt32();
943 for (int index = 0; index < size; ++index) {
944 const String8 key(data.readString8());
945 const String8 value(data.readString8());
946 drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value);
947 }
948
949 DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest);
950
951 if (NULL != drmInfo) {
952 //Filling DRM Info
953 const DrmBuffer drmBuffer = drmInfo->getData();
954 reply->writeInt32(drmInfo->getInfoType());
955
956 const int bufferSize = drmBuffer.length;
957 reply->writeInt32(bufferSize);
958 if (0 < bufferSize) {
959 reply->write(drmBuffer.data, bufferSize);
960 }
961 reply->writeString8(drmInfo->getMimeType());
962 reply->writeInt32(drmInfo->getCount());
963
964 DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
965 while (keyIt.hasNext()) {
966 const String8 key = keyIt.next();
967 reply->writeString8(key);
968 const String8 value = drmInfo->get(key);
969 reply->writeString8((value == String8("")) ? String8("NULL") : value);
970 }
971 delete [] drmBuffer.data;
972 }
973 delete drmInfoRequest; drmInfoRequest = NULL;
974 delete drmInfo; drmInfo = NULL;
975 return DRM_NO_ERROR;
976 }
977
978 case SAVE_RIGHTS:
979 {
980 LOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS");
981 CHECK_INTERFACE(IDrmManagerService, data, reply);
982
983 const int uniqueId = data.readInt32();
984
985 //Filling DRM Rights
986 const int bufferSize = data.readInt32();
987 const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize);
988
989 const String8 mimeType(data.readString8());
990 const String8 accountId(data.readString8());
991 const String8 subscriptionId(data.readString8());
992 const String8 rightsPath(data.readString8());
993 const String8 contentPath(data.readString8());
994
995 DrmRights drmRights(drmBuffer,
996 ((mimeType == String8("NULL")) ? String8("") : mimeType),
997 ((accountId == String8("NULL")) ? String8("") : accountId),
998 ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId));
999
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001000 const status_t status = saveRights(uniqueId, drmRights,
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001001 ((rightsPath == String8("NULL")) ? String8("") : rightsPath),
1002 ((contentPath == String8("NULL")) ? String8("") : contentPath));
1003
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001004 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001005 return DRM_NO_ERROR;
1006 }
1007
1008 case GET_ORIGINAL_MIMETYPE:
1009 {
1010 LOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE");
1011 CHECK_INTERFACE(IDrmManagerService, data, reply);
1012
1013 const String8 originalMimeType = getOriginalMimeType(data.readInt32(), data.readString8());
1014
1015 reply->writeString8(originalMimeType);
1016 return DRM_NO_ERROR;
1017 }
1018
1019 case GET_DRM_OBJECT_TYPE:
1020 {
1021 LOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE");
1022 CHECK_INTERFACE(IDrmManagerService, data, reply);
1023
1024 const int drmObjectType
1025 = getDrmObjectType(data.readInt32(), data.readString8(), data.readString8());
1026
1027 reply->writeInt32(drmObjectType);
1028 return DRM_NO_ERROR;
1029 }
1030
1031 case CHECK_RIGHTS_STATUS:
1032 {
1033 LOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS");
1034 CHECK_INTERFACE(IDrmManagerService, data, reply);
1035
1036 const int result
1037 = checkRightsStatus(data.readInt32(), data.readString8(), data.readInt32());
1038
1039 reply->writeInt32(result);
1040 return DRM_NO_ERROR;
1041 }
1042
1043 case CONSUME_RIGHTS:
1044 {
1045 LOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS");
1046 CHECK_INTERFACE(IDrmManagerService, data, reply);
1047
1048 const int uniqueId = data.readInt32();
1049
1050 DecryptHandle handle;
Gloria Wang4dabc202011-03-21 16:53:14 -07001051 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001052
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001053 const status_t status
1054 = consumeRights(uniqueId, &handle, data.readInt32(),
1055 static_cast<bool>(data.readInt32()));
1056 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001057
Gloria Wang4dabc202011-03-21 16:53:14 -07001058 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001059 return DRM_NO_ERROR;
1060 }
1061
1062 case SET_PLAYBACK_STATUS:
1063 {
1064 LOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS");
1065 CHECK_INTERFACE(IDrmManagerService, data, reply);
1066
1067 const int uniqueId = data.readInt32();
1068
1069 DecryptHandle handle;
Gloria Wang4dabc202011-03-21 16:53:14 -07001070 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001071
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001072 const status_t status
Gloria Wang2ed8a922011-01-19 15:38:16 -08001073 = setPlaybackStatus(uniqueId, &handle, data.readInt32(), data.readInt64());
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001074 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001075
Gloria Wang4dabc202011-03-21 16:53:14 -07001076 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001077 return DRM_NO_ERROR;
1078 }
1079
1080 case VALIDATE_ACTION:
1081 {
1082 LOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION");
1083 CHECK_INTERFACE(IDrmManagerService, data, reply);
1084
1085 bool result = validateAction(
1086 data.readInt32(),
1087 data.readString8(),
1088 data.readInt32(),
1089 ActionDescription(data.readInt32(), data.readInt32()));
1090
1091 reply->writeInt32(result);
1092 return DRM_NO_ERROR;
1093 }
1094
1095 case REMOVE_RIGHTS:
1096 {
1097 LOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS");
1098 CHECK_INTERFACE(IDrmManagerService, data, reply);
1099
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001100 const status_t status = removeRights(data.readInt32(), data.readString8());
1101 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001102
1103 return DRM_NO_ERROR;
1104 }
1105
1106 case REMOVE_ALL_RIGHTS:
1107 {
1108 LOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS");
1109 CHECK_INTERFACE(IDrmManagerService, data, reply);
1110
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001111 const status_t status = removeAllRights(data.readInt32());
1112 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001113
1114 return DRM_NO_ERROR;
1115 }
1116
1117 case OPEN_CONVERT_SESSION:
1118 {
1119 LOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION");
1120 CHECK_INTERFACE(IDrmManagerService, data, reply);
1121
1122 const int convertId = openConvertSession(data.readInt32(), data.readString8());
1123
1124 reply->writeInt32(convertId);
1125 return DRM_NO_ERROR;
1126 }
1127
1128 case CONVERT_DATA:
1129 {
1130 LOGV("BnDrmManagerService::onTransact :CONVERT_DATA");
1131 CHECK_INTERFACE(IDrmManagerService, data, reply);
1132
1133 const int uniqueId = data.readInt32();
1134 const int convertId = data.readInt32();
1135
1136 //Filling input data
1137 const int bufferSize = data.readInt32();
1138 DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1139
1140 DrmConvertedStatus* drmConvertedStatus = convertData(uniqueId, convertId, inputData);
1141
1142 if (NULL != drmConvertedStatus) {
1143 //Filling Drm Converted Ststus
1144 reply->writeInt32(drmConvertedStatus->statusCode);
Gloria Wanga2cd44c2010-11-19 15:19:36 -08001145 reply->writeInt64(drmConvertedStatus->offset);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001146
1147 if (NULL != drmConvertedStatus->convertedData) {
1148 const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
1149 const int bufferSize = convertedData->length;
1150 reply->writeInt32(bufferSize);
1151 if (0 < bufferSize) {
1152 reply->write(convertedData->data, bufferSize);
1153 }
1154 delete [] convertedData->data;
1155 delete convertedData; convertedData = NULL;
1156 }
1157 }
1158 delete inputData; inputData = NULL;
1159 delete drmConvertedStatus; drmConvertedStatus = NULL;
1160 return DRM_NO_ERROR;
1161 }
1162
1163 case CLOSE_CONVERT_SESSION:
1164 {
1165 LOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION");
1166 CHECK_INTERFACE(IDrmManagerService, data, reply);
1167
1168 DrmConvertedStatus* drmConvertedStatus
1169 = closeConvertSession(data.readInt32(), data.readInt32());
1170
1171 if (NULL != drmConvertedStatus) {
1172 //Filling Drm Converted Ststus
1173 reply->writeInt32(drmConvertedStatus->statusCode);
Gloria Wanga2cd44c2010-11-19 15:19:36 -08001174 reply->writeInt64(drmConvertedStatus->offset);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001175
1176 if (NULL != drmConvertedStatus->convertedData) {
1177 const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
1178 const int bufferSize = convertedData->length;
1179 reply->writeInt32(bufferSize);
1180 if (0 < bufferSize) {
1181 reply->write(convertedData->data, bufferSize);
1182 }
1183 delete [] convertedData->data;
1184 delete convertedData; convertedData = NULL;
1185 }
1186 }
1187 delete drmConvertedStatus; drmConvertedStatus = NULL;
1188 return DRM_NO_ERROR;
1189 }
1190
1191 case GET_ALL_SUPPORT_INFO:
1192 {
1193 LOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO");
1194 CHECK_INTERFACE(IDrmManagerService, data, reply);
1195
1196 const int uniqueId = data.readInt32();
1197 int length = 0;
1198 DrmSupportInfo* drmSupportInfoArray = NULL;
1199
1200 status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray);
1201
1202 reply->writeInt32(length);
1203 for (int i = 0; i < length; ++i) {
1204 DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i];
1205
1206 reply->writeInt32(drmSupportInfo.getFileSuffixCount());
1207 DrmSupportInfo::FileSuffixIterator fileSuffixIt
1208 = drmSupportInfo.getFileSuffixIterator();
1209 while (fileSuffixIt.hasNext()) {
1210 reply->writeString8(fileSuffixIt.next());
1211 }
1212
1213 reply->writeInt32(drmSupportInfo.getMimeTypeCount());
1214 DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator();
1215 while (mimeTypeIt.hasNext()) {
1216 reply->writeString8(mimeTypeIt.next());
1217 }
1218 reply->writeString8(drmSupportInfo.getDescription());
1219 }
1220 delete [] drmSupportInfoArray; drmSupportInfoArray = NULL;
1221 reply->writeInt32(status);
1222 return DRM_NO_ERROR;
1223 }
1224
1225 case OPEN_DECRYPT_SESSION:
1226 {
1227 LOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION");
1228 CHECK_INTERFACE(IDrmManagerService, data, reply);
1229
1230 const int uniqueId = data.readInt32();
1231 const int fd = data.readFileDescriptor();
1232
1233 DecryptHandle* handle
Gloria Wanga2cd44c2010-11-19 15:19:36 -08001234 = openDecryptSession(uniqueId, fd, data.readInt64(), data.readInt64());
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001235
1236 if (NULL != handle) {
Gloria Wang4dabc202011-03-21 16:53:14 -07001237 writeDecrptHandleToParcelData(handle, reply);
1238 clearDecryptHandle(handle);
1239 delete handle; handle = NULL;
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001240 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001241 return DRM_NO_ERROR;
1242 }
1243
Takeshi Aimie943f842010-10-08 23:05:49 +09001244 case OPEN_DECRYPT_SESSION_FROM_URI:
1245 {
1246 LOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI");
1247 CHECK_INTERFACE(IDrmManagerService, data, reply);
1248
1249 const int uniqueId = data.readInt32();
1250 const String8 uri = data.readString8();
1251
1252 DecryptHandle* handle = openDecryptSession(uniqueId, uri.string());
1253
1254 if (NULL != handle) {
Gloria Wang4dabc202011-03-21 16:53:14 -07001255 writeDecrptHandleToParcelData(handle, reply);
1256
1257 clearDecryptHandle(handle);
1258 delete handle; handle = NULL;
Takeshi Aimie943f842010-10-08 23:05:49 +09001259 } else {
Gloria Wang6b610a32011-03-04 14:45:03 -08001260 LOGV("NULL decryptHandle is returned");
Takeshi Aimie943f842010-10-08 23:05:49 +09001261 }
Takeshi Aimie943f842010-10-08 23:05:49 +09001262 return DRM_NO_ERROR;
1263 }
1264
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001265 case CLOSE_DECRYPT_SESSION:
1266 {
1267 LOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION");
1268 CHECK_INTERFACE(IDrmManagerService, data, reply);
1269
1270 const int uniqueId = data.readInt32();
1271
1272 DecryptHandle* handle = new DecryptHandle();
Gloria Wang4dabc202011-03-21 16:53:14 -07001273 readDecryptHandleFromParcelData(handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001274
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001275 const status_t status = closeDecryptSession(uniqueId, handle);
1276 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001277 return DRM_NO_ERROR;
1278 }
1279
1280 case INITIALIZE_DECRYPT_UNIT:
1281 {
1282 LOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT");
1283 CHECK_INTERFACE(IDrmManagerService, data, reply);
1284
1285 const int uniqueId = data.readInt32();
1286
1287 DecryptHandle handle;
Gloria Wang4dabc202011-03-21 16:53:14 -07001288 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001289
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001290 const int decryptUnitId = data.readInt32();
1291
1292 //Filling Header info
1293 const int bufferSize = data.readInt32();
1294 DrmBuffer* headerInfo = NULL;
1295 headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1296
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001297 const status_t status
1298 = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo);
1299 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001300
Gloria Wang4dabc202011-03-21 16:53:14 -07001301 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001302 delete headerInfo; headerInfo = NULL;
1303 return DRM_NO_ERROR;
1304 }
1305
1306 case DECRYPT:
1307 {
1308 LOGV("BnDrmManagerService::onTransact :DECRYPT");
1309 CHECK_INTERFACE(IDrmManagerService, data, reply);
1310
1311 const int uniqueId = data.readInt32();
1312
1313 DecryptHandle handle;
Gloria Wang4dabc202011-03-21 16:53:14 -07001314 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001315
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001316 const int decryptUnitId = data.readInt32();
1317 const int decBufferSize = data.readInt32();
1318
1319 const int encBufferSize = data.readInt32();
1320 DrmBuffer* encBuffer
1321 = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize);
1322
1323 char* buffer = NULL;
1324 buffer = new char[decBufferSize];
1325 DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize);
1326
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001327 DrmBuffer* IV = NULL;
1328 if (0 != data.dataAvail()) {
1329 const int ivBufferlength = data.readInt32();
1330 IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength);
1331 }
1332
1333 const status_t status
1334 = decrypt(uniqueId, &handle, decryptUnitId, encBuffer, &decBuffer, IV);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001335
1336 reply->writeInt32(status);
1337
1338 const int size = decBuffer->length;
1339 reply->writeInt32(size);
1340 reply->write(decBuffer->data, size);
1341
Gloria Wang4dabc202011-03-21 16:53:14 -07001342 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001343 delete encBuffer; encBuffer = NULL;
1344 delete decBuffer; decBuffer = NULL;
1345 delete [] buffer; buffer = NULL;
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001346 delete IV; IV = NULL;
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001347 return DRM_NO_ERROR;
1348 }
1349
1350 case FINALIZE_DECRYPT_UNIT:
1351 {
1352 LOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT");
1353 CHECK_INTERFACE(IDrmManagerService, data, reply);
1354
1355 const int uniqueId = data.readInt32();
1356
1357 DecryptHandle handle;
Gloria Wang4dabc202011-03-21 16:53:14 -07001358 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001359
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001360 const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32());
1361 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001362
Gloria Wang4dabc202011-03-21 16:53:14 -07001363 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001364 return DRM_NO_ERROR;
1365 }
1366
1367 case PREAD:
1368 {
1369 LOGV("BnDrmManagerService::onTransact :READ");
1370 CHECK_INTERFACE(IDrmManagerService, data, reply);
1371
1372 const int uniqueId = data.readInt32();
1373
1374 DecryptHandle handle;
Gloria Wang4dabc202011-03-21 16:53:14 -07001375 readDecryptHandleFromParcelData(&handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001376
1377 const int numBytes = data.readInt32();
1378 char* buffer = new char[numBytes];
1379
Gloria Wanga2cd44c2010-11-19 15:19:36 -08001380 const off64_t offset = data.readInt64();
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001381
1382 ssize_t result = pread(uniqueId, &handle, buffer, numBytes, offset);
1383 reply->writeInt32(result);
1384 if (0 < result) {
1385 reply->write(buffer, result);
1386 }
1387
Gloria Wang4dabc202011-03-21 16:53:14 -07001388 clearDecryptHandle(&handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001389 delete [] buffer, buffer = NULL;
1390 return DRM_NO_ERROR;
1391 }
1392
1393 default:
1394 return BBinder::onTransact(code, data, reply, flags);
1395 }
1396}
1397