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