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