blob: e23454783d29394b9ece82b95838be4faea2e647 [file] [log] [blame]
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Takeshi Aimi2272ee22010-09-20 23:40:41 +090017//#define LOG_NDEBUG 0
aimitakeshi27ed8ad2010-07-29 10:12:27 +090018#define LOG_TAG "IDrmManagerService(Native)"
19#include <utils/Log.h>
20
21#include <stdint.h>
22#include <sys/types.h>
23#include <binder/IPCThreadState.h>
24
25#include <drm/DrmInfo.h>
26#include <drm/DrmConstraints.h>
Takeshi Aimi34738462010-11-16 13:56:11 +090027#include <drm/DrmMetadata.h>
aimitakeshi27ed8ad2010-07-29 10:12:27 +090028#include <drm/DrmRights.h>
29#include <drm/DrmInfoStatus.h>
30#include <drm/DrmConvertedStatus.h>
31#include <drm/DrmInfoRequest.h>
32#include <drm/DrmSupportInfo.h>
33
34#include "IDrmManagerService.h"
35
Jeff Tinkerb408fa22015-04-28 16:42:20 -070036#define MAX_BINDER_TRANSACTION_SIZE ((1*1024*1024)-(4096*2))
aimitakeshi27ed8ad2010-07-29 10:12:27 +090037
38using namespace android;
39
Gloria Wangc10ce332011-06-15 10:27:52 -070040static void writeDecryptHandleToParcelData(
Jeff Tinker5d49bef2018-10-03 23:01:09 -070041 const sp<DecryptHandle>& handle, Parcel* data) {
Gloria Wang1da9aa62011-03-20 10:25:16 -070042 data->writeInt32(handle->decryptId);
43 data->writeString8(handle->mimeType);
44 data->writeInt32(handle->decryptApiType);
45 data->writeInt32(handle->status);
Gloria Wang1da9aa62011-03-20 10:25:16 -070046}
47
48static void readDecryptHandleFromParcelData(
Jeff Tinker5d49bef2018-10-03 23:01:09 -070049 sp<DecryptHandle>& handle, const Parcel& data) {
Gloria Wang1da9aa62011-03-20 10:25:16 -070050 if (0 == data.dataAvail()) {
51 return;
52 }
53
54 handle->decryptId = data.readInt32();
55 handle->mimeType = data.readString8();
56 handle->decryptApiType = data.readInt32();
57 handle->status = data.readInt32();
Gloria Wang1da9aa62011-03-20 10:25:16 -070058}
59
Jeff Tinker5d49bef2018-10-03 23:01:09 -070060static void clearDecryptHandle(sp<DecryptHandle> &handle) {
Gloria Wang1da9aa62011-03-20 10:25:16 -070061 if (handle == NULL) {
62 return;
63 }
Gloria Wang1da9aa62011-03-20 10:25:16 -070064}
65
Gloria Wang8f001512011-07-21 15:10:22 -070066int BpDrmManagerService::addUniqueId(bool isNative) {
Steve Block3856b092011-10-20 11:56:00 +010067 ALOGV("add uniqueid");
Takeshi Aimi2272ee22010-09-20 23:40:41 +090068 Parcel data, reply;
69 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
Gloria Wang8f001512011-07-21 15:10:22 -070070 data.writeInt32(isNative);
Takeshi Aimi2272ee22010-09-20 23:40:41 +090071 remote()->transact(ADD_UNIQUEID, data, &reply);
72 return reply.readInt32();
73}
74
75void BpDrmManagerService::removeUniqueId(int uniqueId) {
Steve Block3856b092011-10-20 11:56:00 +010076 ALOGV("remove uniqueid");
Takeshi Aimi2272ee22010-09-20 23:40:41 +090077 Parcel data, reply;
78 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
79 data.writeInt32(uniqueId);
80 remote()->transact(REMOVE_UNIQUEID, data, &reply);
81}
82
Takeshi Aimie943f842010-10-08 23:05:49 +090083void BpDrmManagerService::addClient(int uniqueId) {
aimitakeshi27ed8ad2010-07-29 10:12:27 +090084 Parcel data, reply;
aimitakeshi27ed8ad2010-07-29 10:12:27 +090085 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
86 data.writeInt32(uniqueId);
Takeshi Aimie943f842010-10-08 23:05:49 +090087 remote()->transact(ADD_CLIENT, data, &reply);
aimitakeshi27ed8ad2010-07-29 10:12:27 +090088}
89
Takeshi Aimie943f842010-10-08 23:05:49 +090090void BpDrmManagerService::removeClient(int uniqueId) {
aimitakeshi27ed8ad2010-07-29 10:12:27 +090091 Parcel data, reply;
aimitakeshi27ed8ad2010-07-29 10:12:27 +090092 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
93 data.writeInt32(uniqueId);
Takeshi Aimie943f842010-10-08 23:05:49 +090094 remote()->transact(REMOVE_CLIENT, data, &reply);
aimitakeshi27ed8ad2010-07-29 10:12:27 +090095}
96
97status_t BpDrmManagerService::setDrmServiceListener(
98 int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) {
Steve Block3856b092011-10-20 11:56:00 +010099 ALOGV("setDrmServiceListener");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900100 Parcel data, reply;
101
102 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
103 data.writeInt32(uniqueId);
Marco Nelissen06b46062014-11-14 07:58:25 -0800104 data.writeStrongBinder(IInterface::asBinder(drmServiceListener));
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900105 remote()->transact(SET_DRM_SERVICE_LISTENER, data, &reply);
106 return reply.readInt32();
107}
108
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900109DrmConstraints* BpDrmManagerService::getConstraints(
110 int uniqueId, const String8* path, const int action) {
Steve Block3856b092011-10-20 11:56:00 +0100111 ALOGV("Get Constraints");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900112 Parcel data, reply;
113
114 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
115 data.writeInt32(uniqueId);
116 data.writeString8(*path);
117 data.writeInt32(action);
118
119 remote()->transact(GET_CONSTRAINTS_FROM_CONTENT, data, &reply);
120
121 DrmConstraints* drmConstraints = NULL;
122 if (0 != reply.dataAvail()) {
123 //Filling Drm Constraints
124 drmConstraints = new DrmConstraints();
125
126 const int size = reply.readInt32();
127 for (int index = 0; index < size; ++index) {
128 const String8 key(reply.readString8());
129 const int bufferSize = reply.readInt32();
130 char* data = NULL;
131 if (0 < bufferSize) {
132 data = new char[bufferSize];
133 reply.read(data, bufferSize);
Hung Nguyen0bf43842012-06-05 13:19:53 +0200134 drmConstraints->put(&key, data);
135 delete[] data;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900136 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900137 }
138 }
139 return drmConstraints;
140}
141
Takeshi Aimi34738462010-11-16 13:56:11 +0900142DrmMetadata* BpDrmManagerService::getMetadata(int uniqueId, const String8* path) {
Steve Block3856b092011-10-20 11:56:00 +0100143 ALOGV("Get Metadata");
Takeshi Aimi34738462010-11-16 13:56:11 +0900144 Parcel data, reply;
145 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
146 data.writeInt32(uniqueId);
147
148 DrmMetadata* drmMetadata = NULL;
149 data.writeString8(*path);
150 remote()->transact(GET_METADATA_FROM_CONTENT, data, &reply);
151
152 if (0 != reply.dataAvail()) {
153 //Filling Drm Metadata
154 drmMetadata = new DrmMetadata();
155
156 const int size = reply.readInt32();
157 for (int index = 0; index < size; ++index) {
158 const String8 key(reply.readString8());
159 const int bufferSize = reply.readInt32();
160 char* data = NULL;
161 if (0 < bufferSize) {
162 data = new char[bufferSize];
163 reply.read(data, bufferSize);
Hung Nguyen0bf43842012-06-05 13:19:53 +0200164 drmMetadata->put(&key, data);
165 delete[] data;
Takeshi Aimi34738462010-11-16 13:56:11 +0900166 }
Takeshi Aimi34738462010-11-16 13:56:11 +0900167 }
168 }
169 return drmMetadata;
170}
171
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900172bool BpDrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) {
Steve Block3856b092011-10-20 11:56:00 +0100173 ALOGV("Can Handle");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900174 Parcel data, reply;
175
176 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
177 data.writeInt32(uniqueId);
178
179 data.writeString8(path);
180 data.writeString8(mimeType);
181
182 remote()->transact(CAN_HANDLE, data, &reply);
183
184 return static_cast<bool>(reply.readInt32());
185}
186
187DrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) {
Steve Block3856b092011-10-20 11:56:00 +0100188 ALOGV("Process DRM Info");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900189 Parcel data, reply;
190
191 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
192 data.writeInt32(uniqueId);
193
194 //Filling DRM info
195 data.writeInt32(drmInfo->getInfoType());
196 const DrmBuffer dataBuffer = drmInfo->getData();
197 const int dataBufferSize = dataBuffer.length;
198 data.writeInt32(dataBufferSize);
199 if (0 < dataBufferSize) {
200 data.write(dataBuffer.data, dataBufferSize);
201 }
202 data.writeString8(drmInfo->getMimeType());
203
204 data.writeInt32(drmInfo->getCount());
205 DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
206
207 while (keyIt.hasNext()) {
208 const String8 key = keyIt.next();
209 data.writeString8(key);
210 const String8 value = drmInfo->get(key);
211 data.writeString8((value == String8("")) ? String8("NULL") : value);
212 }
213
214 remote()->transact(PROCESS_DRM_INFO, data, &reply);
215
216 DrmInfoStatus* drmInfoStatus = NULL;
217 if (0 != reply.dataAvail()) {
218 //Filling DRM Info Status
219 const int statusCode = reply.readInt32();
Takeshi Aimie943f842010-10-08 23:05:49 +0900220 const int infoType = reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900221 const String8 mimeType = reply.readString8();
222
223 DrmBuffer* drmBuffer = NULL;
224 if (0 != reply.dataAvail()) {
225 const int bufferSize = reply.readInt32();
226 char* data = NULL;
227 if (0 < bufferSize) {
228 data = new char[bufferSize];
229 reply.read(data, bufferSize);
230 }
231 drmBuffer = new DrmBuffer(data, bufferSize);
232 }
Takeshi Aimie943f842010-10-08 23:05:49 +0900233 drmInfoStatus = new DrmInfoStatus(statusCode, infoType, drmBuffer, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900234 }
235 return drmInfoStatus;
236}
237
238DrmInfo* BpDrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) {
Steve Block3856b092011-10-20 11:56:00 +0100239 ALOGV("Acquire DRM Info");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900240 Parcel data, reply;
241
242 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
243 data.writeInt32(uniqueId);
244
245 //Filling DRM Info Request
246 data.writeInt32(drmInforequest->getInfoType());
247 data.writeString8(drmInforequest->getMimeType());
248
249 data.writeInt32(drmInforequest->getCount());
250 DrmInfoRequest::KeyIterator keyIt = drmInforequest->keyIterator();
251
252 while (keyIt.hasNext()) {
253 const String8 key = keyIt.next();
254 data.writeString8(key);
255 const String8 value = drmInforequest->get(key);
Gene Morgan0abeaca2012-09-14 13:35:39 -0700256 if (key == String8("FileDescriptorKey")) {
257 int fd = -1;
Jeff Tinker2b7561f2016-04-01 09:21:52 -0700258 if (sscanf(value.string(), "FileDescriptor[%d]", &fd) != 1) {
259 sscanf(value.string(), "%d", &fd);
260 }
Gene Morgan0abeaca2012-09-14 13:35:39 -0700261 data.writeFileDescriptor(fd);
262 } else {
263 data.writeString8((value == String8("")) ? String8("NULL") : value);
264 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900265 }
266
267 remote()->transact(ACQUIRE_DRM_INFO, data, &reply);
268
269 DrmInfo* drmInfo = NULL;
270 if (0 != reply.dataAvail()) {
271 //Filling DRM Info
272 const int infoType = reply.readInt32();
273 const int bufferSize = reply.readInt32();
274 char* data = NULL;
275
276 if (0 < bufferSize) {
277 data = new char[bufferSize];
278 reply.read(data, bufferSize);
279 }
280 drmInfo = new DrmInfo(infoType, DrmBuffer(data, bufferSize), reply.readString8());
281
282 const int size = reply.readInt32();
283 for (int index = 0; index < size; ++index) {
284 const String8 key(reply.readString8());
285 const String8 value(reply.readString8());
286 drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
287 }
288 }
289 return drmInfo;
290}
291
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900292status_t BpDrmManagerService::saveRights(
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900293 int uniqueId, const DrmRights& drmRights,
294 const String8& rightsPath, const String8& contentPath) {
Steve Block3856b092011-10-20 11:56:00 +0100295 ALOGV("Save Rights");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900296 Parcel data, reply;
297
298 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
299 data.writeInt32(uniqueId);
300
301 //Filling Drm Rights
302 const DrmBuffer dataBuffer = drmRights.getData();
303 data.writeInt32(dataBuffer.length);
304 data.write(dataBuffer.data, dataBuffer.length);
305
306 const String8 mimeType = drmRights.getMimeType();
307 data.writeString8((mimeType == String8("")) ? String8("NULL") : mimeType);
308
309 const String8 accountId = drmRights.getAccountId();
310 data.writeString8((accountId == String8("")) ? String8("NULL") : accountId);
311
312 const String8 subscriptionId = drmRights.getSubscriptionId();
313 data.writeString8((subscriptionId == String8("")) ? String8("NULL") : subscriptionId);
314
315 data.writeString8((rightsPath == String8("")) ? String8("NULL") : rightsPath);
316 data.writeString8((contentPath == String8("")) ? String8("NULL") : contentPath);
317
318 remote()->transact(SAVE_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900319 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900320}
321
James Dongbf5b3b22012-07-30 17:57:39 -0700322String8 BpDrmManagerService::getOriginalMimeType(int uniqueId, const String8& path, int fd) {
Steve Block3856b092011-10-20 11:56:00 +0100323 ALOGV("Get Original MimeType");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900324 Parcel data, reply;
325
326 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
327 data.writeInt32(uniqueId);
328 data.writeString8(path);
James Dongbf5b3b22012-07-30 17:57:39 -0700329 int32_t isFdValid = (fd >= 0);
330 data.writeInt32(isFdValid);
331 if (isFdValid) {
332 data.writeFileDescriptor(fd);
333 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900334
335 remote()->transact(GET_ORIGINAL_MIMETYPE, data, &reply);
336 return reply.readString8();
337}
338
339int BpDrmManagerService::getDrmObjectType(
340 int uniqueId, const String8& path, const String8& mimeType) {
Steve Block3856b092011-10-20 11:56:00 +0100341 ALOGV("Get Drm object type");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900342 Parcel data, reply;
343
344 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
345 data.writeInt32(uniqueId);
346 data.writeString8(path);
347 data.writeString8(mimeType);
348
349 remote()->transact(GET_DRM_OBJECT_TYPE, data, &reply);
350
351 return reply.readInt32();
352}
353
354int BpDrmManagerService::checkRightsStatus(int uniqueId, const String8& path, int action) {
Steve Block3856b092011-10-20 11:56:00 +0100355 ALOGV("checkRightsStatus");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900356 Parcel data, reply;
357
358 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
359 data.writeInt32(uniqueId);
360 data.writeString8(path);
361 data.writeInt32(action);
362
363 remote()->transact(CHECK_RIGHTS_STATUS, data, &reply);
364
365 return reply.readInt32();
366}
367
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900368status_t BpDrmManagerService::consumeRights(
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700369 int uniqueId, sp<DecryptHandle>& decryptHandle, int action, bool reserve) {
Steve Block3856b092011-10-20 11:56:00 +0100370 ALOGV("consumeRights");
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900371 Parcel data, reply;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900372
373 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
374 data.writeInt32(uniqueId);
375
Gloria Wangc10ce332011-06-15 10:27:52 -0700376 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900377
378 data.writeInt32(action);
379 data.writeInt32(static_cast< int>(reserve));
380
381 remote()->transact(CONSUME_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900382 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900383}
384
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900385status_t BpDrmManagerService::setPlaybackStatus(
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700386 int uniqueId, sp<DecryptHandle>& decryptHandle, int playbackStatus, int64_t position) {
Steve Block3856b092011-10-20 11:56:00 +0100387 ALOGV("setPlaybackStatus");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900388 Parcel data, reply;
389
390 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
391 data.writeInt32(uniqueId);
392
Gloria Wangc10ce332011-06-15 10:27:52 -0700393 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900394
395 data.writeInt32(playbackStatus);
Gloria Wang2ed8a922011-01-19 15:38:16 -0800396 data.writeInt64(position);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900397
398 remote()->transact(SET_PLAYBACK_STATUS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900399 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900400}
401
402bool BpDrmManagerService::validateAction(
403 int uniqueId, const String8& path,
404 int action, const ActionDescription& description) {
Steve Block3856b092011-10-20 11:56:00 +0100405 ALOGV("validateAction");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900406 Parcel data, reply;
407
408 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
409 data.writeInt32(uniqueId);
410 data.writeString8(path);
411 data.writeInt32(action);
412 data.writeInt32(description.outputType);
413 data.writeInt32(description.configuration);
414
415 remote()->transact(VALIDATE_ACTION, data, &reply);
416
417 return static_cast<bool>(reply.readInt32());
418}
419
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900420status_t BpDrmManagerService::removeRights(int uniqueId, const String8& path) {
Steve Block3856b092011-10-20 11:56:00 +0100421 ALOGV("removeRights");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900422 Parcel data, reply;
423
424 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
425 data.writeInt32(uniqueId);
426 data.writeString8(path);
427
428 remote()->transact(REMOVE_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900429 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900430}
431
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900432status_t BpDrmManagerService::removeAllRights(int uniqueId) {
Steve Block3856b092011-10-20 11:56:00 +0100433 ALOGV("removeAllRights");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900434 Parcel data, reply;
435
436 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
437 data.writeInt32(uniqueId);
438
439 remote()->transact(REMOVE_ALL_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900440 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900441}
442
443int BpDrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) {
Steve Block3856b092011-10-20 11:56:00 +0100444 ALOGV("openConvertSession");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900445 Parcel data, reply;
446
447 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
448 data.writeInt32(uniqueId);
449 data.writeString8(mimeType);
450
451 remote()->transact(OPEN_CONVERT_SESSION, data, &reply);
452 return reply.readInt32();
453}
454
455DrmConvertedStatus* BpDrmManagerService::convertData(
456 int uniqueId, int convertId, const DrmBuffer* inputData) {
Steve Block3856b092011-10-20 11:56:00 +0100457 ALOGV("convertData");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900458 Parcel data, reply;
459
460 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
461 data.writeInt32(uniqueId);
462 data.writeInt32(convertId);
463 data.writeInt32(inputData->length);
464 data.write(inputData->data, inputData->length);
465
466 remote()->transact(CONVERT_DATA, data, &reply);
467
468 DrmConvertedStatus* drmConvertedStatus = NULL;
469
470 if (0 != reply.dataAvail()) {
471 //Filling DRM Converted Status
472 const int statusCode = reply.readInt32();
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800473 const off64_t offset = reply.readInt64();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900474
475 DrmBuffer* convertedData = NULL;
476 if (0 != reply.dataAvail()) {
477 const int bufferSize = reply.readInt32();
478 char* data = NULL;
479 if (0 < bufferSize) {
480 data = new char[bufferSize];
481 reply.read(data, bufferSize);
482 }
483 convertedData = new DrmBuffer(data, bufferSize);
484 }
485 drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
486 }
487 return drmConvertedStatus;
488}
489
490DrmConvertedStatus* BpDrmManagerService::closeConvertSession(int uniqueId, int convertId) {
Steve Block3856b092011-10-20 11:56:00 +0100491 ALOGV("closeConvertSession");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900492 Parcel data, reply;
493
494 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
495 data.writeInt32(uniqueId);
496 data.writeInt32(convertId);
497
498 remote()->transact(CLOSE_CONVERT_SESSION, data, &reply);
499
500 DrmConvertedStatus* drmConvertedStatus = NULL;
501
502 if (0 != reply.dataAvail()) {
503 //Filling DRM Converted Status
504 const int statusCode = reply.readInt32();
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800505 const off64_t offset = reply.readInt64();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900506
507 DrmBuffer* convertedData = NULL;
508 if (0 != reply.dataAvail()) {
509 const int bufferSize = reply.readInt32();
510 char* data = NULL;
511 if (0 < bufferSize) {
512 data = new char[bufferSize];
513 reply.read(data, bufferSize);
514 }
515 convertedData = new DrmBuffer(data, bufferSize);
516 }
517 drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
518 }
519 return drmConvertedStatus;
520}
521
522status_t BpDrmManagerService::getAllSupportInfo(
523 int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) {
Steve Block3856b092011-10-20 11:56:00 +0100524 ALOGV("Get All Support Info");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900525 Parcel data, reply;
526
527 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
528 data.writeInt32(uniqueId);
529
530 remote()->transact(GET_ALL_SUPPORT_INFO, data, &reply);
531
532 //Filling DRM Support Info
533 const int arraySize = reply.readInt32();
534 if (0 < arraySize) {
535 *drmSupportInfoArray = new DrmSupportInfo[arraySize];
536
537 for (int index = 0; index < arraySize; ++index) {
538 DrmSupportInfo drmSupportInfo;
539
540 const int fileSuffixVectorSize = reply.readInt32();
541 for (int i = 0; i < fileSuffixVectorSize; ++i) {
542 drmSupportInfo.addFileSuffix(reply.readString8());
543 }
544
545 const int mimeTypeVectorSize = reply.readInt32();
546 for (int i = 0; i < mimeTypeVectorSize; ++i) {
547 drmSupportInfo.addMimeType(reply.readString8());
548 }
549
550 drmSupportInfo.setDescription(reply.readString8());
551 (*drmSupportInfoArray)[index] = drmSupportInfo;
552 }
553 }
554 *length = arraySize;
555 return reply.readInt32();
556}
557
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700558sp<DecryptHandle> BpDrmManagerService::openDecryptSession(
James Dong9d2f3862012-01-10 08:24:37 -0800559 int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) {
Steve Block3856b092011-10-20 11:56:00 +0100560 ALOGV("Entering BpDrmManagerService::openDecryptSession");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900561 Parcel data, reply;
562
Takeshi Aimie943f842010-10-08 23:05:49 +0900563 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900564 data.writeInt32(uniqueId);
565 data.writeFileDescriptor(fd);
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800566 data.writeInt64(offset);
567 data.writeInt64(length);
James Dong9d2f3862012-01-10 08:24:37 -0800568 String8 mimeType;
569 if (mime) {
570 mimeType = mime;
571 }
572 data.writeString8(mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900573
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900574 remote()->transact(OPEN_DECRYPT_SESSION, data, &reply);
575
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700576 sp<DecryptHandle> handle;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900577 if (0 != reply.dataAvail()) {
578 handle = new DecryptHandle();
Gloria Wang1da9aa62011-03-20 10:25:16 -0700579 readDecryptHandleFromParcelData(handle, reply);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900580 }
581 return handle;
582}
583
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700584sp<DecryptHandle> BpDrmManagerService::openDecryptSession(
James Dong9d2f3862012-01-10 08:24:37 -0800585 int uniqueId, const char* uri, const char* mime) {
586
587 ALOGV("Entering BpDrmManagerService::openDecryptSession: mime=%s", mime? mime: "NULL");
Takeshi Aimie943f842010-10-08 23:05:49 +0900588 Parcel data, reply;
589
590 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
591 data.writeInt32(uniqueId);
592 data.writeString8(String8(uri));
James Dong9d2f3862012-01-10 08:24:37 -0800593 String8 mimeType;
594 if (mime) {
595 mimeType = mime;
596 }
597 data.writeString8(mimeType);
Takeshi Aimie943f842010-10-08 23:05:49 +0900598
599 remote()->transact(OPEN_DECRYPT_SESSION_FROM_URI, data, &reply);
600
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700601 sp<DecryptHandle> handle;
Takeshi Aimie943f842010-10-08 23:05:49 +0900602 if (0 != reply.dataAvail()) {
603 handle = new DecryptHandle();
Gloria Wang1da9aa62011-03-20 10:25:16 -0700604 readDecryptHandleFromParcelData(handle, reply);
Takeshi Aimie943f842010-10-08 23:05:49 +0900605 } else {
Steve Block3856b092011-10-20 11:56:00 +0100606 ALOGV("no decryptHandle is generated in service side");
Takeshi Aimie943f842010-10-08 23:05:49 +0900607 }
608 return handle;
609}
610
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700611sp<DecryptHandle> BpDrmManagerService::openDecryptSession(
Kei Takahashicba7b322012-01-18 17:10:19 +0900612 int uniqueId, const DrmBuffer& buf, const String8& mimeType) {
613 ALOGV("Entering BpDrmManagerService::openDecryptSession");
614 Parcel data, reply;
615
616 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
617 data.writeInt32(uniqueId);
618 if (buf.data != NULL && buf.length > 0) {
619 data.writeInt32(buf.length);
620 data.write(buf.data, buf.length);
621 } else {
622 data.writeInt32(0);
623 }
624 data.writeString8(mimeType);
625
626 remote()->transact(OPEN_DECRYPT_SESSION_FOR_STREAMING, data, &reply);
627
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700628 sp<DecryptHandle> handle;
Kei Takahashicba7b322012-01-18 17:10:19 +0900629 if (0 != reply.dataAvail()) {
630 handle = new DecryptHandle();
631 readDecryptHandleFromParcelData(handle, reply);
632 } else {
633 ALOGV("no decryptHandle is generated in service side");
634 }
635 return handle;
636}
637
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700638status_t BpDrmManagerService::closeDecryptSession(int uniqueId, sp<DecryptHandle>& decryptHandle) {
Steve Block3856b092011-10-20 11:56:00 +0100639 ALOGV("closeDecryptSession");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900640 Parcel data, reply;
641
642 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
643 data.writeInt32(uniqueId);
644
Gloria Wangc10ce332011-06-15 10:27:52 -0700645 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900646
647 remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply);
648
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900649 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900650}
651
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900652status_t BpDrmManagerService::initializeDecryptUnit(
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700653 int uniqueId, sp<DecryptHandle>& decryptHandle,
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900654 int decryptUnitId, const DrmBuffer* headerInfo) {
Steve Block3856b092011-10-20 11:56:00 +0100655 ALOGV("initializeDecryptUnit");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900656 Parcel data, reply;
657
658 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
659 data.writeInt32(uniqueId);
660
Gloria Wangc10ce332011-06-15 10:27:52 -0700661 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900662
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900663 data.writeInt32(decryptUnitId);
664
665 data.writeInt32(headerInfo->length);
666 data.write(headerInfo->data, headerInfo->length);
667
668 remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900669 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900670}
671
672status_t BpDrmManagerService::decrypt(
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700673 int uniqueId, sp<DecryptHandle>& decryptHandle, int decryptUnitId,
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900674 const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) {
Steve Block3856b092011-10-20 11:56:00 +0100675 ALOGV("decrypt");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900676 Parcel data, reply;
677
678 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
679 data.writeInt32(uniqueId);
680
Gloria Wangc10ce332011-06-15 10:27:52 -0700681 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900682
683 data.writeInt32(decryptUnitId);
684 data.writeInt32((*decBuffer)->length);
685
686 data.writeInt32(encBuffer->length);
687 data.write(encBuffer->data, encBuffer->length);
688
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900689 if (NULL != IV) {
690 data.writeInt32(IV->length);
691 data.write(IV->data, IV->length);
692 }
693
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900694 remote()->transact(DECRYPT, data, &reply);
695
696 const status_t status = reply.readInt32();
Steve Block3856b092011-10-20 11:56:00 +0100697 ALOGV("Return value of decrypt() is %d", status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900698
Jeff Tinker09ed70f2015-09-14 13:55:23 -0700699 if (status == NO_ERROR) {
700 const int size = reply.readInt32();
701 (*decBuffer)->length = size;
702 reply.read((void *)(*decBuffer)->data, size);
703 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900704
705 return status;
706}
707
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900708status_t BpDrmManagerService::finalizeDecryptUnit(
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700709 int uniqueId, sp<DecryptHandle>& decryptHandle, int decryptUnitId) {
Steve Block3856b092011-10-20 11:56:00 +0100710 ALOGV("finalizeDecryptUnit");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900711 Parcel data, reply;
712
713 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
714 data.writeInt32(uniqueId);
715
Gloria Wangc10ce332011-06-15 10:27:52 -0700716 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900717
718 data.writeInt32(decryptUnitId);
719
720 remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900721 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900722}
723
724ssize_t BpDrmManagerService::pread(
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700725 int uniqueId, sp<DecryptHandle>& decryptHandle, void* buffer,
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800726 ssize_t numBytes, off64_t offset) {
Steve Block3856b092011-10-20 11:56:00 +0100727 ALOGV("read");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900728 Parcel data, reply;
729 int result;
730
731 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
732 data.writeInt32(uniqueId);
733
Gloria Wangc10ce332011-06-15 10:27:52 -0700734 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900735
736 data.writeInt32(numBytes);
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800737 data.writeInt64(offset);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900738
739 remote()->transact(PREAD, data, &reply);
740 result = reply.readInt32();
741 if (0 < result) {
742 reply.read(buffer, result);
743 }
744 return result;
745}
746
747IMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService");
748
749status_t BnDrmManagerService::onTransact(
750 uint32_t code, const Parcel& data,
751 Parcel* reply, uint32_t flags) {
Steve Block3856b092011-10-20 11:56:00 +0100752 ALOGV("Entering BnDrmManagerService::onTransact with code %d", code);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900753
754 switch (code) {
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900755 case ADD_UNIQUEID:
756 {
Steve Block3856b092011-10-20 11:56:00 +0100757 ALOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID");
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900758 CHECK_INTERFACE(IDrmManagerService, data, reply);
759 int uniqueId = addUniqueId(data.readInt32());
760 reply->writeInt32(uniqueId);
761 return DRM_NO_ERROR;
762 }
763
764 case REMOVE_UNIQUEID:
765 {
Steve Block3856b092011-10-20 11:56:00 +0100766 ALOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID");
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900767 CHECK_INTERFACE(IDrmManagerService, data, reply);
768 removeUniqueId(data.readInt32());
769 return DRM_NO_ERROR;
770 }
771
Takeshi Aimie943f842010-10-08 23:05:49 +0900772 case ADD_CLIENT:
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900773 {
Steve Block3856b092011-10-20 11:56:00 +0100774 ALOGV("BnDrmManagerService::onTransact :ADD_CLIENT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900775 CHECK_INTERFACE(IDrmManagerService, data, reply);
Takeshi Aimie943f842010-10-08 23:05:49 +0900776 addClient(data.readInt32());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900777 return DRM_NO_ERROR;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900778 }
779
Takeshi Aimie943f842010-10-08 23:05:49 +0900780 case REMOVE_CLIENT:
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900781 {
Steve Block3856b092011-10-20 11:56:00 +0100782 ALOGV("BnDrmManagerService::onTransact :REMOVE_CLIENT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900783 CHECK_INTERFACE(IDrmManagerService, data, reply);
Takeshi Aimie943f842010-10-08 23:05:49 +0900784 removeClient(data.readInt32());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900785 return DRM_NO_ERROR;
786 }
787
788 case SET_DRM_SERVICE_LISTENER:
789 {
Steve Block3856b092011-10-20 11:56:00 +0100790 ALOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900791 CHECK_INTERFACE(IDrmManagerService, data, reply);
792
793 const int uniqueId = data.readInt32();
794 const sp<IDrmServiceListener> drmServiceListener
795 = interface_cast<IDrmServiceListener> (data.readStrongBinder());
796
797 status_t status = setDrmServiceListener(uniqueId, drmServiceListener);
798
799 reply->writeInt32(status);
800 return DRM_NO_ERROR;
801 }
802
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900803 case GET_CONSTRAINTS_FROM_CONTENT:
804 {
Steve Block3856b092011-10-20 11:56:00 +0100805 ALOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900806 CHECK_INTERFACE(IDrmManagerService, data, reply);
807
808 const int uniqueId = data.readInt32();
809 const String8 path = data.readString8();
810
Gloria Wang197f0472011-08-01 10:31:24 -0700811 DrmConstraints* drmConstraints
812 = getConstraints(uniqueId, &path, data.readInt32());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900813
814 if (NULL != drmConstraints) {
815 //Filling DRM Constraints contents
816 reply->writeInt32(drmConstraints->getCount());
817
818 DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator();
819 while (keyIt.hasNext()) {
820 const String8 key = keyIt.next();
821 reply->writeString8(key);
822 const char* value = drmConstraints->getAsByteArray(&key);
823 int bufferSize = 0;
824 if (NULL != value) {
825 bufferSize = strlen(value);
Hung Nguyen0bf43842012-06-05 13:19:53 +0200826 reply->writeInt32(bufferSize + 1);
827 reply->write(value, bufferSize + 1);
828 } else {
829 reply->writeInt32(0);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900830 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900831 }
832 }
833 delete drmConstraints; drmConstraints = NULL;
834 return DRM_NO_ERROR;
835 }
836
Takeshi Aimi34738462010-11-16 13:56:11 +0900837 case GET_METADATA_FROM_CONTENT:
838 {
Steve Block3856b092011-10-20 11:56:00 +0100839 ALOGV("BnDrmManagerService::onTransact :GET_METADATA_FROM_CONTENT");
Takeshi Aimi34738462010-11-16 13:56:11 +0900840 CHECK_INTERFACE(IDrmManagerService, data, reply);
841
842 const int uniqueId = data.readInt32();
843 const String8 path = data.readString8();
844
845 DrmMetadata* drmMetadata = getMetadata(uniqueId, &path);
846 if (NULL != drmMetadata) {
847 //Filling DRM Metadata contents
848 reply->writeInt32(drmMetadata->getCount());
849
850 DrmMetadata::KeyIterator keyIt = drmMetadata->keyIterator();
851 while (keyIt.hasNext()) {
852 const String8 key = keyIt.next();
853 reply->writeString8(key);
854 const char* value = drmMetadata->getAsByteArray(&key);
855 int bufferSize = 0;
856 if (NULL != value) {
857 bufferSize = strlen(value);
858 reply->writeInt32(bufferSize + 1);
859 reply->write(value, bufferSize + 1);
860 } else {
861 reply->writeInt32(0);
862 }
863 }
864 }
865 delete drmMetadata; drmMetadata = NULL;
866 return NO_ERROR;
867 }
868
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900869 case CAN_HANDLE:
870 {
Steve Block3856b092011-10-20 11:56:00 +0100871 ALOGV("BnDrmManagerService::onTransact :CAN_HANDLE");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900872 CHECK_INTERFACE(IDrmManagerService, data, reply);
873
874 const int uniqueId = data.readInt32();
875 const String8 path = data.readString8();
876 const String8 mimeType = data.readString8();
877
878 bool result = canHandle(uniqueId, path, mimeType);
879
880 reply->writeInt32(result);
881 return DRM_NO_ERROR;
882 }
883
884 case PROCESS_DRM_INFO:
885 {
Steve Block3856b092011-10-20 11:56:00 +0100886 ALOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900887 CHECK_INTERFACE(IDrmManagerService, data, reply);
888
889 const int uniqueId = data.readInt32();
890
891 //Filling DRM info
892 const int infoType = data.readInt32();
Jeff Tinkerb408fa22015-04-28 16:42:20 -0700893 const uint32_t bufferSize = data.readInt32();
894
895 if (bufferSize > data.dataAvail()) {
896 return BAD_VALUE;
897 }
898
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900899 char* buffer = NULL;
900 if (0 < bufferSize) {
901 buffer = (char *)data.readInplace(bufferSize);
902 }
903 const DrmBuffer drmBuffer(buffer, bufferSize);
904 DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8());
905
906 const int size = data.readInt32();
907 for (int index = 0; index < size; ++index) {
908 const String8 key(data.readString8());
909 const String8 value(data.readString8());
910 drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
911 }
912
913 DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo);
914
915 if (NULL != drmInfoStatus) {
916 //Filling DRM Info Status contents
917 reply->writeInt32(drmInfoStatus->statusCode);
Takeshi Aimie943f842010-10-08 23:05:49 +0900918 reply->writeInt32(drmInfoStatus->infoType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900919 reply->writeString8(drmInfoStatus->mimeType);
920
921 if (NULL != drmInfoStatus->drmBuffer) {
922 const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer;
923 const int bufferSize = drmBuffer->length;
924 reply->writeInt32(bufferSize);
925 if (0 < bufferSize) {
926 reply->write(drmBuffer->data, bufferSize);
927 }
928 delete [] drmBuffer->data;
929 delete drmBuffer; drmBuffer = NULL;
930 }
931 }
932 delete drmInfo; drmInfo = NULL;
933 delete drmInfoStatus; drmInfoStatus = NULL;
934 return DRM_NO_ERROR;
935 }
936
937 case ACQUIRE_DRM_INFO:
938 {
Steve Block3856b092011-10-20 11:56:00 +0100939 ALOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900940 CHECK_INTERFACE(IDrmManagerService, data, reply);
941
942 const int uniqueId = data.readInt32();
943
944 //Filling DRM info Request
Gloria Wang197f0472011-08-01 10:31:24 -0700945 const int infoType = data.readInt32();
946 const String8 mimeType = data.readString8();
947 DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(infoType, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900948
949 const int size = data.readInt32();
950 for (int index = 0; index < size; ++index) {
Jeff Tinkerb408fa22015-04-28 16:42:20 -0700951 if (!data.dataAvail()) {
952 break;
953 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900954 const String8 key(data.readString8());
Gene Morgan0abeaca2012-09-14 13:35:39 -0700955 if (key == String8("FileDescriptorKey")) {
956 char buffer[16];
957 int fd = data.readFileDescriptor();
958 sprintf(buffer, "%lu", (unsigned long)fd);
959 drmInfoRequest->put(key, String8(buffer));
960 } else {
961 const String8 value(data.readString8());
962 drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value);
963 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900964 }
965
966 DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest);
967
968 if (NULL != drmInfo) {
969 //Filling DRM Info
970 const DrmBuffer drmBuffer = drmInfo->getData();
971 reply->writeInt32(drmInfo->getInfoType());
972
973 const int bufferSize = drmBuffer.length;
974 reply->writeInt32(bufferSize);
975 if (0 < bufferSize) {
976 reply->write(drmBuffer.data, bufferSize);
977 }
978 reply->writeString8(drmInfo->getMimeType());
979 reply->writeInt32(drmInfo->getCount());
980
981 DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
982 while (keyIt.hasNext()) {
983 const String8 key = keyIt.next();
984 reply->writeString8(key);
985 const String8 value = drmInfo->get(key);
986 reply->writeString8((value == String8("")) ? String8("NULL") : value);
987 }
988 delete [] drmBuffer.data;
989 }
990 delete drmInfoRequest; drmInfoRequest = NULL;
991 delete drmInfo; drmInfo = NULL;
992 return DRM_NO_ERROR;
993 }
994
995 case SAVE_RIGHTS:
996 {
Steve Block3856b092011-10-20 11:56:00 +0100997 ALOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900998 CHECK_INTERFACE(IDrmManagerService, data, reply);
999
1000 const int uniqueId = data.readInt32();
1001
1002 //Filling DRM Rights
Jeff Tinkerb408fa22015-04-28 16:42:20 -07001003 const uint32_t bufferSize = data.readInt32();
1004 if (bufferSize > data.dataAvail()) {
1005 reply->writeInt32(BAD_VALUE);
1006 return DRM_NO_ERROR;
1007 }
1008
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001009 const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1010
1011 const String8 mimeType(data.readString8());
1012 const String8 accountId(data.readString8());
1013 const String8 subscriptionId(data.readString8());
1014 const String8 rightsPath(data.readString8());
1015 const String8 contentPath(data.readString8());
1016
1017 DrmRights drmRights(drmBuffer,
1018 ((mimeType == String8("NULL")) ? String8("") : mimeType),
1019 ((accountId == String8("NULL")) ? String8("") : accountId),
1020 ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId));
1021
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001022 const status_t status = saveRights(uniqueId, drmRights,
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001023 ((rightsPath == String8("NULL")) ? String8("") : rightsPath),
1024 ((contentPath == String8("NULL")) ? String8("") : contentPath));
1025
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001026 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001027 return DRM_NO_ERROR;
1028 }
1029
1030 case GET_ORIGINAL_MIMETYPE:
1031 {
Steve Block3856b092011-10-20 11:56:00 +01001032 ALOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001033 CHECK_INTERFACE(IDrmManagerService, data, reply);
1034
Gloria Wang197f0472011-08-01 10:31:24 -07001035 const int uniqueId = data.readInt32();
1036 const String8 path = data.readString8();
James Dongbf5b3b22012-07-30 17:57:39 -07001037 const int32_t isFdValid = data.readInt32();
1038 int fd = -1;
1039 if (isFdValid) {
1040 fd = data.readFileDescriptor();
1041 }
1042 const String8 originalMimeType = getOriginalMimeType(uniqueId, path, fd);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001043
1044 reply->writeString8(originalMimeType);
1045 return DRM_NO_ERROR;
1046 }
1047
1048 case GET_DRM_OBJECT_TYPE:
1049 {
Steve Block3856b092011-10-20 11:56:00 +01001050 ALOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001051 CHECK_INTERFACE(IDrmManagerService, data, reply);
1052
Gloria Wang197f0472011-08-01 10:31:24 -07001053 const int uniqueId = data.readInt32();
1054 const String8 path = data.readString8();
1055 const String8 mimeType = data.readString8();
1056 const int drmObjectType = getDrmObjectType(uniqueId, path, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001057
1058 reply->writeInt32(drmObjectType);
1059 return DRM_NO_ERROR;
1060 }
1061
1062 case CHECK_RIGHTS_STATUS:
1063 {
Steve Block3856b092011-10-20 11:56:00 +01001064 ALOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001065 CHECK_INTERFACE(IDrmManagerService, data, reply);
1066
Gloria Wang197f0472011-08-01 10:31:24 -07001067 const int uniqueId = data.readInt32();
1068 const String8 path = data.readString8();
1069 const int action = data.readInt32();
1070 const int result = checkRightsStatus(uniqueId, path, action);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001071
1072 reply->writeInt32(result);
1073 return DRM_NO_ERROR;
1074 }
1075
1076 case CONSUME_RIGHTS:
1077 {
Steve Block3856b092011-10-20 11:56:00 +01001078 ALOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001079 CHECK_INTERFACE(IDrmManagerService, data, reply);
1080
1081 const int uniqueId = data.readInt32();
1082
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001083 sp<DecryptHandle> handle = new DecryptHandle();
1084 readDecryptHandleFromParcelData(handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001085
Gloria Wang197f0472011-08-01 10:31:24 -07001086 const int action = data.readInt32();
1087 const bool reserve = static_cast<bool>(data.readInt32());
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001088 const status_t status
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001089 = consumeRights(uniqueId, handle, action, reserve);
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001090 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001091
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001092 clearDecryptHandle(handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001093 return DRM_NO_ERROR;
1094 }
1095
1096 case SET_PLAYBACK_STATUS:
1097 {
Steve Block3856b092011-10-20 11:56:00 +01001098 ALOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001099 CHECK_INTERFACE(IDrmManagerService, data, reply);
1100
1101 const int uniqueId = data.readInt32();
1102
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001103 sp<DecryptHandle> handle = new DecryptHandle();
1104 readDecryptHandleFromParcelData(handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001105
Gloria Wang197f0472011-08-01 10:31:24 -07001106 const int playbackStatus = data.readInt32();
1107 const int64_t position = data.readInt64();
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001108 const status_t status
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001109 = setPlaybackStatus(uniqueId, handle, playbackStatus, position);
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001110 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001111
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001112 clearDecryptHandle(handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001113 return DRM_NO_ERROR;
1114 }
1115
1116 case VALIDATE_ACTION:
1117 {
Steve Block3856b092011-10-20 11:56:00 +01001118 ALOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001119 CHECK_INTERFACE(IDrmManagerService, data, reply);
1120
Gloria Wang197f0472011-08-01 10:31:24 -07001121 const int uniqueId = data.readInt32();
1122 const String8 path = data.readString8();
1123 const int action = data.readInt32();
1124 const int outputType = data.readInt32();
1125 const int configuration = data.readInt32();
1126 bool result = validateAction(uniqueId, path, action,
1127 ActionDescription(outputType, configuration));
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001128
1129 reply->writeInt32(result);
1130 return DRM_NO_ERROR;
1131 }
1132
1133 case REMOVE_RIGHTS:
1134 {
Steve Block3856b092011-10-20 11:56:00 +01001135 ALOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001136 CHECK_INTERFACE(IDrmManagerService, data, reply);
1137
Gloria Wang197f0472011-08-01 10:31:24 -07001138 int uniqueId = data.readInt32();
1139 String8 path = data.readString8();
1140 const status_t status = removeRights(uniqueId, path);
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001141 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001142
1143 return DRM_NO_ERROR;
1144 }
1145
1146 case REMOVE_ALL_RIGHTS:
1147 {
Steve Block3856b092011-10-20 11:56:00 +01001148 ALOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001149 CHECK_INTERFACE(IDrmManagerService, data, reply);
1150
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001151 const status_t status = removeAllRights(data.readInt32());
1152 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001153
1154 return DRM_NO_ERROR;
1155 }
1156
1157 case OPEN_CONVERT_SESSION:
1158 {
Steve Block3856b092011-10-20 11:56:00 +01001159 ALOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001160 CHECK_INTERFACE(IDrmManagerService, data, reply);
1161
Gloria Wang197f0472011-08-01 10:31:24 -07001162 const int uniqueId = data.readInt32();
1163 const String8 mimeType = data.readString8();
1164 const int convertId = openConvertSession(uniqueId, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001165
1166 reply->writeInt32(convertId);
1167 return DRM_NO_ERROR;
1168 }
1169
1170 case CONVERT_DATA:
1171 {
Steve Block3856b092011-10-20 11:56:00 +01001172 ALOGV("BnDrmManagerService::onTransact :CONVERT_DATA");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001173 CHECK_INTERFACE(IDrmManagerService, data, reply);
1174
1175 const int uniqueId = data.readInt32();
1176 const int convertId = data.readInt32();
1177
1178 //Filling input data
Jeff Tinkerb408fa22015-04-28 16:42:20 -07001179 const uint32_t bufferSize = data.readInt32();
1180 if (bufferSize > data.dataAvail()) {
1181 return BAD_VALUE;
1182 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001183 DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1184
Jeff Tinkerb408fa22015-04-28 16:42:20 -07001185 DrmConvertedStatus* drmConvertedStatus = convertData(uniqueId, convertId, inputData);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001186
1187 if (NULL != drmConvertedStatus) {
1188 //Filling Drm Converted Ststus
1189 reply->writeInt32(drmConvertedStatus->statusCode);
Gloria Wanga2cd44c2010-11-19 15:19:36 -08001190 reply->writeInt64(drmConvertedStatus->offset);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001191
1192 if (NULL != drmConvertedStatus->convertedData) {
1193 const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
1194 const int bufferSize = convertedData->length;
1195 reply->writeInt32(bufferSize);
1196 if (0 < bufferSize) {
1197 reply->write(convertedData->data, bufferSize);
1198 }
1199 delete [] convertedData->data;
1200 delete convertedData; convertedData = NULL;
1201 }
1202 }
1203 delete inputData; inputData = NULL;
1204 delete drmConvertedStatus; drmConvertedStatus = NULL;
1205 return DRM_NO_ERROR;
1206 }
1207
1208 case CLOSE_CONVERT_SESSION:
1209 {
Steve Block3856b092011-10-20 11:56:00 +01001210 ALOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001211 CHECK_INTERFACE(IDrmManagerService, data, reply);
1212
Gloria Wang197f0472011-08-01 10:31:24 -07001213 const int uniqueId = data.readInt32();
1214 const int convertId = data.readInt32();
1215 DrmConvertedStatus* drmConvertedStatus
1216 = closeConvertSession(uniqueId, convertId);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001217
1218 if (NULL != drmConvertedStatus) {
1219 //Filling Drm Converted Ststus
1220 reply->writeInt32(drmConvertedStatus->statusCode);
Gloria Wanga2cd44c2010-11-19 15:19:36 -08001221 reply->writeInt64(drmConvertedStatus->offset);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001222
1223 if (NULL != drmConvertedStatus->convertedData) {
1224 const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
1225 const int bufferSize = convertedData->length;
1226 reply->writeInt32(bufferSize);
1227 if (0 < bufferSize) {
1228 reply->write(convertedData->data, bufferSize);
1229 }
1230 delete [] convertedData->data;
1231 delete convertedData; convertedData = NULL;
1232 }
1233 }
1234 delete drmConvertedStatus; drmConvertedStatus = NULL;
1235 return DRM_NO_ERROR;
1236 }
1237
1238 case GET_ALL_SUPPORT_INFO:
1239 {
Steve Block3856b092011-10-20 11:56:00 +01001240 ALOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001241 CHECK_INTERFACE(IDrmManagerService, data, reply);
1242
1243 const int uniqueId = data.readInt32();
1244 int length = 0;
1245 DrmSupportInfo* drmSupportInfoArray = NULL;
1246
1247 status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray);
1248
1249 reply->writeInt32(length);
1250 for (int i = 0; i < length; ++i) {
1251 DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i];
1252
1253 reply->writeInt32(drmSupportInfo.getFileSuffixCount());
1254 DrmSupportInfo::FileSuffixIterator fileSuffixIt
1255 = drmSupportInfo.getFileSuffixIterator();
1256 while (fileSuffixIt.hasNext()) {
1257 reply->writeString8(fileSuffixIt.next());
1258 }
1259
1260 reply->writeInt32(drmSupportInfo.getMimeTypeCount());
1261 DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator();
1262 while (mimeTypeIt.hasNext()) {
1263 reply->writeString8(mimeTypeIt.next());
1264 }
1265 reply->writeString8(drmSupportInfo.getDescription());
1266 }
1267 delete [] drmSupportInfoArray; drmSupportInfoArray = NULL;
1268 reply->writeInt32(status);
1269 return DRM_NO_ERROR;
1270 }
1271
1272 case OPEN_DECRYPT_SESSION:
1273 {
Steve Block3856b092011-10-20 11:56:00 +01001274 ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001275 CHECK_INTERFACE(IDrmManagerService, data, reply);
1276
1277 const int uniqueId = data.readInt32();
1278 const int fd = data.readFileDescriptor();
1279
Gloria Wang197f0472011-08-01 10:31:24 -07001280 const off64_t offset = data.readInt64();
1281 const off64_t length = data.readInt64();
James Dong9d2f3862012-01-10 08:24:37 -08001282 const String8 mime = data.readString8();
1283
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001284 sp<DecryptHandle> handle
James Dong9d2f3862012-01-10 08:24:37 -08001285 = openDecryptSession(uniqueId, fd, offset, length, mime.string());
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001286
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001287 if (NULL != handle.get()) {
1288 writeDecryptHandleToParcelData(handle.get(), reply);
Gloria Wang1da9aa62011-03-20 10:25:16 -07001289 clearDecryptHandle(handle);
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001290 handle.clear();
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001291 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001292 return DRM_NO_ERROR;
1293 }
1294
Takeshi Aimie943f842010-10-08 23:05:49 +09001295 case OPEN_DECRYPT_SESSION_FROM_URI:
1296 {
Steve Block3856b092011-10-20 11:56:00 +01001297 ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI");
Takeshi Aimie943f842010-10-08 23:05:49 +09001298 CHECK_INTERFACE(IDrmManagerService, data, reply);
1299
1300 const int uniqueId = data.readInt32();
1301 const String8 uri = data.readString8();
James Dong9d2f3862012-01-10 08:24:37 -08001302 const String8 mime = data.readString8();
Takeshi Aimie943f842010-10-08 23:05:49 +09001303
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001304 sp<DecryptHandle> handle = openDecryptSession(uniqueId, uri.string(), mime.string());
Takeshi Aimie943f842010-10-08 23:05:49 +09001305
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001306 if (NULL != handle.get()) {
1307 writeDecryptHandleToParcelData(handle.get(), reply);
Gloria Wang1da9aa62011-03-20 10:25:16 -07001308
1309 clearDecryptHandle(handle);
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001310 handle.clear();
Takeshi Aimie943f842010-10-08 23:05:49 +09001311 } else {
Steve Block3856b092011-10-20 11:56:00 +01001312 ALOGV("NULL decryptHandle is returned");
Takeshi Aimie943f842010-10-08 23:05:49 +09001313 }
Takeshi Aimie943f842010-10-08 23:05:49 +09001314 return DRM_NO_ERROR;
1315 }
1316
Kei Takahashicba7b322012-01-18 17:10:19 +09001317 case OPEN_DECRYPT_SESSION_FOR_STREAMING:
1318 {
1319 ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FOR_STREAMING");
1320 CHECK_INTERFACE(IDrmManagerService, data, reply);
1321
1322 const int uniqueId = data.readInt32();
1323 const int bufferSize = data.readInt32();
1324 DrmBuffer buf((bufferSize > 0) ? (char *)data.readInplace(bufferSize) : NULL,
1325 bufferSize);
1326 const String8 mimeType(data.readString8());
1327
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001328 sp<DecryptHandle> handle = openDecryptSession(uniqueId, buf, mimeType);
Kei Takahashicba7b322012-01-18 17:10:19 +09001329
1330 if (handle != NULL) {
1331 writeDecryptHandleToParcelData(handle, reply);
1332 clearDecryptHandle(handle);
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001333 handle.clear();
Kei Takahashicba7b322012-01-18 17:10:19 +09001334 } else {
1335 ALOGV("NULL decryptHandle is returned");
1336 }
1337 return DRM_NO_ERROR;
1338 }
1339
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001340 case CLOSE_DECRYPT_SESSION:
1341 {
Steve Block3856b092011-10-20 11:56:00 +01001342 ALOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001343 CHECK_INTERFACE(IDrmManagerService, data, reply);
1344
1345 const int uniqueId = data.readInt32();
1346
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001347 sp<DecryptHandle> handle = new DecryptHandle();
Gloria Wang1da9aa62011-03-20 10:25:16 -07001348 readDecryptHandleFromParcelData(handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001349
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001350 const status_t status = closeDecryptSession(uniqueId, handle);
1351 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001352 return DRM_NO_ERROR;
1353 }
1354
1355 case INITIALIZE_DECRYPT_UNIT:
1356 {
Steve Block3856b092011-10-20 11:56:00 +01001357 ALOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001358 CHECK_INTERFACE(IDrmManagerService, data, reply);
1359
1360 const int uniqueId = data.readInt32();
1361
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001362 sp<DecryptHandle> handle = new DecryptHandle();
1363 readDecryptHandleFromParcelData(handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001364
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001365 const int decryptUnitId = data.readInt32();
1366
1367 //Filling Header info
Jeff Tinkerb408fa22015-04-28 16:42:20 -07001368 const uint32_t bufferSize = data.readInt32();
1369 if (bufferSize > data.dataAvail()) {
1370 reply->writeInt32(BAD_VALUE);
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001371 clearDecryptHandle(handle);
Jeff Tinkerb408fa22015-04-28 16:42:20 -07001372 return DRM_NO_ERROR;
1373 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001374 DrmBuffer* headerInfo = NULL;
1375 headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1376
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001377 const status_t status
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001378 = initializeDecryptUnit(uniqueId, handle, decryptUnitId, headerInfo);
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001379 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001380
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001381 clearDecryptHandle(handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001382 delete headerInfo; headerInfo = NULL;
1383 return DRM_NO_ERROR;
1384 }
1385
1386 case DECRYPT:
1387 {
Steve Block3856b092011-10-20 11:56:00 +01001388 ALOGV("BnDrmManagerService::onTransact :DECRYPT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001389 CHECK_INTERFACE(IDrmManagerService, data, reply);
1390
1391 const int uniqueId = data.readInt32();
1392
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001393 sp<DecryptHandle> handle = new DecryptHandle;
1394 readDecryptHandleFromParcelData(handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001395
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001396 const int decryptUnitId = data.readInt32();
Jeff Tinkerb408fa22015-04-28 16:42:20 -07001397 const uint32_t decBufferSize = data.readInt32();
1398 const uint32_t encBufferSize = data.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001399
Jeff Tinkerb408fa22015-04-28 16:42:20 -07001400 if (encBufferSize > data.dataAvail() ||
1401 decBufferSize > MAX_BINDER_TRANSACTION_SIZE) {
1402 reply->writeInt32(BAD_VALUE);
1403 reply->writeInt32(0);
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001404 clearDecryptHandle(handle);
Jeff Tinkerb408fa22015-04-28 16:42:20 -07001405 return DRM_NO_ERROR;
1406 }
1407
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001408 DrmBuffer* encBuffer
1409 = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize);
1410
1411 char* buffer = NULL;
1412 buffer = new char[decBufferSize];
1413 DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize);
1414
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001415 DrmBuffer* IV = NULL;
1416 if (0 != data.dataAvail()) {
Jeff Tinkerb408fa22015-04-28 16:42:20 -07001417 const uint32_t ivBufferlength = data.readInt32();
1418 if (ivBufferlength <= data.dataAvail()) {
1419 IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength);
1420 }
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001421 }
1422
1423 const status_t status
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001424 = decrypt(uniqueId, handle, decryptUnitId, encBuffer, &decBuffer, IV);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001425
1426 reply->writeInt32(status);
1427
Jeff Tinker09ed70f2015-09-14 13:55:23 -07001428 if (status == NO_ERROR) {
1429 const int size = decBuffer->length;
1430 reply->writeInt32(size);
1431 reply->write(decBuffer->data, size);
1432 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001433
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001434 clearDecryptHandle(handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001435 delete encBuffer; encBuffer = NULL;
1436 delete decBuffer; decBuffer = NULL;
1437 delete [] buffer; buffer = NULL;
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001438 delete IV; IV = NULL;
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001439 return DRM_NO_ERROR;
1440 }
1441
1442 case FINALIZE_DECRYPT_UNIT:
1443 {
Steve Block3856b092011-10-20 11:56:00 +01001444 ALOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001445 CHECK_INTERFACE(IDrmManagerService, data, reply);
1446
1447 const int uniqueId = data.readInt32();
1448
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001449 sp<DecryptHandle> handle = new DecryptHandle();
1450 readDecryptHandleFromParcelData(handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001451
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001452 const status_t status = finalizeDecryptUnit(uniqueId, handle, data.readInt32());
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001453 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001454
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001455 clearDecryptHandle(handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001456 return DRM_NO_ERROR;
1457 }
1458
1459 case PREAD:
1460 {
Steve Block3856b092011-10-20 11:56:00 +01001461 ALOGV("BnDrmManagerService::onTransact :READ");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001462 CHECK_INTERFACE(IDrmManagerService, data, reply);
1463
1464 const int uniqueId = data.readInt32();
1465
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001466 sp<DecryptHandle> handle = new DecryptHandle();
1467 readDecryptHandleFromParcelData(handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001468
Jeff Tinkerb408fa22015-04-28 16:42:20 -07001469 const uint32_t numBytes = data.readInt32();
1470 if (numBytes > MAX_BINDER_TRANSACTION_SIZE) {
1471 reply->writeInt32(BAD_VALUE);
1472 return DRM_NO_ERROR;
1473 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001474 char* buffer = new char[numBytes];
1475
Gloria Wanga2cd44c2010-11-19 15:19:36 -08001476 const off64_t offset = data.readInt64();
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001477
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001478 ssize_t result = pread(uniqueId, handle, buffer, numBytes, offset);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001479 reply->writeInt32(result);
1480 if (0 < result) {
1481 reply->write(buffer, result);
1482 }
1483
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001484 clearDecryptHandle(handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001485 delete [] buffer, buffer = NULL;
1486 return DRM_NO_ERROR;
1487 }
1488
1489 default:
1490 return BBinder::onTransact(code, data, reply, flags);
1491 }
1492}