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