IDrmManagerService.cpp revision 2ed8a921ef55aa2f3dd4b7ac33b7ded6ec33d92d
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 402272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimiint BpDrmManagerService::addUniqueId(int uniqueId) { 412272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi LOGV("add uniqueid"); 422272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi Parcel data, reply; 432272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 442272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInt32(uniqueId); 452272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi remote()->transact(ADD_UNIQUEID, data, &reply); 462272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 472272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi} 482272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 492272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimivoid BpDrmManagerService::removeUniqueId(int uniqueId) { 502272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi LOGV("remove uniqueid"); 512272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi Parcel data, reply; 522272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 532272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInt32(uniqueId); 542272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi remote()->transact(REMOVE_UNIQUEID, data, &reply); 552272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi} 562272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 57e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid BpDrmManagerService::addClient(int uniqueId) { 5827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 5927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 6027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 61e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi remote()->transact(ADD_CLIENT, data, &reply); 6227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 6327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 64e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid BpDrmManagerService::removeClient(int uniqueId) { 6527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 6627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 6727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 68e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi remote()->transact(REMOVE_CLIENT, data, &reply); 6927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 7027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::setDrmServiceListener( 7227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) { 7327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("setDrmServiceListener"); 7427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 7527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 7727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 7827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeStrongBinder(drmServiceListener->asBinder()); 7927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(SET_DRM_SERVICE_LISTENER, data, &reply); 8027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 8127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 8227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 8327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::installDrmEngine(int uniqueId, const String8& drmEngineFile) { 8427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Install DRM Engine"); 8527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 8627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 8727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 8827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 8927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(drmEngineFile); 9027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(INSTALL_DRM_ENGINE, data, &reply); 9227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 9327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 9427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConstraints* BpDrmManagerService::getConstraints( 9627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8* path, const int action) { 9727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Get Constraints"); 9827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 9927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 10127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 10227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(*path); 10327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(action); 10427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(GET_CONSTRAINTS_FROM_CONTENT, data, &reply); 10627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConstraints* drmConstraints = NULL; 10827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 10927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Drm Constraints 11027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConstraints = new DrmConstraints(); 11127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = reply.readInt32(); 11327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < size; ++index) { 11427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key(reply.readString8()); 11527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 11627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 11727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 11827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 11927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 12027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 12127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConstraints->put(&key, data); 12227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 12327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 12427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConstraints; 12527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 12627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1273473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi AimiDrmMetadata* BpDrmManagerService::getMetadata(int uniqueId, const String8* path) { 1283473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi LOGV("Get Metadata"); 1293473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi Parcel data, reply; 1303473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 1313473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi data.writeInt32(uniqueId); 1323473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 1333473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi DrmMetadata* drmMetadata = NULL; 1343473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi data.writeString8(*path); 1353473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi remote()->transact(GET_METADATA_FROM_CONTENT, data, &reply); 1363473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 1373473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (0 != reply.dataAvail()) { 1383473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi //Filling Drm Metadata 1393473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi drmMetadata = new DrmMetadata(); 1403473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 1413473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const int size = reply.readInt32(); 1423473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi for (int index = 0; index < size; ++index) { 1433473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const String8 key(reply.readString8()); 1443473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const int bufferSize = reply.readInt32(); 1453473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi char* data = NULL; 1463473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (0 < bufferSize) { 1473473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi data = new char[bufferSize]; 1483473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply.read(data, bufferSize); 1493473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 1503473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi drmMetadata->put(&key, data); 1513473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 1523473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 1533473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi return drmMetadata; 1543473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi} 1553473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool BpDrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) { 15727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Can Handle"); 15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 15927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 16127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 16427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(mimeType); 16527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CAN_HANDLE, data, &reply); 16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return static_cast<bool>(reply.readInt32()); 16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 17027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 17127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) { 17227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Process DRM Info"); 17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 17427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 17527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 17627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 17727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 17827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM info 17927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(drmInfo->getInfoType()); 18027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer dataBuffer = drmInfo->getData(); 18127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int dataBufferSize = dataBuffer.length; 18227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(dataBufferSize); 18327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < dataBufferSize) { 18427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(dataBuffer.data, dataBufferSize); 18527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 18627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(drmInfo->getMimeType()); 18727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 18827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(drmInfo->getCount()); 18927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo::KeyIterator keyIt = drmInfo->keyIterator(); 19027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 19127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (keyIt.hasNext()) { 19227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key = keyIt.next(); 19327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(key); 19427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value = drmInfo->get(key); 19527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((value == String8("")) ? String8("NULL") : value); 19627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 19727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 19827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(PROCESS_DRM_INFO, data, &reply); 19927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 20027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoStatus* drmInfoStatus = NULL; 20127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 20227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info Status 20327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int statusCode = reply.readInt32(); 204e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi const int infoType = reply.readInt32(); 20527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 mimeType = reply.readString8(); 20627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 20727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* drmBuffer = NULL; 20827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 20927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 21027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 21127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 21227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 21327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 21427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 21527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmBuffer = new DrmBuffer(data, bufferSize); 21627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 217e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi drmInfoStatus = new DrmInfoStatus(statusCode, infoType, drmBuffer, mimeType); 21827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 21927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmInfoStatus; 22027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 22127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 22227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfo* BpDrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) { 22327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Acquire DRM Info"); 22427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 22527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 22627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 22727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 22827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 22927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info Request 23027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(drmInforequest->getInfoType()); 23127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(drmInforequest->getMimeType()); 23227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 23327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(drmInforequest->getCount()); 23427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoRequest::KeyIterator keyIt = drmInforequest->keyIterator(); 23527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 23627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (keyIt.hasNext()) { 23727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key = keyIt.next(); 23827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(key); 23927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value = drmInforequest->get(key); 24027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((value == String8("")) ? String8("NULL") : value); 24127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 24227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 24327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(ACQUIRE_DRM_INFO, data, &reply); 24427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 24527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo* drmInfo = NULL; 24627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 24727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info 24827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int infoType = reply.readInt32(); 24927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 25027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 25127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 25227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 25327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 25427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 25527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 25627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfo = new DrmInfo(infoType, DrmBuffer(data, bufferSize), reply.readString8()); 25727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 25827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = reply.readInt32(); 25927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < size; ++index) { 26027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key(reply.readString8()); 26127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value(reply.readString8()); 26227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfo->put(key, (value == String8("NULL")) ? String8("") : value); 26327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 26427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 26527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmInfo; 26627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 26727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2682272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::saveRights( 26927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const DrmRights& drmRights, 27027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8& rightsPath, const String8& contentPath) { 27127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Save Rights"); 27227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 27327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 27427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 27527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 27627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 27727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Drm Rights 27827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer dataBuffer = drmRights.getData(); 27927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(dataBuffer.length); 28027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(dataBuffer.data, dataBuffer.length); 28127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 28227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 mimeType = drmRights.getMimeType(); 28327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((mimeType == String8("")) ? String8("NULL") : mimeType); 28427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 28527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 accountId = drmRights.getAccountId(); 28627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((accountId == String8("")) ? String8("NULL") : accountId); 28727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 28827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 subscriptionId = drmRights.getSubscriptionId(); 28927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((subscriptionId == String8("")) ? String8("NULL") : subscriptionId); 29027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 29127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((rightsPath == String8("")) ? String8("NULL") : rightsPath); 29227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((contentPath == String8("")) ? String8("NULL") : contentPath); 29327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 29427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(SAVE_RIGHTS, data, &reply); 2952272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 29627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 29727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 29827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 BpDrmManagerService::getOriginalMimeType(int uniqueId, const String8& path) { 29927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Get Original MimeType"); 30027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 30127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 30227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 30327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 30427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 30527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 30627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(GET_ORIGINAL_MIMETYPE, data, &reply); 30727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readString8(); 30827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 30927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 31027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::getDrmObjectType( 31127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, const String8& mimeType) { 31227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Get Drm object type"); 31327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 31427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 31527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 31627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 31727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 31827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(mimeType); 31927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 32027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(GET_DRM_OBJECT_TYPE, data, &reply); 32127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 32227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 32327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 32427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 32527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::checkRightsStatus(int uniqueId, const String8& path, int action) { 32627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("checkRightsStatus"); 32727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 32827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 32927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 33027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 33127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 33227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(action); 33327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 33427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CHECK_RIGHTS_STATUS, data, &reply); 33527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 33627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 33727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 33827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3392272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::consumeRights( 34027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) { 34127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("consumeRights"); 3422272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi Parcel data, reply; 34327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 34427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 34527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 34627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 34727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptId); 34827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(decryptHandle->mimeType); 34927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptApiType); 35027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->status); 35127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 35227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle->decryptInfo) { 35327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength); 35427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 35527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(INVALID_BUFFER_LENGTH); 35627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 35727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 35827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(action); 35927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(static_cast< int>(reserve)); 36027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 36127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CONSUME_RIGHTS, data, &reply); 3622272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 36327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 36427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3652272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::setPlaybackStatus( 366a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) { 36727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("setPlaybackStatus"); 36827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 36927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 37027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 37127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 37227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 37327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptId); 37427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(decryptHandle->mimeType); 37527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptApiType); 37627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->status); 37727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 37827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle->decryptInfo) { 37927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength); 38027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 38127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(INVALID_BUFFER_LENGTH); 38227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 38327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 38427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(playbackStatus); 3852ed8a921ef55aa2f3dd4b7ac33b7ded6ec33d92dGloria Wang data.writeInt64(position); 38627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 38727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(SET_PLAYBACK_STATUS, data, &reply); 3882272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 38927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 39027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 39127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool BpDrmManagerService::validateAction( 39227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, 39327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int action, const ActionDescription& description) { 39427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("validateAction"); 39527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 39627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 39727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 39827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 39927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 40027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(action); 40127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(description.outputType); 40227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(description.configuration); 40327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 40427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(VALIDATE_ACTION, data, &reply); 40527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 40627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return static_cast<bool>(reply.readInt32()); 40727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 40827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4092272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::removeRights(int uniqueId, const String8& path) { 41027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("removeRights"); 41127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 41227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 41327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 41427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 41527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 41627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 41727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(REMOVE_RIGHTS, data, &reply); 4182272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 41927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 42027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4212272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::removeAllRights(int uniqueId) { 42227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("removeAllRights"); 42327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 42427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 42527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 42627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 42727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 42827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(REMOVE_ALL_RIGHTS, data, &reply); 4292272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 43027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 43127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 43227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) { 43327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("openConvertSession"); 43427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 43527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 43627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 43727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 43827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(mimeType); 43927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 44027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(OPEN_CONVERT_SESSION, data, &reply); 44127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 44227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 44327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 44427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* BpDrmManagerService::convertData( 44527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int convertId, const DrmBuffer* inputData) { 44627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("convertData"); 44727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 44827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 44927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 45027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 45127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(convertId); 45227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(inputData->length); 45327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(inputData->data, inputData->length); 45427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 45527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CONVERT_DATA, data, &reply); 45627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 45727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* drmConvertedStatus = NULL; 45827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 45927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 46027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Converted Status 46127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int statusCode = reply.readInt32(); 462a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang const off64_t offset = reply.readInt64(); 46327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 46427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* convertedData = NULL; 46527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 46627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 46727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 46827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 46927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 47027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 47127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 47227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi convertedData = new DrmBuffer(data, bufferSize); 47327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 47427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset); 47527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 47627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConvertedStatus; 47727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 47827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 47927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* BpDrmManagerService::closeConvertSession(int uniqueId, int convertId) { 48027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("closeConvertSession"); 48127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 48227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 48327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 48427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 48527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(convertId); 48627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 48727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CLOSE_CONVERT_SESSION, data, &reply); 48827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 48927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* drmConvertedStatus = NULL; 49027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 49127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 49227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Converted Status 49327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int statusCode = reply.readInt32(); 494a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang const off64_t offset = reply.readInt64(); 49527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 49627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* convertedData = NULL; 49727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 49827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 49927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 50027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 50127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 50227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 50327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 50427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi convertedData = new DrmBuffer(data, bufferSize); 50527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 50627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset); 50727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 50827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConvertedStatus; 50927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 51027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 51127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::getAllSupportInfo( 51227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) { 51327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Get All Support Info"); 51427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 51527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 51627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 51727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 51827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 51927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(GET_ALL_SUPPORT_INFO, data, &reply); 52027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 52127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Support Info 52227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int arraySize = reply.readInt32(); 52327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < arraySize) { 52427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *drmSupportInfoArray = new DrmSupportInfo[arraySize]; 52527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 52627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < arraySize; ++index) { 52727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo drmSupportInfo; 52827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 52927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int fileSuffixVectorSize = reply.readInt32(); 53027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int i = 0; i < fileSuffixVectorSize; ++i) { 53127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmSupportInfo.addFileSuffix(reply.readString8()); 53227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 53327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 53427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int mimeTypeVectorSize = reply.readInt32(); 53527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int i = 0; i < mimeTypeVectorSize; ++i) { 53627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmSupportInfo.addMimeType(reply.readString8()); 53727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 53827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 53927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmSupportInfo.setDescription(reply.readString8()); 54027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi (*drmSupportInfoArray)[index] = drmSupportInfo; 54127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 54227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 54327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *length = arraySize; 54427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 54527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 54627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 54727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDecryptHandle* BpDrmManagerService::openDecryptSession( 548a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang int uniqueId, int fd, off64_t offset, off64_t length) { 54927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Entering BpDrmManagerService::openDecryptSession"); 55027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 55127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 552e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 55327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 55427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeFileDescriptor(fd); 555a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang data.writeInt64(offset); 556a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang data.writeInt64(length); 55727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 55827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(OPEN_DECRYPT_SESSION, data, &reply); 55927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 56027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle* handle = NULL; 56127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 56227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle = new DecryptHandle(); 56327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptId = reply.readInt32(); 56427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->mimeType = reply.readString8(); 56527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptApiType = reply.readInt32(); 56627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->status = reply.readInt32(); 56727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptInfo = NULL; 56827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 56927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptInfo = new DecryptInfo(); 57027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptInfo->decryptBufferLength = reply.readInt32(); 57127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 57227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 57327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return handle; 57427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 57527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 576e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi AimiDecryptHandle* BpDrmManagerService::openDecryptSession(int uniqueId, const char* uri) { 577e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi LOGV("Entering BpDrmManagerService::openDecryptSession"); 578e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi Parcel data, reply; 579e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 580e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 581e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi data.writeInt32(uniqueId); 582e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi data.writeString8(String8(uri)); 583e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 584e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi remote()->transact(OPEN_DECRYPT_SESSION_FROM_URI, data, &reply); 585e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 586e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi DecryptHandle* handle = NULL; 587e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi if (0 != reply.dataAvail()) { 588e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi handle = new DecryptHandle(); 589e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi handle->decryptId = reply.readInt32(); 590e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi handle->mimeType = reply.readString8(); 591e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi handle->decryptApiType = reply.readInt32(); 592e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi handle->status = reply.readInt32(); 593e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi handle->decryptInfo = NULL; 594e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi if (0 != reply.dataAvail()) { 595e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi handle->decryptInfo = new DecryptInfo(); 596e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi handle->decryptInfo->decryptBufferLength = reply.readInt32(); 597e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } 598e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } else { 599e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi LOGE("no decryptHandle is generated in service side"); 600e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } 601e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi return handle; 602e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi} 603e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 6042272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { 60527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("closeDecryptSession"); 60627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 60727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 60827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 60927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 61027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 61127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptId); 61227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(decryptHandle->mimeType); 61327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptApiType); 61427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->status); 61527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 61627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle->decryptInfo) { 61727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength); 61827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 61927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(INVALID_BUFFER_LENGTH); 62027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 62127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 62227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply); 62327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 62427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle->decryptInfo) { 62527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("deleting decryptInfo"); 62627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete decryptHandle->decryptInfo; decryptHandle->decryptInfo = NULL; 62727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 62827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete decryptHandle; decryptHandle = NULL; 6292272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 63027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 63127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6322272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::initializeDecryptUnit( 63327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, 63427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int decryptUnitId, const DrmBuffer* headerInfo) { 63527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("initializeDecryptUnit"); 63627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 63727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 63827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 63927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 64027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 64127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptId); 64227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(decryptHandle->mimeType); 64327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptApiType); 64427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->status); 64527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 64627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle->decryptInfo) { 64727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength); 64827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 64927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(INVALID_BUFFER_LENGTH); 65027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 65127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptUnitId); 65227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 65327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(headerInfo->length); 65427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(headerInfo->data, headerInfo->length); 65527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 65627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply); 6572272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 65827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 65927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 66027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::decrypt( 66127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, 6622272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { 66327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("decrypt"); 66427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 66527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 66627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 66727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 66827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 66927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptId); 67027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(decryptHandle->mimeType); 67127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptApiType); 67227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->status); 67327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 67427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle->decryptInfo) { 67527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength); 67627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 67727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(INVALID_BUFFER_LENGTH); 67827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 67927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 68027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptUnitId); 68127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32((*decBuffer)->length); 68227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 68327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(encBuffer->length); 68427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(encBuffer->data, encBuffer->length); 68527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6862272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi if (NULL != IV) { 6872272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInt32(IV->length); 6882272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.write(IV->data, IV->length); 6892272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 6902272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 69127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(DECRYPT, data, &reply); 69227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 69327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const status_t status = reply.readInt32(); 69427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Return value of decrypt() is %d", status); 69527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 69627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = reply.readInt32(); 69727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi (*decBuffer)->length = size; 69827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read((void *)(*decBuffer)->data, size); 69927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 70027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return status; 70127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 70227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7032272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::finalizeDecryptUnit( 70427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { 70527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("finalizeDecryptUnit"); 70627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 70727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 70827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 70927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 71027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 71127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptId); 71227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(decryptHandle->mimeType); 71327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptApiType); 71427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->status); 71527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 71627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle->decryptInfo) { 71727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength); 71827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 71927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(INVALID_BUFFER_LENGTH); 72027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 72127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 72227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptUnitId); 72327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 72427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply); 7252272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 72627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 72727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 72827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshissize_t BpDrmManagerService::pread( 72927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, void* buffer, 730a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang ssize_t numBytes, off64_t offset) { 73127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("read"); 73227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 73327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int result; 73427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 73527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 73627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 73727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 73827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptId); 73927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(decryptHandle->mimeType); 74027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptApiType); 74127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->status); 74227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 74327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle->decryptInfo) { 74427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength); 74527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 74627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(INVALID_BUFFER_LENGTH); 74727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 74827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 74927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(numBytes); 750a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang data.writeInt64(offset); 75127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 75227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(PREAD, data, &reply); 75327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi result = reply.readInt32(); 75427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < result) { 75527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(buffer, result); 75627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 75727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return result; 75827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 75927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 76027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiIMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService"); 76127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 76227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BnDrmManagerService::onTransact( 76327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi uint32_t code, const Parcel& data, 76427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel* reply, uint32_t flags) { 76527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Entering BnDrmManagerService::onTransact with code %d", code); 76627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 76727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi switch (code) { 7682272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi case ADD_UNIQUEID: 7692272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi { 7702272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi LOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID"); 7712272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi CHECK_INTERFACE(IDrmManagerService, data, reply); 7722272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi int uniqueId = addUniqueId(data.readInt32()); 7732272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(uniqueId); 7742272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return DRM_NO_ERROR; 7752272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 7762272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 7772272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi case REMOVE_UNIQUEID: 7782272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi { 7792272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi LOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID"); 7802272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi CHECK_INTERFACE(IDrmManagerService, data, reply); 7812272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi removeUniqueId(data.readInt32()); 7822272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return DRM_NO_ERROR; 7832272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 7842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 785e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi case ADD_CLIENT: 78627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 787e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi LOGV("BnDrmManagerService::onTransact :ADD_CLIENT"); 78827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 789e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi addClient(data.readInt32()); 79027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 79127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 79227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 793e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi case REMOVE_CLIENT: 79427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 795e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi LOGV("BnDrmManagerService::onTransact :REMOVE_CLIENT"); 79627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 797e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi removeClient(data.readInt32()); 79827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 79927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 80027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 80127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case SET_DRM_SERVICE_LISTENER: 80227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 80327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER"); 80427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 80527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 80627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 80727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const sp<IDrmServiceListener> drmServiceListener 80827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = interface_cast<IDrmServiceListener> (data.readStrongBinder()); 80927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 81027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = setDrmServiceListener(uniqueId, drmServiceListener); 81127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 81227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 81327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 81427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 81527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 81627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case INSTALL_DRM_ENGINE: 81727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 81827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :INSTALL_DRM_ENGINE"); 81927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 82027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 82127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = installDrmEngine(data.readInt32(), data.readString8()); 82227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 82327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 82427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 82527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 82627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 82727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case GET_CONSTRAINTS_FROM_CONTENT: 82827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 82927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT"); 83027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 83127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 83227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 83327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 path = data.readString8(); 83427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 83527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConstraints* drmConstraints = getConstraints(uniqueId, &path, data.readInt32()); 83627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 83727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConstraints) { 83827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Constraints contents 83927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmConstraints->getCount()); 84027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 84127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator(); 84227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (keyIt.hasNext()) { 84327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key = keyIt.next(); 84427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(key); 84527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const char* value = drmConstraints->getAsByteArray(&key); 84627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int bufferSize = 0; 84727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != value) { 84827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bufferSize = strlen(value); 84927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 85027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize + 1); 85127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(value, bufferSize + 1); 85227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 85327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 85427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmConstraints; drmConstraints = NULL; 85527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 85627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 85727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 8583473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi case GET_METADATA_FROM_CONTENT: 8593473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi { 8603473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi LOGV("BnDrmManagerService::onTransact :GET_METADATA_FROM_CONTENT"); 8613473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi CHECK_INTERFACE(IDrmManagerService, data, reply); 8623473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 8633473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const int uniqueId = data.readInt32(); 8643473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const String8 path = data.readString8(); 8653473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 8663473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi DrmMetadata* drmMetadata = getMetadata(uniqueId, &path); 8673473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (NULL != drmMetadata) { 8683473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi //Filling DRM Metadata contents 8693473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply->writeInt32(drmMetadata->getCount()); 8703473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 8713473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi DrmMetadata::KeyIterator keyIt = drmMetadata->keyIterator(); 8723473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi while (keyIt.hasNext()) { 8733473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const String8 key = keyIt.next(); 8743473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply->writeString8(key); 8753473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi const char* value = drmMetadata->getAsByteArray(&key); 8763473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi int bufferSize = 0; 8773473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi if (NULL != value) { 8783473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi bufferSize = strlen(value); 8793473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply->writeInt32(bufferSize + 1); 8803473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply->write(value, bufferSize + 1); 8813473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } else { 8823473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi reply->writeInt32(0); 8833473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 8843473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 8853473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 8863473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi delete drmMetadata; drmMetadata = NULL; 8873473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi return NO_ERROR; 8883473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi } 8893473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi 89027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CAN_HANDLE: 89127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 89227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :CAN_HANDLE"); 89327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 89427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 89527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 89627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 path = data.readString8(); 89727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 mimeType = data.readString8(); 89827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 89927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bool result = canHandle(uniqueId, path, mimeType); 90027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 90127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(result); 90227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 90327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 90427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 90527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case PROCESS_DRM_INFO: 90627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 90727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO"); 90827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 90927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 91027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 91127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 91227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM info 91327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int infoType = data.readInt32(); 91427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = data.readInt32(); 91527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* buffer = NULL; 91627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 91727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi buffer = (char *)data.readInplace(bufferSize); 91827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 91927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer drmBuffer(buffer, bufferSize); 92027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8()); 92127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 92227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = data.readInt32(); 92327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < size; ++index) { 92427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key(data.readString8()); 92527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value(data.readString8()); 92627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfo->put(key, (value == String8("NULL")) ? String8("") : value); 92727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 92827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 92927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo); 93027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 93127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfoStatus) { 93227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info Status contents 93327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmInfoStatus->statusCode); 934e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi reply->writeInt32(drmInfoStatus->infoType); 93527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(drmInfoStatus->mimeType); 93627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 93727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfoStatus->drmBuffer) { 93827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer; 93927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = drmBuffer->length; 94027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize); 94127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 94227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(drmBuffer->data, bufferSize); 94327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 94427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] drmBuffer->data; 94527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmBuffer; drmBuffer = NULL; 94627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 94727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 94827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmInfo; drmInfo = NULL; 94927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmInfoStatus; drmInfoStatus = NULL; 95027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 95127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 95227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 95327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case ACQUIRE_DRM_INFO: 95427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 95527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO"); 95627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 95727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 95827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 95927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 96027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM info Request 96127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(data.readInt32(), data.readString8()); 96227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 96327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = data.readInt32(); 96427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < size; ++index) { 96527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key(data.readString8()); 96627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value(data.readString8()); 96727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value); 96827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 96927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 97027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest); 97127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 97227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfo) { 97327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info 97427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer drmBuffer = drmInfo->getData(); 97527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmInfo->getInfoType()); 97627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 97727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = drmBuffer.length; 97827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize); 97927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 98027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(drmBuffer.data, bufferSize); 98127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 98227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(drmInfo->getMimeType()); 98327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmInfo->getCount()); 98427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 98527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo::KeyIterator keyIt = drmInfo->keyIterator(); 98627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (keyIt.hasNext()) { 98727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key = keyIt.next(); 98827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(key); 98927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value = drmInfo->get(key); 99027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8((value == String8("")) ? String8("NULL") : value); 99127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 99227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] drmBuffer.data; 99327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 99427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmInfoRequest; drmInfoRequest = NULL; 99527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmInfo; drmInfo = NULL; 99627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 99727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 99827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 99927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case SAVE_RIGHTS: 100027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 100127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS"); 100227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 100327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 100427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 100527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 100627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Rights 100727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = data.readInt32(); 100827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize); 100927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 101027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 mimeType(data.readString8()); 101127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 accountId(data.readString8()); 101227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 subscriptionId(data.readString8()); 101327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 rightsPath(data.readString8()); 101427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 contentPath(data.readString8()); 101527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 101627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmRights drmRights(drmBuffer, 101727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((mimeType == String8("NULL")) ? String8("") : mimeType), 101827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((accountId == String8("NULL")) ? String8("") : accountId), 101927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId)); 102027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10212272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = saveRights(uniqueId, drmRights, 102227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((rightsPath == String8("NULL")) ? String8("") : rightsPath), 102327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((contentPath == String8("NULL")) ? String8("") : contentPath)); 102427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10252272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 102627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 102727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 102827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 102927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case GET_ORIGINAL_MIMETYPE: 103027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 103127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE"); 103227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 103327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 103427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 originalMimeType = getOriginalMimeType(data.readInt32(), data.readString8()); 103527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 103627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(originalMimeType); 103727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 103827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 103927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 104027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case GET_DRM_OBJECT_TYPE: 104127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 104227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE"); 104327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 104427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 104527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int drmObjectType 104627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = getDrmObjectType(data.readInt32(), data.readString8(), data.readString8()); 104727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 104827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmObjectType); 104927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 105027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 105127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 105227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CHECK_RIGHTS_STATUS: 105327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 105427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS"); 105527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 105627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 105727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int result 105827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = checkRightsStatus(data.readInt32(), data.readString8(), data.readInt32()); 105927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 106027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(result); 106127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 106227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 106327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 106427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CONSUME_RIGHTS: 106527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 106627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS"); 106727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 106827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 106927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 107027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 107127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 107227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptId = data.readInt32(); 107327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.mimeType = data.readString8(); 107427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptApiType = data.readInt32(); 107527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.status = data.readInt32(); 107627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = NULL; 107727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 107827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferLength = data.readInt32(); 107927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (INVALID_BUFFER_LENGTH != bufferLength) { 108027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = new DecryptInfo(); 108127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo->decryptBufferLength = bufferLength; 108227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 108327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status 10852272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi = consumeRights(uniqueId, &handle, data.readInt32(), 10862272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi static_cast<bool>(data.readInt32())); 10872272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 108827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 108927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete handle.decryptInfo; handle.decryptInfo = NULL; 109027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 109127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 109227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 109327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case SET_PLAYBACK_STATUS: 109427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 109527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS"); 109627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 109727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 109827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 109927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 110027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 110127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptId = data.readInt32(); 110227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.mimeType = data.readString8(); 110327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptApiType = data.readInt32(); 110427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.status = data.readInt32(); 110527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = NULL; 110627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 110727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferLength = data.readInt32(); 110827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (INVALID_BUFFER_LENGTH != bufferLength) { 110927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = new DecryptInfo(); 111027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo->decryptBufferLength = bufferLength; 111127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 111227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11132272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status 11142ed8a921ef55aa2f3dd4b7ac33b7ded6ec33d92dGloria Wang = setPlaybackStatus(uniqueId, &handle, data.readInt32(), data.readInt64()); 11152272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 111627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 111727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete handle.decryptInfo; handle.decryptInfo = NULL; 111827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 111927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 112027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 112127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case VALIDATE_ACTION: 112227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 112327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION"); 112427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 112527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 112627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bool result = validateAction( 112727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.readInt32(), 112827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.readString8(), 112927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.readInt32(), 113027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ActionDescription(data.readInt32(), data.readInt32())); 113127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 113227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(result); 113327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 113427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 113527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 113627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case REMOVE_RIGHTS: 113727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 113827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS"); 113927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 114027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11412272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = removeRights(data.readInt32(), data.readString8()); 11422272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 114327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 114427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 114527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 114627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 114727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case REMOVE_ALL_RIGHTS: 114827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 114927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS"); 115027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 115127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11522272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = removeAllRights(data.readInt32()); 11532272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 115427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 115527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 115627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 115727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 115827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case OPEN_CONVERT_SESSION: 115927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 116027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION"); 116127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 116227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 116327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int convertId = openConvertSession(data.readInt32(), data.readString8()); 116427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 116527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(convertId); 116627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 116727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 116827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 116927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CONVERT_DATA: 117027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 117127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :CONVERT_DATA"); 117227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 117327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 117427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 117527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int convertId = data.readInt32(); 117627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 117727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling input data 117827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = data.readInt32(); 117927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize); 118027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 118127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* drmConvertedStatus = convertData(uniqueId, convertId, inputData); 118227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 118327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConvertedStatus) { 118427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Drm Converted Ststus 118527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmConvertedStatus->statusCode); 1186a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang reply->writeInt64(drmConvertedStatus->offset); 118727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 118827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConvertedStatus->convertedData) { 118927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer* convertedData = drmConvertedStatus->convertedData; 119027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = convertedData->length; 119127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize); 119227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 119327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(convertedData->data, bufferSize); 119427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 119527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] convertedData->data; 119627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete convertedData; convertedData = NULL; 119727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 119827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 119927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete inputData; inputData = NULL; 120027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmConvertedStatus; drmConvertedStatus = NULL; 120127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 120227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 120327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 120427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CLOSE_CONVERT_SESSION: 120527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 120627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION"); 120727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 120827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 120927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* drmConvertedStatus 121027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = closeConvertSession(data.readInt32(), data.readInt32()); 121127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 121227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConvertedStatus) { 121327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Drm Converted Ststus 121427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmConvertedStatus->statusCode); 1215a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang reply->writeInt64(drmConvertedStatus->offset); 121627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 121727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConvertedStatus->convertedData) { 121827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer* convertedData = drmConvertedStatus->convertedData; 121927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = convertedData->length; 122027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize); 122127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 122227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(convertedData->data, bufferSize); 122327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 122427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] convertedData->data; 122527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete convertedData; convertedData = NULL; 122627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 122727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 122827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmConvertedStatus; drmConvertedStatus = NULL; 122927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 123027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 123127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 123227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case GET_ALL_SUPPORT_INFO: 123327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 123427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO"); 123527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 123627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 123727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 123827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int length = 0; 123927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo* drmSupportInfoArray = NULL; 124027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 124127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray); 124227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 124327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(length); 124427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int i = 0; i < length; ++i) { 124527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i]; 124627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 124727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmSupportInfo.getFileSuffixCount()); 124827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo::FileSuffixIterator fileSuffixIt 124927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = drmSupportInfo.getFileSuffixIterator(); 125027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (fileSuffixIt.hasNext()) { 125127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(fileSuffixIt.next()); 125227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 125327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 125427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmSupportInfo.getMimeTypeCount()); 125527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator(); 125627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (mimeTypeIt.hasNext()) { 125727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(mimeTypeIt.next()); 125827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 125927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(drmSupportInfo.getDescription()); 126027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 126127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] drmSupportInfoArray; drmSupportInfoArray = NULL; 126227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 126327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 126427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 126527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 126627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case OPEN_DECRYPT_SESSION: 126727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 126827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION"); 126927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 127027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 127127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 127227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int fd = data.readFileDescriptor(); 127327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 127427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle* handle 1275a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang = openDecryptSession(uniqueId, fd, data.readInt64(), data.readInt64()); 127627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 127727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != handle) { 127827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(handle->decryptId); 127927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(handle->mimeType); 128027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(handle->decryptApiType); 128127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(handle->status); 128227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != handle->decryptInfo) { 128327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(handle->decryptInfo->decryptBufferLength); 128427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete handle->decryptInfo; handle->decryptInfo = NULL; 128527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 128627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 128727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete handle; handle = NULL; 128827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 1289e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } 1290e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 1291e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi case OPEN_DECRYPT_SESSION_FROM_URI: 1292e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi { 1293e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi LOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI"); 1294e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi CHECK_INTERFACE(IDrmManagerService, data, reply); 1295e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 1296e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi const int uniqueId = data.readInt32(); 1297e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi const String8 uri = data.readString8(); 1298e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 1299e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi DecryptHandle* handle = openDecryptSession(uniqueId, uri.string()); 1300e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi 1301e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi if (NULL != handle) { 1302e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi reply->writeInt32(handle->decryptId); 1303e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi reply->writeString8(handle->mimeType); 1304e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi reply->writeInt32(handle->decryptApiType); 1305e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi reply->writeInt32(handle->status); 1306e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi if (NULL != handle->decryptInfo) { 1307e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi reply->writeInt32(handle->decryptInfo->decryptBufferLength); 1308e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi delete handle->decryptInfo; handle->decryptInfo = NULL; 1309e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } 1310e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } else { 1311e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi LOGE("NULL decryptHandle is returned"); 1312e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi } 1313e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi delete handle; handle = NULL; 1314e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi return DRM_NO_ERROR; 131527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 131627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 131727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CLOSE_DECRYPT_SESSION: 131827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 131927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION"); 132027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 132127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 132227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 132327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 132427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle* handle = new DecryptHandle(); 132527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptId = data.readInt32(); 132627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->mimeType = data.readString8(); 132727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptApiType = data.readInt32(); 132827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->status = data.readInt32(); 132927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptInfo = NULL; 133027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 133127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferLength = data.readInt32(); 133227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (INVALID_BUFFER_LENGTH != bufferLength) { 133327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptInfo = new DecryptInfo(); 133427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptInfo->decryptBufferLength = bufferLength; 133527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 133627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13372272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = closeDecryptSession(uniqueId, handle); 13382272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 133927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 134027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 134127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 134227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case INITIALIZE_DECRYPT_UNIT: 134327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 134427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT"); 134527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 134627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 134727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 134827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 134927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 135027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptId = data.readInt32(); 135127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.mimeType = data.readString8(); 135227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptApiType = data.readInt32(); 135327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.status = data.readInt32(); 135427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = NULL; 135527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 135627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferLength = data.readInt32(); 135727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (INVALID_BUFFER_LENGTH != bufferLength) { 135827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = new DecryptInfo(); 135927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo->decryptBufferLength = bufferLength; 136027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 136127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int decryptUnitId = data.readInt32(); 136227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 136327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Header info 136427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = data.readInt32(); 136527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* headerInfo = NULL; 136627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize); 136727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13682272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status 13692272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo); 13702272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 137127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 137227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete handle.decryptInfo; handle.decryptInfo = NULL; 137327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete headerInfo; headerInfo = NULL; 137427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 137527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 137627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 137727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case DECRYPT: 137827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 137927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :DECRYPT"); 138027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 138127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 138227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 138327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 138427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 138527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptId = data.readInt32(); 138627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.mimeType = data.readString8(); 138727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptApiType = data.readInt32(); 138827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.status = data.readInt32(); 138927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = NULL; 139027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 139127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferLength = data.readInt32(); 139227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (INVALID_BUFFER_LENGTH != bufferLength) { 139327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = new DecryptInfo(); 139427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo->decryptBufferLength = bufferLength; 139527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 139627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int decryptUnitId = data.readInt32(); 139727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int decBufferSize = data.readInt32(); 139827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 139927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int encBufferSize = data.readInt32(); 140027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* encBuffer 140127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize); 140227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 140327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* buffer = NULL; 140427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi buffer = new char[decBufferSize]; 140527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize); 140627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14072272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi DrmBuffer* IV = NULL; 14082272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi if (0 != data.dataAvail()) { 14092272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const int ivBufferlength = data.readInt32(); 14102272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength); 14112272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 14122272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 14132272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status 14142272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi = decrypt(uniqueId, &handle, decryptUnitId, encBuffer, &decBuffer, IV); 141527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 141627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 141727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 141827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = decBuffer->length; 141927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(size); 142027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(decBuffer->data, size); 142127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 142227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete handle.decryptInfo; handle.decryptInfo = NULL; 142327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete encBuffer; encBuffer = NULL; 142427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete decBuffer; decBuffer = NULL; 142527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] buffer; buffer = NULL; 14262272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi delete IV; IV = NULL; 142727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 142827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 142927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 143027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case FINALIZE_DECRYPT_UNIT: 143127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 143227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT"); 143327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 143427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 143527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 143627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 143727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 143827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptId = data.readInt32(); 143927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.mimeType = data.readString8(); 144027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptApiType = data.readInt32(); 144127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.status = data.readInt32(); 144227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = NULL; 144327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 144427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferLength = data.readInt32(); 144527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (INVALID_BUFFER_LENGTH != bufferLength) { 144627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = new DecryptInfo(); 144727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo->decryptBufferLength = bufferLength; 144827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 144927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14502272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32()); 14512272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 145227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 145327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete handle.decryptInfo; handle.decryptInfo = NULL; 145427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 145527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 145627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 145727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case PREAD: 145827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 145927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :READ"); 146027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 146127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 146227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 146327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 146427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 146527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptId = data.readInt32(); 146627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.mimeType = data.readString8(); 146727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptApiType = data.readInt32(); 146827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.status = data.readInt32(); 146927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = NULL; 147027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 147127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferLength = data.readInt32(); 147227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (INVALID_BUFFER_LENGTH != bufferLength) { 147327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = new DecryptInfo(); 147427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo->decryptBufferLength = bufferLength; 147527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 147627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 147727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int numBytes = data.readInt32(); 147827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* buffer = new char[numBytes]; 147927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1480a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang const off64_t offset = data.readInt64(); 148127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 148227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ssize_t result = pread(uniqueId, &handle, buffer, numBytes, offset); 148327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(result); 148427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < result) { 148527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(buffer, result); 148627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 148727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 148827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete handle.decryptInfo; handle.decryptInfo = NULL; 148927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] buffer, buffer = NULL; 149027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 149127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 149227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 149327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi default: 149427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return BBinder::onTransact(code, data, reply, flags); 149527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 149627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 149727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1498