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 3727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiusing namespace android; 3927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 40c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wangstatic void writeDecryptHandleToParcelData( 411da9aa606096e14985924e8433a087d04f68ea22Gloria Wang const DecryptHandle* handle, Parcel* data) { 421da9aa606096e14985924e8433a087d04f68ea22Gloria Wang data->writeInt32(handle->decryptId); 431da9aa606096e14985924e8433a087d04f68ea22Gloria Wang data->writeString8(handle->mimeType); 441da9aa606096e14985924e8433a087d04f68ea22Gloria Wang data->writeInt32(handle->decryptApiType); 451da9aa606096e14985924e8433a087d04f68ea22Gloria Wang data->writeInt32(handle->status); 461da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 471da9aa606096e14985924e8433a087d04f68ea22Gloria Wang int size = handle->copyControlVector.size(); 481da9aa606096e14985924e8433a087d04f68ea22Gloria Wang data->writeInt32(size); 49c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang for (int i = 0; i < size; i++) { 501da9aa606096e14985924e8433a087d04f68ea22Gloria Wang data->writeInt32(handle->copyControlVector.keyAt(i)); 511da9aa606096e14985924e8433a087d04f68ea22Gloria Wang data->writeInt32(handle->copyControlVector.valueAt(i)); 521da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } 531da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 546b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang size = handle->extendedData.size(); 556b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang data->writeInt32(size); 56c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang for (int i = 0; i < size; i++) { 576b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang data->writeString8(handle->extendedData.keyAt(i)); 586b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang data->writeString8(handle->extendedData.valueAt(i)); 596b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang } 606b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang 611da9aa606096e14985924e8433a087d04f68ea22Gloria Wang if (NULL != handle->decryptInfo) { 621da9aa606096e14985924e8433a087d04f68ea22Gloria Wang data->writeInt32(handle->decryptInfo->decryptBufferLength); 631da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } else { 641da9aa606096e14985924e8433a087d04f68ea22Gloria Wang data->writeInt32(INVALID_BUFFER_LENGTH); 651da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } 661da9aa606096e14985924e8433a087d04f68ea22Gloria Wang} 671da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 681da9aa606096e14985924e8433a087d04f68ea22Gloria Wangstatic void readDecryptHandleFromParcelData( 691da9aa606096e14985924e8433a087d04f68ea22Gloria Wang DecryptHandle* handle, const Parcel& data) { 701da9aa606096e14985924e8433a087d04f68ea22Gloria Wang if (0 == data.dataAvail()) { 711da9aa606096e14985924e8433a087d04f68ea22Gloria Wang return; 721da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } 731da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 741da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->decryptId = data.readInt32(); 751da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->mimeType = data.readString8(); 761da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->decryptApiType = data.readInt32(); 771da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->status = data.readInt32(); 781da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 791da9aa606096e14985924e8433a087d04f68ea22Gloria Wang int size = data.readInt32(); 80c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang for (int i = 0; i < size; i++) { 816b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang DrmCopyControl key = (DrmCopyControl)data.readInt32(); 826b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang int value = data.readInt32(); 836b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang handle->copyControlVector.add(key, value); 846b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang } 856b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang 866b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang size = data.readInt32(); 87c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang for (int i = 0; i < size; i++) { 886b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang String8 key = data.readString8(); 896b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang String8 value = data.readString8(); 906b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang handle->extendedData.add(key, value); 911da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } 921da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 931da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->decryptInfo = NULL; 941da9aa606096e14985924e8433a087d04f68ea22Gloria Wang const int bufferLen = data.readInt32(); 951da9aa606096e14985924e8433a087d04f68ea22Gloria Wang if (INVALID_BUFFER_LENGTH != bufferLen) { 961da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->decryptInfo = new DecryptInfo(); 971da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->decryptInfo->decryptBufferLength = bufferLen; 981da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } 991da9aa606096e14985924e8433a087d04f68ea22Gloria Wang} 1001da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 1011da9aa606096e14985924e8433a087d04f68ea22Gloria Wangstatic void clearDecryptHandle(DecryptHandle* handle) { 1021da9aa606096e14985924e8433a087d04f68ea22Gloria Wang if (handle == NULL) { 1031da9aa606096e14985924e8433a087d04f68ea22Gloria Wang return; 1041da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } 1051da9aa606096e14985924e8433a087d04f68ea22Gloria Wang if (handle->decryptInfo) { 1061da9aa606096e14985924e8433a087d04f68ea22Gloria Wang delete handle->decryptInfo; 1071da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->decryptInfo = NULL; 1081da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } 1091da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->copyControlVector.clear(); 110ab00df4d8585b181e9058eb1b9c7996aa3bbaeabGloria Wang handle->extendedData.clear(); 1111da9aa606096e14985924e8433a087d04f68ea22Gloria Wang} 1121da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 1138f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wangint BpDrmManagerService::addUniqueId(bool isNative) { 1143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("add uniqueid"); 1152272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi Parcel data, reply; 1162272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 1178f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang data.writeInt32(isNative); 1182272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi remote()->transact(ADD_UNIQUEID, data, &reply); 1192272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 1202272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi} 1212272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 1222272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimivoid BpDrmManagerService::removeUniqueId(int uniqueId) { 1233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("remove uniqueid"); 1242272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi Parcel data, reply; 1252272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 1262272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInt32(uniqueId); 1272272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi remote()->transact(REMOVE_UNIQUEID, data, &reply); 1282272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi} 1292272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 130e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid BpDrmManagerService::addClient(int uniqueId) { 13127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 134e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi remote()->transact(ADD_CLIENT, data, &reply); 13527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 13627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 137e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid BpDrmManagerService::removeClient(int uniqueId) { 13827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 13927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 14027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 141e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi remote()->transact(REMOVE_CLIENT, data, &reply); 14227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 14327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::setDrmServiceListener( 14527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) { 1463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setDrmServiceListener"); 14727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 14827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 15027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 15127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeStrongBinder(drmServiceListener->asBinder()); 15227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(SET_DRM_SERVICE_LISTENER, data, &reply); 15327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 15427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 15527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::installDrmEngine(int uniqueId, const String8& drmEngineFile) { 1573856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Install DRM Engine"); 15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 15927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 16127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(drmEngineFile); 16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(INSTALL_DRM_ENGINE, data, &reply); 16527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 16627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConstraints* BpDrmManagerService::getConstraints( 16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8* path, const int action) { 1703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Get Constraints"); 17127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 17227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 17427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 17527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(*path); 17627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(action); 17727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 17827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(GET_CONSTRAINTS_FROM_CONTENT, data, &reply); 17927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 18027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConstraints* drmConstraints = NULL; 18127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 18227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Drm Constraints 18327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConstraints = new DrmConstraints(); 18427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 18527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = reply.readInt32(); 18627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < size; ++index) { 18727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key(reply.readString8()); 18827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 18927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 19027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 19127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 19227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 19327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 19427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConstraints->put(&key, data); 19527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 19627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 19727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConstraints; 19827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 19927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2003473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi AimiDrmMetadata* BpDrmManagerService::getMetadata(int uniqueId, const String8* path) { 2013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Get Metadata"); 2023473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi Parcel data, reply; 2033473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 2043473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi data.writeInt32(uniqueId); 2053473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 2063473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi DrmMetadata* drmMetadata = NULL; 2073473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi data.writeString8(*path); 2083473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi remote()->transact(GET_METADATA_FROM_CONTENT, data, &reply); 2093473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 2103473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (0 != reply.dataAvail()) { 2113473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi //Filling Drm Metadata 2123473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi drmMetadata = new DrmMetadata(); 2133473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 2143473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const int size = reply.readInt32(); 2153473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi for (int index = 0; index < size; ++index) { 2163473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const String8 key(reply.readString8()); 2173473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const int bufferSize = reply.readInt32(); 2183473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi char* data = NULL; 2193473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (0 < bufferSize) { 2203473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi data = new char[bufferSize]; 2213473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply.read(data, bufferSize); 2223473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 2233473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi drmMetadata->put(&key, data); 2243473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 2253473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 2263473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi return drmMetadata; 2273473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi} 2283473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 22927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool BpDrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) { 2303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Can Handle"); 23127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 23227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 23327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 23427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 23527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 23627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 23727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(mimeType); 23827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 23927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CAN_HANDLE, data, &reply); 24027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 24127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return static_cast<bool>(reply.readInt32()); 24227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 24327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 24427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) { 2453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Process DRM Info"); 24627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 24727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 24827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 24927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 25027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 25127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM info 25227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(drmInfo->getInfoType()); 25327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer dataBuffer = drmInfo->getData(); 25427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int dataBufferSize = dataBuffer.length; 25527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(dataBufferSize); 25627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < dataBufferSize) { 25727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(dataBuffer.data, dataBufferSize); 25827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 25927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(drmInfo->getMimeType()); 26027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 26127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(drmInfo->getCount()); 26227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo::KeyIterator keyIt = drmInfo->keyIterator(); 26327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 26427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (keyIt.hasNext()) { 26527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key = keyIt.next(); 26627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(key); 26727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value = drmInfo->get(key); 26827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((value == String8("")) ? String8("NULL") : value); 26927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 27027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 27127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(PROCESS_DRM_INFO, data, &reply); 27227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 27327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoStatus* drmInfoStatus = NULL; 27427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 27527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info Status 27627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int statusCode = reply.readInt32(); 277e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi const int infoType = reply.readInt32(); 27827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 mimeType = reply.readString8(); 27927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 28027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* drmBuffer = NULL; 28127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 28227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 28327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 28427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 28527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 28627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 28727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 28827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmBuffer = new DrmBuffer(data, bufferSize); 28927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 290e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi drmInfoStatus = new DrmInfoStatus(statusCode, infoType, drmBuffer, mimeType); 29127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 29227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmInfoStatus; 29327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 29427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 29527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfo* BpDrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) { 2963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Acquire DRM Info"); 29727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 29827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 29927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 30027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 30127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 30227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info Request 30327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(drmInforequest->getInfoType()); 30427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(drmInforequest->getMimeType()); 30527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 30627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(drmInforequest->getCount()); 30727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoRequest::KeyIterator keyIt = drmInforequest->keyIterator(); 30827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 30927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (keyIt.hasNext()) { 31027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key = keyIt.next(); 31127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(key); 31227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value = drmInforequest->get(key); 31327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((value == String8("")) ? String8("NULL") : value); 31427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 31527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 31627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(ACQUIRE_DRM_INFO, data, &reply); 31727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 31827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo* drmInfo = NULL; 31927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 32027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info 32127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int infoType = reply.readInt32(); 32227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 32327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 32427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 32527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 32627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 32727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 32827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 32927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfo = new DrmInfo(infoType, DrmBuffer(data, bufferSize), reply.readString8()); 33027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 33127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = reply.readInt32(); 33227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < size; ++index) { 33327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key(reply.readString8()); 33427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value(reply.readString8()); 33527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfo->put(key, (value == String8("NULL")) ? String8("") : value); 33627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 33727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 33827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmInfo; 33927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 34027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3412272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::saveRights( 34227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const DrmRights& drmRights, 34327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8& rightsPath, const String8& contentPath) { 3443856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Save Rights"); 34527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 34627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 34727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 34827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 34927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 35027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Drm Rights 35127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer dataBuffer = drmRights.getData(); 35227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(dataBuffer.length); 35327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(dataBuffer.data, dataBuffer.length); 35427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 35527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 mimeType = drmRights.getMimeType(); 35627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((mimeType == String8("")) ? String8("NULL") : mimeType); 35727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 35827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 accountId = drmRights.getAccountId(); 35927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((accountId == String8("")) ? String8("NULL") : accountId); 36027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 36127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 subscriptionId = drmRights.getSubscriptionId(); 36227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((subscriptionId == String8("")) ? String8("NULL") : subscriptionId); 36327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 36427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((rightsPath == String8("")) ? String8("NULL") : rightsPath); 36527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((contentPath == String8("")) ? String8("NULL") : contentPath); 36627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 36727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(SAVE_RIGHTS, data, &reply); 3682272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 36927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 37027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 37127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 BpDrmManagerService::getOriginalMimeType(int uniqueId, const String8& path) { 3723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Get Original MimeType"); 37327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 37427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 37527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 37627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 37727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 37827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 37927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(GET_ORIGINAL_MIMETYPE, data, &reply); 38027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readString8(); 38127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 38227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 38327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::getDrmObjectType( 38427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, const String8& mimeType) { 3853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Get Drm object type"); 38627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 38727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 38827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 38927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 39027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 39127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(mimeType); 39227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 39327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(GET_DRM_OBJECT_TYPE, data, &reply); 39427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 39527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 39627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 39727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 39827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::checkRightsStatus(int uniqueId, const String8& path, int action) { 3993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("checkRightsStatus"); 40027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 40127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 40227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 40327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 40427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 40527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(action); 40627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 40727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CHECK_RIGHTS_STATUS, data, &reply); 40827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 40927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 41027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 41127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4122272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::consumeRights( 41327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) { 4143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("consumeRights"); 4152272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi Parcel data, reply; 41627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 41727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 41827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 41927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 420c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang writeDecryptHandleToParcelData(decryptHandle, &data); 42127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 42227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(action); 42327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(static_cast< int>(reserve)); 42427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 42527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CONSUME_RIGHTS, data, &reply); 4262272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 42727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 42827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4292272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::setPlaybackStatus( 430a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) { 4313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setPlaybackStatus"); 43227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 43327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 43427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 43527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 43627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 437c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang writeDecryptHandleToParcelData(decryptHandle, &data); 43827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 43927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(playbackStatus); 4402ed8a921ef55aa2f3dd4b7ac33b7ded6ec33d92dGloria Wang data.writeInt64(position); 44127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 44227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(SET_PLAYBACK_STATUS, data, &reply); 4432272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 44427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 44527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 44627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool BpDrmManagerService::validateAction( 44727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, 44827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int action, const ActionDescription& description) { 4493856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("validateAction"); 45027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 45127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 45227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 45327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 45427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 45527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(action); 45627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(description.outputType); 45727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(description.configuration); 45827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 45927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(VALIDATE_ACTION, data, &reply); 46027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 46127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return static_cast<bool>(reply.readInt32()); 46227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 46327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4642272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::removeRights(int uniqueId, const String8& path) { 4653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("removeRights"); 46627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 46727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 46827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 46927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 47027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 47127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 47227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(REMOVE_RIGHTS, data, &reply); 4732272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 47427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 47527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4762272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::removeAllRights(int uniqueId) { 4773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("removeAllRights"); 47827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 47927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 48027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 48127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 48227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 48327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(REMOVE_ALL_RIGHTS, data, &reply); 4842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 48527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 48627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 48727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) { 4883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("openConvertSession"); 48927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 49027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 49127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 49227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 49327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(mimeType); 49427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 49527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(OPEN_CONVERT_SESSION, data, &reply); 49627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 49727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 49827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 49927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* BpDrmManagerService::convertData( 50027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int convertId, const DrmBuffer* inputData) { 5013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("convertData"); 50227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 50327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 50427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 50527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 50627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(convertId); 50727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(inputData->length); 50827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(inputData->data, inputData->length); 50927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 51027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CONVERT_DATA, data, &reply); 51127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 51227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* drmConvertedStatus = NULL; 51327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 51427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 51527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Converted Status 51627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int statusCode = reply.readInt32(); 517a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang const off64_t offset = reply.readInt64(); 51827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 51927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* convertedData = NULL; 52027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 52127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 52227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 52327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 52427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 52527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 52627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 52727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi convertedData = new DrmBuffer(data, bufferSize); 52827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 52927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset); 53027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 53127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConvertedStatus; 53227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 53327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 53427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* BpDrmManagerService::closeConvertSession(int uniqueId, int convertId) { 5353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("closeConvertSession"); 53627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 53727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 53827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 53927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 54027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(convertId); 54127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 54227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CLOSE_CONVERT_SESSION, data, &reply); 54327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 54427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* drmConvertedStatus = NULL; 54527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 54627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 54727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Converted Status 54827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int statusCode = reply.readInt32(); 549a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang const off64_t offset = reply.readInt64(); 55027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 55127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* convertedData = NULL; 55227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 55327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 55427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 55527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 55627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 55727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 55827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 55927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi convertedData = new DrmBuffer(data, bufferSize); 56027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 56127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset); 56227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 56327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConvertedStatus; 56427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 56527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 56627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::getAllSupportInfo( 56727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) { 5683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Get All Support Info"); 56927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 57027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 57127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 57227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 57327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 57427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(GET_ALL_SUPPORT_INFO, data, &reply); 57527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 57627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Support Info 57727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int arraySize = reply.readInt32(); 57827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < arraySize) { 57927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *drmSupportInfoArray = new DrmSupportInfo[arraySize]; 58027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 58127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < arraySize; ++index) { 58227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo drmSupportInfo; 58327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 58427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int fileSuffixVectorSize = reply.readInt32(); 58527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int i = 0; i < fileSuffixVectorSize; ++i) { 58627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmSupportInfo.addFileSuffix(reply.readString8()); 58727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 58827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 58927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int mimeTypeVectorSize = reply.readInt32(); 59027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int i = 0; i < mimeTypeVectorSize; ++i) { 59127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmSupportInfo.addMimeType(reply.readString8()); 59227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 59327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 59427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmSupportInfo.setDescription(reply.readString8()); 59527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi (*drmSupportInfoArray)[index] = drmSupportInfo; 59627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 59727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 59827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *length = arraySize; 59927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 60027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 60127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 60227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDecryptHandle* BpDrmManagerService::openDecryptSession( 6039d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) { 6043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering BpDrmManagerService::openDecryptSession"); 60527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 60627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 607e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 60827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 60927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeFileDescriptor(fd); 610a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang data.writeInt64(offset); 611a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang data.writeInt64(length); 6129d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong String8 mimeType; 6139d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong if (mime) { 6149d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong mimeType = mime; 6159d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong } 6169d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong data.writeString8(mimeType); 61727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 61827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(OPEN_DECRYPT_SESSION, data, &reply); 61927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 62027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle* handle = NULL; 62127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 62227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle = new DecryptHandle(); 6231da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(handle, reply); 62427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 62527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return handle; 62627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 62727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6289d2f386dd2885eaffa11fd494ae258bb09fe6397James DongDecryptHandle* BpDrmManagerService::openDecryptSession( 6299d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong int uniqueId, const char* uri, const char* mime) { 6309d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 6319d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong ALOGV("Entering BpDrmManagerService::openDecryptSession: mime=%s", mime? mime: "NULL"); 632e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi Parcel data, reply; 633e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 634e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 635e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi data.writeInt32(uniqueId); 636e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi data.writeString8(String8(uri)); 6379d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong String8 mimeType; 6389d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong if (mime) { 6399d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong mimeType = mime; 6409d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong } 6419d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong data.writeString8(mimeType); 642e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 643e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi remote()->transact(OPEN_DECRYPT_SESSION_FROM_URI, data, &reply); 644e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 645e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi DecryptHandle* handle = NULL; 646e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi if (0 != reply.dataAvail()) { 647e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi handle = new DecryptHandle(); 6481da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(handle, reply); 649e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } else { 6503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("no decryptHandle is generated in service side"); 651e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } 652e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi return handle; 653e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi} 654e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 6552272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { 6563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("closeDecryptSession"); 65727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 65827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 65927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 66027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 66127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 662c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang writeDecryptHandleToParcelData(decryptHandle, &data); 66327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 66427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply); 66527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6662272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 66727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 66827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6692272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::initializeDecryptUnit( 67027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, 67127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int decryptUnitId, const DrmBuffer* headerInfo) { 6723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("initializeDecryptUnit"); 67327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 67427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 67527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 67627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 67727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 678c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang writeDecryptHandleToParcelData(decryptHandle, &data); 67927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 68027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptUnitId); 68127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 68227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(headerInfo->length); 68327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(headerInfo->data, headerInfo->length); 68427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 68527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply); 6862272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 68727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 68827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 68927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::decrypt( 69027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, 6912272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { 6923856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("decrypt"); 69327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 69427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 69527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 69627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 69727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 698c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang writeDecryptHandleToParcelData(decryptHandle, &data); 69927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 70027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptUnitId); 70127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32((*decBuffer)->length); 70227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 70327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(encBuffer->length); 70427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(encBuffer->data, encBuffer->length); 70527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7062272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi if (NULL != IV) { 7072272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInt32(IV->length); 7082272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.write(IV->data, IV->length); 7092272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 7102272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 71127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(DECRYPT, data, &reply); 71227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 71327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const status_t status = reply.readInt32(); 7143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Return value of decrypt() is %d", status); 71527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 71627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = reply.readInt32(); 71727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi (*decBuffer)->length = size; 71827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read((void *)(*decBuffer)->data, size); 71927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 72027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return status; 72127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 72227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7232272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::finalizeDecryptUnit( 72427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { 7253856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("finalizeDecryptUnit"); 72627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 72727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 72827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 72927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 73027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 731c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang writeDecryptHandleToParcelData(decryptHandle, &data); 73227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 73327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptUnitId); 73427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 73527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply); 7362272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 73727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 73827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 73927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshissize_t BpDrmManagerService::pread( 74027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, void* buffer, 741a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang ssize_t numBytes, off64_t offset) { 7423856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("read"); 74327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 74427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int result; 74527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 74627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 74727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 74827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 749c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang writeDecryptHandleToParcelData(decryptHandle, &data); 75027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 75127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(numBytes); 752a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang data.writeInt64(offset); 75327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 75427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(PREAD, data, &reply); 75527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi result = reply.readInt32(); 75627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < result) { 75727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(buffer, result); 75827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 75927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return result; 76027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 76127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 76227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiIMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService"); 76327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 76427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BnDrmManagerService::onTransact( 76527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi uint32_t code, const Parcel& data, 76627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel* reply, uint32_t flags) { 7673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Entering BnDrmManagerService::onTransact with code %d", code); 76827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 76927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi switch (code) { 7702272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi case ADD_UNIQUEID: 7712272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi { 7723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID"); 7732272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi CHECK_INTERFACE(IDrmManagerService, data, reply); 7742272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi int uniqueId = addUniqueId(data.readInt32()); 7752272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(uniqueId); 7762272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return DRM_NO_ERROR; 7772272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 7782272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 7792272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi case REMOVE_UNIQUEID: 7802272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi { 7813856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID"); 7822272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi CHECK_INTERFACE(IDrmManagerService, data, reply); 7832272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi removeUniqueId(data.readInt32()); 7842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return DRM_NO_ERROR; 7852272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 7862272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 787e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi case ADD_CLIENT: 78827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 7893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :ADD_CLIENT"); 79027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 791e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi addClient(data.readInt32()); 79227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 79327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 79427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 795e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi case REMOVE_CLIENT: 79627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 7973856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :REMOVE_CLIENT"); 79827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 799e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi removeClient(data.readInt32()); 80027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 80127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 80227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 80327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case SET_DRM_SERVICE_LISTENER: 80427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 8053856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER"); 80627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 80727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 80827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 80927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const sp<IDrmServiceListener> drmServiceListener 81027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = interface_cast<IDrmServiceListener> (data.readStrongBinder()); 81127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 81227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = setDrmServiceListener(uniqueId, drmServiceListener); 81327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 81427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 81527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 81627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 81727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 81827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case INSTALL_DRM_ENGINE: 81927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 8203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :INSTALL_DRM_ENGINE"); 82127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 82227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 823197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int uniqueId = data.readInt32(); 824197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const String8 engineFile = data.readString8(); 825197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang status_t status = installDrmEngine(uniqueId, engineFile); 82627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 82727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 82827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 82927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 83027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 83127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case GET_CONSTRAINTS_FROM_CONTENT: 83227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 8333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT"); 83427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 83527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 83627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 83727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 path = data.readString8(); 83827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 839197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang DrmConstraints* drmConstraints 840197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang = getConstraints(uniqueId, &path, data.readInt32()); 84127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 84227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConstraints) { 84327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Constraints contents 84427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmConstraints->getCount()); 84527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 84627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator(); 84727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (keyIt.hasNext()) { 84827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key = keyIt.next(); 84927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(key); 85027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const char* value = drmConstraints->getAsByteArray(&key); 85127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int bufferSize = 0; 85227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != value) { 85327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bufferSize = strlen(value); 85427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 85527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize + 1); 85627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(value, bufferSize + 1); 85727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 85827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 85927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmConstraints; drmConstraints = NULL; 86027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 86127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 86227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 8633473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi case GET_METADATA_FROM_CONTENT: 8643473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi { 8653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :GET_METADATA_FROM_CONTENT"); 8663473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi CHECK_INTERFACE(IDrmManagerService, data, reply); 8673473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 8683473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const int uniqueId = data.readInt32(); 8693473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const String8 path = data.readString8(); 8703473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 8713473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi DrmMetadata* drmMetadata = getMetadata(uniqueId, &path); 8723473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (NULL != drmMetadata) { 8733473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi //Filling DRM Metadata contents 8743473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply->writeInt32(drmMetadata->getCount()); 8753473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 8763473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi DrmMetadata::KeyIterator keyIt = drmMetadata->keyIterator(); 8773473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi while (keyIt.hasNext()) { 8783473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const String8 key = keyIt.next(); 8793473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply->writeString8(key); 8803473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const char* value = drmMetadata->getAsByteArray(&key); 8813473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi int bufferSize = 0; 8823473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (NULL != value) { 8833473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi bufferSize = strlen(value); 8843473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply->writeInt32(bufferSize + 1); 8853473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply->write(value, bufferSize + 1); 8863473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } else { 8873473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply->writeInt32(0); 8883473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 8893473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 8903473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 8913473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi delete drmMetadata; drmMetadata = NULL; 8923473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi return NO_ERROR; 8933473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 8943473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 89527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CAN_HANDLE: 89627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 8973856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :CAN_HANDLE"); 89827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 89927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 90027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 90127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 path = data.readString8(); 90227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 mimeType = data.readString8(); 90327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 90427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bool result = canHandle(uniqueId, path, mimeType); 90527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 90627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(result); 90727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 90827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 90927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 91027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case PROCESS_DRM_INFO: 91127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 9123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO"); 91327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 91427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 91527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 91627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 91727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM info 91827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int infoType = data.readInt32(); 91927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = data.readInt32(); 92027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* buffer = NULL; 92127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 92227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi buffer = (char *)data.readInplace(bufferSize); 92327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 92427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer drmBuffer(buffer, bufferSize); 92527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8()); 92627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 92727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = data.readInt32(); 92827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < size; ++index) { 92927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key(data.readString8()); 93027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value(data.readString8()); 93127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfo->put(key, (value == String8("NULL")) ? String8("") : value); 93227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 93327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 93427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo); 93527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 93627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfoStatus) { 93727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info Status contents 93827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmInfoStatus->statusCode); 939e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi reply->writeInt32(drmInfoStatus->infoType); 94027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(drmInfoStatus->mimeType); 94127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 94227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfoStatus->drmBuffer) { 94327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer; 94427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = drmBuffer->length; 94527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize); 94627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 94727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(drmBuffer->data, bufferSize); 94827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 94927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] drmBuffer->data; 95027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmBuffer; drmBuffer = NULL; 95127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 95227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 95327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmInfo; drmInfo = NULL; 95427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmInfoStatus; drmInfoStatus = NULL; 95527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 95627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 95727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 95827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case ACQUIRE_DRM_INFO: 95927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 9603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO"); 96127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 96227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 96327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 96427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 96527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM info Request 966197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int infoType = data.readInt32(); 967197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const String8 mimeType = data.readString8(); 968197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(infoType, mimeType); 96927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 97027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = data.readInt32(); 97127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < size; ++index) { 97227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key(data.readString8()); 97327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value(data.readString8()); 97427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value); 97527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 97627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 97727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest); 97827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 97927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfo) { 98027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info 98127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer drmBuffer = drmInfo->getData(); 98227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmInfo->getInfoType()); 98327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 98427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = drmBuffer.length; 98527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize); 98627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 98727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(drmBuffer.data, bufferSize); 98827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 98927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(drmInfo->getMimeType()); 99027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmInfo->getCount()); 99127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 99227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo::KeyIterator keyIt = drmInfo->keyIterator(); 99327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (keyIt.hasNext()) { 99427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key = keyIt.next(); 99527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(key); 99627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value = drmInfo->get(key); 99727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8((value == String8("")) ? String8("NULL") : value); 99827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 99927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] drmBuffer.data; 100027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 100127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmInfoRequest; drmInfoRequest = NULL; 100227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmInfo; drmInfo = NULL; 100327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 100427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 100527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 100627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case SAVE_RIGHTS: 100727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 10083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS"); 100927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 101027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 101127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 101227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 101327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Rights 101427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = data.readInt32(); 101527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize); 101627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 101727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 mimeType(data.readString8()); 101827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 accountId(data.readString8()); 101927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 subscriptionId(data.readString8()); 102027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 rightsPath(data.readString8()); 102127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 contentPath(data.readString8()); 102227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 102327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmRights drmRights(drmBuffer, 102427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((mimeType == String8("NULL")) ? String8("") : mimeType), 102527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((accountId == String8("NULL")) ? String8("") : accountId), 102627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId)); 102727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10282272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = saveRights(uniqueId, drmRights, 102927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((rightsPath == String8("NULL")) ? String8("") : rightsPath), 103027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((contentPath == String8("NULL")) ? String8("") : contentPath)); 103127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10322272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 103327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 103427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 103527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 103627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case GET_ORIGINAL_MIMETYPE: 103727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 10383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE"); 103927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 104027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1041197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int uniqueId = data.readInt32(); 1042197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const String8 path = data.readString8(); 1043197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const String8 originalMimeType = getOriginalMimeType(uniqueId, path); 104427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 104527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(originalMimeType); 104627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 104727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 104827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 104927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case GET_DRM_OBJECT_TYPE: 105027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 10513856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE"); 105227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 105327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1054197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int uniqueId = data.readInt32(); 1055197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const String8 path = data.readString8(); 1056197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const String8 mimeType = data.readString8(); 1057197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int drmObjectType = getDrmObjectType(uniqueId, path, mimeType); 105827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 105927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmObjectType); 106027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 106127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 106227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 106327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CHECK_RIGHTS_STATUS: 106427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 10653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS"); 106627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 106727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1068197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int uniqueId = data.readInt32(); 1069197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const String8 path = data.readString8(); 1070197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int action = data.readInt32(); 1071197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int result = checkRightsStatus(uniqueId, path, action); 107227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 107327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(result); 107427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 107527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 107627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 107727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CONSUME_RIGHTS: 107827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 10793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS"); 108027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 108127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 108227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 108327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 108427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 10851da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(&handle, data); 108627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1087197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int action = data.readInt32(); 1088197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const bool reserve = static_cast<bool>(data.readInt32()); 10892272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status 1090197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang = consumeRights(uniqueId, &handle, action, reserve); 10912272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 109227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10931da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(&handle); 109427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 109527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 109627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 109727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case SET_PLAYBACK_STATUS: 109827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 10993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS"); 110027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 110127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 110227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 110327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 110427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 11051da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(&handle, data); 110627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1107197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int playbackStatus = data.readInt32(); 1108197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int64_t position = data.readInt64(); 11092272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status 1110197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang = setPlaybackStatus(uniqueId, &handle, playbackStatus, position); 11112272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 111227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11131da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(&handle); 111427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 111527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 111627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 111727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case VALIDATE_ACTION: 111827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 11193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION"); 112027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 112127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1122197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int uniqueId = data.readInt32(); 1123197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const String8 path = data.readString8(); 1124197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int action = data.readInt32(); 1125197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int outputType = data.readInt32(); 1126197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int configuration = data.readInt32(); 1127197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang bool result = validateAction(uniqueId, path, action, 1128197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang ActionDescription(outputType, configuration)); 112927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 113027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(result); 113127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 113227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 113327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 113427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case REMOVE_RIGHTS: 113527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 11363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS"); 113727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 113827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1139197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang int uniqueId = data.readInt32(); 1140197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang String8 path = data.readString8(); 1141197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const status_t status = removeRights(uniqueId, path); 11422272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 114327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 114427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 114527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 114627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 114727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case REMOVE_ALL_RIGHTS: 114827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 11493856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS"); 115027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 115127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11522272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = removeAllRights(data.readInt32()); 11532272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 115427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 115527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 115627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 115727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 115827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case OPEN_CONVERT_SESSION: 115927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 11603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION"); 116127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 116227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1163197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int uniqueId = data.readInt32(); 1164197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const String8 mimeType = data.readString8(); 1165197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int convertId = openConvertSession(uniqueId, mimeType); 116627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 116727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(convertId); 116827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 116927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 117027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 117127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CONVERT_DATA: 117227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 11733856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :CONVERT_DATA"); 117427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 117527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 117627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 117727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int convertId = data.readInt32(); 117827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 117927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling input data 118027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = data.readInt32(); 118127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize); 118227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 118327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* drmConvertedStatus = convertData(uniqueId, convertId, inputData); 118427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 118527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConvertedStatus) { 118627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Drm Converted Ststus 118727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmConvertedStatus->statusCode); 1188a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang reply->writeInt64(drmConvertedStatus->offset); 118927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 119027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConvertedStatus->convertedData) { 119127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer* convertedData = drmConvertedStatus->convertedData; 119227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = convertedData->length; 119327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize); 119427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 119527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(convertedData->data, bufferSize); 119627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 119727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] convertedData->data; 119827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete convertedData; convertedData = NULL; 119927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 120027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 120127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete inputData; inputData = NULL; 120227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmConvertedStatus; drmConvertedStatus = NULL; 120327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 120427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 120527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 120627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CLOSE_CONVERT_SESSION: 120727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 12083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION"); 120927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 121027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1211197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int uniqueId = data.readInt32(); 1212197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const int convertId = data.readInt32(); 1213197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang DrmConvertedStatus* drmConvertedStatus 1214197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang = closeConvertSession(uniqueId, convertId); 121527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 121627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConvertedStatus) { 121727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Drm Converted Ststus 121827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmConvertedStatus->statusCode); 1219a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang reply->writeInt64(drmConvertedStatus->offset); 122027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 122127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConvertedStatus->convertedData) { 122227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer* convertedData = drmConvertedStatus->convertedData; 122327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = convertedData->length; 122427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize); 122527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 122627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(convertedData->data, bufferSize); 122727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 122827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] convertedData->data; 122927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete convertedData; convertedData = NULL; 123027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 123127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 123227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmConvertedStatus; drmConvertedStatus = NULL; 123327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 123427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 123527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 123627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case GET_ALL_SUPPORT_INFO: 123727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 12383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO"); 123927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 124027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 124127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 124227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int length = 0; 124327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo* drmSupportInfoArray = NULL; 124427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 124527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray); 124627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 124727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(length); 124827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int i = 0; i < length; ++i) { 124927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i]; 125027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 125127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmSupportInfo.getFileSuffixCount()); 125227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo::FileSuffixIterator fileSuffixIt 125327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = drmSupportInfo.getFileSuffixIterator(); 125427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (fileSuffixIt.hasNext()) { 125527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(fileSuffixIt.next()); 125627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 125727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 125827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmSupportInfo.getMimeTypeCount()); 125927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator(); 126027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (mimeTypeIt.hasNext()) { 126127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(mimeTypeIt.next()); 126227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 126327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(drmSupportInfo.getDescription()); 126427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 126527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] drmSupportInfoArray; drmSupportInfoArray = NULL; 126627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 126727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 126827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 126927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 127027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case OPEN_DECRYPT_SESSION: 127127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 12723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION"); 127327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 127427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 127527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 127627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int fd = data.readFileDescriptor(); 127727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1278197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const off64_t offset = data.readInt64(); 1279197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang const off64_t length = data.readInt64(); 12809d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong const String8 mime = data.readString8(); 12819d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 128227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle* handle 12839d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong = openDecryptSession(uniqueId, fd, offset, length, mime.string()); 128427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 128527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != handle) { 1286c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang writeDecryptHandleToParcelData(handle, reply); 12871da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(handle); 12881da9aa606096e14985924e8433a087d04f68ea22Gloria Wang delete handle; handle = NULL; 128927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 129027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 1291e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } 1292e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 1293e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi case OPEN_DECRYPT_SESSION_FROM_URI: 1294e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi { 12953856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI"); 1296e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi CHECK_INTERFACE(IDrmManagerService, data, reply); 1297e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 1298e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi const int uniqueId = data.readInt32(); 1299e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi const String8 uri = data.readString8(); 13009d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong const String8 mime = data.readString8(); 1301e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 13029d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong DecryptHandle* handle = openDecryptSession(uniqueId, uri.string(), mime.string()); 1303e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 1304e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi if (NULL != handle) { 1305c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang writeDecryptHandleToParcelData(handle, reply); 13061da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 13071da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(handle); 13081da9aa606096e14985924e8433a087d04f68ea22Gloria Wang delete handle; handle = NULL; 1309e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } else { 13103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("NULL decryptHandle is returned"); 1311e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } 1312e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi return DRM_NO_ERROR; 131327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 131427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 131527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CLOSE_DECRYPT_SESSION: 131627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 13173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION"); 131827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 131927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 132027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 132127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 132227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle* handle = new DecryptHandle(); 13231da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(handle, data); 132427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13252272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = closeDecryptSession(uniqueId, handle); 13262272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 132727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 132827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 132927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 133027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case INITIALIZE_DECRYPT_UNIT: 133127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 13323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT"); 133327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 133427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 133527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 133627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 133727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 13381da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(&handle, data); 13391da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 134027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int decryptUnitId = data.readInt32(); 134127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 134227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Header info 134327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = data.readInt32(); 134427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* headerInfo = NULL; 134527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize); 134627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13472272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status 13482272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo); 13492272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 135027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13511da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(&handle); 135227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete headerInfo; headerInfo = NULL; 135327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 135427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 135527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 135627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case DECRYPT: 135727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 13583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :DECRYPT"); 135927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 136027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 136127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 136227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 136327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 13641da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(&handle, data); 13651da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 136627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int decryptUnitId = data.readInt32(); 136727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int decBufferSize = data.readInt32(); 136827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 136927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int encBufferSize = data.readInt32(); 137027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* encBuffer 137127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize); 137227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 137327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* buffer = NULL; 137427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi buffer = new char[decBufferSize]; 137527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize); 137627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13772272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi DrmBuffer* IV = NULL; 13782272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi if (0 != data.dataAvail()) { 13792272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const int ivBufferlength = data.readInt32(); 13802272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength); 13812272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 13822272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 13832272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status 13842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi = decrypt(uniqueId, &handle, decryptUnitId, encBuffer, &decBuffer, IV); 138527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 138627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 138727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 138827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = decBuffer->length; 138927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(size); 139027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(decBuffer->data, size); 139127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13921da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(&handle); 139327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete encBuffer; encBuffer = NULL; 139427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete decBuffer; decBuffer = NULL; 139527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] buffer; buffer = NULL; 13962272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi delete IV; IV = NULL; 139727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 139827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 139927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 140027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case FINALIZE_DECRYPT_UNIT: 140127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 14023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT"); 140327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 140427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 140527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 140627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 140727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 14081da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(&handle, data); 140927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14102272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32()); 14112272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 141227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14131da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(&handle); 141427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 141527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 141627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 141727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case PREAD: 141827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 14193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("BnDrmManagerService::onTransact :READ"); 142027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 142127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 142227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 142327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 142427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 14251da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(&handle, data); 142627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 142727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int numBytes = data.readInt32(); 142827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* buffer = new char[numBytes]; 142927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1430a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang const off64_t offset = data.readInt64(); 143127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 143227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ssize_t result = pread(uniqueId, &handle, buffer, numBytes, offset); 143327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(result); 143427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < result) { 143527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(buffer, result); 143627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 143727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14381da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(&handle); 143927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] buffer, buffer = NULL; 144027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 144127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 144227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 144327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi default: 144427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return BBinder::onTransact(code, data, reply, flags); 144527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 144627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 144727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1448