127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi/* 227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Copyright (C) 2010 The Android Open Source Project 327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * 427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Licensed under the Apache License, Version 2.0 (the "License"); 527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * you may not use this file except in compliance with the License. 627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * You may obtain a copy of the License at 727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * 827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * http://www.apache.org/licenses/LICENSE-2.0 927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * 1027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Unless required by applicable law or agreed to in writing, software 1127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * distributed under the License is distributed on an "AS IS" BASIS, 1227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * See the License for the specific language governing permissions and 1427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * limitations under the License. 1527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi */ 1627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 172272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi//#define LOG_NDEBUG 0 1827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define LOG_TAG "IDrmManagerService(Native)" 1927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/Log.h> 2027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <stdint.h> 2227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <sys/types.h> 2327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <binder/IPCThreadState.h> 2427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfo.h> 2627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmConstraints.h> 273473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi#include <drm/DrmMetadata.h> 2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmRights.h> 2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoStatus.h> 3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmConvertedStatus.h> 3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoRequest.h> 3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmSupportInfo.h> 3327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "IDrmManagerService.h" 3527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define INVALID_BUFFER_LENGTH -1 37b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker#define MAX_BINDER_TRANSACTION_SIZE ((1*1024*1024)-(4096*2)) 3827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiusing namespace android; 4027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 41c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wangstatic void writeDecryptHandleToParcelData( 421da9aa606096e14985924e8433a087d04f68ea22Gloria Wang const DecryptHandle* handle, Parcel* data) { 431da9aa606096e14985924e8433a087d04f68ea22Gloria Wang data->writeInt32(handle->decryptId); 441da9aa606096e14985924e8433a087d04f68ea22Gloria Wang data->writeString8(handle->mimeType); 451da9aa606096e14985924e8433a087d04f68ea22Gloria Wang data->writeInt32(handle->decryptApiType); 461da9aa606096e14985924e8433a087d04f68ea22Gloria Wang data->writeInt32(handle->status); 471da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 481da9aa606096e14985924e8433a087d04f68ea22Gloria Wang int size = handle->copyControlVector.size(); 491da9aa606096e14985924e8433a087d04f68ea22Gloria Wang data->writeInt32(size); 50c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang for (int i = 0; i < size; i++) { 511da9aa606096e14985924e8433a087d04f68ea22Gloria Wang data->writeInt32(handle->copyControlVector.keyAt(i)); 521da9aa606096e14985924e8433a087d04f68ea22Gloria Wang data->writeInt32(handle->copyControlVector.valueAt(i)); 531da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } 541da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 556b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang size = handle->extendedData.size(); 566b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang data->writeInt32(size); 57c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang for (int i = 0; i < size; i++) { 586b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang data->writeString8(handle->extendedData.keyAt(i)); 596b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang data->writeString8(handle->extendedData.valueAt(i)); 606b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang } 616b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang 621da9aa606096e14985924e8433a087d04f68ea22Gloria Wang if (NULL != handle->decryptInfo) { 631da9aa606096e14985924e8433a087d04f68ea22Gloria Wang data->writeInt32(handle->decryptInfo->decryptBufferLength); 641da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } else { 651da9aa606096e14985924e8433a087d04f68ea22Gloria Wang data->writeInt32(INVALID_BUFFER_LENGTH); 661da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } 671da9aa606096e14985924e8433a087d04f68ea22Gloria Wang} 681da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 691da9aa606096e14985924e8433a087d04f68ea22Gloria Wangstatic void readDecryptHandleFromParcelData( 701da9aa606096e14985924e8433a087d04f68ea22Gloria Wang DecryptHandle* handle, const Parcel& data) { 711da9aa606096e14985924e8433a087d04f68ea22Gloria Wang if (0 == data.dataAvail()) { 721da9aa606096e14985924e8433a087d04f68ea22Gloria Wang return; 731da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } 741da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 751da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->decryptId = data.readInt32(); 761da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->mimeType = data.readString8(); 771da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->decryptApiType = data.readInt32(); 781da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->status = data.readInt32(); 791da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 801da9aa606096e14985924e8433a087d04f68ea22Gloria Wang int size = data.readInt32(); 81c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang for (int i = 0; i < size; i++) { 826b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang DrmCopyControl key = (DrmCopyControl)data.readInt32(); 836b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang int value = data.readInt32(); 846b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang handle->copyControlVector.add(key, value); 856b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang } 866b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang 876b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang size = data.readInt32(); 88c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang for (int i = 0; i < size; i++) { 896b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang String8 key = data.readString8(); 906b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang String8 value = data.readString8(); 916b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang handle->extendedData.add(key, value); 921da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } 931da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 941da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->decryptInfo = NULL; 951da9aa606096e14985924e8433a087d04f68ea22Gloria Wang const int bufferLen = data.readInt32(); 961da9aa606096e14985924e8433a087d04f68ea22Gloria Wang if (INVALID_BUFFER_LENGTH != bufferLen) { 971da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->decryptInfo = new DecryptInfo(); 981da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->decryptInfo->decryptBufferLength = bufferLen; 991da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } 1001da9aa606096e14985924e8433a087d04f68ea22Gloria Wang} 1011da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 1021da9aa606096e14985924e8433a087d04f68ea22Gloria Wangstatic void clearDecryptHandle(DecryptHandle* handle) { 1031da9aa606096e14985924e8433a087d04f68ea22Gloria Wang if (handle == NULL) { 1041da9aa606096e14985924e8433a087d04f68ea22Gloria Wang return; 1051da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } 1061da9aa606096e14985924e8433a087d04f68ea22Gloria Wang if (handle->decryptInfo) { 1071da9aa606096e14985924e8433a087d04f68ea22Gloria Wang delete handle->decryptInfo; 1081da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->decryptInfo = NULL; 1091da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } 1101da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->copyControlVector.clear(); 111ab00df4d8585b181e9058eb1b9c7996aa3bbaeabGloria Wang handle->extendedData.clear(); 1121da9aa606096e14985924e8433a087d04f68ea22Gloria Wang} 1131da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 1148f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wangint BpDrmManagerService::addUniqueId(bool isNative) { 1153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("add uniqueid"); 1162272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi Parcel data, reply; 1172272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 1188f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang data.writeInt32(isNative); 1192272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi remote()->transact(ADD_UNIQUEID, data, &reply); 1202272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 1212272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi} 1222272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 1232272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimivoid BpDrmManagerService::removeUniqueId(int uniqueId) { 1243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("remove uniqueid"); 1252272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi Parcel data, reply; 1262272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 1272272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInt32(uniqueId); 1282272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi remote()->transact(REMOVE_UNIQUEID, data, &reply); 1292272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi} 1302272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 131e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid BpDrmManagerService::addClient(int uniqueId) { 13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 13427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 135e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi remote()->transact(ADD_CLIENT, data, &reply); 13627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 13727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 138e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid BpDrmManagerService::removeClient(int uniqueId) { 13927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 14027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 14127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 142e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi remote()->transact(REMOVE_CLIENT, data, &reply); 14327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::setDrmServiceListener( 14627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) { 1473856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setDrmServiceListener"); 14827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 14927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 15027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 15127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 15206b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen data.writeStrongBinder(IInterface::asBinder(drmServiceListener)); 15327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(SET_DRM_SERVICE_LISTENER, data, &reply); 15427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 15527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 15727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConstraints* BpDrmManagerService::getConstraints( 15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8* path, const int action) { 1593856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Get Constraints"); 16027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 16127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 16427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(*path); 16527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(action); 16627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(GET_CONSTRAINTS_FROM_CONTENT, data, &reply); 16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConstraints* drmConstraints = NULL; 17027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 17127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Drm Constraints 17227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConstraints = new DrmConstraints(); 17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 17427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = reply.readInt32(); 17527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < size; ++index) { 17627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key(reply.readString8()); 17727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 17827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 17927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 18027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 18127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 1820bf43848adb00922122b0a0eed2fa0318bde8317Hung Nguyen drmConstraints->put(&key, data); 1830bf43848adb00922122b0a0eed2fa0318bde8317Hung Nguyen delete[] data; 18427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 18527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 18627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 18727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConstraints; 18827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 18927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1903473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi AimiDrmMetadata* BpDrmManagerService::getMetadata(int uniqueId, const String8* path) { 1913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Get Metadata"); 1923473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi Parcel data, reply; 1933473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 1943473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi data.writeInt32(uniqueId); 1953473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 1963473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi DrmMetadata* drmMetadata = NULL; 1973473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi data.writeString8(*path); 1983473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi remote()->transact(GET_METADATA_FROM_CONTENT, data, &reply); 1993473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 2003473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (0 != reply.dataAvail()) { 2013473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi //Filling Drm Metadata 2023473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi drmMetadata = new DrmMetadata(); 2033473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 2043473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const int size = reply.readInt32(); 2053473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi for (int index = 0; index < size; ++index) { 2063473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const String8 key(reply.readString8()); 2073473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const int bufferSize = reply.readInt32(); 2083473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi char* data = NULL; 2093473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (0 < bufferSize) { 2103473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi data = new char[bufferSize]; 2113473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply.read(data, bufferSize); 2120bf43848adb00922122b0a0eed2fa0318bde8317Hung Nguyen drmMetadata->put(&key, data); 2130bf43848adb00922122b0a0eed2fa0318bde8317Hung Nguyen delete[] data; 2143473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 2153473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 2163473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 2173473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi return drmMetadata; 2183473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi} 2193473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 22027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool BpDrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) { 2213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Can Handle"); 22227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 22327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 22427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 22527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 22627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 22727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 22827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(mimeType); 22927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 23027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CAN_HANDLE, data, &reply); 23127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 23227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return static_cast<bool>(reply.readInt32()); 23327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 23427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 23527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) { 2363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Process DRM Info"); 23727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 23827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 23927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 24027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 24127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 24227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM info 24327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(drmInfo->getInfoType()); 24427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer dataBuffer = drmInfo->getData(); 24527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int dataBufferSize = dataBuffer.length; 24627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(dataBufferSize); 24727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < dataBufferSize) { 24827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(dataBuffer.data, dataBufferSize); 24927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 25027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(drmInfo->getMimeType()); 25127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 25227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(drmInfo->getCount()); 25327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo::KeyIterator keyIt = drmInfo->keyIterator(); 25427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 25527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (keyIt.hasNext()) { 25627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key = keyIt.next(); 25727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(key); 25827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value = drmInfo->get(key); 25927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((value == String8("")) ? String8("NULL") : value); 26027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 26127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 26227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(PROCESS_DRM_INFO, data, &reply); 26327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 26427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoStatus* drmInfoStatus = NULL; 26527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 26627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info Status 26727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int statusCode = reply.readInt32(); 268e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi const int infoType = reply.readInt32(); 26927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 mimeType = reply.readString8(); 27027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 27127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* drmBuffer = NULL; 27227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 27327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 27427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 27527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 27627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 27727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 27827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 27927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmBuffer = new DrmBuffer(data, bufferSize); 28027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 281e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi drmInfoStatus = new DrmInfoStatus(statusCode, infoType, drmBuffer, mimeType); 28227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 28327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmInfoStatus; 28427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 28527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 28627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfo* BpDrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) { 2873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Acquire DRM Info"); 28827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 28927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 29027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 29127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 29227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 29327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info Request 29427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(drmInforequest->getInfoType()); 29527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(drmInforequest->getMimeType()); 29627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 29727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(drmInforequest->getCount()); 29827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoRequest::KeyIterator keyIt = drmInforequest->keyIterator(); 29927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 30027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (keyIt.hasNext()) { 30127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key = keyIt.next(); 30227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(key); 30327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value = drmInforequest->get(key); 3040abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan if (key == String8("FileDescriptorKey")) { 3050abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan int fd = -1; 3062b7561f802bac06981dc46867d959e627085a8f7Jeff Tinker if (sscanf(value.string(), "FileDescriptor[%d]", &fd) != 1) { 3072b7561f802bac06981dc46867d959e627085a8f7Jeff Tinker sscanf(value.string(), "%d", &fd); 3082b7561f802bac06981dc46867d959e627085a8f7Jeff Tinker } 3090abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan data.writeFileDescriptor(fd); 3100abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan } else { 3110abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan data.writeString8((value == String8("")) ? String8("NULL") : value); 3120abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan } 31327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 31427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 31527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(ACQUIRE_DRM_INFO, data, &reply); 31627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 31727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo* drmInfo = NULL; 31827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 31927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info 32027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int infoType = reply.readInt32(); 32127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 32227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 32327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 32427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 32527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 32627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 32727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 32827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfo = new DrmInfo(infoType, DrmBuffer(data, bufferSize), reply.readString8()); 32927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 33027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = reply.readInt32(); 33127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < size; ++index) { 33227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key(reply.readString8()); 33327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value(reply.readString8()); 33427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfo->put(key, (value == String8("NULL")) ? String8("") : value); 33527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 33627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 33727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmInfo; 33827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 33927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3402272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::saveRights( 34127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const DrmRights& drmRights, 34227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8& rightsPath, const String8& contentPath) { 3433856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Save Rights"); 34427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 34527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 34627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 34727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 34827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 34927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Drm Rights 35027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer dataBuffer = drmRights.getData(); 35127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(dataBuffer.length); 35227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(dataBuffer.data, dataBuffer.length); 35327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 35427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 mimeType = drmRights.getMimeType(); 35527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((mimeType == String8("")) ? String8("NULL") : mimeType); 35627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 35727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 accountId = drmRights.getAccountId(); 35827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((accountId == String8("")) ? String8("NULL") : accountId); 35927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 36027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 subscriptionId = drmRights.getSubscriptionId(); 36127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((subscriptionId == String8("")) ? String8("NULL") : subscriptionId); 36227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 36327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((rightsPath == String8("")) ? String8("NULL") : rightsPath); 36427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((contentPath == String8("")) ? String8("NULL") : contentPath); 36527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 36627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(SAVE_RIGHTS, data, &reply); 3672272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 36827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 36927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 370bf5b3b29e31b293313788d7464cfb258ac0da803James DongString8 BpDrmManagerService::getOriginalMimeType(int uniqueId, const String8& path, int fd) { 3713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Get Original MimeType"); 37227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 37327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 37427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 37527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 37627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 377bf5b3b29e31b293313788d7464cfb258ac0da803James Dong int32_t isFdValid = (fd >= 0); 378bf5b3b29e31b293313788d7464cfb258ac0da803James Dong data.writeInt32(isFdValid); 379bf5b3b29e31b293313788d7464cfb258ac0da803James Dong if (isFdValid) { 380bf5b3b29e31b293313788d7464cfb258ac0da803James Dong data.writeFileDescriptor(fd); 381bf5b3b29e31b293313788d7464cfb258ac0da803James Dong } 38227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 38327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(GET_ORIGINAL_MIMETYPE, data, &reply); 38427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readString8(); 38527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 38627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 38727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::getDrmObjectType( 38827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, const String8& mimeType) { 3893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Get Drm object type"); 39027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 39127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 39227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 39327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 39427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 39527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(mimeType); 39627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 39727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(GET_DRM_OBJECT_TYPE, data, &reply); 39827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 39927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 40027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 40127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 40227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::checkRightsStatus(int uniqueId, const String8& path, int action) { 4033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("checkRightsStatus"); 40427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 40527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 40627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 40727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 40827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 40927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(action); 41027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 41127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CHECK_RIGHTS_STATUS, data, &reply); 41227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 41327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 41427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 41527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4162272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::consumeRights( 41727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) { 4183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("consumeRights"); 4192272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi Parcel data, reply; 42027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 42127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 42227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 42327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 424c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang writeDecryptHandleToParcelData(decryptHandle, &data); 42527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 42627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(action); 42727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(static_cast< int>(reserve)); 42827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 42927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CONSUME_RIGHTS, data, &reply); 4302272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 43127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 43227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4332272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::setPlaybackStatus( 434a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) { 4353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setPlaybackStatus"); 43627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 43727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 43827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 43927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 44027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 441c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang writeDecryptHandleToParcelData(decryptHandle, &data); 44227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 44327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(playbackStatus); 4442ed8a921ef55aa2f3dd4b7ac33b7ded6ec33d92dGloria Wang data.writeInt64(position); 44527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 44627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(SET_PLAYBACK_STATUS, data, &reply); 4472272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 44827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 44927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 45027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool BpDrmManagerService::validateAction( 45127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, 45227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int action, const ActionDescription& description) { 4533856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("validateAction"); 45427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 45527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 45627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 45727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 45827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 45927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(action); 46027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(description.outputType); 46127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(description.configuration); 46227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 46327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(VALIDATE_ACTION, data, &reply); 46427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 46527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return static_cast<bool>(reply.readInt32()); 46627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 46727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4682272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::removeRights(int uniqueId, const String8& path) { 4693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("removeRights"); 47027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 47127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 47227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 47327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 47427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 47527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 47627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(REMOVE_RIGHTS, data, &reply); 4772272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 47827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 47927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4802272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::removeAllRights(int uniqueId) { 4813856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("removeAllRights"); 48227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 48327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 48427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 48527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 48627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 48727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(REMOVE_ALL_RIGHTS, data, &reply); 4882272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 48927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 49027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 49127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) { 4923856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("openConvertSession"); 49327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 49427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 49527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 49627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 49727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(mimeType); 49827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 49927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(OPEN_CONVERT_SESSION, data, &reply); 50027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 50127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 50227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 50327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* BpDrmManagerService::convertData( 50427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int convertId, const DrmBuffer* inputData) { 5053856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("convertData"); 50627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 50727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 50827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 50927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 51027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(convertId); 51127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(inputData->length); 51227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(inputData->data, inputData->length); 51327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 51427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CONVERT_DATA, data, &reply); 51527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 51627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* drmConvertedStatus = NULL; 51727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 51827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 51927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Converted Status 52027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int statusCode = reply.readInt32(); 521a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang const off64_t offset = reply.readInt64(); 52227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 52327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* convertedData = NULL; 52427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 52527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 52627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 52727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 52827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 52927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 53027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 53127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi convertedData = new DrmBuffer(data, bufferSize); 53227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 53327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset); 53427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 53527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConvertedStatus; 53627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 53727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 53827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* BpDrmManagerService::closeConvertSession(int uniqueId, int convertId) { 5393856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("closeConvertSession"); 54027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 54127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 54227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 54327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 54427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(convertId); 54527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 54627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CLOSE_CONVERT_SESSION, data, &reply); 54727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 54827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* drmConvertedStatus = NULL; 54927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 55027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 55127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Converted Status 55227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int statusCode = reply.readInt32(); 553a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang const off64_t offset = reply.readInt64(); 55427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 55527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* convertedData = NULL; 55627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 55727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 55827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 55927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 56027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 56127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 56227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 56327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi convertedData = new DrmBuffer(data, bufferSize); 56427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 56527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset); 56627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 56727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConvertedStatus; 56827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 56927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 57027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::getAllSupportInfo( 57127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) { 5723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Get All Support Info"); 57327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 57427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 57527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 57627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 57727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 57827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(GET_ALL_SUPPORT_INFO, data, &reply); 57927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 58027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Support Info 58127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int arraySize = reply.readInt32(); 58227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < arraySize) { 58327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *drmSupportInfoArray = new DrmSupportInfo[arraySize]; 58427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 58527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < arraySize; ++index) { 58627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo drmSupportInfo; 58727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 58827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int fileSuffixVectorSize = reply.readInt32(); 58927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int i = 0; i < fileSuffixVectorSize; ++i) { 59027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmSupportInfo.addFileSuffix(reply.readString8()); 59127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 59227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 59327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int mimeTypeVectorSize = reply.readInt32(); 59427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int i = 0; i < mimeTypeVectorSize; ++i) { 59527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmSupportInfo.addMimeType(reply.readString8()); 59627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 59727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 59827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmSupportInfo.setDescription(reply.readString8()); 59927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi (*drmSupportInfoArray)[index] = drmSupportInfo; 60027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 60127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 60227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *length = arraySize; 60327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 60427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 60527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 60627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDecryptHandle* BpDrmManagerService::openDecryptSession( 6079d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) { 6083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering BpDrmManagerService::openDecryptSession"); 60927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 61027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 611e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 61227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 61327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeFileDescriptor(fd); 614a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang data.writeInt64(offset); 615a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang data.writeInt64(length); 6169d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong String8 mimeType; 6179d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong if (mime) { 6189d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong mimeType = mime; 6199d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong } 6209d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong data.writeString8(mimeType); 62127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 62227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(OPEN_DECRYPT_SESSION, data, &reply); 62327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 62427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle* handle = NULL; 62527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 62627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle = new DecryptHandle(); 6271da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(handle, reply); 62827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 62927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return handle; 63027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 63127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6329d2f386dd2885eaffa11fd494ae258bb09fe6397James DongDecryptHandle* BpDrmManagerService::openDecryptSession( 6339d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong int uniqueId, const char* uri, const char* mime) { 6349d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 6359d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong ALOGV("Entering BpDrmManagerService::openDecryptSession: mime=%s", mime? mime: "NULL"); 636e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi Parcel data, reply; 637e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 638e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 639e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi data.writeInt32(uniqueId); 640e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi data.writeString8(String8(uri)); 6419d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong String8 mimeType; 6429d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong if (mime) { 6439d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong mimeType = mime; 6449d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong } 6459d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong data.writeString8(mimeType); 646e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 647e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi remote()->transact(OPEN_DECRYPT_SESSION_FROM_URI, data, &reply); 648e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 649e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi DecryptHandle* handle = NULL; 650e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi if (0 != reply.dataAvail()) { 651e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi handle = new DecryptHandle(); 6521da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(handle, reply); 653e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } else { 6543856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("no decryptHandle is generated in service side"); 655e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } 656e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi return handle; 657e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi} 658e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 659cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei TakahashiDecryptHandle* BpDrmManagerService::openDecryptSession( 660cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi int uniqueId, const DrmBuffer& buf, const String8& mimeType) { 661cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi ALOGV("Entering BpDrmManagerService::openDecryptSession"); 662cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi Parcel data, reply; 663cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi 664cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 665cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi data.writeInt32(uniqueId); 666cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi if (buf.data != NULL && buf.length > 0) { 667cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi data.writeInt32(buf.length); 668cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi data.write(buf.data, buf.length); 669cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi } else { 670cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi data.writeInt32(0); 671cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi } 672cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi data.writeString8(mimeType); 673cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi 674cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi remote()->transact(OPEN_DECRYPT_SESSION_FOR_STREAMING, data, &reply); 675cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi 676cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi DecryptHandle* handle = NULL; 677cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi if (0 != reply.dataAvail()) { 678cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi handle = new DecryptHandle(); 679cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi readDecryptHandleFromParcelData(handle, reply); 680cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi } else { 681cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi ALOGV("no decryptHandle is generated in service side"); 682cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi } 683cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi return handle; 684cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi} 685cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi 6862272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { 6873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("closeDecryptSession"); 68827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 68927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 69027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 69127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 69227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 693c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang writeDecryptHandleToParcelData(decryptHandle, &data); 69427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 69527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply); 69627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6972272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 69827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 69927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7002272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::initializeDecryptUnit( 70127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, 70227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int decryptUnitId, const DrmBuffer* headerInfo) { 7033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("initializeDecryptUnit"); 70427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 70527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 70627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 70727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 70827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 709c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang writeDecryptHandleToParcelData(decryptHandle, &data); 71027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 71127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptUnitId); 71227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 71327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(headerInfo->length); 71427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(headerInfo->data, headerInfo->length); 71527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 71627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply); 7172272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 71827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 71927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 72027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::decrypt( 72127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, 7222272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { 7233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("decrypt"); 72427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 72527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 72627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 72727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 72827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 729c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang writeDecryptHandleToParcelData(decryptHandle, &data); 73027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 73127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptUnitId); 73227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32((*decBuffer)->length); 73327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 73427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(encBuffer->length); 73527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(encBuffer->data, encBuffer->length); 73627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7372272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi if (NULL != IV) { 7382272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInt32(IV->length); 7392272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.write(IV->data, IV->length); 7402272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 7412272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 74227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(DECRYPT, data, &reply); 74327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 74427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const status_t status = reply.readInt32(); 7453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Return value of decrypt() is %d", status); 74627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 74709ed70fab1f1424971ccc105dcdf5be5ce2e2643Jeff Tinker if (status == NO_ERROR) { 74809ed70fab1f1424971ccc105dcdf5be5ce2e2643Jeff Tinker const int size = reply.readInt32(); 74909ed70fab1f1424971ccc105dcdf5be5ce2e2643Jeff Tinker (*decBuffer)->length = size; 75009ed70fab1f1424971ccc105dcdf5be5ce2e2643Jeff Tinker reply.read((void *)(*decBuffer)->data, size); 75109ed70fab1f1424971ccc105dcdf5be5ce2e2643Jeff Tinker } 75227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 75327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return status; 75427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 75527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7562272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::finalizeDecryptUnit( 75727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { 7583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("finalizeDecryptUnit"); 75927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 76027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 76127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 76227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 76327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 764c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang writeDecryptHandleToParcelData(decryptHandle, &data); 76527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 76627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptUnitId); 76727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 76827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply); 7692272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 77027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 77127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 77227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshissize_t BpDrmManagerService::pread( 77327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, void* buffer, 774a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang ssize_t numBytes, off64_t offset) { 7753856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("read"); 77627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 77727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int result; 77827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 77927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 78027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 78127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 782c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang writeDecryptHandleToParcelData(decryptHandle, &data); 78327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 78427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(numBytes); 785a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang data.writeInt64(offset); 78627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 78727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(PREAD, data, &reply); 78827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi result = reply.readInt32(); 78927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < result) { 79027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(buffer, result); 79127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 79227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return result; 79327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 79427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 79527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiIMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService"); 79627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 79727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BnDrmManagerService::onTransact( 79827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi uint32_t code, const Parcel& data, 79927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel* reply, uint32_t flags) { 8003856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering BnDrmManagerService::onTransact with code %d", code); 80127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 80227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi switch (code) { 8032272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi case ADD_UNIQUEID: 8042272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi { 8053856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID"); 8062272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi CHECK_INTERFACE(IDrmManagerService, data, reply); 8072272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi int uniqueId = addUniqueId(data.readInt32()); 8082272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(uniqueId); 8092272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return DRM_NO_ERROR; 8102272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 8112272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 8122272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi case REMOVE_UNIQUEID: 8132272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi { 8143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID"); 8152272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi CHECK_INTERFACE(IDrmManagerService, data, reply); 8162272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi removeUniqueId(data.readInt32()); 8172272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return DRM_NO_ERROR; 8182272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 8192272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 820e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi case ADD_CLIENT: 82127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 8223856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :ADD_CLIENT"); 82327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 824e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi addClient(data.readInt32()); 82527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 82627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 82727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 828e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi case REMOVE_CLIENT: 82927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 8303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :REMOVE_CLIENT"); 83127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 832e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi removeClient(data.readInt32()); 83327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 83427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 83527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 83627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case SET_DRM_SERVICE_LISTENER: 83727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 8383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER"); 83927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 84027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 84127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 84227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const sp<IDrmServiceListener> drmServiceListener 84327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = interface_cast<IDrmServiceListener> (data.readStrongBinder()); 84427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 84527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = setDrmServiceListener(uniqueId, drmServiceListener); 84627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 84727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 84827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 84927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 85027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 85127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case GET_CONSTRAINTS_FROM_CONTENT: 85227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 8533856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT"); 85427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 85527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 85627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 85727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 path = data.readString8(); 85827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 859197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang DrmConstraints* drmConstraints 860197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang = getConstraints(uniqueId, &path, data.readInt32()); 86127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 86227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConstraints) { 86327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Constraints contents 86427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmConstraints->getCount()); 86527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 86627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator(); 86727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (keyIt.hasNext()) { 86827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key = keyIt.next(); 86927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(key); 87027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const char* value = drmConstraints->getAsByteArray(&key); 87127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int bufferSize = 0; 87227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != value) { 87327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bufferSize = strlen(value); 8740bf43848adb00922122b0a0eed2fa0318bde8317Hung Nguyen reply->writeInt32(bufferSize + 1); 8750bf43848adb00922122b0a0eed2fa0318bde8317Hung Nguyen reply->write(value, bufferSize + 1); 8760bf43848adb00922122b0a0eed2fa0318bde8317Hung Nguyen } else { 8770bf43848adb00922122b0a0eed2fa0318bde8317Hung Nguyen reply->writeInt32(0); 87827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 87927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 88027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 88127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmConstraints; drmConstraints = NULL; 88227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 88327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 88427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 8853473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi case GET_METADATA_FROM_CONTENT: 8863473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi { 8873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :GET_METADATA_FROM_CONTENT"); 8883473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi CHECK_INTERFACE(IDrmManagerService, data, reply); 8893473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 8903473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const int uniqueId = data.readInt32(); 8913473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const String8 path = data.readString8(); 8923473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 8933473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi DrmMetadata* drmMetadata = getMetadata(uniqueId, &path); 8943473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (NULL != drmMetadata) { 8953473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi //Filling DRM Metadata contents 8963473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply->writeInt32(drmMetadata->getCount()); 8973473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 8983473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi DrmMetadata::KeyIterator keyIt = drmMetadata->keyIterator(); 8993473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi while (keyIt.hasNext()) { 9003473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const String8 key = keyIt.next(); 9013473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply->writeString8(key); 9023473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const char* value = drmMetadata->getAsByteArray(&key); 9033473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi int bufferSize = 0; 9043473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (NULL != value) { 9053473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi bufferSize = strlen(value); 9063473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply->writeInt32(bufferSize + 1); 9073473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply->write(value, bufferSize + 1); 9083473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } else { 9093473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply->writeInt32(0); 9103473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 9113473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 9123473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 9133473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi delete drmMetadata; drmMetadata = NULL; 9143473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi return NO_ERROR; 9153473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 9163473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 91727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CAN_HANDLE: 91827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 9193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :CAN_HANDLE"); 92027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 92127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 92227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 92327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 path = data.readString8(); 92427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 mimeType = data.readString8(); 92527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 92627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bool result = canHandle(uniqueId, path, mimeType); 92727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 92827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(result); 92927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 93027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 93127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 93227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case PROCESS_DRM_INFO: 93327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 9343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO"); 93527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 93627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 93727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 93827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 93927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM info 94027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int infoType = data.readInt32(); 941b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker const uint32_t bufferSize = data.readInt32(); 942b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker 943b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker if (bufferSize > data.dataAvail()) { 944b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker return BAD_VALUE; 945b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker } 946b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker 94727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* buffer = NULL; 94827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 94927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi buffer = (char *)data.readInplace(bufferSize); 95027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 95127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer drmBuffer(buffer, bufferSize); 95227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8()); 95327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 95427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = data.readInt32(); 95527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < size; ++index) { 95627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key(data.readString8()); 95727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value(data.readString8()); 95827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfo->put(key, (value == String8("NULL")) ? String8("") : value); 95927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 96027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 96127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo); 96227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 96327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfoStatus) { 96427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info Status contents 96527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmInfoStatus->statusCode); 966e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi reply->writeInt32(drmInfoStatus->infoType); 96727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(drmInfoStatus->mimeType); 96827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 96927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfoStatus->drmBuffer) { 97027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer; 97127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = drmBuffer->length; 97227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize); 97327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 97427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(drmBuffer->data, bufferSize); 97527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 97627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] drmBuffer->data; 97727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmBuffer; drmBuffer = NULL; 97827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 97927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 98027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmInfo; drmInfo = NULL; 98127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmInfoStatus; drmInfoStatus = NULL; 98227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 98327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 98427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 98527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case ACQUIRE_DRM_INFO: 98627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 9873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO"); 98827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 98927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 99027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 99127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 99227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM info Request 993197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int infoType = data.readInt32(); 994197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const String8 mimeType = data.readString8(); 995197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(infoType, mimeType); 99627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 99727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = data.readInt32(); 99827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < size; ++index) { 999b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker if (!data.dataAvail()) { 1000b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker break; 1001b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker } 100227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key(data.readString8()); 10030abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan if (key == String8("FileDescriptorKey")) { 10040abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan char buffer[16]; 10050abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan int fd = data.readFileDescriptor(); 10060abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan sprintf(buffer, "%lu", (unsigned long)fd); 10070abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan drmInfoRequest->put(key, String8(buffer)); 10080abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan } else { 10090abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan const String8 value(data.readString8()); 10100abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value); 10110abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan } 101227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 101327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 101427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest); 101527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 101627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfo) { 101727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info 101827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer drmBuffer = drmInfo->getData(); 101927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmInfo->getInfoType()); 102027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 102127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = drmBuffer.length; 102227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize); 102327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 102427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(drmBuffer.data, bufferSize); 102527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 102627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(drmInfo->getMimeType()); 102727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmInfo->getCount()); 102827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 102927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo::KeyIterator keyIt = drmInfo->keyIterator(); 103027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (keyIt.hasNext()) { 103127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key = keyIt.next(); 103227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(key); 103327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value = drmInfo->get(key); 103427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8((value == String8("")) ? String8("NULL") : value); 103527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 103627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] drmBuffer.data; 103727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 103827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmInfoRequest; drmInfoRequest = NULL; 103927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmInfo; drmInfo = NULL; 104027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 104127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 104227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 104327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case SAVE_RIGHTS: 104427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 10453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS"); 104627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 104727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 104827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 104927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 105027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Rights 1051b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker const uint32_t bufferSize = data.readInt32(); 1052b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker if (bufferSize > data.dataAvail()) { 1053b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker reply->writeInt32(BAD_VALUE); 1054b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker return DRM_NO_ERROR; 1055b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker } 1056b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker 105727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize); 105827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 105927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 mimeType(data.readString8()); 106027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 accountId(data.readString8()); 106127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 subscriptionId(data.readString8()); 106227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 rightsPath(data.readString8()); 106327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 contentPath(data.readString8()); 106427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 106527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmRights drmRights(drmBuffer, 106627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((mimeType == String8("NULL")) ? String8("") : mimeType), 106727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((accountId == String8("NULL")) ? String8("") : accountId), 106827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId)); 106927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10702272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = saveRights(uniqueId, drmRights, 107127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((rightsPath == String8("NULL")) ? String8("") : rightsPath), 107227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((contentPath == String8("NULL")) ? String8("") : contentPath)); 107327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10742272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 107527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 107627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 107727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 107827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case GET_ORIGINAL_MIMETYPE: 107927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 10803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE"); 108127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 108227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1083197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int uniqueId = data.readInt32(); 1084197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const String8 path = data.readString8(); 1085bf5b3b29e31b293313788d7464cfb258ac0da803James Dong const int32_t isFdValid = data.readInt32(); 1086bf5b3b29e31b293313788d7464cfb258ac0da803James Dong int fd = -1; 1087bf5b3b29e31b293313788d7464cfb258ac0da803James Dong if (isFdValid) { 1088bf5b3b29e31b293313788d7464cfb258ac0da803James Dong fd = data.readFileDescriptor(); 1089bf5b3b29e31b293313788d7464cfb258ac0da803James Dong } 1090bf5b3b29e31b293313788d7464cfb258ac0da803James Dong const String8 originalMimeType = getOriginalMimeType(uniqueId, path, fd); 109127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 109227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(originalMimeType); 109327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 109427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 109527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 109627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case GET_DRM_OBJECT_TYPE: 109727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 10983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE"); 109927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 110027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1101197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int uniqueId = data.readInt32(); 1102197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const String8 path = data.readString8(); 1103197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const String8 mimeType = data.readString8(); 1104197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int drmObjectType = getDrmObjectType(uniqueId, path, mimeType); 110527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 110627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmObjectType); 110727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 110827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 110927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 111027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CHECK_RIGHTS_STATUS: 111127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 11123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS"); 111327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 111427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1115197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int uniqueId = data.readInt32(); 1116197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const String8 path = data.readString8(); 1117197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int action = data.readInt32(); 1118197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int result = checkRightsStatus(uniqueId, path, action); 111927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 112027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(result); 112127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 112227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 112327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 112427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CONSUME_RIGHTS: 112527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 11263856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS"); 112727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 112827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 112927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 113027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 113127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 11321da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(&handle, data); 113327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1134197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int action = data.readInt32(); 1135197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const bool reserve = static_cast<bool>(data.readInt32()); 11362272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status 1137197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang = consumeRights(uniqueId, &handle, action, reserve); 11382272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 113927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11401da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(&handle); 114127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 114227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 114327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 114427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case SET_PLAYBACK_STATUS: 114527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 11463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS"); 114727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 114827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 114927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 115027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 115127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 11521da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(&handle, data); 115327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1154197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int playbackStatus = data.readInt32(); 1155197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int64_t position = data.readInt64(); 11562272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status 1157197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang = setPlaybackStatus(uniqueId, &handle, playbackStatus, position); 11582272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 115927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11601da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(&handle); 116127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 116227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 116327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 116427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case VALIDATE_ACTION: 116527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 11663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION"); 116727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 116827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1169197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int uniqueId = data.readInt32(); 1170197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const String8 path = data.readString8(); 1171197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int action = data.readInt32(); 1172197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int outputType = data.readInt32(); 1173197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int configuration = data.readInt32(); 1174197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang bool result = validateAction(uniqueId, path, action, 1175197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang ActionDescription(outputType, configuration)); 117627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 117727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(result); 117827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 117927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 118027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 118127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case REMOVE_RIGHTS: 118227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 11833856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS"); 118427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 118527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1186197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang int uniqueId = data.readInt32(); 1187197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang String8 path = data.readString8(); 1188197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const status_t status = removeRights(uniqueId, path); 11892272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 119027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 119127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 119227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 119327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 119427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case REMOVE_ALL_RIGHTS: 119527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 11963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS"); 119727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 119827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11992272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = removeAllRights(data.readInt32()); 12002272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 120127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 120227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 120327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 120427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 120527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case OPEN_CONVERT_SESSION: 120627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 12073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION"); 120827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 120927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1210197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int uniqueId = data.readInt32(); 1211197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const String8 mimeType = data.readString8(); 1212197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int convertId = openConvertSession(uniqueId, mimeType); 121327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 121427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(convertId); 121527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 121627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 121727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 121827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CONVERT_DATA: 121927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 12203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :CONVERT_DATA"); 122127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 122227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 122327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 122427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int convertId = data.readInt32(); 122527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 122627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling input data 1227b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker const uint32_t bufferSize = data.readInt32(); 1228b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker if (bufferSize > data.dataAvail()) { 1229b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker return BAD_VALUE; 1230b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker } 123127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize); 123227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1233b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker DrmConvertedStatus* drmConvertedStatus = convertData(uniqueId, convertId, inputData); 123427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 123527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConvertedStatus) { 123627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Drm Converted Ststus 123727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmConvertedStatus->statusCode); 1238a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang reply->writeInt64(drmConvertedStatus->offset); 123927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 124027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConvertedStatus->convertedData) { 124127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer* convertedData = drmConvertedStatus->convertedData; 124227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = convertedData->length; 124327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize); 124427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 124527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(convertedData->data, bufferSize); 124627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 124727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] convertedData->data; 124827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete convertedData; convertedData = NULL; 124927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 125027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 125127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete inputData; inputData = NULL; 125227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmConvertedStatus; drmConvertedStatus = NULL; 125327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 125427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 125527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 125627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CLOSE_CONVERT_SESSION: 125727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 12583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION"); 125927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 126027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1261197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int uniqueId = data.readInt32(); 1262197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int convertId = data.readInt32(); 1263197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang DrmConvertedStatus* drmConvertedStatus 1264197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang = closeConvertSession(uniqueId, convertId); 126527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 126627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConvertedStatus) { 126727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Drm Converted Ststus 126827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmConvertedStatus->statusCode); 1269a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang reply->writeInt64(drmConvertedStatus->offset); 127027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 127127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConvertedStatus->convertedData) { 127227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer* convertedData = drmConvertedStatus->convertedData; 127327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = convertedData->length; 127427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize); 127527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 127627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(convertedData->data, bufferSize); 127727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 127827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] convertedData->data; 127927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete convertedData; convertedData = NULL; 128027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 128127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 128227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmConvertedStatus; drmConvertedStatus = NULL; 128327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 128427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 128527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 128627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case GET_ALL_SUPPORT_INFO: 128727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 12883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO"); 128927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 129027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 129127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 129227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int length = 0; 129327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo* drmSupportInfoArray = NULL; 129427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 129527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray); 129627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 129727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(length); 129827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int i = 0; i < length; ++i) { 129927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i]; 130027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 130127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmSupportInfo.getFileSuffixCount()); 130227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo::FileSuffixIterator fileSuffixIt 130327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = drmSupportInfo.getFileSuffixIterator(); 130427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (fileSuffixIt.hasNext()) { 130527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(fileSuffixIt.next()); 130627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 130727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 130827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmSupportInfo.getMimeTypeCount()); 130927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator(); 131027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (mimeTypeIt.hasNext()) { 131127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(mimeTypeIt.next()); 131227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 131327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(drmSupportInfo.getDescription()); 131427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 131527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] drmSupportInfoArray; drmSupportInfoArray = NULL; 131627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 131727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 131827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 131927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 132027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case OPEN_DECRYPT_SESSION: 132127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 13223856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION"); 132327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 132427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 132527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 132627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int fd = data.readFileDescriptor(); 132727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1328197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const off64_t offset = data.readInt64(); 1329197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const off64_t length = data.readInt64(); 13309d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong const String8 mime = data.readString8(); 13319d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 133227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle* handle 13339d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong = openDecryptSession(uniqueId, fd, offset, length, mime.string()); 133427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 133527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != handle) { 1336c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang writeDecryptHandleToParcelData(handle, reply); 13371da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(handle); 13381da9aa606096e14985924e8433a087d04f68ea22Gloria Wang delete handle; handle = NULL; 133927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 134027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 1341e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } 1342e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 1343e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi case OPEN_DECRYPT_SESSION_FROM_URI: 1344e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi { 13453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI"); 1346e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi CHECK_INTERFACE(IDrmManagerService, data, reply); 1347e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 1348e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi const int uniqueId = data.readInt32(); 1349e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi const String8 uri = data.readString8(); 13509d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong const String8 mime = data.readString8(); 1351e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 13529d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong DecryptHandle* handle = openDecryptSession(uniqueId, uri.string(), mime.string()); 1353e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 1354e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi if (NULL != handle) { 1355c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang writeDecryptHandleToParcelData(handle, reply); 13561da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 13571da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(handle); 13581da9aa606096e14985924e8433a087d04f68ea22Gloria Wang delete handle; handle = NULL; 1359e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } else { 13603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("NULL decryptHandle is returned"); 1361cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi } 1362cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi return DRM_NO_ERROR; 1363cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi } 1364cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi 1365cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi case OPEN_DECRYPT_SESSION_FOR_STREAMING: 1366cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi { 1367cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FOR_STREAMING"); 1368cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi CHECK_INTERFACE(IDrmManagerService, data, reply); 1369cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi 1370cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi const int uniqueId = data.readInt32(); 1371cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi const int bufferSize = data.readInt32(); 1372cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi DrmBuffer buf((bufferSize > 0) ? (char *)data.readInplace(bufferSize) : NULL, 1373cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi bufferSize); 1374cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi const String8 mimeType(data.readString8()); 1375cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi 1376cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi DecryptHandle* handle = openDecryptSession(uniqueId, buf, mimeType); 1377cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi 1378cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi if (handle != NULL) { 1379cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi writeDecryptHandleToParcelData(handle, reply); 1380cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi clearDecryptHandle(handle); 1381cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi delete handle; 1382cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi handle = NULL; 1383cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi } else { 1384cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi ALOGV("NULL decryptHandle is returned"); 1385e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } 1386e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi return DRM_NO_ERROR; 138727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 138827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 138927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CLOSE_DECRYPT_SESSION: 139027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 13913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION"); 139227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 139327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 139427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 139527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 139627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle* handle = new DecryptHandle(); 13971da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(handle, data); 139827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13992272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = closeDecryptSession(uniqueId, handle); 14002272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 140127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 140227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 140327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 140427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case INITIALIZE_DECRYPT_UNIT: 140527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 14063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT"); 140727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 140827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 140927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 141027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 141127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 14121da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(&handle, data); 14131da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 141427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int decryptUnitId = data.readInt32(); 141527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 141627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Header info 1417b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker const uint32_t bufferSize = data.readInt32(); 1418b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker if (bufferSize > data.dataAvail()) { 1419b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker reply->writeInt32(BAD_VALUE); 1420b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker clearDecryptHandle(&handle); 1421b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker return DRM_NO_ERROR; 1422b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker } 142327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* headerInfo = NULL; 142427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize); 142527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14262272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status 14272272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo); 14282272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 142927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14301da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(&handle); 143127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete headerInfo; headerInfo = NULL; 143227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 143327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 143427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 143527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case DECRYPT: 143627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 14373856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :DECRYPT"); 143827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 143927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 144027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 144127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 144227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 14431da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(&handle, data); 14441da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 144527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int decryptUnitId = data.readInt32(); 1446b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker const uint32_t decBufferSize = data.readInt32(); 1447b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker const uint32_t encBufferSize = data.readInt32(); 1448b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker 1449b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker if (encBufferSize > data.dataAvail() || 1450b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker decBufferSize > MAX_BINDER_TRANSACTION_SIZE) { 1451b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker reply->writeInt32(BAD_VALUE); 1452b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker reply->writeInt32(0); 1453b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker clearDecryptHandle(&handle); 1454b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker return DRM_NO_ERROR; 1455b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker } 145627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 145727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* encBuffer 145827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize); 145927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 146027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* buffer = NULL; 146127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi buffer = new char[decBufferSize]; 146227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize); 146327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14642272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi DrmBuffer* IV = NULL; 14652272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi if (0 != data.dataAvail()) { 1466b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker const uint32_t ivBufferlength = data.readInt32(); 1467b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker if (ivBufferlength <= data.dataAvail()) { 1468b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength); 1469b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker } 14702272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 14712272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 14722272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status 14732272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi = decrypt(uniqueId, &handle, decryptUnitId, encBuffer, &decBuffer, IV); 147427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 147527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 147627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 147709ed70fab1f1424971ccc105dcdf5be5ce2e2643Jeff Tinker if (status == NO_ERROR) { 147809ed70fab1f1424971ccc105dcdf5be5ce2e2643Jeff Tinker const int size = decBuffer->length; 147909ed70fab1f1424971ccc105dcdf5be5ce2e2643Jeff Tinker reply->writeInt32(size); 148009ed70fab1f1424971ccc105dcdf5be5ce2e2643Jeff Tinker reply->write(decBuffer->data, size); 148109ed70fab1f1424971ccc105dcdf5be5ce2e2643Jeff Tinker } 148227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14831da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(&handle); 148427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete encBuffer; encBuffer = NULL; 148527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete decBuffer; decBuffer = NULL; 148627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] buffer; buffer = NULL; 14872272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi delete IV; IV = NULL; 148827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 148927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 149027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 149127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case FINALIZE_DECRYPT_UNIT: 149227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 14933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT"); 149427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 149527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 149627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 149727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 149827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 14991da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(&handle, data); 150027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 15012272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32()); 15022272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 150327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 15041da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(&handle); 150527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 150627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 150727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 150827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case PREAD: 150927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 15103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :READ"); 151127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 151227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 151327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 151427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 151527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 15161da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(&handle, data); 151727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1518b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker const uint32_t numBytes = data.readInt32(); 1519b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker if (numBytes > MAX_BINDER_TRANSACTION_SIZE) { 1520b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker reply->writeInt32(BAD_VALUE); 1521b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker return DRM_NO_ERROR; 1522b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker } 152327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* buffer = new char[numBytes]; 152427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1525a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang const off64_t offset = data.readInt64(); 152627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 152727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ssize_t result = pread(uniqueId, &handle, buffer, numBytes, offset); 152827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(result); 152927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < result) { 153027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(buffer, result); 153127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 153227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 15331da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(&handle); 153427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] buffer, buffer = NULL; 153527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 153627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 153727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 153827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi default: 153927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return BBinder::onTransact(code, data, reply, flags); 154027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 154127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 1542