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