IDrm.cpp revision 441a78d5e224e0d67f9b52fa9adc795c6944159b
1441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker/* 2441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * Copyright (C) 2013 The Android Open Source Project 3441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * 4441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * Licensed under the Apache License, Version 2.0 (the "License"); 5441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * you may not use this file except in compliance with the License. 6441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * You may obtain a copy of the License at 7441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * 8441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * http://www.apache.org/licenses/LICENSE-2.0 9441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * 10441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * Unless required by applicable law or agreed to in writing, software 11441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * distributed under the License is distributed on an "AS IS" BASIS, 12441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * See the License for the specific language governing permissions and 14441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker * limitations under the License. 15441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker */ 16441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 17441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker//#define LOG_NDEBUG 0 18441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#define LOG_TAG "IDrm" 19441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <utils/Log.h> 20441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 21441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <binder/Parcel.h> 22441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <media/IDrm.h> 23441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <media/stagefright/MediaErrors.h> 24441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <media/stagefright/foundation/ADebug.h> 25441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker#include <media/stagefright/foundation/AString.h> 26441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 27441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkernamespace android { 28441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 29441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerenum { 30441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker INIT_CHECK = IBinder::FIRST_CALL_TRANSACTION, 31441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker IS_CRYPTO_SUPPORTED, 32441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CREATE_PLUGIN, 33441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker DESTROY_PLUGIN, 34441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker OPEN_SESSION, 35441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CLOSE_SESSION, 36441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker GET_LICENSE_REQUEST, 37441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker PROVIDE_LICENSE_RESPONSE, 38441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker REMOVE_LICENSE, 39441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker QUERY_LICENSE_STATUS, 40441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker GET_PROVISION_REQUEST, 41441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker PROVIDE_PROVISION_RESPONSE, 42441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker GET_SECURE_STOPS, 43441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker RELEASE_SECURE_STOPS, 44441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker GET_PROPERTY_STRING, 45441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker GET_PROPERTY_BYTE_ARRAY, 46441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker SET_PROPERTY_STRING, 47441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker SET_PROPERTY_BYTE_ARRAY 48441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}; 49441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 50441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstruct BpDrm : public BpInterface<IDrm> { 51441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker BpDrm(const sp<IBinder> &impl) 52441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker : BpInterface<IDrm>(impl) { 53441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 54441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 55441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t initCheck() const { 56441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 57441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 58441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(INIT_CHECK, data, &reply); 59441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 60441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 61441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 62441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 63441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual bool isCryptoSchemeSupported(const uint8_t uuid[16]) { 64441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 65441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 66441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(uuid, 16); 67441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply); 68441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 69441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32() != 0; 70441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 71441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 72441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t createPlugin(const uint8_t uuid[16]) { 73441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 74441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 75441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(uuid, 16); 76441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 77441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(CREATE_PLUGIN, data, &reply); 78441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 79441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 80441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 81441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 82441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t destroyPlugin() { 83441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 84441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 85441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(DESTROY_PLUGIN, data, &reply); 86441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 87441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 88441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 89441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 90441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t openSession(Vector<uint8_t> &sessionId) { 91441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 92441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 93441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 94441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(OPEN_SESSION, data, &reply); 95441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t size = reply.readInt32(); 96441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker sessionId.insertAt((size_t)0, size); 97441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply.read(sessionId.editArray(), size); 98441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 99441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 100441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 101441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 102441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t closeSession(Vector<uint8_t> const &sessionId) { 103441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 104441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 105441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 106441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInt32(sessionId.size()); 107441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(sessionId.array(), sessionId.size()); 108441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(CLOSE_SESSION, data, &reply); 109441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 110441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 111441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 112441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 113441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t 114441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker getLicenseRequest(Vector<uint8_t> const &sessionId, 115441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> const &initData, 116441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 const &mimeType, DrmPlugin::LicenseType licenseType, 117441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> const &optionalParameters, 118441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> &request, String8 &defaultUrl) { 119441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 120441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 121441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 122441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInt32(sessionId.size()); 123441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(sessionId.array(), sessionId.size()); 124441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 125441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInt32(initData.size()); 126441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(initData.array(), initData.size()); 127441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 128441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(mimeType); 129441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInt32((uint32_t)licenseType); 130441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 131441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInt32(optionalParameters.size()); 132441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < optionalParameters.size(); ++i) { 133441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(optionalParameters.keyAt(i)); 134441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(optionalParameters.valueAt(i)); 135441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 136441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(GET_LICENSE_REQUEST, data, &reply); 137441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 138441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t len = reply.readInt32(); 139441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker request.insertAt((size_t)0, len); 140441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply.read(request.editArray(), len); 141441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker defaultUrl = reply.readString8(); 142441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 143441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 144441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 145441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 146441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t provideLicenseResponse(Vector<uint8_t> const &sessionId, 147441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> const &response) { 148441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 149441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 150441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 151441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInt32(sessionId.size()); 152441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(sessionId.array(), sessionId.size()); 153441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInt32(response.size()); 154441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(response.array(), response.size()); 155441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(PROVIDE_LICENSE_RESPONSE, data, &reply); 156441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 157441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 158441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 159441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 160441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t removeLicense(Vector<uint8_t> const &sessionId) { 161441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 162441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 163441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 164441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInt32(sessionId.size()); 165441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(sessionId.array(), sessionId.size()); 166441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(REMOVE_LICENSE, data, &reply); 167441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 168441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 169441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 170441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 171441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t queryLicenseStatus(Vector<uint8_t> const &sessionId, 172441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> &infoMap) const { 173441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 174441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 175441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 176441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInt32(sessionId.size()); 177441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(sessionId.array(), sessionId.size()); 178441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 179441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(QUERY_LICENSE_STATUS, data, &reply); 180441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 181441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker infoMap.clear(); 182441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = reply.readInt32(); 183441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; i++) { 184441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 key = reply.readString8(); 185441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value = reply.readString8(); 186441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker infoMap.add(key, value); 187441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 188441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 189441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 190441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 191441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getProvisionRequest(Vector<uint8_t> &request, 192441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 &defaultUrl) { 193441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 194441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 195441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 196441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(GET_PROVISION_REQUEST, data, &reply); 197441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 198441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t len = reply.readInt32(); 199441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker request.insertAt((size_t)0, len); 200441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply.read(request.editArray(), len); 201441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker defaultUrl = reply.readString8(); 202441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 203441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 204441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 205441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 206441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t provideProvisionResponse(Vector<uint8_t> const &response) { 207441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 208441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 209441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 210441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInt32(response.size()); 211441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(response.array(), response.size()); 212441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(PROVIDE_PROVISION_RESPONSE, data, &reply); 213441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 214441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 215441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 216441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 217441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getSecureStops(List<Vector<uint8_t> > &secureStops) { 218441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 219441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 220441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 221441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(GET_SECURE_STOPS, data, &reply); 222441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 223441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker secureStops.clear(); 224441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t count = reply.readInt32(); 225441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; i++) { 226441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> secureStop; 227441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t len = reply.readInt32(); 228441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker secureStop.insertAt((size_t)0, len); 229441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply.read(secureStop.editArray(), len); 230441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker secureStops.push_back(secureStop); 231441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 232441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 233441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 234441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 235441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t releaseSecureStops(Vector<uint8_t> const &ssRelease) { 236441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 237441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 238441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 239441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInt32(ssRelease.size()); 240441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(ssRelease.array(), ssRelease.size()); 241441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(RELEASE_SECURE_STOPS, data, &reply); 242441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 243441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 244441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 245441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 246441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getPropertyString(String8 const &name, String8 &value) const { 247441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 248441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 249441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 250441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 251441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(GET_PROPERTY_STRING, data, &reply); 252441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 253441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker value = reply.readString8(); 254441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 255441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 256441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 257441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t getPropertyByteArray(String8 const &name, Vector<uint8_t> &value) const { 258441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 259441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 260441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 261441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 262441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(GET_PROPERTY_BYTE_ARRAY, data, &reply); 263441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 264441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t len = reply.readInt32(); 265441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker value.insertAt((size_t)0, len); 266441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply.read(value.editArray(), len); 267441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 268441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 269441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 270441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 271441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t setPropertyString(String8 const &name, String8 const &value) const { 272441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 273441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 274441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 275441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 276441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(value); 277441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(SET_PROPERTY_STRING, data, &reply); 278441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 279441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 280441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 281441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 282441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker virtual status_t setPropertyByteArray(String8 const &name, 283441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> const &value) const { 284441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Parcel data, reply; 285441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); 286441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 287441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeString8(name); 288441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.writeInt32(value.size()); 289441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.write(value.array(), value.size()); 290441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker remote()->transact(SET_PROPERTY_BYTE_ARRAY, data, &reply); 291441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 292441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return reply.readInt32(); 293441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 294441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 295441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 296441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerprivate: 297441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker DISALLOW_EVIL_CONSTRUCTORS(BpDrm); 298441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker}; 299441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 300441a78d5e224e0d67f9b52fa9adc795c6944159bJeff TinkerIMPLEMENT_META_INTERFACE(Drm, "android.drm.IDrm"); 301441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 302441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker//////////////////////////////////////////////////////////////////////////////// 303441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 304441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinkerstatus_t BnDrm::onTransact( 305441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) { 306441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker switch (code) { 307441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case INIT_CHECK: 308441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 309441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 310441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(initCheck()); 311441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 312441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 313441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 314441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case IS_CRYPTO_SUPPORTED: 315441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 316441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 317441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint8_t uuid[16]; 318441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(uuid, sizeof(uuid)); 319441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(isCryptoSchemeSupported(uuid)); 320441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 321441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 322441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 323441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case CREATE_PLUGIN: 324441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 325441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 326441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint8_t uuid[16]; 327441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(uuid, sizeof(uuid)); 328441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(createPlugin(uuid)); 329441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 330441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 331441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 332441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case DESTROY_PLUGIN: 333441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 334441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 335441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(destroyPlugin()); 336441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 337441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 338441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 339441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case OPEN_SESSION: 340441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 341441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 342441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 343441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = openSession(sessionId); 344441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(sessionId.size()); 345441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->write(sessionId.array(), sessionId.size()); 346441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 347441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 348441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 349441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 350441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case CLOSE_SESSION: 351441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 352441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 353441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 354441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t size = data.readInt32(); 355441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker sessionId.insertAt((size_t)0, size); 356441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(sessionId.editArray(), size); 357441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(closeSession(sessionId)); 358441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 359441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 360441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 361441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_LICENSE_REQUEST: 362441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 363441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 364441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 365441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t size = data.readInt32(); 366441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker sessionId.insertAt((size_t)0, size); 367441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(sessionId.editArray(), size); 368441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 369441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> initData; 370441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size = data.readInt32(); 371441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker initData.insertAt((size_t)0, size); 372441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(initData.editArray(), size); 373441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 374441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 mimeType = data.readString8(); 375441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker DrmPlugin::LicenseType licenseType = (DrmPlugin::LicenseType)data.readInt32(); 376441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 377441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> optionalParameters; 378441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t count = data.readInt32(); 379441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; ++i) { 380441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 key, value; 381441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker key = data.readString8(); 382441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker value = data.readString8(); 383441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker optionalParameters.add(key, value); 384441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 385441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 386441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> request; 387441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 defaultUrl; 388441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 389441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getLicenseRequest(sessionId, initData, 390441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker mimeType, licenseType, 391441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker optionalParameters, 392441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker request, defaultUrl); 393441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(request.size()); 394441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->write(request.array(), request.size()); 395441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(defaultUrl); 396441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 397441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 398441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 399441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 400441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case PROVIDE_LICENSE_RESPONSE: 401441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 402441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 403441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 404441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t size = data.readInt32(); 405441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker sessionId.insertAt((size_t)0, size); 406441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(sessionId.editArray(), size); 407441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> response; 408441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size = data.readInt32(); 409441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker response.insertAt((size_t)0, size); 410441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(response.editArray(), size); 411441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 412441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(provideLicenseResponse(sessionId, response)); 413441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 414441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 415441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 416441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case REMOVE_LICENSE: 417441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 418441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 419441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 420441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t size = data.readInt32(); 421441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker sessionId.insertAt((size_t)0, size); 422441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(sessionId.editArray(), size); 423441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(removeLicense(sessionId)); 424441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 425441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 426441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 427441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case QUERY_LICENSE_STATUS: 428441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 429441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 430441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> sessionId; 431441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t size = data.readInt32(); 432441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker sessionId.insertAt((size_t)0, size); 433441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(sessionId.editArray(), size); 434441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker KeyedVector<String8, String8> infoMap; 435441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 436441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = queryLicenseStatus(sessionId, infoMap); 437441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 438441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = infoMap.size(); 439441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(count); 440441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker for (size_t i = 0; i < count; ++i) { 441441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(infoMap.keyAt(i)); 442441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(infoMap.valueAt(i)); 443441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 444441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 445441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 446441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 447441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 448441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROVISION_REQUEST: 449441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 450441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 451441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> request; 452441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 defaultUrl; 453441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getProvisionRequest(request, defaultUrl); 454441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(request.size()); 455441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->write(request.array(), request.size()); 456441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(defaultUrl); 457441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 458441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 459441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 460441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 461441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case PROVIDE_PROVISION_RESPONSE: 462441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 463441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 464441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> response; 465441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t size = data.readInt32(); 466441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker response.insertAt((size_t)0, size); 467441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(response.editArray(), size); 468441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(provideProvisionResponse(response)); 469441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 470441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 471441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 472441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 473441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_SECURE_STOPS: 474441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 475441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 476441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker List<Vector<uint8_t> > secureStops; 477441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getSecureStops(secureStops); 478441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = secureStops.size(); 479441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(count); 480441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker List<Vector<uint8_t> >::iterator iter = secureStops.begin(); 481441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker while(iter != secureStops.end()) { 482441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t size = iter->size(); 483441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(size); 484441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->write(iter->array(), iter->size()); 485441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 486441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 487441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 488441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 489441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 490441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case RELEASE_SECURE_STOPS: 491441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 492441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 493441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> ssRelease; 494441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker uint32_t size = data.readInt32(); 495441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker ssRelease.insertAt((size_t)0, size); 496441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(ssRelease.editArray(), size); 497441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(releaseSecureStops(ssRelease)); 498441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 499441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 500441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 501441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROPERTY_STRING: 502441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 503441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 504441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 505441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value; 506441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getPropertyString(name, value); 507441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeString8(value); 508441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 509441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 510441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 511441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 512441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case GET_PROPERTY_BYTE_ARRAY: 513441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 514441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 515441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 516441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> value; 517441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker status_t result = getPropertyByteArray(name, value); 518441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(value.size()); 519441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->write(value.array(), value.size()); 520441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(result); 521441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 522441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 523441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 524441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case SET_PROPERTY_STRING: 525441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 526441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 527441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 528441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 value = data.readString8(); 529441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(setPropertyString(name, value)); 530441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 531441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 532441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 533441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker case SET_PROPERTY_BYTE_ARRAY: 534441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker { 535441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker CHECK_INTERFACE(IDrm, data, reply); 536441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker String8 name = data.readString8(); 537441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker Vector<uint8_t> value; 538441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker size_t count = data.readInt32(); 539441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker value.insertAt((size_t)0, count); 540441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker data.read(value.editArray(), count); 541441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker reply->writeInt32(setPropertyByteArray(name, value)); 542441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return OK; 543441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 544441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 545441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker default: 546441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker return BBinder::onTransact(code, data, reply, flags); 547441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker } 548441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker} 549441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 550441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker} // namespace android 551441a78d5e224e0d67f9b52fa9adc795c6944159bJeff Tinker 552