IDrmManagerService.cpp revision 197f047db2909c3d8cc84b95f69d18410a935fb8
1d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines/* 2d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines * Copyright (C) 2010 The Android Open Source Project 3d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines * 4d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines * Licensed under the Apache License, Version 2.0 (the "License"); 5d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines * you may not use this file except in compliance with the License. 6d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines * You may obtain a copy of the License at 7d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines * 8d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines * http://www.apache.org/licenses/LICENSE-2.0 9d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines * 10d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines * Unless required by applicable law or agreed to in writing, software 11d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines * distributed under the License is distributed on an "AS IS" BASIS, 12d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines * See the License for the specific language governing permissions and 14d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines * limitations under the License. 158bb06b7c40b14ce2dae414b0aa034e9b23b278c9Stephen Hines */ 16d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 17d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines//#define LOG_NDEBUG 0 1823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines#define LOG_TAG "IDrmManagerService(Native)" 1923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines#include <utils/Log.h> 2023c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 21c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines#include <stdint.h> 2223c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines#include <sys/types.h> 2323c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines#include <binder/IPCThreadState.h> 2423c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 2523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines#include <drm/DrmInfo.h> 2623c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines#include <drm/DrmConstraints.h> 27c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines#include <drm/DrmMetadata.h> 2823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines#include <drm/DrmRights.h> 29d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#include <drm/DrmInfoStatus.h> 30d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#include <drm/DrmConvertedStatus.h> 31d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#include <drm/DrmInfoRequest.h> 32d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#include <drm/DrmSupportInfo.h> 3323c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 34d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#include "IDrmManagerService.h" 35d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 36d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines#define INVALID_BUFFER_LENGTH -1 37d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 38d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesusing namespace android; 39d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 40d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesstatic void writeDecryptHandleToParcelData( 41d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const DecryptHandle* handle, Parcel* data) { 42d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data->writeInt32(handle->decryptId); 43d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data->writeString8(handle->mimeType); 44d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data->writeInt32(handle->decryptApiType); 45d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data->writeInt32(handle->status); 46d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 47d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines int size = handle->copyControlVector.size(); 48d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data->writeInt32(size); 49d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines for (int i = 0; i < size; i++) { 50d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data->writeInt32(handle->copyControlVector.keyAt(i)); 51d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data->writeInt32(handle->copyControlVector.valueAt(i)); 52d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 53d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 54d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines size = handle->extendedData.size(); 55d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data->writeInt32(size); 56d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines for (int i = 0; i < size; i++) { 57d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data->writeString8(handle->extendedData.keyAt(i)); 58d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data->writeString8(handle->extendedData.valueAt(i)); 59d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 60c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 61d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (NULL != handle->decryptInfo) { 62d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data->writeInt32(handle->decryptInfo->decryptBufferLength); 63d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } else { 64d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data->writeInt32(INVALID_BUFFER_LENGTH); 65d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 66d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 67d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 68d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesstatic void readDecryptHandleFromParcelData( 69d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DecryptHandle* handle, const Parcel& data) { 70d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 == data.dataAvail()) { 71d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return; 72d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 73d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 74d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines handle->decryptId = data.readInt32(); 75d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines handle->mimeType = data.readString8(); 76d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines handle->decryptApiType = data.readInt32(); 77d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines handle->status = data.readInt32(); 78d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 79d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines int size = data.readInt32(); 80d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines for (int i = 0; i < size; i++) { 81d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmCopyControl key = (DrmCopyControl)data.readInt32(); 82d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines int value = data.readInt32(); 83d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines handle->copyControlVector.add(key, value); 84d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 85d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 86d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines size = data.readInt32(); 87d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines for (int i = 0; i < size; i++) { 88d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines String8 key = data.readString8(); 89d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines String8 value = data.readString8(); 90d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines handle->extendedData.add(key, value); 91d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 92d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 93d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines handle->decryptInfo = NULL; 94d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int bufferLen = data.readInt32(); 95d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (INVALID_BUFFER_LENGTH != bufferLen) { 96d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines handle->decryptInfo = new DecryptInfo(); 97d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines handle->decryptInfo->decryptBufferLength = bufferLen; 98d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 99d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 100d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 101d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesstatic void clearDecryptHandle(DecryptHandle* handle) { 102d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (handle == NULL) { 103d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return; 104d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 105d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (handle->decryptInfo) { 106d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete handle->decryptInfo; 107d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines handle->decryptInfo = NULL; 108d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 109d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines handle->copyControlVector.clear(); 110d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines handle->extendedData.clear(); 111d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 112d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 113d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesint BpDrmManagerService::addUniqueId(bool isNative) { 114d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("add uniqueid"); 115d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel data, reply; 116d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 117d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(isNative); 118d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(ADD_UNIQUEID, data, &reply); 119d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return reply.readInt32(); 120d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 121d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 122d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesvoid BpDrmManagerService::removeUniqueId(int uniqueId) { 123d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("remove uniqueid"); 124d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel data, reply; 125d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 126d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(uniqueId); 127d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(REMOVE_UNIQUEID, data, &reply); 128d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 129d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 130d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesvoid BpDrmManagerService::addClient(int uniqueId) { 131d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel data, reply; 132d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 133d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(uniqueId); 134d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(ADD_CLIENT, data, &reply); 135d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 136d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 137d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesvoid BpDrmManagerService::removeClient(int uniqueId) { 138d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel data, reply; 139d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 140d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(uniqueId); 141d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(REMOVE_CLIENT, data, &reply); 142d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 143d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 144d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesstatus_t BpDrmManagerService::setDrmServiceListener( 145d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) { 146d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("setDrmServiceListener"); 147d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel data, reply; 148d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 149d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 150d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(uniqueId); 151d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeStrongBinder(drmServiceListener->asBinder()); 152d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(SET_DRM_SERVICE_LISTENER, data, &reply); 153d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return reply.readInt32(); 154d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 155d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 156d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesstatus_t BpDrmManagerService::installDrmEngine(int uniqueId, const String8& drmEngineFile) { 157d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("Install DRM Engine"); 158d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel data, reply; 159d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 160d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 16123c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines data.writeInt32(uniqueId); 162d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeString8(drmEngineFile); 163d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 164d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(INSTALL_DRM_ENGINE, data, &reply); 165d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return reply.readInt32(); 166d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 167d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 16823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen HinesDrmConstraints* BpDrmManagerService::getConstraints( 1698bb06b7c40b14ce2dae414b0aa034e9b23b278c9Stephen Hines int uniqueId, const String8* path, const int action) { 1708bb06b7c40b14ce2dae414b0aa034e9b23b278c9Stephen Hines LOGV("Get Constraints"); 1718bb06b7c40b14ce2dae414b0aa034e9b23b278c9Stephen Hines Parcel data, reply; 1728bb06b7c40b14ce2dae414b0aa034e9b23b278c9Stephen Hines 173d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 1748bb06b7c40b14ce2dae414b0aa034e9b23b278c9Stephen Hines data.writeInt32(uniqueId); 1758bb06b7c40b14ce2dae414b0aa034e9b23b278c9Stephen Hines data.writeString8(*path); 176d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(action); 177d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 178d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(GET_CONSTRAINTS_FROM_CONTENT, data, &reply); 179d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 180d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmConstraints* drmConstraints = NULL; 181d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 != reply.dataAvail()) { 182d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines //Filling Drm Constraints 183d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines drmConstraints = new DrmConstraints(); 184d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 185d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int size = reply.readInt32(); 186d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines for (int index = 0; index < size; ++index) { 187d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 key(reply.readString8()); 188d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int bufferSize = reply.readInt32(); 189d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines char* data = NULL; 190d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 < bufferSize) { 191d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data = new char[bufferSize]; 192d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply.read(data, bufferSize); 193d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 194d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines drmConstraints->put(&key, data); 195d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 196d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 197d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return drmConstraints; 198d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 199d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 200d711dec946b6408791ca59eb98e363ef04bbd4aaStephen HinesDrmMetadata* BpDrmManagerService::getMetadata(int uniqueId, const String8* path) { 201d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("Get Metadata"); 202d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel data, reply; 203d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 204d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(uniqueId); 205d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 206d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmMetadata* drmMetadata = NULL; 207d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeString8(*path); 208d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(GET_METADATA_FROM_CONTENT, data, &reply); 209d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 210d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 != reply.dataAvail()) { 211d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines //Filling Drm Metadata 212d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines drmMetadata = new DrmMetadata(); 213d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 214d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int size = reply.readInt32(); 215d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines for (int index = 0; index < size; ++index) { 216d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 key(reply.readString8()); 217d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int bufferSize = reply.readInt32(); 218d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines char* data = NULL; 219d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 < bufferSize) { 220d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data = new char[bufferSize]; 221d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply.read(data, bufferSize); 222d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 223d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines drmMetadata->put(&key, data); 224d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 225d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 226d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return drmMetadata; 227d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 228d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 229d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesbool BpDrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) { 230d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("Can Handle"); 231d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel data, reply; 23223c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 233d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 234d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(uniqueId); 235d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 236d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeString8(path); 237d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeString8(mimeType); 238d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 239d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(CAN_HANDLE, data, &reply); 240d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 241d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return static_cast<bool>(reply.readInt32()); 242d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 243d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 244d711dec946b6408791ca59eb98e363ef04bbd4aaStephen HinesDrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) { 245d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("Process DRM Info"); 246d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel data, reply; 247d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 248d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 249d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(uniqueId); 250d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 251d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines //Filling DRM info 252d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(drmInfo->getInfoType()); 253d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const DrmBuffer dataBuffer = drmInfo->getData(); 2540da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines const int dataBufferSize = dataBuffer.length; 2550da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines data.writeInt32(dataBufferSize); 2560da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines if (0 < dataBufferSize) { 2570da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines data.write(dataBuffer.data, dataBufferSize); 2580da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines } 2590da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines data.writeString8(drmInfo->getMimeType()); 260d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 2610da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines data.writeInt32(drmInfo->getCount()); 2620da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines DrmInfo::KeyIterator keyIt = drmInfo->keyIterator(); 2630da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines 264d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines while (keyIt.hasNext()) { 265d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 key = keyIt.next(); 266d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeString8(key); 267d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 value = drmInfo->get(key); 268d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeString8((value == String8("")) ? String8("NULL") : value); 269d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 270d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 271d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(PROCESS_DRM_INFO, data, &reply); 272d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 273d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmInfoStatus* drmInfoStatus = NULL; 274d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 != reply.dataAvail()) { 275d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines //Filling DRM Info Status 276d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int statusCode = reply.readInt32(); 277d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int infoType = reply.readInt32(); 278d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 mimeType = reply.readString8(); 279d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 280d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmBuffer* drmBuffer = NULL; 281d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 != reply.dataAvail()) { 282d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int bufferSize = reply.readInt32(); 283d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines char* data = NULL; 284d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 < bufferSize) { 285d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data = new char[bufferSize]; 286d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply.read(data, bufferSize); 287d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 288d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines drmBuffer = new DrmBuffer(data, bufferSize); 289d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 290d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines drmInfoStatus = new DrmInfoStatus(statusCode, infoType, drmBuffer, mimeType); 291d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 292d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return drmInfoStatus; 293d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 294d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 295d711dec946b6408791ca59eb98e363ef04bbd4aaStephen HinesDrmInfo* BpDrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) { 296d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("Acquire DRM Info"); 297d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel data, reply; 29823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 299d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 300d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(uniqueId); 301d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 302d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines //Filling DRM Info Request 303d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(drmInforequest->getInfoType()); 304d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeString8(drmInforequest->getMimeType()); 305d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 306d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(drmInforequest->getCount()); 307d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmInfoRequest::KeyIterator keyIt = drmInforequest->keyIterator(); 308d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 309d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines while (keyIt.hasNext()) { 310d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 key = keyIt.next(); 311d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeString8(key); 312d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 value = drmInforequest->get(key); 313d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeString8((value == String8("")) ? String8("NULL") : value); 314d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 315d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 316d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(ACQUIRE_DRM_INFO, data, &reply); 317d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 318d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmInfo* drmInfo = NULL; 319d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 != reply.dataAvail()) { 320d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines //Filling DRM Info 321d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int infoType = reply.readInt32(); 322d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int bufferSize = reply.readInt32(); 323d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines char* data = NULL; 324d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 325d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 < bufferSize) { 326d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data = new char[bufferSize]; 327d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply.read(data, bufferSize); 328d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 329d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines drmInfo = new DrmInfo(infoType, DrmBuffer(data, bufferSize), reply.readString8()); 330d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 331d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int size = reply.readInt32(); 332d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines for (int index = 0; index < size; ++index) { 333d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 key(reply.readString8()); 334d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 value(reply.readString8()); 335d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines drmInfo->put(key, (value == String8("NULL")) ? String8("") : value); 336d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 337d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 338d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return drmInfo; 339d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 340d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 341d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesstatus_t BpDrmManagerService::saveRights( 342d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines int uniqueId, const DrmRights& drmRights, 343d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8& rightsPath, const String8& contentPath) { 344c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines LOGV("Save Rights"); 345c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines Parcel data, reply; 346c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 347c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 348c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInt32(uniqueId); 349c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 350c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines //Filling Drm Rights 351c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines const DrmBuffer dataBuffer = drmRights.getData(); 352c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInt32(dataBuffer.length); 353c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.write(dataBuffer.data, dataBuffer.length); 354c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 355c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines const String8 mimeType = drmRights.getMimeType(); 356c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeString8((mimeType == String8("")) ? String8("NULL") : mimeType); 357c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 358c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines const String8 accountId = drmRights.getAccountId(); 359c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeString8((accountId == String8("")) ? String8("NULL") : accountId); 360c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 361c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines const String8 subscriptionId = drmRights.getSubscriptionId(); 362c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeString8((subscriptionId == String8("")) ? String8("NULL") : subscriptionId); 363c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 364c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeString8((rightsPath == String8("")) ? String8("NULL") : rightsPath); 365c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeString8((contentPath == String8("")) ? String8("NULL") : contentPath); 366c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 367c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines remote()->transact(SAVE_RIGHTS, data, &reply); 368d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return reply.readInt32(); 369d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 370d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 371d711dec946b6408791ca59eb98e363ef04bbd4aaStephen HinesString8 BpDrmManagerService::getOriginalMimeType(int uniqueId, const String8& path) { 372c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines LOGV("Get Original MimeType"); 373c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines Parcel data, reply; 374d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 375d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 376d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(uniqueId); 377d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeString8(path); 378d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 379d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(GET_ORIGINAL_MIMETYPE, data, &reply); 380d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return reply.readString8(); 381c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines} 382c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 383d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesint BpDrmManagerService::getDrmObjectType( 384d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines int uniqueId, const String8& path, const String8& mimeType) { 385d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("Get Drm object type"); 386d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel data, reply; 387d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 388d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 389d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(uniqueId); 390d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeString8(path); 391d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeString8(mimeType); 392d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 393d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(GET_DRM_OBJECT_TYPE, data, &reply); 394d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 395d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return reply.readInt32(); 396d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 397d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 398d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesint BpDrmManagerService::checkRightsStatus(int uniqueId, const String8& path, int action) { 399d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("checkRightsStatus"); 400d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel data, reply; 401c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 402c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 403c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInt32(uniqueId); 404d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeString8(path); 405d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(action); 406d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 407d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(CHECK_RIGHTS_STATUS, data, &reply); 408d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 409d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return reply.readInt32(); 410d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 411d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 412d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesstatus_t BpDrmManagerService::consumeRights( 413d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) { 414c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines LOGV("consumeRights"); 415c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines Parcel data, reply; 416c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 417c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 418d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(uniqueId); 419c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 420d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines writeDecryptHandleToParcelData(decryptHandle, &data); 421c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 422d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(action); 423d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(static_cast< int>(reserve)); 424d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 425d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(CONSUME_RIGHTS, data, &reply); 426d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return reply.readInt32(); 427c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines} 428c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 429c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hinesstatus_t BpDrmManagerService::setPlaybackStatus( 430d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) { 431c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines LOGV("setPlaybackStatus"); 432d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel data, reply; 433c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 434d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 435d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(uniqueId); 436d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 437d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines writeDecryptHandleToParcelData(decryptHandle, &data); 438c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 439d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(playbackStatus); 440c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInt64(position); 441d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 442c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines remote()->transact(SET_PLAYBACK_STATUS, data, &reply); 443d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return reply.readInt32(); 444d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 445d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 446d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesbool BpDrmManagerService::validateAction( 447d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines int uniqueId, const String8& path, 448d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines int action, const ActionDescription& description) { 449d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("validateAction"); 450d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel data, reply; 451d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 452d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 453d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(uniqueId); 454d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeString8(path); 455d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(action); 456d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(description.outputType); 457d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(description.configuration); 458d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 459d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(VALIDATE_ACTION, data, &reply); 460d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 461d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return static_cast<bool>(reply.readInt32()); 462d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 463d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 464d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesstatus_t BpDrmManagerService::removeRights(int uniqueId, const String8& path) { 465d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("removeRights"); 466d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel data, reply; 467d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 468d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 469d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(uniqueId); 470d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeString8(path); 471d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 472d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(REMOVE_RIGHTS, data, &reply); 473d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return reply.readInt32(); 474d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 475d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 476d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesstatus_t BpDrmManagerService::removeAllRights(int uniqueId) { 477d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("removeAllRights"); 478c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines Parcel data, reply; 479d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 480d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 481d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(uniqueId); 482d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 483d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(REMOVE_ALL_RIGHTS, data, &reply); 484c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines return reply.readInt32(); 485c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines} 486c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 487c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hinesint BpDrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) { 488d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("openConvertSession"); 489c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines Parcel data, reply; 490c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 491c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 492c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInt32(uniqueId); 493c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeString8(mimeType); 494d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 495d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(OPEN_CONVERT_SESSION, data, &reply); 496c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines return reply.readInt32(); 497c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines} 498d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 499d711dec946b6408791ca59eb98e363ef04bbd4aaStephen HinesDrmConvertedStatus* BpDrmManagerService::convertData( 500d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines int uniqueId, int convertId, const DrmBuffer* inputData) { 501d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("convertData"); 502d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel data, reply; 503d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 504d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 505d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(uniqueId); 506d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(convertId); 507c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInt32(inputData->length); 508d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.write(inputData->data, inputData->length); 509d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 510c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines remote()->transact(CONVERT_DATA, data, &reply); 511c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 512c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines DrmConvertedStatus* drmConvertedStatus = NULL; 513d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 514c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines if (0 != reply.dataAvail()) { 515c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines //Filling DRM Converted Status 516c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines const int statusCode = reply.readInt32(); 517d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const off64_t offset = reply.readInt64(); 518c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 519c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines DrmBuffer* convertedData = NULL; 520d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 != reply.dataAvail()) { 521d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int bufferSize = reply.readInt32(); 522d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines char* data = NULL; 523d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 < bufferSize) { 524d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data = new char[bufferSize]; 525d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply.read(data, bufferSize); 526d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 527c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines convertedData = new DrmBuffer(data, bufferSize); 528d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 529c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset); 530c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines } 531c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines return drmConvertedStatus; 532c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines} 533d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 534d711dec946b6408791ca59eb98e363ef04bbd4aaStephen HinesDrmConvertedStatus* BpDrmManagerService::closeConvertSession(int uniqueId, int convertId) { 535d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("closeConvertSession"); 536d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel data, reply; 537d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 538d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 539d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(uniqueId); 540d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(convertId); 541d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 542c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines remote()->transact(CLOSE_CONVERT_SESSION, data, &reply); 543d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 544d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmConvertedStatus* drmConvertedStatus = NULL; 545d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 546d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 != reply.dataAvail()) { 547c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines //Filling DRM Converted Status 548d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int statusCode = reply.readInt32(); 549d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const off64_t offset = reply.readInt64(); 550c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 5510da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines DrmBuffer* convertedData = NULL; 5520da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines if (0 != reply.dataAvail()) { 5530da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines const int bufferSize = reply.readInt32(); 5540da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines char* data = NULL; 5550da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines if (0 < bufferSize) { 5560da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines data = new char[bufferSize]; 5570da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines reply.read(data, bufferSize); 5580da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines } 5590da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines convertedData = new DrmBuffer(data, bufferSize); 5600da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines } 5610da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset); 5620da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines } 5630da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines return drmConvertedStatus; 564d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 565d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 566d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesstatus_t BpDrmManagerService::getAllSupportInfo( 567d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) { 568d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("Get All Support Info"); 569c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines Parcel data, reply; 570c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 571c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 572c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInt32(uniqueId); 573c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 574c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines remote()->transact(GET_ALL_SUPPORT_INFO, data, &reply); 575c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 576c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines //Filling DRM Support Info 577c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines const int arraySize = reply.readInt32(); 578c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines if (0 < arraySize) { 579c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines *drmSupportInfoArray = new DrmSupportInfo[arraySize]; 580c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 581c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines for (int index = 0; index < arraySize; ++index) { 582c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines DrmSupportInfo drmSupportInfo; 583c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 584d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int fileSuffixVectorSize = reply.readInt32(); 585c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines for (int i = 0; i < fileSuffixVectorSize; ++i) { 586c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines drmSupportInfo.addFileSuffix(reply.readString8()); 587c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines } 588c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 589c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines const int mimeTypeVectorSize = reply.readInt32(); 590c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines for (int i = 0; i < mimeTypeVectorSize; ++i) { 591d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines drmSupportInfo.addMimeType(reply.readString8()); 592c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines } 593c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 594c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines drmSupportInfo.setDescription(reply.readString8()); 595c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines (*drmSupportInfoArray)[index] = drmSupportInfo; 596c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines } 597c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines } 598c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines *length = arraySize; 599d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return reply.readInt32(); 600d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 601c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 602d711dec946b6408791ca59eb98e363ef04bbd4aaStephen HinesDecryptHandle* BpDrmManagerService::openDecryptSession( 603d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines int uniqueId, int fd, off64_t offset, off64_t length) { 604d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("Entering BpDrmManagerService::openDecryptSession"); 605c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines Parcel data, reply; 606c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 607c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 608c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInt32(uniqueId); 609c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeFileDescriptor(fd); 610c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInt64(offset); 611c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInt64(length); 612c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 613c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines remote()->transact(OPEN_DECRYPT_SESSION, data, &reply); 614c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 615c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines DecryptHandle* handle = NULL; 616c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines if (0 != reply.dataAvail()) { 617c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines handle = new DecryptHandle(); 618c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines readDecryptHandleFromParcelData(handle, reply); 619c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines } 620c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines return handle; 621c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines} 622c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 623c706907a8041faaa882f9bd87f1d1c1669023a62Stephen HinesDecryptHandle* BpDrmManagerService::openDecryptSession(int uniqueId, const char* uri) { 624c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines LOGV("Entering BpDrmManagerService::openDecryptSession"); 625d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel data, reply; 626d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 627d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 628c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInt32(uniqueId); 629c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeString8(String8(uri)); 630c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 631c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines remote()->transact(OPEN_DECRYPT_SESSION_FROM_URI, data, &reply); 632c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 633c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines DecryptHandle* handle = NULL; 634c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines if (0 != reply.dataAvail()) { 635d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines handle = new DecryptHandle(); 636c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines readDecryptHandleFromParcelData(handle, reply); 637c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines } else { 638c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines LOGV("no decryptHandle is generated in service side"); 639c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines } 640c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines return handle; 641c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines} 642c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 643c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hinesstatus_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) { 644d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("closeDecryptSession"); 645c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines Parcel data, reply; 646c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 647c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 648c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInt32(uniqueId); 649c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 650c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines writeDecryptHandleToParcelData(decryptHandle, &data); 651c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 652c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply); 653c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 654c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines return reply.readInt32(); 655c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines} 656c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 657c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hinesstatus_t BpDrmManagerService::initializeDecryptUnit( 658c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines int uniqueId, DecryptHandle* decryptHandle, 659c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines int decryptUnitId, const DrmBuffer* headerInfo) { 660c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines LOGV("initializeDecryptUnit"); 661d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel data, reply; 662c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 663c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 664c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInt32(uniqueId); 665c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 666c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines writeDecryptHandleToParcelData(decryptHandle, &data); 667c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 668c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInt32(decryptUnitId); 669c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 670c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInt32(headerInfo->length); 671d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.write(headerInfo->data, headerInfo->length); 672c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 673c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply); 674c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines return reply.readInt32(); 675c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines} 676c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 677c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hinesstatus_t BpDrmManagerService::decrypt( 678c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId, 679c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) { 680c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines LOGV("decrypt"); 681c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines Parcel data, reply; 682c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 683c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 684c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInt32(uniqueId); 685c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 686c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines writeDecryptHandleToParcelData(decryptHandle, &data); 687d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 688c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInt32(decryptUnitId); 689c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInt32((*decBuffer)->length); 690c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 691c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInt32(encBuffer->length); 692c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.write(encBuffer->data, encBuffer->length); 693c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 694c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines if (NULL != IV) { 695c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInt32(IV->length); 696c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.write(IV->data, IV->length); 697c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines } 698c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 699d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(DECRYPT, data, &reply); 700d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 701d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const status_t status = reply.readInt32(); 702c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines LOGV("Return value of decrypt() is %d", status); 703d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 704c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines const int size = reply.readInt32(); 705c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines (*decBuffer)->length = size; 706c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines reply.read((void *)(*decBuffer)->data, size); 707d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 708d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return status; 709d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 710c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 711c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hinesstatus_t BpDrmManagerService::finalizeDecryptUnit( 712d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) { 713d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("finalizeDecryptUnit"); 714d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel data, reply; 715d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 716c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 717d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(uniqueId); 718d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 719d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines writeDecryptHandleToParcelData(decryptHandle, &data); 720d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 721d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(decryptUnitId); 722d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 723d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply); 724c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines return reply.readInt32(); 725c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines} 726c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 727c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hinesssize_t BpDrmManagerService::pread( 728c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines int uniqueId, DecryptHandle* decryptHandle, void* buffer, 729c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines ssize_t numBytes, off64_t offset) { 730c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines LOGV("read"); 731c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines Parcel data, reply; 732c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines int result; 733c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 73423c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor()); 735d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(uniqueId); 736d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 737d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines writeDecryptHandleToParcelData(decryptHandle, &data); 738d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 739d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt32(numBytes); 740d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines data.writeInt64(offset); 741d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 742d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines remote()->transact(PREAD, data, &reply); 743d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines result = reply.readInt32(); 744d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 < result) { 745d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply.read(buffer, result); 746d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 747d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return result; 748c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines} 74923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 750d711dec946b6408791ca59eb98e363ef04bbd4aaStephen HinesIMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService"); 751d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 752d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hinesstatus_t BnDrmManagerService::onTransact( 753d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines uint32_t code, const Parcel& data, 754d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines Parcel* reply, uint32_t flags) { 75523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines LOGV("Entering BnDrmManagerService::onTransact with code %d", code); 756d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 757d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines switch (code) { 758d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case ADD_UNIQUEID: 759d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 76023c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines LOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID"); 761d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 762d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines int uniqueId = addUniqueId(data.readInt32()); 763c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines reply->writeInt32(uniqueId); 764d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 765d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 766d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 767d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case REMOVE_UNIQUEID: 768d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 769d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID"); 770d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 771d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines removeUniqueId(data.readInt32()); 772d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 773d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 774d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 775d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case ADD_CLIENT: 776d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 777d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :ADD_CLIENT"); 778d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 77923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines addClient(data.readInt32()); 780d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 781d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 782d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 78323c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines case REMOVE_CLIENT: 784d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 785d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :REMOVE_CLIENT"); 786d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 787d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines removeClient(data.readInt32()); 78823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines return DRM_NO_ERROR; 789d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 790d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 791d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case SET_DRM_SERVICE_LISTENER: 792d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 793d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER"); 794d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 795d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 796c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines const int uniqueId = data.readInt32(); 797c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines const sp<IDrmServiceListener> drmServiceListener 798c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines = interface_cast<IDrmServiceListener> (data.readStrongBinder()); 799c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 800c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines status_t status = setDrmServiceListener(uniqueId, drmServiceListener); 801d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 802d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(status); 803d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 804d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 805d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 806d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case INSTALL_DRM_ENGINE: 807d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 808d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :INSTALL_DRM_ENGINE"); 809d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 810d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 811d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 812d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 engineFile = data.readString8(); 813d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines status_t status = installDrmEngine(uniqueId, engineFile); 814d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 815d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(status); 816d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 817d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 818d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 819d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case GET_CONSTRAINTS_FROM_CONTENT: 820d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 821d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT"); 822d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 823d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 824d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 825d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 path = data.readString8(); 826d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 827d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmConstraints* drmConstraints 828d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines = getConstraints(uniqueId, &path, data.readInt32()); 829d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 830d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (NULL != drmConstraints) { 831d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines //Filling DRM Constraints contents 832d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(drmConstraints->getCount()); 833d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 834d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator(); 835d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines while (keyIt.hasNext()) { 836d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 key = keyIt.next(); 837d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeString8(key); 838d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const char* value = drmConstraints->getAsByteArray(&key); 839d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines int bufferSize = 0; 840d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (NULL != value) { 841d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines bufferSize = strlen(value); 842d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 843d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(bufferSize + 1); 844d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->write(value, bufferSize + 1); 845d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 846c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines } 847d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete drmConstraints; drmConstraints = NULL; 848d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 849d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 850d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 851d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case GET_METADATA_FROM_CONTENT: 852d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 853d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :GET_METADATA_FROM_CONTENT"); 854d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 855d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 856d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 857d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 path = data.readString8(); 858d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 859d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmMetadata* drmMetadata = getMetadata(uniqueId, &path); 860d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (NULL != drmMetadata) { 861d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines //Filling DRM Metadata contents 862d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(drmMetadata->getCount()); 863d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 864d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmMetadata::KeyIterator keyIt = drmMetadata->keyIterator(); 865d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines while (keyIt.hasNext()) { 866d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 key = keyIt.next(); 867d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeString8(key); 868d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const char* value = drmMetadata->getAsByteArray(&key); 869d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines int bufferSize = 0; 870d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (NULL != value) { 871d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines bufferSize = strlen(value); 872d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(bufferSize + 1); 873d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->write(value, bufferSize + 1); 874d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } else { 875d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(0); 876d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 877d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 878d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 879d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete drmMetadata; drmMetadata = NULL; 880d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return NO_ERROR; 881d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 882d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 883d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case CAN_HANDLE: 884d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 885d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :CAN_HANDLE"); 886c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 887c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 888c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines const int uniqueId = data.readInt32(); 889c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines const String8 path = data.readString8(); 890c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines const String8 mimeType = data.readString8(); 891c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 892c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines bool result = canHandle(uniqueId, path, mimeType); 893c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 894c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines reply->writeInt32(result); 895c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines return DRM_NO_ERROR; 896c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines } 897c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 898c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines case PROCESS_DRM_INFO: 899c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines { 900c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines LOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO"); 901c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 902c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 903d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 904d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 905d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines //Filling DRM info 906d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int infoType = data.readInt32(); 907d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int bufferSize = data.readInt32(); 908d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines char* buffer = NULL; 909d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 < bufferSize) { 910d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines buffer = (char *)data.readInplace(bufferSize); 911d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 912d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const DrmBuffer drmBuffer(buffer, bufferSize); 913d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8()); 914d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 915d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int size = data.readInt32(); 916d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines for (int index = 0; index < size; ++index) { 917d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 key(data.readString8()); 918d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 value(data.readString8()); 919d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines drmInfo->put(key, (value == String8("NULL")) ? String8("") : value); 920d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 921d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 922d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo); 923d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 924d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (NULL != drmInfoStatus) { 925d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines //Filling DRM Info Status contents 926d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(drmInfoStatus->statusCode); 927d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(drmInfoStatus->infoType); 928d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeString8(drmInfoStatus->mimeType); 929d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 930d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (NULL != drmInfoStatus->drmBuffer) { 931d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer; 932d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int bufferSize = drmBuffer->length; 933d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(bufferSize); 934d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 < bufferSize) { 935d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->write(drmBuffer->data, bufferSize); 936d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 937d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete [] drmBuffer->data; 938d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete drmBuffer; drmBuffer = NULL; 939d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 940d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 941d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete drmInfo; drmInfo = NULL; 942d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete drmInfoStatus; drmInfoStatus = NULL; 943d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 944d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 94523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 946d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case ACQUIRE_DRM_INFO: 947d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 948d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO"); 949d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 95023c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 951d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 952d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 953d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines //Filling DRM info Request 954d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int infoType = data.readInt32(); 955d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 mimeType = data.readString8(); 956d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(infoType, mimeType); 957d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 958d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int size = data.readInt32(); 959d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines for (int index = 0; index < size; ++index) { 960d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 key(data.readString8()); 961d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 value(data.readString8()); 962d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value); 963d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 964d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 965d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest); 966d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 967d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (NULL != drmInfo) { 968d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines //Filling DRM Info 969d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const DrmBuffer drmBuffer = drmInfo->getData(); 970d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(drmInfo->getInfoType()); 971d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 972d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int bufferSize = drmBuffer.length; 973d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(bufferSize); 974d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 < bufferSize) { 975d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->write(drmBuffer.data, bufferSize); 976d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 977d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeString8(drmInfo->getMimeType()); 978d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(drmInfo->getCount()); 979d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 980d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmInfo::KeyIterator keyIt = drmInfo->keyIterator(); 981d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines while (keyIt.hasNext()) { 982d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 key = keyIt.next(); 983d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeString8(key); 984d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 value = drmInfo->get(key); 985d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeString8((value == String8("")) ? String8("NULL") : value); 986d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 987d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete [] drmBuffer.data; 988d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 989d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete drmInfoRequest; drmInfoRequest = NULL; 990d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete drmInfo; drmInfo = NULL; 991d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 992d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 993d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 994d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case SAVE_RIGHTS: 995d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 996d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS"); 997d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 998d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 999d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 1000d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1001d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines //Filling DRM Rights 1002d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int bufferSize = data.readInt32(); 1003d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize); 1004d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1005d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 mimeType(data.readString8()); 1006d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 accountId(data.readString8()); 1007d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 subscriptionId(data.readString8()); 1008d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 rightsPath(data.readString8()); 1009d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 contentPath(data.readString8()); 1010d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1011d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmRights drmRights(drmBuffer, 1012d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines ((mimeType == String8("NULL")) ? String8("") : mimeType), 1013d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines ((accountId == String8("NULL")) ? String8("") : accountId), 1014d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId)); 1015d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1016d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const status_t status = saveRights(uniqueId, drmRights, 1017d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines ((rightsPath == String8("NULL")) ? String8("") : rightsPath), 1018d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines ((contentPath == String8("NULL")) ? String8("") : contentPath)); 1019d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1020d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(status); 1021d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 1022d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1023d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1024d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case GET_ORIGINAL_MIMETYPE: 1025d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 1026d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE"); 1027d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 1028d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1029d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 1030d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 path = data.readString8(); 1031d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 originalMimeType = getOriginalMimeType(uniqueId, path); 1032d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1033d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeString8(originalMimeType); 1034d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 1035d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1036d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1037d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case GET_DRM_OBJECT_TYPE: 1038d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 1039d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE"); 1040d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 1041d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1042d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 1043d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 path = data.readString8(); 1044d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 mimeType = data.readString8(); 1045d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int drmObjectType = getDrmObjectType(uniqueId, path, mimeType); 1046d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1047d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(drmObjectType); 1048d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 1049d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1050d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1051d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case CHECK_RIGHTS_STATUS: 1052d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 1053d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS"); 1054d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 1055d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1056d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 1057d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 path = data.readString8(); 1058d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int action = data.readInt32(); 1059d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int result = checkRightsStatus(uniqueId, path, action); 1060d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1061d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(result); 1062d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 1063d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1064d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1065d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case CONSUME_RIGHTS: 1066d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 1067d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS"); 1068d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 1069d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1070d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 1071d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1072d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DecryptHandle handle; 1073d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines readDecryptHandleFromParcelData(&handle, data); 1074d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1075d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int action = data.readInt32(); 1076d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const bool reserve = static_cast<bool>(data.readInt32()); 1077d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const status_t status 1078d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines = consumeRights(uniqueId, &handle, action, reserve); 1079d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(status); 1080d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1081d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines clearDecryptHandle(&handle); 1082d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 1083d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1084d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1085d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case SET_PLAYBACK_STATUS: 1086d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 1087d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS"); 1088d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 1089d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1090d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 1091d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1092d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DecryptHandle handle; 1093d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines readDecryptHandleFromParcelData(&handle, data); 1094d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1095d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int playbackStatus = data.readInt32(); 1096d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int64_t position = data.readInt64(); 1097d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const status_t status 1098d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines = setPlaybackStatus(uniqueId, &handle, playbackStatus, position); 1099d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(status); 1100d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1101d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines clearDecryptHandle(&handle); 1102d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 1103d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1104d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1105d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case VALIDATE_ACTION: 1106d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 1107d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION"); 1108d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 1109d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1110d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 1111d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 path = data.readString8(); 1112d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int action = data.readInt32(); 1113d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int outputType = data.readInt32(); 1114d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int configuration = data.readInt32(); 1115d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines bool result = validateAction(uniqueId, path, action, 1116d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines ActionDescription(outputType, configuration)); 1117d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1118d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(result); 1119d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 1120d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1121d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1122d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case REMOVE_RIGHTS: 1123d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 1124d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS"); 1125d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 1126d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1127d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines int uniqueId = data.readInt32(); 1128d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines String8 path = data.readString8(); 1129d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const status_t status = removeRights(uniqueId, path); 1130d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(status); 1131d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1132d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 1133c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines } 1134d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1135c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines case REMOVE_ALL_RIGHTS: 1136d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 1137d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS"); 1138d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 1139d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1140d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const status_t status = removeAllRights(data.readInt32()); 1141d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(status); 1142d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1143d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 1144d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1145d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1146d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case OPEN_CONVERT_SESSION: 1147d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 1148d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION"); 1149d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 1150d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1151d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 1152d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 mimeType = data.readString8(); 1153d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int convertId = openConvertSession(uniqueId, mimeType); 1154d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1155d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(convertId); 1156d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 1157d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1158d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1159d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case CONVERT_DATA: 1160d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 1161d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :CONVERT_DATA"); 1162d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 1163d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1164d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 1165d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int convertId = data.readInt32(); 1166d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1167d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines //Filling input data 1168d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int bufferSize = data.readInt32(); 1169d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize); 1170d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1171d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmConvertedStatus* drmConvertedStatus = convertData(uniqueId, convertId, inputData); 1172d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1173d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (NULL != drmConvertedStatus) { 1174d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines //Filling Drm Converted Ststus 1175d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(drmConvertedStatus->statusCode); 1176d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt64(drmConvertedStatus->offset); 1177d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1178d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (NULL != drmConvertedStatus->convertedData) { 1179d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const DrmBuffer* convertedData = drmConvertedStatus->convertedData; 1180d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int bufferSize = convertedData->length; 1181d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(bufferSize); 1182d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 < bufferSize) { 1183d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->write(convertedData->data, bufferSize); 1184d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1185d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete [] convertedData->data; 1186d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete convertedData; convertedData = NULL; 1187d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1188d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1189d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete inputData; inputData = NULL; 1190d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete drmConvertedStatus; drmConvertedStatus = NULL; 1191d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 1192d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1193d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1194d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case CLOSE_CONVERT_SESSION: 1195d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 1196d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION"); 1197d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 1198d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1199d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 1200d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int convertId = data.readInt32(); 1201d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmConvertedStatus* drmConvertedStatus 1202d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines = closeConvertSession(uniqueId, convertId); 1203d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1204d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (NULL != drmConvertedStatus) { 1205d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines //Filling Drm Converted Ststus 12060da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines reply->writeInt32(drmConvertedStatus->statusCode); 1207d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt64(drmConvertedStatus->offset); 1208d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1209d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (NULL != drmConvertedStatus->convertedData) { 1210d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const DrmBuffer* convertedData = drmConvertedStatus->convertedData; 1211d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int bufferSize = convertedData->length; 1212d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(bufferSize); 1213d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 < bufferSize) { 1214d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->write(convertedData->data, bufferSize); 1215d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1216d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete [] convertedData->data; 12170da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines delete convertedData; convertedData = NULL; 121899d429070eb7c4c39fb7d74555031d518a4e0a79Stephen Hines } 121999d429070eb7c4c39fb7d74555031d518a4e0a79Stephen Hines } 122099d429070eb7c4c39fb7d74555031d518a4e0a79Stephen Hines delete drmConvertedStatus; drmConvertedStatus = NULL; 12210da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines return DRM_NO_ERROR; 1222d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1223eeb251e8db802b836af7461d0f6eb1252c527ab8Stephen Hines 1224eeb251e8db802b836af7461d0f6eb1252c527ab8Stephen Hines case GET_ALL_SUPPORT_INFO: 1225d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 1226d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO"); 1227d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 1228d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1229d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 1230d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines int length = 0; 1231d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmSupportInfo* drmSupportInfoArray = NULL; 1232d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1233d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray); 123423c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 1235d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(length); 1236d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines for (int i = 0; i < length; ++i) { 1237d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i]; 1238d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1239d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(drmSupportInfo.getFileSuffixCount()); 1240d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmSupportInfo::FileSuffixIterator fileSuffixIt 1241d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines = drmSupportInfo.getFileSuffixIterator(); 1242d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines while (fileSuffixIt.hasNext()) { 1243d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeString8(fileSuffixIt.next()); 1244d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1245d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1246d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(drmSupportInfo.getMimeTypeCount()); 1247d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator(); 1248d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines while (mimeTypeIt.hasNext()) { 1249d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeString8(mimeTypeIt.next()); 1250d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1251d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeString8(drmSupportInfo.getDescription()); 1252d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1253d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete [] drmSupportInfoArray; drmSupportInfoArray = NULL; 1254d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(status); 1255d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 1256d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1257d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1258d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case OPEN_DECRYPT_SESSION: 1259d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 1260d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION"); 1261d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 1262d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1263d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 1264d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int fd = data.readFileDescriptor(); 1265d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1266d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const off64_t offset = data.readInt64(); 1267d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const off64_t length = data.readInt64(); 1268d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DecryptHandle* handle 1269d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines = openDecryptSession(uniqueId, fd, offset, length); 1270d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1271d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (NULL != handle) { 1272d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines writeDecryptHandleToParcelData(handle, reply); 1273d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines clearDecryptHandle(handle); 1274d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete handle; handle = NULL; 1275d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1276d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 1277d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1278d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1279d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case OPEN_DECRYPT_SESSION_FROM_URI: 1280d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 1281d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI"); 1282d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 1283d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1284d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 1285d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const String8 uri = data.readString8(); 1286d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1287d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DecryptHandle* handle = openDecryptSession(uniqueId, uri.string()); 1288d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1289d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (NULL != handle) { 1290d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines writeDecryptHandleToParcelData(handle, reply); 1291d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1292d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines clearDecryptHandle(handle); 1293d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete handle; handle = NULL; 1294d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } else { 1295d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("NULL decryptHandle is returned"); 1296d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1297c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines return DRM_NO_ERROR; 1298d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1299d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1300d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case CLOSE_DECRYPT_SESSION: 1301d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 1302d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION"); 1303d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 1304c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines 1305d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 1306d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1307d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DecryptHandle* handle = new DecryptHandle(); 1308d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines readDecryptHandleFromParcelData(handle, data); 1309d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1310d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const status_t status = closeDecryptSession(uniqueId, handle); 1311d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(status); 1312d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 1313d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1314d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1315d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case INITIALIZE_DECRYPT_UNIT: 1316d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 1317d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT"); 1318d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 1319d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1320d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 1321d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1322d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DecryptHandle handle; 1323d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines readDecryptHandleFromParcelData(&handle, data); 1324d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1325d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int decryptUnitId = data.readInt32(); 1326d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1327d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines //Filling Header info 1328d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int bufferSize = data.readInt32(); 1329d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmBuffer* headerInfo = NULL; 1330d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize); 1331d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1332d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const status_t status 1333d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo); 1334d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(status); 1335d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1336d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines clearDecryptHandle(&handle); 1337d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete headerInfo; headerInfo = NULL; 1338d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 1339d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1340d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1341d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case DECRYPT: 1342d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 1343c706907a8041faaa882f9bd87f1d1c1669023a62Stephen Hines LOGV("BnDrmManagerService::onTransact :DECRYPT"); 1344d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 1345d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1346d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 1347d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1348d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DecryptHandle handle; 1349d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines readDecryptHandleFromParcelData(&handle, data); 1350d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1351d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int decryptUnitId = data.readInt32(); 1352d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int decBufferSize = data.readInt32(); 1353d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1354d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int encBufferSize = data.readInt32(); 1355d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmBuffer* encBuffer 1356d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize); 1357d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1358d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines char* buffer = NULL; 1359d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines buffer = new char[decBufferSize]; 1360d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize); 1361d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1362d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DrmBuffer* IV = NULL; 1363d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 != data.dataAvail()) { 1364d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int ivBufferlength = data.readInt32(); 1365d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength); 1366d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1367d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1368d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const status_t status 1369d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines = decrypt(uniqueId, &handle, decryptUnitId, encBuffer, &decBuffer, IV); 1370d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1371d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(status); 1372d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1373d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int size = decBuffer->length; 1374d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(size); 1375d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->write(decBuffer->data, size); 1376d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1377d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines clearDecryptHandle(&handle); 1378d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete encBuffer; encBuffer = NULL; 1379d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete decBuffer; decBuffer = NULL; 1380d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete [] buffer; buffer = NULL; 1381d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete IV; IV = NULL; 1382d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 1383d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1384d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1385d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case FINALIZE_DECRYPT_UNIT: 1386d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 1387d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT"); 1388d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 1389d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1390d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 1391d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1392d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DecryptHandle handle; 1393d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines readDecryptHandleFromParcelData(&handle, data); 1394d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1395d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32()); 1396d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(status); 1397d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1398d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines clearDecryptHandle(&handle); 1399d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 1400d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1401d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1402d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines case PREAD: 1403d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines { 1404d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines LOGV("BnDrmManagerService::onTransact :READ"); 1405d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines CHECK_INTERFACE(IDrmManagerService, data, reply); 1406d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1407d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int uniqueId = data.readInt32(); 1408d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1409d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines DecryptHandle handle; 1410d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines readDecryptHandleFromParcelData(&handle, data); 1411d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1412d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const int numBytes = data.readInt32(); 1413d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines char* buffer = new char[numBytes]; 1414d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1415d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines const off64_t offset = data.readInt64(); 1416d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1417d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines ssize_t result = pread(uniqueId, &handle, buffer, numBytes, offset); 1418d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->writeInt32(result); 1419d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines if (0 < result) { 1420d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines reply->write(buffer, result); 1421d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1422d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1423d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines clearDecryptHandle(&handle); 1424d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines delete [] buffer, buffer = NULL; 1425d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return DRM_NO_ERROR; 1426d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1427d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1428d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines default: 1429d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines return BBinder::onTransact(code, data, reply, flags); 1430d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines } 1431d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines} 1432d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines 1433d711dec946b6408791ca59eb98e363ef04bbd4aaStephen Hines