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