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