IDrmManagerService.cpp revision 2272ee27d9022d173b6eab45c409b3c3f57f30ec
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> 2727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmRights.h> 2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoStatus.h> 2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmConvertedStatus.h> 3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoRequest.h> 3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmSupportInfo.h> 3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "IDrmManagerService.h" 3427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define INVALID_BUFFER_LENGTH -1 3627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiusing namespace android; 3827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 392272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimiint BpDrmManagerService::addUniqueId(int uniqueId) { 402272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi LOGV("add uniqueid"); 412272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi Parcel data, reply; 422272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 432272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInt32(uniqueId); 442272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi remote()->transact(ADD_UNIQUEID, data, &reply); 452272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 462272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi} 472272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 482272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimivoid BpDrmManagerService::removeUniqueId(int uniqueId) { 492272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi LOGV("remove uniqueid"); 502272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi Parcel data, reply; 512272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 522272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInt32(uniqueId); 532272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi remote()->transact(REMOVE_UNIQUEID, data, &reply); 542272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi} 552272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 5627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::loadPlugIns(int uniqueId) { 5727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("load plugins"); 5827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 5927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 6127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 6227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(LOAD_PLUGINS, data, &reply); 6427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 6527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 6627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::loadPlugIns(int uniqueId, const String8& plugInDirPath) { 6827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("load plugins from path"); 6927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 7027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 7227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 7327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(plugInDirPath); 7427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(LOAD_PLUGINS_FROM_PATH, data, &reply); 7627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 7727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 7827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::setDrmServiceListener( 8027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) { 8127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("setDrmServiceListener"); 8227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 8327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 8427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 8527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 8627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeStrongBinder(drmServiceListener->asBinder()); 8727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(SET_DRM_SERVICE_LISTENER, data, &reply); 8827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 8927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 9027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::unloadPlugIns(int uniqueId) { 9227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("unload plugins"); 9327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 9427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 9627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 9727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(UNLOAD_PLUGINS, data, &reply); 9927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 10027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 10127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::installDrmEngine(int uniqueId, const String8& drmEngineFile) { 10327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Install DRM Engine"); 10427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 10527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 10727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 10827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(drmEngineFile); 10927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(INSTALL_DRM_ENGINE, data, &reply); 11127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 11227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 11327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConstraints* BpDrmManagerService::getConstraints( 11527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8* path, const int action) { 11627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Get Constraints"); 11727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 11827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 12027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 12127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(*path); 12227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(action); 12327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 12427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(GET_CONSTRAINTS_FROM_CONTENT, data, &reply); 12527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 12627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConstraints* drmConstraints = NULL; 12727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 12827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Drm Constraints 12927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConstraints = new DrmConstraints(); 13027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = reply.readInt32(); 13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < size; ++index) { 13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key(reply.readString8()); 13427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 13527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 13627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 13727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 13827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 13927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 14027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConstraints->put(&key, data); 14127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 14227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 14327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConstraints; 14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 14527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 14627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool BpDrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) { 14727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Can Handle"); 14827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 14927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 15027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 15127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 15227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 15327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 15427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(mimeType); 15527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CAN_HANDLE, data, &reply); 15727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return static_cast<bool>(reply.readInt32()); 15927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 16027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) { 16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Process DRM Info"); 16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 16427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 16627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM info 16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(drmInfo->getInfoType()); 17027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer dataBuffer = drmInfo->getData(); 17127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int dataBufferSize = dataBuffer.length; 17227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(dataBufferSize); 17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < dataBufferSize) { 17427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(dataBuffer.data, dataBufferSize); 17527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 17627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(drmInfo->getMimeType()); 17727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 17827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(drmInfo->getCount()); 17927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo::KeyIterator keyIt = drmInfo->keyIterator(); 18027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 18127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (keyIt.hasNext()) { 18227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key = keyIt.next(); 18327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(key); 18427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value = drmInfo->get(key); 18527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((value == String8("")) ? String8("NULL") : value); 18627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 18727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 18827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(PROCESS_DRM_INFO, data, &reply); 18927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 19027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoStatus* drmInfoStatus = NULL; 19127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 19227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info Status 19327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int statusCode = reply.readInt32(); 19427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 mimeType = reply.readString8(); 19527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 19627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* drmBuffer = NULL; 19727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 19827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 19927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 20027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 20127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 20227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 20327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 20427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmBuffer = new DrmBuffer(data, bufferSize); 20527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 20627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfoStatus = new DrmInfoStatus(statusCode, drmBuffer, mimeType); 20727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 20827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmInfoStatus; 20927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 21027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 21127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfo* BpDrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) { 21227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Acquire DRM Info"); 21327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 21427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 21527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 21627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 21727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 21827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info Request 21927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(drmInforequest->getInfoType()); 22027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(drmInforequest->getMimeType()); 22127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 22227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(drmInforequest->getCount()); 22327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoRequest::KeyIterator keyIt = drmInforequest->keyIterator(); 22427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 22527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (keyIt.hasNext()) { 22627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key = keyIt.next(); 22727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(key); 22827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value = drmInforequest->get(key); 22927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((value == String8("")) ? String8("NULL") : value); 23027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 23127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 23227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(ACQUIRE_DRM_INFO, data, &reply); 23327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 23427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo* drmInfo = NULL; 23527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 23627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info 23727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int infoType = reply.readInt32(); 23827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 23927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 24027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 24127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 24227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 24327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 24427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 24527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfo = new DrmInfo(infoType, DrmBuffer(data, bufferSize), reply.readString8()); 24627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 24727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = reply.readInt32(); 24827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < size; ++index) { 24927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key(reply.readString8()); 25027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value(reply.readString8()); 25127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfo->put(key, (value == String8("NULL")) ? String8("") : value); 25227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 25327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 25427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmInfo; 25527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 25627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 2572272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::saveRights( 25827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const DrmRights& drmRights, 25927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8& rightsPath, const String8& contentPath) { 26027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Save Rights"); 26127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 26227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 26327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 26427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 26527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 26627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Drm Rights 26727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer dataBuffer = drmRights.getData(); 26827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(dataBuffer.length); 26927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(dataBuffer.data, dataBuffer.length); 27027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 27127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 mimeType = drmRights.getMimeType(); 27227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((mimeType == String8("")) ? String8("NULL") : mimeType); 27327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 27427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 accountId = drmRights.getAccountId(); 27527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((accountId == String8("")) ? String8("NULL") : accountId); 27627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 27727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 subscriptionId = drmRights.getSubscriptionId(); 27827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((subscriptionId == String8("")) ? String8("NULL") : subscriptionId); 27927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 28027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((rightsPath == String8("")) ? String8("NULL") : rightsPath); 28127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8((contentPath == String8("")) ? String8("NULL") : contentPath); 28227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 28327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(SAVE_RIGHTS, data, &reply); 2842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 28527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 28627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 28727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 BpDrmManagerService::getOriginalMimeType(int uniqueId, const String8& path) { 28827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Get Original MimeType"); 28927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 29027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 29127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 29227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 29327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 29427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 29527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(GET_ORIGINAL_MIMETYPE, data, &reply); 29627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readString8(); 29727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 29827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 29927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::getDrmObjectType( 30027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, const String8& mimeType) { 30127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Get Drm object type"); 30227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 30327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 30427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 30527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 30627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 30727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(mimeType); 30827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 30927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(GET_DRM_OBJECT_TYPE, data, &reply); 31027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 31127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 31227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 31327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 31427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::checkRightsStatus(int uniqueId, const String8& path, int action) { 31527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("checkRightsStatus"); 31627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 31727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 31827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 31927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 32027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 32127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(action); 32227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 32327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CHECK_RIGHTS_STATUS, data, &reply); 32427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 32527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 32627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 32727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3282272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::consumeRights( 32927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) { 33027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("consumeRights"); 3312272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi Parcel data, reply; 33227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 33327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 33427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 33527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 33627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptId); 33727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(decryptHandle->mimeType); 33827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptApiType); 33927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->status); 34027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 34127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle->decryptInfo) { 34227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength); 34327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 34427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(INVALID_BUFFER_LENGTH); 34527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 34627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 34727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(action); 34827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(static_cast< int>(reserve)); 34927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 35027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CONSUME_RIGHTS, data, &reply); 3512272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 35227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 35327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3542272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::setPlaybackStatus( 35527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int position) { 35627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("setPlaybackStatus"); 35727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 35827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 35927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 36027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 36127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 36227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptId); 36327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(decryptHandle->mimeType); 36427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptApiType); 36527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->status); 36627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 36727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle->decryptInfo) { 36827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength); 36927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 37027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(INVALID_BUFFER_LENGTH); 37127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 37227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 37327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(playbackStatus); 37427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(position); 37527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 37627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(SET_PLAYBACK_STATUS, data, &reply); 3772272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 37827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 37927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 38027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool BpDrmManagerService::validateAction( 38127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, const String8& path, 38227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int action, const ActionDescription& description) { 38327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("validateAction"); 38427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 38527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 38627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 38727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 38827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 38927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(action); 39027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(description.outputType); 39127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(description.configuration); 39227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 39327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(VALIDATE_ACTION, data, &reply); 39427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 39527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return static_cast<bool>(reply.readInt32()); 39627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 39727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 3982272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::removeRights(int uniqueId, const String8& path) { 39927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("removeRights"); 40027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 40127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 40227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 40327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 40427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(path); 40527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 40627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(REMOVE_RIGHTS, data, &reply); 4072272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 40827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 40927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 4102272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::removeAllRights(int uniqueId) { 41127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("removeAllRights"); 41227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 41327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 41427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 41527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 41627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 41727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(REMOVE_ALL_RIGHTS, data, &reply); 4182272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 41927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 42027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 42127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) { 42227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("openConvertSession"); 42327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 42427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 42527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 42627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 42727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(mimeType); 42827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 42927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(OPEN_CONVERT_SESSION, data, &reply); 43027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 43127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 43227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 43327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* BpDrmManagerService::convertData( 43427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int convertId, const DrmBuffer* inputData) { 43527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("convertData"); 43627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 43727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 43827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 43927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 44027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(convertId); 44127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(inputData->length); 44227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(inputData->data, inputData->length); 44327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 44427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CONVERT_DATA, data, &reply); 44527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 44627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* drmConvertedStatus = NULL; 44727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 44827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 44927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Converted Status 45027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int statusCode = reply.readInt32(); 45127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int offset = reply.readInt32(); 45227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 45327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* convertedData = NULL; 45427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 45527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 45627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 45727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 45827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 45927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 46027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 46127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi convertedData = new DrmBuffer(data, bufferSize); 46227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 46327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset); 46427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 46527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConvertedStatus; 46627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 46727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 46827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* BpDrmManagerService::closeConvertSession(int uniqueId, int convertId) { 46927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("closeConvertSession"); 47027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 47127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 47227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 47327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 47427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(convertId); 47527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 47627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CLOSE_CONVERT_SESSION, data, &reply); 47727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 47827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* drmConvertedStatus = NULL; 47927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 48027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 48127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Converted Status 48227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int statusCode = reply.readInt32(); 48327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int offset = reply.readInt32(); 48427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 48527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* convertedData = NULL; 48627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 48727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = reply.readInt32(); 48827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* data = NULL; 48927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 49027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data = new char[bufferSize]; 49127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(data, bufferSize); 49227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 49327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi convertedData = new DrmBuffer(data, bufferSize); 49427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 49527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset); 49627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 49727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return drmConvertedStatus; 49827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 49927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 50027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::getAllSupportInfo( 50127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) { 50227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Get All Support Info"); 50327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 50427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 50527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 50627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 50727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 50827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(GET_ALL_SUPPORT_INFO, data, &reply); 50927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 51027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Support Info 51127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int arraySize = reply.readInt32(); 51227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < arraySize) { 51327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *drmSupportInfoArray = new DrmSupportInfo[arraySize]; 51427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 51527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < arraySize; ++index) { 51627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo drmSupportInfo; 51727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 51827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int fileSuffixVectorSize = reply.readInt32(); 51927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int i = 0; i < fileSuffixVectorSize; ++i) { 52027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmSupportInfo.addFileSuffix(reply.readString8()); 52127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 52227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 52327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int mimeTypeVectorSize = reply.readInt32(); 52427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int i = 0; i < mimeTypeVectorSize; ++i) { 52527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmSupportInfo.addMimeType(reply.readString8()); 52627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 52727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 52827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmSupportInfo.setDescription(reply.readString8()); 52927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi (*drmSupportInfoArray)[index] = drmSupportInfo; 53027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 53127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 53227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *length = arraySize; 53327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return reply.readInt32(); 53427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 53527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 53627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDecryptHandle* BpDrmManagerService::openDecryptSession( 53727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, int fd, int offset, int length) { 53827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Entering BpDrmManagerService::openDecryptSession"); 53927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 54027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 54127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String16 interfaceDescriptor = IDrmManagerService::getInterfaceDescriptor(); 54227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(interfaceDescriptor); 54327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 54427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeFileDescriptor(fd); 54527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(offset); 54627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(length); 54727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 54827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(OPEN_DECRYPT_SESSION, data, &reply); 54927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 55027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle* handle = NULL; 55127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 55227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle = new DecryptHandle(); 55327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptId = reply.readInt32(); 55427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->mimeType = reply.readString8(); 55527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptApiType = reply.readInt32(); 55627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->status = reply.readInt32(); 55727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptInfo = NULL; 55827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 != reply.dataAvail()) { 55927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptInfo = new DecryptInfo(); 56027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptInfo->decryptBufferLength = reply.readInt32(); 56127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 56227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 56327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGE("no decryptHandle is generated in service side"); 56427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 56527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return handle; 56627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 56727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 5682272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { 56927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("closeDecryptSession"); 57027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 57127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 57227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 57327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 57427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 57527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptId); 57627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(decryptHandle->mimeType); 57727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptApiType); 57827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->status); 57927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 58027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle->decryptInfo) { 58127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength); 58227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 58327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(INVALID_BUFFER_LENGTH); 58427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 58527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 58627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply); 58727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 58827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle->decryptInfo) { 58927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("deleting decryptInfo"); 59027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete decryptHandle->decryptInfo; decryptHandle->decryptInfo = NULL; 59127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 59227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete decryptHandle; decryptHandle = NULL; 5932272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 59427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 59527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 5962272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::initializeDecryptUnit( 59727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, 59827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int decryptUnitId, const DrmBuffer* headerInfo) { 59927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("initializeDecryptUnit"); 60027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 60127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 60227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 60327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 60427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 60527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptId); 60627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(decryptHandle->mimeType); 60727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptApiType); 60827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->status); 60927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 61027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle->decryptInfo) { 61127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength); 61227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 61327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(INVALID_BUFFER_LENGTH); 61427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 61527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptUnitId); 61627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 61727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(headerInfo->length); 61827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(headerInfo->data, headerInfo->length); 61927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 62027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply); 6212272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 62227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 62327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 62427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::decrypt( 62527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, 6262272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { 62727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("decrypt"); 62827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 62927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 63027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 63127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 63227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 63327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptId); 63427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(decryptHandle->mimeType); 63527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptApiType); 63627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->status); 63727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 63827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle->decryptInfo) { 63927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength); 64027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 64127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(INVALID_BUFFER_LENGTH); 64227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 64327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 64427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptUnitId); 64527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32((*decBuffer)->length); 64627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 64727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(encBuffer->length); 64827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.write(encBuffer->data, encBuffer->length); 64927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6502272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi if (NULL != IV) { 6512272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.writeInt32(IV->length); 6522272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi data.write(IV->data, IV->length); 6532272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 6542272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 65527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(DECRYPT, data, &reply); 65627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 65727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const status_t status = reply.readInt32(); 65827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Return value of decrypt() is %d", status); 65927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 66027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = reply.readInt32(); 66127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi (*decBuffer)->length = size; 66227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read((void *)(*decBuffer)->data, size); 66327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 66427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return status; 66527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 66627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 6672272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::finalizeDecryptUnit( 66827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { 66927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("finalizeDecryptUnit"); 67027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 67127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 67227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 67327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 67427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 67527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptId); 67627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(decryptHandle->mimeType); 67727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptApiType); 67827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->status); 67927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 68027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle->decryptInfo) { 68127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength); 68227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 68327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(INVALID_BUFFER_LENGTH); 68427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 68527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 68627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptUnitId); 68727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 68827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply); 6892272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return reply.readInt32(); 69027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 69127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 69227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshissize_t BpDrmManagerService::pread( 69327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int uniqueId, DecryptHandle* decryptHandle, void* buffer, 69427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ssize_t numBytes, off_t offset) { 69527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("read"); 69627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel data, reply; 69727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int result; 69827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 69927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 70027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(uniqueId); 70127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 70227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptId); 70327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeString8(decryptHandle->mimeType); 70427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptApiType); 70527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->status); 70627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 70727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != decryptHandle->decryptInfo) { 70827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength); 70927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 71027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(INVALID_BUFFER_LENGTH); 71127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 71227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 71327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(numBytes); 71427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.writeInt32(offset); 71527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 71627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi remote()->transact(PREAD, data, &reply); 71727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi result = reply.readInt32(); 71827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < result) { 71927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply.read(buffer, result); 72027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 72127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return result; 72227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 72327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 72427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiIMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService"); 72527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 72627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BnDrmManagerService::onTransact( 72727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi uint32_t code, const Parcel& data, 72827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi Parcel* reply, uint32_t flags) { 72927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("Entering BnDrmManagerService::onTransact with code %d", code); 73027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 73127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi switch (code) { 7322272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi case ADD_UNIQUEID: 7332272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi { 7342272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi LOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID"); 7352272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi CHECK_INTERFACE(IDrmManagerService, data, reply); 7362272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi int uniqueId = addUniqueId(data.readInt32()); 7372272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(uniqueId); 7382272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return DRM_NO_ERROR; 7392272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 7402272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 7412272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi case REMOVE_UNIQUEID: 7422272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi { 7432272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi LOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID"); 7442272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi CHECK_INTERFACE(IDrmManagerService, data, reply); 7452272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi removeUniqueId(data.readInt32()); 7462272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi return DRM_NO_ERROR; 7472272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 7482272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 74927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case LOAD_PLUGINS: 75027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 75127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :LOAD_PLUGINS"); 75227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 75327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 75427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = loadPlugIns(data.readInt32()); 75527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 75627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 75727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 75827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 75927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 76027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case LOAD_PLUGINS_FROM_PATH: 76127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 76227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :LOAD_PLUGINS_FROM_PATH"); 76327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 76427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 76527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = loadPlugIns(data.readInt32(), data.readString8()); 76627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 76727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 76827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 76927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 77027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 77127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case SET_DRM_SERVICE_LISTENER: 77227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 77327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER"); 77427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 77527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 77627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 77727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const sp<IDrmServiceListener> drmServiceListener 77827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = interface_cast<IDrmServiceListener> (data.readStrongBinder()); 77927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 78027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = setDrmServiceListener(uniqueId, drmServiceListener); 78127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 78227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 78327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 78427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 78527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 78627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case UNLOAD_PLUGINS: 78727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 78827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :UNLOAD_PLUGINS"); 78927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 79027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 7912272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const int uniqueId = data.readInt32(); 7922272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi status_t status = unloadPlugIns(uniqueId); 79327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 79427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 79527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 79627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 79727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 79827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case INSTALL_DRM_ENGINE: 79927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 80027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :INSTALL_DRM_ENGINE"); 80127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 80227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 80327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = installDrmEngine(data.readInt32(), data.readString8()); 80427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 80527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 80627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 80727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 80827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 80927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case GET_CONSTRAINTS_FROM_CONTENT: 81027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 81127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT"); 81227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 81327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 81427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 81527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 path = data.readString8(); 81627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 81727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConstraints* drmConstraints = getConstraints(uniqueId, &path, data.readInt32()); 81827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 81927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConstraints) { 82027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Constraints contents 82127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmConstraints->getCount()); 82227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 82327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator(); 82427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (keyIt.hasNext()) { 82527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key = keyIt.next(); 82627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(key); 82727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const char* value = drmConstraints->getAsByteArray(&key); 82827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int bufferSize = 0; 82927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != value) { 83027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bufferSize = strlen(value); 83127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 83227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize + 1); 83327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(value, bufferSize + 1); 83427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 83527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 83627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmConstraints; drmConstraints = NULL; 83727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 83827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 83927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 84027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CAN_HANDLE: 84127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 84227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :CAN_HANDLE"); 84327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 84427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 84527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 84627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 path = data.readString8(); 84727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 mimeType = data.readString8(); 84827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 84927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bool result = canHandle(uniqueId, path, mimeType); 85027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 85127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(result); 85227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 85327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 85427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 85527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case PROCESS_DRM_INFO: 85627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 85727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO"); 85827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 85927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 86027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 86127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 86227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM info 86327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int infoType = data.readInt32(); 86427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = data.readInt32(); 86527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* buffer = NULL; 86627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 86727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi buffer = (char *)data.readInplace(bufferSize); 86827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 86927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer drmBuffer(buffer, bufferSize); 87027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8()); 87127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 87227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = data.readInt32(); 87327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < size; ++index) { 87427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key(data.readString8()); 87527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value(data.readString8()); 87627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfo->put(key, (value == String8("NULL")) ? String8("") : value); 87727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 87827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 87927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo); 88027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 88127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfoStatus) { 88227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info Status contents 88327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmInfoStatus->statusCode); 88427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(drmInfoStatus->mimeType); 88527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 88627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfoStatus->drmBuffer) { 88727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer; 88827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = drmBuffer->length; 88927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize); 89027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 89127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(drmBuffer->data, bufferSize); 89227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 89327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] drmBuffer->data; 89427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmBuffer; drmBuffer = NULL; 89527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 89627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 89727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmInfo; drmInfo = NULL; 89827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmInfoStatus; drmInfoStatus = NULL; 89927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 90027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 90127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 90227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case ACQUIRE_DRM_INFO: 90327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 90427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO"); 90527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 90627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 90727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 90827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 90927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM info Request 91027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(data.readInt32(), data.readString8()); 91127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 91227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = data.readInt32(); 91327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int index = 0; index < size; ++index) { 91427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key(data.readString8()); 91527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value(data.readString8()); 91627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value); 91727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 91827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 91927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest); 92027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 92127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmInfo) { 92227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Info 92327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer drmBuffer = drmInfo->getData(); 92427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmInfo->getInfoType()); 92527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 92627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = drmBuffer.length; 92727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize); 92827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 92927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(drmBuffer.data, bufferSize); 93027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 93127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(drmInfo->getMimeType()); 93227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmInfo->getCount()); 93327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 93427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmInfo::KeyIterator keyIt = drmInfo->keyIterator(); 93527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (keyIt.hasNext()) { 93627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 key = keyIt.next(); 93727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(key); 93827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 value = drmInfo->get(key); 93927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8((value == String8("")) ? String8("NULL") : value); 94027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 94127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] drmBuffer.data; 94227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 94327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmInfoRequest; drmInfoRequest = NULL; 94427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmInfo; drmInfo = NULL; 94527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 94627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 94727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 94827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case SAVE_RIGHTS: 94927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 95027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS"); 95127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 95227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 95327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 95427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 95527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling DRM Rights 95627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = data.readInt32(); 95727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize); 95827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 95927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 mimeType(data.readString8()); 96027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 accountId(data.readString8()); 96127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 subscriptionId(data.readString8()); 96227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 rightsPath(data.readString8()); 96327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 contentPath(data.readString8()); 96427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 96527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmRights drmRights(drmBuffer, 96627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((mimeType == String8("NULL")) ? String8("") : mimeType), 96727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((accountId == String8("NULL")) ? String8("") : accountId), 96827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId)); 96927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9702272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = saveRights(uniqueId, drmRights, 97127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((rightsPath == String8("NULL")) ? String8("") : rightsPath), 97227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ((contentPath == String8("NULL")) ? String8("") : contentPath)); 97327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 9742272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 97527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 97627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 97727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 97827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case GET_ORIGINAL_MIMETYPE: 97927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 98027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE"); 98127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 98227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 98327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const String8 originalMimeType = getOriginalMimeType(data.readInt32(), data.readString8()); 98427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 98527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(originalMimeType); 98627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 98727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 98827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 98927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case GET_DRM_OBJECT_TYPE: 99027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 99127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE"); 99227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 99327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 99427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int drmObjectType 99527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = getDrmObjectType(data.readInt32(), data.readString8(), data.readString8()); 99627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 99727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmObjectType); 99827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 99927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 100027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 100127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CHECK_RIGHTS_STATUS: 100227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 100327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS"); 100427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 100527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 100627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int result 100727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = checkRightsStatus(data.readInt32(), data.readString8(), data.readInt32()); 100827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 100927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(result); 101027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 101127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 101227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 101327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CONSUME_RIGHTS: 101427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 101527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS"); 101627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 101727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 101827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 101927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 102027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 102127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptId = data.readInt32(); 102227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.mimeType = data.readString8(); 102327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptApiType = data.readInt32(); 102427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.status = data.readInt32(); 102527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = NULL; 102627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 102727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferLength = data.readInt32(); 102827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (INVALID_BUFFER_LENGTH != bufferLength) { 102927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = new DecryptInfo(); 103027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo->decryptBufferLength = bufferLength; 103127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 103227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10332272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status 10342272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi = consumeRights(uniqueId, &handle, data.readInt32(), 10352272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi static_cast<bool>(data.readInt32())); 10362272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 103727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 103827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete handle.decryptInfo; handle.decryptInfo = NULL; 103927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 104027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 104127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 104227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case SET_PLAYBACK_STATUS: 104327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 104427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS"); 104527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 104627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 104727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 104827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 104927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 105027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptId = data.readInt32(); 105127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.mimeType = data.readString8(); 105227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptApiType = data.readInt32(); 105327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.status = data.readInt32(); 105427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = NULL; 105527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 105627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferLength = data.readInt32(); 105727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (INVALID_BUFFER_LENGTH != bufferLength) { 105827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = new DecryptInfo(); 105927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo->decryptBufferLength = bufferLength; 106027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 106127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10622272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status 10632272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi = setPlaybackStatus(uniqueId, &handle, data.readInt32(), data.readInt32()); 10642272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 106527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 106627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete handle.decryptInfo; handle.decryptInfo = NULL; 106727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 106827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 106927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 107027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case VALIDATE_ACTION: 107127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 107227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION"); 107327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 107427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 107527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi bool result = validateAction( 107627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.readInt32(), 107727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.readString8(), 107827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi data.readInt32(), 107927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ActionDescription(data.readInt32(), data.readInt32())); 108027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 108127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(result); 108227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 108327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 108427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 108527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case REMOVE_RIGHTS: 108627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 108727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS"); 108827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 108927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 10902272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = removeRights(data.readInt32(), data.readString8()); 10912272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 109227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 109327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 109427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 109527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 109627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case REMOVE_ALL_RIGHTS: 109727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 109827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS"); 109927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 110027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 11012272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = removeAllRights(data.readInt32()); 11022272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 110327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 110427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 110527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 110627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 110727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case OPEN_CONVERT_SESSION: 110827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 110927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION"); 111027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 111127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 111227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int convertId = openConvertSession(data.readInt32(), data.readString8()); 111327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 111427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(convertId); 111527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 111627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 111727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 111827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CONVERT_DATA: 111927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 112027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :CONVERT_DATA"); 112127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 112227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 112327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 112427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int convertId = data.readInt32(); 112527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 112627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling input data 112727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = data.readInt32(); 112827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize); 112927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 113027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* drmConvertedStatus = convertData(uniqueId, convertId, inputData); 113127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 113227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConvertedStatus) { 113327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Drm Converted Ststus 113427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmConvertedStatus->statusCode); 113527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmConvertedStatus->offset); 113627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 113727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConvertedStatus->convertedData) { 113827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer* convertedData = drmConvertedStatus->convertedData; 113927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = convertedData->length; 114027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize); 114127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 114227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(convertedData->data, bufferSize); 114327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 114427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] convertedData->data; 114527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete convertedData; convertedData = NULL; 114627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 114727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 114827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete inputData; inputData = NULL; 114927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmConvertedStatus; drmConvertedStatus = NULL; 115027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 115127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 115227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 115327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CLOSE_CONVERT_SESSION: 115427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 115527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION"); 115627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 115727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 115827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmConvertedStatus* drmConvertedStatus 115927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = closeConvertSession(data.readInt32(), data.readInt32()); 116027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 116127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConvertedStatus) { 116227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Drm Converted Ststus 116327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmConvertedStatus->statusCode); 116427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmConvertedStatus->offset); 116527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 116627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != drmConvertedStatus->convertedData) { 116727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const DrmBuffer* convertedData = drmConvertedStatus->convertedData; 116827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = convertedData->length; 116927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(bufferSize); 117027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < bufferSize) { 117127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(convertedData->data, bufferSize); 117227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 117327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] convertedData->data; 117427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete convertedData; convertedData = NULL; 117527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 117627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 117727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete drmConvertedStatus; drmConvertedStatus = NULL; 117827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 117927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 118027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 118127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case GET_ALL_SUPPORT_INFO: 118227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 118327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO"); 118427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 118527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 118627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 118727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi int length = 0; 118827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo* drmSupportInfoArray = NULL; 118927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 119027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray); 119127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 119227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(length); 119327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi for (int i = 0; i < length; ++i) { 119427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i]; 119527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 119627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmSupportInfo.getFileSuffixCount()); 119727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo::FileSuffixIterator fileSuffixIt 119827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = drmSupportInfo.getFileSuffixIterator(); 119927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (fileSuffixIt.hasNext()) { 120027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(fileSuffixIt.next()); 120127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 120227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 120327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(drmSupportInfo.getMimeTypeCount()); 120427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator(); 120527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi while (mimeTypeIt.hasNext()) { 120627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(mimeTypeIt.next()); 120727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 120827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(drmSupportInfo.getDescription()); 120927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 121027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] drmSupportInfoArray; drmSupportInfoArray = NULL; 121127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 121227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 121327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 121427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 121527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case OPEN_DECRYPT_SESSION: 121627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 121727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION"); 121827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 121927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 122027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 122127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int fd = data.readFileDescriptor(); 122227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 122327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle* handle 122427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = openDecryptSession(uniqueId, fd, data.readInt32(), data.readInt32()); 122527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 122627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != handle) { 122727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(handle->decryptId); 122827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeString8(handle->mimeType); 122927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(handle->decryptApiType); 123027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(handle->status); 123127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (NULL != handle->decryptInfo) { 123227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(handle->decryptInfo->decryptBufferLength); 123327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete handle->decryptInfo; handle->decryptInfo = NULL; 123427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 123527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } else { 123627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGE("NULL decryptHandle is returned"); 123727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 123827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete handle; handle = NULL; 123927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 124027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 124127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 124227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case CLOSE_DECRYPT_SESSION: 124327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 124427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION"); 124527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 124627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 124727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 124827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 124927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle* handle = new DecryptHandle(); 125027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptId = data.readInt32(); 125127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->mimeType = data.readString8(); 125227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptApiType = data.readInt32(); 125327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->status = data.readInt32(); 125427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptInfo = NULL; 125527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 125627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferLength = data.readInt32(); 125727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (INVALID_BUFFER_LENGTH != bufferLength) { 125827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptInfo = new DecryptInfo(); 125927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle->decryptInfo->decryptBufferLength = bufferLength; 126027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 126127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 12622272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = closeDecryptSession(uniqueId, handle); 12632272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 126427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 126527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 126627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 126727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case INITIALIZE_DECRYPT_UNIT: 126827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 126927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT"); 127027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 127127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 127227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 127327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 127427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 127527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptId = data.readInt32(); 127627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.mimeType = data.readString8(); 127727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptApiType = data.readInt32(); 127827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.status = data.readInt32(); 127927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = NULL; 128027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 128127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferLength = data.readInt32(); 128227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (INVALID_BUFFER_LENGTH != bufferLength) { 128327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = new DecryptInfo(); 128427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo->decryptBufferLength = bufferLength; 128527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 128627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int decryptUnitId = data.readInt32(); 128727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 128827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi //Filling Header info 128927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferSize = data.readInt32(); 129027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* headerInfo = NULL; 129127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize); 129227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 12932272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status 12942272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo); 12952272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 129627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 129727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete handle.decryptInfo; handle.decryptInfo = NULL; 129827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete headerInfo; headerInfo = NULL; 129927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 130027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 130127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 130227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case DECRYPT: 130327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 130427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :DECRYPT"); 130527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 130627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 130727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 130827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 130927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 131027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptId = data.readInt32(); 131127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.mimeType = data.readString8(); 131227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptApiType = data.readInt32(); 131327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.status = data.readInt32(); 131427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = NULL; 131527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 131627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferLength = data.readInt32(); 131727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (INVALID_BUFFER_LENGTH != bufferLength) { 131827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = new DecryptInfo(); 131927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo->decryptBufferLength = bufferLength; 132027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 132127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int decryptUnitId = data.readInt32(); 132227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int decBufferSize = data.readInt32(); 132327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 132427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int encBufferSize = data.readInt32(); 132527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* encBuffer 132627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize); 132727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 132827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* buffer = NULL; 132927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi buffer = new char[decBufferSize]; 133027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize); 133127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13322272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi DrmBuffer* IV = NULL; 13332272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi if (0 != data.dataAvail()) { 13342272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const int ivBufferlength = data.readInt32(); 13352272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength); 13362272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi } 13372272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi 13382272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status 13392272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi = decrypt(uniqueId, &handle, decryptUnitId, encBuffer, &decBuffer, IV); 134027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 134127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(status); 134227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 134327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int size = decBuffer->length; 134427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(size); 134527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(decBuffer->data, size); 134627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 134727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete handle.decryptInfo; handle.decryptInfo = NULL; 134827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete encBuffer; encBuffer = NULL; 134927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete decBuffer; decBuffer = NULL; 135027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] buffer; buffer = NULL; 13512272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi delete IV; IV = NULL; 135227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 135327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 135427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 135527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case FINALIZE_DECRYPT_UNIT: 135627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 135727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT"); 135827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 135927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 136027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 136127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 136227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 136327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptId = data.readInt32(); 136427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.mimeType = data.readString8(); 136527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptApiType = data.readInt32(); 136627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.status = data.readInt32(); 136727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = NULL; 136827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 136927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferLength = data.readInt32(); 137027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (INVALID_BUFFER_LENGTH != bufferLength) { 137127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = new DecryptInfo(); 137227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo->decryptBufferLength = bufferLength; 137327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 137427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 13752272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32()); 13762272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi reply->writeInt32(status); 137727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 137827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete handle.decryptInfo; handle.decryptInfo = NULL; 137927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 138027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 138127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 138227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi case PREAD: 138327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi { 138427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi LOGV("BnDrmManagerService::onTransact :READ"); 138527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi CHECK_INTERFACE(IDrmManagerService, data, reply); 138627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 138727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int uniqueId = data.readInt32(); 138827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 138927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi DecryptHandle handle; 139027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptId = data.readInt32(); 139127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.mimeType = data.readString8(); 139227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptApiType = data.readInt32(); 139327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.status = data.readInt32(); 139427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = NULL; 139527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 139627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int bufferLength = data.readInt32(); 139727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (INVALID_BUFFER_LENGTH != bufferLength) { 139827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo = new DecryptInfo(); 139927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi handle.decryptInfo->decryptBufferLength = bufferLength; 140027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 140127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 140227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const int numBytes = data.readInt32(); 140327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi char* buffer = new char[numBytes]; 140427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 140527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi const off_t offset = data.readInt32(); 140627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 140727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi ssize_t result = pread(uniqueId, &handle, buffer, numBytes, offset); 140827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->writeInt32(result); 140927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi if (0 < result) { 141027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi reply->write(buffer, result); 141127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 141227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 141327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete handle.decryptInfo; handle.decryptInfo = NULL; 141427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi delete [] buffer, buffer = NULL; 141527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return DRM_NO_ERROR; 141627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 141727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 141827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi default: 141927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi return BBinder::onTransact(code, data, reply, flags); 142027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi } 142127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi} 142227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi 1423