IDrmManagerService.cpp revision 1da9aa606096e14985924e8433a087d04f68ea22
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 401da9aa606096e14985924e8433a087d04f68ea22Gloria Wangstatic void writeDecrptHandleToParcelData( 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); 491da9aa606096e14985924e8433a087d04f68ea22Gloria 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 541da9aa606096e14985924e8433a087d04f68ea22Gloria Wang if (NULL != handle->decryptInfo) { 551da9aa606096e14985924e8433a087d04f68ea22Gloria Wang data->writeInt32(handle->decryptInfo->decryptBufferLength); 561da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } else { 571da9aa606096e14985924e8433a087d04f68ea22Gloria Wang data->writeInt32(INVALID_BUFFER_LENGTH); 581da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } 591da9aa606096e14985924e8433a087d04f68ea22Gloria Wang} 601da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 611da9aa606096e14985924e8433a087d04f68ea22Gloria Wangstatic void readDecryptHandleFromParcelData( 621da9aa606096e14985924e8433a087d04f68ea22Gloria Wang DecryptHandle* handle, const Parcel& data) { 631da9aa606096e14985924e8433a087d04f68ea22Gloria Wang if (0 == data.dataAvail()) { 641da9aa606096e14985924e8433a087d04f68ea22Gloria Wang return; 651da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } 661da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 671da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->decryptId = data.readInt32(); 681da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->mimeType = data.readString8(); 691da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->decryptApiType = data.readInt32(); 701da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->status = data.readInt32(); 711da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 721da9aa606096e14985924e8433a087d04f68ea22Gloria Wang int size = data.readInt32(); 731da9aa606096e14985924e8433a087d04f68ea22Gloria Wang for (int i = 0; i < size; i ++) { 741da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->copyControlVector.add( 751da9aa606096e14985924e8433a087d04f68ea22Gloria Wang (DrmCopyControl)data.readInt32(), data.readInt32()); 761da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } 771da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 781da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->decryptInfo = NULL; 791da9aa606096e14985924e8433a087d04f68ea22Gloria Wang const int bufferLen = data.readInt32(); 801da9aa606096e14985924e8433a087d04f68ea22Gloria Wang if (INVALID_BUFFER_LENGTH != bufferLen) { 811da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->decryptInfo = new DecryptInfo(); 821da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->decryptInfo->decryptBufferLength = bufferLen; 831da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } 841da9aa606096e14985924e8433a087d04f68ea22Gloria Wang} 851da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 861da9aa606096e14985924e8433a087d04f68ea22Gloria Wangstatic void clearDecryptHandle(DecryptHandle* handle) { 871da9aa606096e14985924e8433a087d04f68ea22Gloria Wang if (handle == NULL) { 881da9aa606096e14985924e8433a087d04f68ea22Gloria Wang return; 891da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } 901da9aa606096e14985924e8433a087d04f68ea22Gloria Wang if (handle->decryptInfo) { 911da9aa606096e14985924e8433a087d04f68ea22Gloria Wang delete handle->decryptInfo; 921da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->decryptInfo = NULL; 931da9aa606096e14985924e8433a087d04f68ea22Gloria Wang } 941da9aa606096e14985924e8433a087d04f68ea22Gloria Wang handle->copyControlVector.clear(); 951da9aa606096e14985924e8433a087d04f68ea22Gloria Wang} 961da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 972272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimiint BpDrmManagerService::addUniqueId(int uniqueId) { 982272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi LOGV("add uniqueid"); 992272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi Parcel data, reply; 1002272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 1012272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInt32(uniqueId); 1022272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi remote()->transact(ADD_UNIQUEID, data, &reply); 1032272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 1042272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi} 1052272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 1062272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimivoid BpDrmManagerService::removeUniqueId(int uniqueId) { 1072272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi LOGV("remove uniqueid"); 1082272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi Parcel data, reply; 1092272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 1102272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInt32(uniqueId); 1112272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi remote()->transact(REMOVE_UNIQUEID, data, &reply); 1122272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi} 1132272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 114e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid BpDrmManagerService::addClient(int uniqueId) { 11527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 11627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 11727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 118e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi remote()->transact(ADD_CLIENT, data, &reply); 11927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 12027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 121e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid BpDrmManagerService::removeClient(int uniqueId) { 12227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 12327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 12427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 125e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi remote()->transact(REMOVE_CLIENT, data, &reply); 12627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 12727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 12827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::setDrmServiceListener( 12927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) { 13027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("setDrmServiceListener"); 13127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 13427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 13527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeStrongBinder(drmServiceListener->asBinder()); 13627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(SET_DRM_SERVICE_LISTENER, data, &reply); 13727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 13827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 13927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::installDrmEngine(int uniqueId, const String8& drmEngineFile) { 14127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Install DRM Engine"); 14227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 14327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 14527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 14627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(drmEngineFile); 14727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(INSTALL_DRM_ENGINE, data, &reply); 14927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 15027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 15127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 15227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConstraints* BpDrmManagerService::getConstraints( 15327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8* path, const int action) { 15427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Get Constraints"); 15527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 15727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 15927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(*path); 16027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(action); 16127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(GET_CONSTRAINTS_FROM_CONTENT, data, &reply); 16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConstraints* drmConstraints = NULL; 16527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 16627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Drm Constraints 16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConstraints = new DrmConstraints(); 16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = reply.readInt32(); 17027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < size; ++index) { 17127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key(reply.readString8()); 17227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 17427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 17527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 17627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 17727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 17827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConstraints->put(&key, data); 17927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 18027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 18127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConstraints; 18227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 18327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1843473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi AimiDrmMetadata* BpDrmManagerService::getMetadata(int uniqueId, const String8* path) { 1853473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi LOGV("Get Metadata"); 1863473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi Parcel data, reply; 1873473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 1883473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi data.writeInt32(uniqueId); 1893473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 1903473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi DrmMetadata* drmMetadata = NULL; 1913473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi data.writeString8(*path); 1923473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi remote()->transact(GET_METADATA_FROM_CONTENT, data, &reply); 1933473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 1943473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (0 != reply.dataAvail()) { 1953473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi //Filling Drm Metadata 1963473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi drmMetadata = new DrmMetadata(); 1973473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 1983473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const int size = reply.readInt32(); 1993473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi for (int index = 0; index < size; ++index) { 2003473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const String8 key(reply.readString8()); 2013473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const int bufferSize = reply.readInt32(); 2023473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi char* data = NULL; 2033473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (0 < bufferSize) { 2043473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi data = new char[bufferSize]; 2053473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply.read(data, bufferSize); 2063473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 2073473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi drmMetadata->put(&key, data); 2083473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 2093473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 2103473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi return drmMetadata; 2113473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi} 2123473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 21327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool BpDrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) { 21427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Can Handle"); 21527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 21627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 21727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 21827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 21927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 22027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 22127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(mimeType); 22227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 22327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CAN_HANDLE, data, &reply); 22427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 22527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return static_cast<bool>(reply.readInt32()); 22627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 22727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 22827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) { 22927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Process DRM Info"); 23027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 23127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 23227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 23327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 23427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 23527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM info 23627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(drmInfo->getInfoType()); 23727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer dataBuffer = drmInfo->getData(); 23827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int dataBufferSize = dataBuffer.length; 23927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(dataBufferSize); 24027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < dataBufferSize) { 24127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(dataBuffer.data, dataBufferSize); 24227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 24327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(drmInfo->getMimeType()); 24427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 24527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(drmInfo->getCount()); 24627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo::KeyIterator keyIt = drmInfo->keyIterator(); 24727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 24827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (keyIt.hasNext()) { 24927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key = keyIt.next(); 25027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(key); 25127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value = drmInfo->get(key); 25227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((value == String8("")) ? String8("NULL") : value); 25327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 25427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 25527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(PROCESS_DRM_INFO, data, &reply); 25627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 25727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoStatus* drmInfoStatus = NULL; 25827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 25927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info Status 26027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int statusCode = reply.readInt32(); 261e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi const int infoType = reply.readInt32(); 26227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 mimeType = reply.readString8(); 26327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 26427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* drmBuffer = NULL; 26527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 26627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 26727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 26827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 26927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 27027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 27127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 27227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmBuffer = new DrmBuffer(data, bufferSize); 27327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 274e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi drmInfoStatus = new DrmInfoStatus(statusCode, infoType, drmBuffer, mimeType); 27527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 27627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmInfoStatus; 27727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 27827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 27927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfo* BpDrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) { 28027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Acquire DRM Info"); 28127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 28227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 28327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 28427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 28527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 28627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info Request 28727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(drmInforequest->getInfoType()); 28827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(drmInforequest->getMimeType()); 28927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 29027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(drmInforequest->getCount()); 29127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoRequest::KeyIterator keyIt = drmInforequest->keyIterator(); 29227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 29327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (keyIt.hasNext()) { 29427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key = keyIt.next(); 29527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(key); 29627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value = drmInforequest->get(key); 29727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((value == String8("")) ? String8("NULL") : value); 29827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 29927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 30027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(ACQUIRE_DRM_INFO, data, &reply); 30127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 30227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo* drmInfo = NULL; 30327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 30427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info 30527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int infoType = reply.readInt32(); 30627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 30727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 30827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 30927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 31027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 31127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 31227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 31327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfo = new DrmInfo(infoType, DrmBuffer(data, bufferSize), reply.readString8()); 31427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 31527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = reply.readInt32(); 31627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < size; ++index) { 31727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key(reply.readString8()); 31827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value(reply.readString8()); 31927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfo->put(key, (value == String8("NULL")) ? String8("") : value); 32027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 32127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 32227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmInfo; 32327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 32427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3252272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::saveRights( 32627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const DrmRights& drmRights, 32727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8& rightsPath, const String8& contentPath) { 32827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Save Rights"); 32927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 33027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 33127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 33227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 33327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 33427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Drm Rights 33527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer dataBuffer = drmRights.getData(); 33627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(dataBuffer.length); 33727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(dataBuffer.data, dataBuffer.length); 33827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 33927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 mimeType = drmRights.getMimeType(); 34027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((mimeType == String8("")) ? String8("NULL") : mimeType); 34127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 34227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 accountId = drmRights.getAccountId(); 34327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((accountId == String8("")) ? String8("NULL") : accountId); 34427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 34527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 subscriptionId = drmRights.getSubscriptionId(); 34627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((subscriptionId == String8("")) ? String8("NULL") : subscriptionId); 34727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 34827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((rightsPath == String8("")) ? String8("NULL") : rightsPath); 34927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((contentPath == String8("")) ? String8("NULL") : contentPath); 35027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 35127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(SAVE_RIGHTS, data, &reply); 3522272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 35327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 35427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 35527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 BpDrmManagerService::getOriginalMimeType(int uniqueId, const String8& path) { 35627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Get Original MimeType"); 35727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 35827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 35927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 36027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 36127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 36227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 36327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(GET_ORIGINAL_MIMETYPE, data, &reply); 36427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readString8(); 36527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 36627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 36727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::getDrmObjectType( 36827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, const String8& mimeType) { 36927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Get Drm object type"); 37027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 37127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 37227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 37327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 37427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 37527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(mimeType); 37627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 37727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(GET_DRM_OBJECT_TYPE, data, &reply); 37827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 37927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 38027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 38127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 38227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::checkRightsStatus(int uniqueId, const String8& path, int action) { 38327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("checkRightsStatus"); 38427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 38527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 38627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 38727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 38827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 38927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(action); 39027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 39127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CHECK_RIGHTS_STATUS, data, &reply); 39227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 39327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 39427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 39527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3962272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::consumeRights( 39727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) { 39827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("consumeRights"); 3992272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi Parcel data, reply; 40027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 40127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 40227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 40327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4041da9aa606096e14985924e8433a087d04f68ea22Gloria Wang writeDecrptHandleToParcelData(decryptHandle, &data); 40527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 40627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(action); 40727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(static_cast< int>(reserve)); 40827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 40927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CONSUME_RIGHTS, data, &reply); 4102272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 41127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 41227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4132272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::setPlaybackStatus( 414a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) { 41527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("setPlaybackStatus"); 41627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 41727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 41827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 41927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 42027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4211da9aa606096e14985924e8433a087d04f68ea22Gloria Wang writeDecrptHandleToParcelData(decryptHandle, &data); 42227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 42327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(playbackStatus); 4242ed8a921ef55aa2f3dd4b7ac33b7ded6ec33d92dGloria Wang data.writeInt64(position); 42527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 42627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(SET_PLAYBACK_STATUS, data, &reply); 4272272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 42827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 42927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 43027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool BpDrmManagerService::validateAction( 43127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, 43227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int action, const ActionDescription& description) { 43327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("validateAction"); 43427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 43527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 43627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 43727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 43827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 43927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(action); 44027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(description.outputType); 44127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(description.configuration); 44227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 44327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(VALIDATE_ACTION, data, &reply); 44427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 44527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return static_cast<bool>(reply.readInt32()); 44627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 44727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4482272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::removeRights(int uniqueId, const String8& path) { 44927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("removeRights"); 45027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 45127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 45227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 45327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 45427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 45527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 45627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(REMOVE_RIGHTS, data, &reply); 4572272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 45827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 45927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4602272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::removeAllRights(int uniqueId) { 46127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("removeAllRights"); 46227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 46327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 46427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 46527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 46627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 46727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(REMOVE_ALL_RIGHTS, data, &reply); 4682272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 46927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 47027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 47127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) { 47227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("openConvertSession"); 47327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 47427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 47527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 47627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 47727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(mimeType); 47827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 47927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(OPEN_CONVERT_SESSION, data, &reply); 48027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 48127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 48227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 48327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* BpDrmManagerService::convertData( 48427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int convertId, const DrmBuffer* inputData) { 48527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("convertData"); 48627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 48727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 48827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 48927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 49027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(convertId); 49127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(inputData->length); 49227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(inputData->data, inputData->length); 49327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 49427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CONVERT_DATA, data, &reply); 49527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 49627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* drmConvertedStatus = NULL; 49727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 49827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 49927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Converted Status 50027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int statusCode = reply.readInt32(); 501a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang const off64_t offset = reply.readInt64(); 50227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 50327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* convertedData = NULL; 50427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 50527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 50627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 50727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 50827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 50927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 51027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 51127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi convertedData = new DrmBuffer(data, bufferSize); 51227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 51327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset); 51427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 51527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConvertedStatus; 51627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 51727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 51827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* BpDrmManagerService::closeConvertSession(int uniqueId, int convertId) { 51927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("closeConvertSession"); 52027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 52127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 52227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 52327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 52427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(convertId); 52527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 52627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CLOSE_CONVERT_SESSION, data, &reply); 52727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 52827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* drmConvertedStatus = NULL; 52927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 53027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 53127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Converted Status 53227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int statusCode = reply.readInt32(); 533a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang const off64_t offset = reply.readInt64(); 53427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 53527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* convertedData = NULL; 53627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 53727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 53827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 53927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 54027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 54127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 54227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 54327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi convertedData = new DrmBuffer(data, bufferSize); 54427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 54527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset); 54627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 54727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConvertedStatus; 54827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 54927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 55027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::getAllSupportInfo( 55127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) { 55227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Get All Support Info"); 55327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 55427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 55527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 55627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 55727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 55827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(GET_ALL_SUPPORT_INFO, data, &reply); 55927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 56027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Support Info 56127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int arraySize = reply.readInt32(); 56227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < arraySize) { 56327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *drmSupportInfoArray = new DrmSupportInfo[arraySize]; 56427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 56527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < arraySize; ++index) { 56627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo drmSupportInfo; 56727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 56827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int fileSuffixVectorSize = reply.readInt32(); 56927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int i = 0; i < fileSuffixVectorSize; ++i) { 57027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmSupportInfo.addFileSuffix(reply.readString8()); 57127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 57227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 57327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int mimeTypeVectorSize = reply.readInt32(); 57427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int i = 0; i < mimeTypeVectorSize; ++i) { 57527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmSupportInfo.addMimeType(reply.readString8()); 57627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 57727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 57827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmSupportInfo.setDescription(reply.readString8()); 57927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi (*drmSupportInfoArray)[index] = drmSupportInfo; 58027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 58127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 58227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *length = arraySize; 58327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 58427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 58527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 58627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDecryptHandle* BpDrmManagerService::openDecryptSession( 587a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang int uniqueId, int fd, off64_t offset, off64_t length) { 58827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Entering BpDrmManagerService::openDecryptSession"); 58927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 59027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 591e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 59227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 59327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeFileDescriptor(fd); 594a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang data.writeInt64(offset); 595a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang data.writeInt64(length); 59627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 59727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(OPEN_DECRYPT_SESSION, data, &reply); 59827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 59927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle* handle = NULL; 60027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 60127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle = new DecryptHandle(); 6021da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(handle, reply); 60327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 60427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return handle; 60527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 60627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 607e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi AimiDecryptHandle* BpDrmManagerService::openDecryptSession(int uniqueId, const char* uri) { 608e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi LOGV("Entering BpDrmManagerService::openDecryptSession"); 609e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi Parcel data, reply; 610e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 611e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 612e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi data.writeInt32(uniqueId); 613e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi data.writeString8(String8(uri)); 614e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 615e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi remote()->transact(OPEN_DECRYPT_SESSION_FROM_URI, data, &reply); 616e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 617e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi DecryptHandle* handle = NULL; 618e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi if (0 != reply.dataAvail()) { 619e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi handle = new DecryptHandle(); 6201da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(handle, reply); 621e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } else { 6226b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang LOGV("no decryptHandle is generated in service side"); 623e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } 624e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi return handle; 625e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi} 626e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 6272272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { 62827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("closeDecryptSession"); 62927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 63027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 63127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 63227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 63327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6341da9aa606096e14985924e8433a087d04f68ea22Gloria Wang writeDecrptHandleToParcelData(decryptHandle, &data); 63527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 63627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply); 63727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6382272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 63927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 64027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6412272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::initializeDecryptUnit( 64227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, 64327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int decryptUnitId, const DrmBuffer* headerInfo) { 64427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("initializeDecryptUnit"); 64527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 64627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 64727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 64827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 64927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6501da9aa606096e14985924e8433a087d04f68ea22Gloria Wang writeDecrptHandleToParcelData(decryptHandle, &data); 65127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 65227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptUnitId); 65327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 65427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(headerInfo->length); 65527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(headerInfo->data, headerInfo->length); 65627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 65727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply); 6582272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 65927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 66027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 66127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::decrypt( 66227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, 6632272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { 66427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("decrypt"); 66527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 66627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 66727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 66827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 66927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6701da9aa606096e14985924e8433a087d04f68ea22Gloria Wang writeDecrptHandleToParcelData(decryptHandle, &data); 67127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 67227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptUnitId); 67327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32((*decBuffer)->length); 67427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 67527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(encBuffer->length); 67627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(encBuffer->data, encBuffer->length); 67727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6782272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi if (NULL != IV) { 6792272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInt32(IV->length); 6802272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.write(IV->data, IV->length); 6812272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 6822272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 68327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(DECRYPT, data, &reply); 68427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 68527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const status_t status = reply.readInt32(); 68627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Return value of decrypt() is %d", status); 68727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 68827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = reply.readInt32(); 68927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi (*decBuffer)->length = size; 69027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read((void *)(*decBuffer)->data, size); 69127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 69227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return status; 69327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 69427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6952272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::finalizeDecryptUnit( 69627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { 69727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("finalizeDecryptUnit"); 69827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 69927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 70027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 70127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 70227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7031da9aa606096e14985924e8433a087d04f68ea22Gloria Wang writeDecrptHandleToParcelData(decryptHandle, &data); 70427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 70527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptUnitId); 70627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 70727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply); 7082272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 70927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 71027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 71127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshissize_t BpDrmManagerService::pread( 71227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, void* buffer, 713a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang ssize_t numBytes, off64_t offset) { 71427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("read"); 71527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 71627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int result; 71727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 71827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 71927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 72027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7211da9aa606096e14985924e8433a087d04f68ea22Gloria Wang writeDecrptHandleToParcelData(decryptHandle, &data); 72227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 72327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(numBytes); 724a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang data.writeInt64(offset); 72527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 72627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(PREAD, data, &reply); 72727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi result = reply.readInt32(); 72827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < result) { 72927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(buffer, result); 73027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 73127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return result; 73227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 73327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 73427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiIMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService"); 73527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 73627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BnDrmManagerService::onTransact( 73727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi uint32_t code, const Parcel& data, 73827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel* reply, uint32_t flags) { 73927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Entering BnDrmManagerService::onTransact with code %d", code); 74027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 74127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi switch (code) { 7422272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi case ADD_UNIQUEID: 7432272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi { 7442272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi LOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID"); 7452272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi CHECK_INTERFACE(IDrmManagerService, data, reply); 7462272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi int uniqueId = addUniqueId(data.readInt32()); 7472272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(uniqueId); 7482272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return DRM_NO_ERROR; 7492272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 7502272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 7512272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi case REMOVE_UNIQUEID: 7522272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi { 7532272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi LOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID"); 7542272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi CHECK_INTERFACE(IDrmManagerService, data, reply); 7552272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi removeUniqueId(data.readInt32()); 7562272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return DRM_NO_ERROR; 7572272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 7582272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 759e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi case ADD_CLIENT: 76027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 761e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi LOGV("BnDrmManagerService::onTransact :ADD_CLIENT"); 76227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 763e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi addClient(data.readInt32()); 76427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 76527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 76627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 767e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi case REMOVE_CLIENT: 76827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 769e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi LOGV("BnDrmManagerService::onTransact :REMOVE_CLIENT"); 77027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 771e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi removeClient(data.readInt32()); 77227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 77327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 77427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 77527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case SET_DRM_SERVICE_LISTENER: 77627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 77727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER"); 77827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 77927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 78027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 78127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const sp<IDrmServiceListener> drmServiceListener 78227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = interface_cast<IDrmServiceListener> (data.readStrongBinder()); 78327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 78427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = setDrmServiceListener(uniqueId, drmServiceListener); 78527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 78627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 78727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 78827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 78927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 79027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case INSTALL_DRM_ENGINE: 79127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 79227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :INSTALL_DRM_ENGINE"); 79327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 79427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 79527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = installDrmEngine(data.readInt32(), data.readString8()); 79627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 79727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 79827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 79927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 80027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 80127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case GET_CONSTRAINTS_FROM_CONTENT: 80227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 80327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT"); 80427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 80527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 80627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 80727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 path = data.readString8(); 80827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 80927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConstraints* drmConstraints = getConstraints(uniqueId, &path, data.readInt32()); 81027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 81127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConstraints) { 81227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Constraints contents 81327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmConstraints->getCount()); 81427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 81527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator(); 81627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (keyIt.hasNext()) { 81727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key = keyIt.next(); 81827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(key); 81927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const char* value = drmConstraints->getAsByteArray(&key); 82027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int bufferSize = 0; 82127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != value) { 82227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bufferSize = strlen(value); 82327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 82427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize + 1); 82527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(value, bufferSize + 1); 82627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 82727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 82827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmConstraints; drmConstraints = NULL; 82927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 83027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 83127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 8323473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi case GET_METADATA_FROM_CONTENT: 8333473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi { 8343473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi LOGV("BnDrmManagerService::onTransact :GET_METADATA_FROM_CONTENT"); 8353473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi CHECK_INTERFACE(IDrmManagerService, data, reply); 8363473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 8373473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const int uniqueId = data.readInt32(); 8383473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const String8 path = data.readString8(); 8393473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 8403473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi DrmMetadata* drmMetadata = getMetadata(uniqueId, &path); 8413473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (NULL != drmMetadata) { 8423473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi //Filling DRM Metadata contents 8433473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply->writeInt32(drmMetadata->getCount()); 8443473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 8453473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi DrmMetadata::KeyIterator keyIt = drmMetadata->keyIterator(); 8463473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi while (keyIt.hasNext()) { 8473473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const String8 key = keyIt.next(); 8483473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply->writeString8(key); 8493473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const char* value = drmMetadata->getAsByteArray(&key); 8503473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi int bufferSize = 0; 8513473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (NULL != value) { 8523473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi bufferSize = strlen(value); 8533473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply->writeInt32(bufferSize + 1); 8543473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply->write(value, bufferSize + 1); 8553473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } else { 8563473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply->writeInt32(0); 8573473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 8583473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 8593473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 8603473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi delete drmMetadata; drmMetadata = NULL; 8613473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi return NO_ERROR; 8623473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 8633473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 86427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CAN_HANDLE: 86527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 86627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :CAN_HANDLE"); 86727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 86827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 86927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 87027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 path = data.readString8(); 87127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 mimeType = data.readString8(); 87227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 87327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bool result = canHandle(uniqueId, path, mimeType); 87427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 87527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(result); 87627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 87727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 87827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 87927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case PROCESS_DRM_INFO: 88027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 88127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO"); 88227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 88327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 88427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 88527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 88627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM info 88727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int infoType = data.readInt32(); 88827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = data.readInt32(); 88927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* buffer = NULL; 89027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 89127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi buffer = (char *)data.readInplace(bufferSize); 89227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 89327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer drmBuffer(buffer, bufferSize); 89427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8()); 89527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 89627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = data.readInt32(); 89727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < size; ++index) { 89827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key(data.readString8()); 89927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value(data.readString8()); 90027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfo->put(key, (value == String8("NULL")) ? String8("") : value); 90127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 90227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 90327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo); 90427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 90527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfoStatus) { 90627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info Status contents 90727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmInfoStatus->statusCode); 908e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi reply->writeInt32(drmInfoStatus->infoType); 90927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(drmInfoStatus->mimeType); 91027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 91127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfoStatus->drmBuffer) { 91227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer; 91327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = drmBuffer->length; 91427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize); 91527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 91627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(drmBuffer->data, bufferSize); 91727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 91827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] drmBuffer->data; 91927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmBuffer; drmBuffer = NULL; 92027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 92127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 92227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmInfo; drmInfo = NULL; 92327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmInfoStatus; drmInfoStatus = NULL; 92427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 92527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 92627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 92727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case ACQUIRE_DRM_INFO: 92827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 92927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO"); 93027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 93127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 93227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 93327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 93427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM info Request 93527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(data.readInt32(), data.readString8()); 93627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 93727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = data.readInt32(); 93827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < size; ++index) { 93927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key(data.readString8()); 94027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value(data.readString8()); 94127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value); 94227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 94327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 94427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest); 94527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 94627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfo) { 94727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info 94827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer drmBuffer = drmInfo->getData(); 94927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmInfo->getInfoType()); 95027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 95127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = drmBuffer.length; 95227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize); 95327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 95427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(drmBuffer.data, bufferSize); 95527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 95627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(drmInfo->getMimeType()); 95727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmInfo->getCount()); 95827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 95927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo::KeyIterator keyIt = drmInfo->keyIterator(); 96027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (keyIt.hasNext()) { 96127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key = keyIt.next(); 96227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(key); 96327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value = drmInfo->get(key); 96427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8((value == String8("")) ? String8("NULL") : value); 96527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 96627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] drmBuffer.data; 96727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 96827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmInfoRequest; drmInfoRequest = NULL; 96927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmInfo; drmInfo = NULL; 97027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 97127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 97227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 97327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case SAVE_RIGHTS: 97427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 97527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS"); 97627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 97727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 97827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 97927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 98027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Rights 98127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = data.readInt32(); 98227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize); 98327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 98427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 mimeType(data.readString8()); 98527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 accountId(data.readString8()); 98627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 subscriptionId(data.readString8()); 98727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 rightsPath(data.readString8()); 98827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 contentPath(data.readString8()); 98927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 99027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmRights drmRights(drmBuffer, 99127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((mimeType == String8("NULL")) ? String8("") : mimeType), 99227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((accountId == String8("NULL")) ? String8("") : accountId), 99327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId)); 99427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9952272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = saveRights(uniqueId, drmRights, 99627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((rightsPath == String8("NULL")) ? String8("") : rightsPath), 99727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((contentPath == String8("NULL")) ? String8("") : contentPath)); 99827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9992272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 100027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 100127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 100227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 100327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case GET_ORIGINAL_MIMETYPE: 100427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 100527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE"); 100627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 100727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 100827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 originalMimeType = getOriginalMimeType(data.readInt32(), data.readString8()); 100927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 101027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(originalMimeType); 101127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 101227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 101327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 101427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case GET_DRM_OBJECT_TYPE: 101527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 101627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE"); 101727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 101827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 101927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int drmObjectType 102027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = getDrmObjectType(data.readInt32(), data.readString8(), data.readString8()); 102127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 102227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmObjectType); 102327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 102427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 102527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 102627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CHECK_RIGHTS_STATUS: 102727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 102827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS"); 102927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 103027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 103127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int result 103227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = checkRightsStatus(data.readInt32(), data.readString8(), data.readInt32()); 103327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 103427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(result); 103527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 103627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 103727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 103827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CONSUME_RIGHTS: 103927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 104027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS"); 104127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 104227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 104327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 104427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 104527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 10461da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(&handle, data); 104727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10482272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status 10492272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi = consumeRights(uniqueId, &handle, data.readInt32(), 10502272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi static_cast<bool>(data.readInt32())); 10512272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 105227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10531da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(&handle); 105427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 105527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 105627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 105727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case SET_PLAYBACK_STATUS: 105827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 105927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS"); 106027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 106127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 106227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 106327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 106427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 10651da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(&handle, data); 106627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10672272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status 10682ed8a921ef55aa2f3dd4b7ac33b7ded6ec33d92dGloria Wang = setPlaybackStatus(uniqueId, &handle, data.readInt32(), data.readInt64()); 10692272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 107027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10711da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(&handle); 107227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 107327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 107427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 107527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case VALIDATE_ACTION: 107627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 107727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION"); 107827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 107927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 108027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bool result = validateAction( 108127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.readInt32(), 108227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.readString8(), 108327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.readInt32(), 108427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ActionDescription(data.readInt32(), data.readInt32())); 108527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 108627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(result); 108727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 108827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 108927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 109027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case REMOVE_RIGHTS: 109127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 109227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS"); 109327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 109427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10952272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = removeRights(data.readInt32(), data.readString8()); 10962272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 109727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 109827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 109927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 110027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 110127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case REMOVE_ALL_RIGHTS: 110227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 110327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS"); 110427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 110527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11062272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = removeAllRights(data.readInt32()); 11072272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 110827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 110927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 111027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 111127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 111227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case OPEN_CONVERT_SESSION: 111327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 111427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION"); 111527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 111627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 111727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int convertId = openConvertSession(data.readInt32(), data.readString8()); 111827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 111927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(convertId); 112027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 112127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 112227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 112327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CONVERT_DATA: 112427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 112527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :CONVERT_DATA"); 112627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 112727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 112827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 112927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int convertId = data.readInt32(); 113027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 113127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling input data 113227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = data.readInt32(); 113327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize); 113427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 113527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* drmConvertedStatus = convertData(uniqueId, convertId, inputData); 113627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 113727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConvertedStatus) { 113827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Drm Converted Ststus 113927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmConvertedStatus->statusCode); 1140a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang reply->writeInt64(drmConvertedStatus->offset); 114127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 114227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConvertedStatus->convertedData) { 114327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer* convertedData = drmConvertedStatus->convertedData; 114427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = convertedData->length; 114527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize); 114627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 114727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(convertedData->data, bufferSize); 114827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 114927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] convertedData->data; 115027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete convertedData; convertedData = NULL; 115127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 115227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 115327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete inputData; inputData = NULL; 115427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmConvertedStatus; drmConvertedStatus = NULL; 115527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 115627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 115727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 115827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CLOSE_CONVERT_SESSION: 115927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 116027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION"); 116127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 116227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 116327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* drmConvertedStatus 116427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = closeConvertSession(data.readInt32(), data.readInt32()); 116527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 116627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConvertedStatus) { 116727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Drm Converted Ststus 116827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmConvertedStatus->statusCode); 1169a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang reply->writeInt64(drmConvertedStatus->offset); 117027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 117127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConvertedStatus->convertedData) { 117227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer* convertedData = drmConvertedStatus->convertedData; 117327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = convertedData->length; 117427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize); 117527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 117627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(convertedData->data, bufferSize); 117727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 117827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] convertedData->data; 117927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete convertedData; convertedData = NULL; 118027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 118127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 118227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmConvertedStatus; drmConvertedStatus = NULL; 118327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 118427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 118527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 118627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case GET_ALL_SUPPORT_INFO: 118727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 118827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO"); 118927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 119027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 119127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 119227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int length = 0; 119327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo* drmSupportInfoArray = NULL; 119427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 119527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray); 119627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 119727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(length); 119827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int i = 0; i < length; ++i) { 119927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i]; 120027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 120127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmSupportInfo.getFileSuffixCount()); 120227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo::FileSuffixIterator fileSuffixIt 120327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = drmSupportInfo.getFileSuffixIterator(); 120427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (fileSuffixIt.hasNext()) { 120527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(fileSuffixIt.next()); 120627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 120727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 120827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmSupportInfo.getMimeTypeCount()); 120927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator(); 121027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (mimeTypeIt.hasNext()) { 121127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(mimeTypeIt.next()); 121227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 121327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(drmSupportInfo.getDescription()); 121427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 121527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] drmSupportInfoArray; drmSupportInfoArray = NULL; 121627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 121727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 121827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 121927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 122027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case OPEN_DECRYPT_SESSION: 122127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 122227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION"); 122327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 122427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 122527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 122627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int fd = data.readFileDescriptor(); 122727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 122827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle* handle 1229a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang = openDecryptSession(uniqueId, fd, data.readInt64(), data.readInt64()); 123027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 123127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != handle) { 12321da9aa606096e14985924e8433a087d04f68ea22Gloria Wang writeDecrptHandleToParcelData(handle, reply); 12331da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(handle); 12341da9aa606096e14985924e8433a087d04f68ea22Gloria Wang delete handle; handle = NULL; 123527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 123627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 1237e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } 1238e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 1239e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi case OPEN_DECRYPT_SESSION_FROM_URI: 1240e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi { 1241e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi LOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI"); 1242e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi CHECK_INTERFACE(IDrmManagerService, data, reply); 1243e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 1244e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi const int uniqueId = data.readInt32(); 1245e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi const String8 uri = data.readString8(); 1246e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 1247e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi DecryptHandle* handle = openDecryptSession(uniqueId, uri.string()); 1248e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 1249e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi if (NULL != handle) { 12501da9aa606096e14985924e8433a087d04f68ea22Gloria Wang writeDecrptHandleToParcelData(handle, reply); 12511da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 12521da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(handle); 12531da9aa606096e14985924e8433a087d04f68ea22Gloria Wang delete handle; handle = NULL; 1254e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } else { 12556b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang LOGV("NULL decryptHandle is returned"); 1256e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } 1257e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi return DRM_NO_ERROR; 125827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 125927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 126027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CLOSE_DECRYPT_SESSION: 126127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 126227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION"); 126327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 126427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 126527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 126627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 126727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle* handle = new DecryptHandle(); 12681da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(handle, data); 126927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 12702272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = closeDecryptSession(uniqueId, handle); 12712272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 127227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 127327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 127427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 127527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case INITIALIZE_DECRYPT_UNIT: 127627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 127727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT"); 127827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 127927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 128027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 128127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 128227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 12831da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(&handle, data); 12841da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 128527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int decryptUnitId = data.readInt32(); 128627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 128727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Header info 128827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = data.readInt32(); 128927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* headerInfo = NULL; 129027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize); 129127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 12922272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status 12932272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo); 12942272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 129527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 12961da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(&handle); 129727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete headerInfo; headerInfo = NULL; 129827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 129927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 130027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 130127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case DECRYPT: 130227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 130327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :DECRYPT"); 130427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 130527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 130627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 130727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 130827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 13091da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(&handle, data); 13101da9aa606096e14985924e8433a087d04f68ea22Gloria Wang 131127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int decryptUnitId = data.readInt32(); 131227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int decBufferSize = data.readInt32(); 131327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 131427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int encBufferSize = data.readInt32(); 131527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* encBuffer 131627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize); 131727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 131827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* buffer = NULL; 131927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi buffer = new char[decBufferSize]; 132027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize); 132127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13222272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi DrmBuffer* IV = NULL; 13232272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi if (0 != data.dataAvail()) { 13242272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const int ivBufferlength = data.readInt32(); 13252272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength); 13262272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 13272272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 13282272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status 13292272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi = decrypt(uniqueId, &handle, decryptUnitId, encBuffer, &decBuffer, IV); 133027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 133127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 133227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 133327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = decBuffer->length; 133427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(size); 133527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(decBuffer->data, size); 133627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13371da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(&handle); 133827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete encBuffer; encBuffer = NULL; 133927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete decBuffer; decBuffer = NULL; 134027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] buffer; buffer = NULL; 13412272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi delete IV; IV = NULL; 134227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 134327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 134427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 134527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case FINALIZE_DECRYPT_UNIT: 134627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 134727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT"); 134827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 134927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 135027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 135127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 135227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 13531da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(&handle, data); 135427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13552272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32()); 13562272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 135727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13581da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(&handle); 135927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 136027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 136127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 136227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case PREAD: 136327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 136427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :READ"); 136527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 136627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 136727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 136827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 136927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 13701da9aa606096e14985924e8433a087d04f68ea22Gloria Wang readDecryptHandleFromParcelData(&handle, data); 137127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 137227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int numBytes = data.readInt32(); 137327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* buffer = new char[numBytes]; 137427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1375a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang const off64_t offset = data.readInt64(); 137627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 137727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ssize_t result = pread(uniqueId, &handle, buffer, numBytes, offset); 137827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(result); 137927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < result) { 138027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(buffer, result); 138127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 138227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13831da9aa606096e14985924e8433a087d04f68ea22Gloria Wang clearDecryptHandle(&handle); 138427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] buffer, buffer = NULL; 138527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 138627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 138727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 138827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi default: 138927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return BBinder::onTransact(code, data, reply, flags); 139027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 139127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 139227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1393