blob: a6d33b0fa4492773f0397fb1f2a9e072f68a8af5 [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
Greg Kaiser81e1c002019-11-20 06:12:58 -080036#define INVALID_BUFFER_LENGTH (-1)
Jeff Tinkerb408fa22015-04-28 16:42:20 -070037#define MAX_BINDER_TRANSACTION_SIZE ((1*1024*1024)-(4096*2))
aimitakeshi27ed8ad2010-07-29 10:12:27 +090038
39using namespace android;
40
Gloria Wangc10ce332011-06-15 10:27:52 -070041static void writeDecryptHandleToParcelData(
Jeff Tinker5d49bef2018-10-03 23:01:09 -070042 const sp<DecryptHandle>& handle, Parcel* data) {
Gloria Wang1da9aa62011-03-20 10:25:16 -070043 data->writeInt32(handle->decryptId);
44 data->writeString8(handle->mimeType);
45 data->writeInt32(handle->decryptApiType);
46 data->writeInt32(handle->status);
Greg Kaiser81e1c002019-11-20 06:12:58 -080047
48 int size = handle->copyControlVector.size();
49 data->writeInt32(size);
50 for (int i = 0; i < size; i++) {
51 data->writeInt32(handle->copyControlVector.keyAt(i));
52 data->writeInt32(handle->copyControlVector.valueAt(i));
53 }
54
55 size = handle->extendedData.size();
56 data->writeInt32(size);
57 for (int i = 0; i < size; i++) {
58 data->writeString8(handle->extendedData.keyAt(i));
59 data->writeString8(handle->extendedData.valueAt(i));
60 }
61
62 if (NULL != handle->decryptInfo) {
63 data->writeInt32(handle->decryptInfo->decryptBufferLength);
64 } else {
65 data->writeInt32(INVALID_BUFFER_LENGTH);
66 }
Gloria Wang1da9aa62011-03-20 10:25:16 -070067}
68
69static void readDecryptHandleFromParcelData(
Jeff Tinker5d49bef2018-10-03 23:01:09 -070070 sp<DecryptHandle>& handle, const Parcel& data) {
Gloria Wang1da9aa62011-03-20 10:25:16 -070071 if (0 == data.dataAvail()) {
72 return;
73 }
74
75 handle->decryptId = data.readInt32();
76 handle->mimeType = data.readString8();
77 handle->decryptApiType = data.readInt32();
78 handle->status = data.readInt32();
Greg Kaiser81e1c002019-11-20 06:12:58 -080079
80 int size = data.readInt32();
81 for (int i = 0; i < size; i++) {
82 DrmCopyControl key = (DrmCopyControl)data.readInt32();
83 int value = data.readInt32();
84 handle->copyControlVector.add(key, value);
85 }
86
87 size = data.readInt32();
88 for (int i = 0; i < size; i++) {
89 String8 key = data.readString8();
90 String8 value = data.readString8();
91 handle->extendedData.add(key, value);
92 }
93
94 handle->decryptInfo = NULL;
95 const int bufferLen = data.readInt32();
96 if (INVALID_BUFFER_LENGTH != bufferLen) {
97 handle->decryptInfo = new DecryptInfo();
98 handle->decryptInfo->decryptBufferLength = bufferLen;
99 }
Gloria Wang1da9aa62011-03-20 10:25:16 -0700100}
101
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700102static void clearDecryptHandle(sp<DecryptHandle> &handle) {
Gloria Wang1da9aa62011-03-20 10:25:16 -0700103 if (handle == NULL) {
104 return;
105 }
Greg Kaiser81e1c002019-11-20 06:12:58 -0800106 if (handle->decryptInfo) {
107 delete handle->decryptInfo;
108 handle->decryptInfo = NULL;
109 }
110 handle->copyControlVector.clear();
111 handle->extendedData.clear();
Gloria Wang1da9aa62011-03-20 10:25:16 -0700112}
113
Gloria Wang8f001512011-07-21 15:10:22 -0700114int BpDrmManagerService::addUniqueId(bool isNative) {
Steve Block3856b092011-10-20 11:56:00 +0100115 ALOGV("add uniqueid");
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900116 Parcel data, reply;
117 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
Gloria Wang8f001512011-07-21 15:10:22 -0700118 data.writeInt32(isNative);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900119 remote()->transact(ADD_UNIQUEID, data, &reply);
120 return reply.readInt32();
121}
122
123void BpDrmManagerService::removeUniqueId(int uniqueId) {
Steve Block3856b092011-10-20 11:56:00 +0100124 ALOGV("remove uniqueid");
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900125 Parcel data, reply;
126 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
127 data.writeInt32(uniqueId);
128 remote()->transact(REMOVE_UNIQUEID, data, &reply);
129}
130
Takeshi Aimie943f842010-10-08 23:05:49 +0900131void BpDrmManagerService::addClient(int uniqueId) {
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900132 Parcel data, reply;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900133 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
134 data.writeInt32(uniqueId);
Takeshi Aimie943f842010-10-08 23:05:49 +0900135 remote()->transact(ADD_CLIENT, data, &reply);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900136}
137
Takeshi Aimie943f842010-10-08 23:05:49 +0900138void BpDrmManagerService::removeClient(int uniqueId) {
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900139 Parcel data, reply;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900140 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
141 data.writeInt32(uniqueId);
Takeshi Aimie943f842010-10-08 23:05:49 +0900142 remote()->transact(REMOVE_CLIENT, data, &reply);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900143}
144
145status_t BpDrmManagerService::setDrmServiceListener(
146 int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) {
Steve Block3856b092011-10-20 11:56:00 +0100147 ALOGV("setDrmServiceListener");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900148 Parcel data, reply;
149
150 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
151 data.writeInt32(uniqueId);
Marco Nelissen06b46062014-11-14 07:58:25 -0800152 data.writeStrongBinder(IInterface::asBinder(drmServiceListener));
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900153 remote()->transact(SET_DRM_SERVICE_LISTENER, data, &reply);
154 return reply.readInt32();
155}
156
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900157DrmConstraints* BpDrmManagerService::getConstraints(
158 int uniqueId, const String8* path, const int action) {
Steve Block3856b092011-10-20 11:56:00 +0100159 ALOGV("Get Constraints");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900160 Parcel data, reply;
161
162 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
163 data.writeInt32(uniqueId);
164 data.writeString8(*path);
165 data.writeInt32(action);
166
167 remote()->transact(GET_CONSTRAINTS_FROM_CONTENT, data, &reply);
168
169 DrmConstraints* drmConstraints = NULL;
170 if (0 != reply.dataAvail()) {
171 //Filling Drm Constraints
172 drmConstraints = new DrmConstraints();
173
174 const int size = reply.readInt32();
175 for (int index = 0; index < size; ++index) {
176 const String8 key(reply.readString8());
177 const int bufferSize = reply.readInt32();
178 char* data = NULL;
179 if (0 < bufferSize) {
180 data = new char[bufferSize];
181 reply.read(data, bufferSize);
Hung Nguyen0bf43842012-06-05 13:19:53 +0200182 drmConstraints->put(&key, data);
183 delete[] data;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900184 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900185 }
186 }
187 return drmConstraints;
188}
189
Takeshi Aimi34738462010-11-16 13:56:11 +0900190DrmMetadata* BpDrmManagerService::getMetadata(int uniqueId, const String8* path) {
Steve Block3856b092011-10-20 11:56:00 +0100191 ALOGV("Get Metadata");
Takeshi Aimi34738462010-11-16 13:56:11 +0900192 Parcel data, reply;
193 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
194 data.writeInt32(uniqueId);
195
196 DrmMetadata* drmMetadata = NULL;
197 data.writeString8(*path);
198 remote()->transact(GET_METADATA_FROM_CONTENT, data, &reply);
199
200 if (0 != reply.dataAvail()) {
201 //Filling Drm Metadata
202 drmMetadata = new DrmMetadata();
203
204 const int size = reply.readInt32();
205 for (int index = 0; index < size; ++index) {
206 const String8 key(reply.readString8());
207 const int bufferSize = reply.readInt32();
208 char* data = NULL;
209 if (0 < bufferSize) {
210 data = new char[bufferSize];
211 reply.read(data, bufferSize);
Hung Nguyen0bf43842012-06-05 13:19:53 +0200212 drmMetadata->put(&key, data);
213 delete[] data;
Takeshi Aimi34738462010-11-16 13:56:11 +0900214 }
Takeshi Aimi34738462010-11-16 13:56:11 +0900215 }
216 }
217 return drmMetadata;
218}
219
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900220bool BpDrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) {
Steve Block3856b092011-10-20 11:56:00 +0100221 ALOGV("Can Handle");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900222 Parcel data, reply;
223
224 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
225 data.writeInt32(uniqueId);
226
227 data.writeString8(path);
228 data.writeString8(mimeType);
229
230 remote()->transact(CAN_HANDLE, data, &reply);
231
232 return static_cast<bool>(reply.readInt32());
233}
234
235DrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) {
Steve Block3856b092011-10-20 11:56:00 +0100236 ALOGV("Process DRM Info");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900237 Parcel data, reply;
238
239 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
240 data.writeInt32(uniqueId);
241
242 //Filling DRM info
243 data.writeInt32(drmInfo->getInfoType());
244 const DrmBuffer dataBuffer = drmInfo->getData();
245 const int dataBufferSize = dataBuffer.length;
246 data.writeInt32(dataBufferSize);
247 if (0 < dataBufferSize) {
248 data.write(dataBuffer.data, dataBufferSize);
249 }
250 data.writeString8(drmInfo->getMimeType());
251
252 data.writeInt32(drmInfo->getCount());
253 DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
254
255 while (keyIt.hasNext()) {
256 const String8 key = keyIt.next();
257 data.writeString8(key);
258 const String8 value = drmInfo->get(key);
259 data.writeString8((value == String8("")) ? String8("NULL") : value);
260 }
261
262 remote()->transact(PROCESS_DRM_INFO, data, &reply);
263
264 DrmInfoStatus* drmInfoStatus = NULL;
265 if (0 != reply.dataAvail()) {
266 //Filling DRM Info Status
267 const int statusCode = reply.readInt32();
Takeshi Aimie943f842010-10-08 23:05:49 +0900268 const int infoType = reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900269 const String8 mimeType = reply.readString8();
270
271 DrmBuffer* drmBuffer = NULL;
272 if (0 != reply.dataAvail()) {
273 const int bufferSize = reply.readInt32();
274 char* data = NULL;
275 if (0 < bufferSize) {
276 data = new char[bufferSize];
277 reply.read(data, bufferSize);
278 }
279 drmBuffer = new DrmBuffer(data, bufferSize);
280 }
Takeshi Aimie943f842010-10-08 23:05:49 +0900281 drmInfoStatus = new DrmInfoStatus(statusCode, infoType, drmBuffer, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900282 }
283 return drmInfoStatus;
284}
285
286DrmInfo* BpDrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) {
Steve Block3856b092011-10-20 11:56:00 +0100287 ALOGV("Acquire DRM Info");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900288 Parcel data, reply;
289
290 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
291 data.writeInt32(uniqueId);
292
293 //Filling DRM Info Request
294 data.writeInt32(drmInforequest->getInfoType());
295 data.writeString8(drmInforequest->getMimeType());
296
297 data.writeInt32(drmInforequest->getCount());
298 DrmInfoRequest::KeyIterator keyIt = drmInforequest->keyIterator();
299
300 while (keyIt.hasNext()) {
301 const String8 key = keyIt.next();
302 data.writeString8(key);
303 const String8 value = drmInforequest->get(key);
Gene Morgan0abeaca2012-09-14 13:35:39 -0700304 if (key == String8("FileDescriptorKey")) {
305 int fd = -1;
Jeff Tinker2b7561f2016-04-01 09:21:52 -0700306 if (sscanf(value.string(), "FileDescriptor[%d]", &fd) != 1) {
307 sscanf(value.string(), "%d", &fd);
308 }
Gene Morgan0abeaca2012-09-14 13:35:39 -0700309 data.writeFileDescriptor(fd);
310 } else {
311 data.writeString8((value == String8("")) ? String8("NULL") : value);
312 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900313 }
314
315 remote()->transact(ACQUIRE_DRM_INFO, data, &reply);
316
317 DrmInfo* drmInfo = NULL;
318 if (0 != reply.dataAvail()) {
319 //Filling DRM Info
320 const int infoType = reply.readInt32();
321 const int bufferSize = reply.readInt32();
322 char* data = NULL;
323
324 if (0 < bufferSize) {
325 data = new char[bufferSize];
326 reply.read(data, bufferSize);
327 }
328 drmInfo = new DrmInfo(infoType, DrmBuffer(data, bufferSize), reply.readString8());
329
330 const int size = reply.readInt32();
331 for (int index = 0; index < size; ++index) {
332 const String8 key(reply.readString8());
333 const String8 value(reply.readString8());
334 drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
335 }
336 }
337 return drmInfo;
338}
339
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900340status_t BpDrmManagerService::saveRights(
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900341 int uniqueId, const DrmRights& drmRights,
342 const String8& rightsPath, const String8& contentPath) {
Steve Block3856b092011-10-20 11:56:00 +0100343 ALOGV("Save Rights");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900344 Parcel data, reply;
345
346 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
347 data.writeInt32(uniqueId);
348
349 //Filling Drm Rights
350 const DrmBuffer dataBuffer = drmRights.getData();
351 data.writeInt32(dataBuffer.length);
352 data.write(dataBuffer.data, dataBuffer.length);
353
354 const String8 mimeType = drmRights.getMimeType();
355 data.writeString8((mimeType == String8("")) ? String8("NULL") : mimeType);
356
357 const String8 accountId = drmRights.getAccountId();
358 data.writeString8((accountId == String8("")) ? String8("NULL") : accountId);
359
360 const String8 subscriptionId = drmRights.getSubscriptionId();
361 data.writeString8((subscriptionId == String8("")) ? String8("NULL") : subscriptionId);
362
363 data.writeString8((rightsPath == String8("")) ? String8("NULL") : rightsPath);
364 data.writeString8((contentPath == String8("")) ? String8("NULL") : contentPath);
365
366 remote()->transact(SAVE_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900367 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900368}
369
James Dongbf5b3b22012-07-30 17:57:39 -0700370String8 BpDrmManagerService::getOriginalMimeType(int uniqueId, const String8& path, int fd) {
Steve Block3856b092011-10-20 11:56:00 +0100371 ALOGV("Get Original MimeType");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900372 Parcel data, reply;
373
374 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
375 data.writeInt32(uniqueId);
376 data.writeString8(path);
James Dongbf5b3b22012-07-30 17:57:39 -0700377 int32_t isFdValid = (fd >= 0);
378 data.writeInt32(isFdValid);
379 if (isFdValid) {
380 data.writeFileDescriptor(fd);
381 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900382
383 remote()->transact(GET_ORIGINAL_MIMETYPE, data, &reply);
384 return reply.readString8();
385}
386
387int BpDrmManagerService::getDrmObjectType(
388 int uniqueId, const String8& path, const String8& mimeType) {
Steve Block3856b092011-10-20 11:56:00 +0100389 ALOGV("Get Drm object type");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900390 Parcel data, reply;
391
392 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
393 data.writeInt32(uniqueId);
394 data.writeString8(path);
395 data.writeString8(mimeType);
396
397 remote()->transact(GET_DRM_OBJECT_TYPE, data, &reply);
398
399 return reply.readInt32();
400}
401
402int BpDrmManagerService::checkRightsStatus(int uniqueId, const String8& path, int action) {
Steve Block3856b092011-10-20 11:56:00 +0100403 ALOGV("checkRightsStatus");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900404 Parcel data, reply;
405
406 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
407 data.writeInt32(uniqueId);
408 data.writeString8(path);
409 data.writeInt32(action);
410
411 remote()->transact(CHECK_RIGHTS_STATUS, data, &reply);
412
413 return reply.readInt32();
414}
415
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900416status_t BpDrmManagerService::consumeRights(
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700417 int uniqueId, sp<DecryptHandle>& decryptHandle, int action, bool reserve) {
Steve Block3856b092011-10-20 11:56:00 +0100418 ALOGV("consumeRights");
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900419 Parcel data, reply;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900420
421 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
422 data.writeInt32(uniqueId);
423
Gloria Wangc10ce332011-06-15 10:27:52 -0700424 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900425
426 data.writeInt32(action);
427 data.writeInt32(static_cast< int>(reserve));
428
429 remote()->transact(CONSUME_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900430 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900431}
432
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900433status_t BpDrmManagerService::setPlaybackStatus(
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700434 int uniqueId, sp<DecryptHandle>& decryptHandle, int playbackStatus, int64_t position) {
Steve Block3856b092011-10-20 11:56:00 +0100435 ALOGV("setPlaybackStatus");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900436 Parcel data, reply;
437
438 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
439 data.writeInt32(uniqueId);
440
Gloria Wangc10ce332011-06-15 10:27:52 -0700441 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900442
443 data.writeInt32(playbackStatus);
Gloria Wang2ed8a922011-01-19 15:38:16 -0800444 data.writeInt64(position);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900445
446 remote()->transact(SET_PLAYBACK_STATUS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900447 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900448}
449
450bool BpDrmManagerService::validateAction(
451 int uniqueId, const String8& path,
452 int action, const ActionDescription& description) {
Steve Block3856b092011-10-20 11:56:00 +0100453 ALOGV("validateAction");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900454 Parcel data, reply;
455
456 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
457 data.writeInt32(uniqueId);
458 data.writeString8(path);
459 data.writeInt32(action);
460 data.writeInt32(description.outputType);
461 data.writeInt32(description.configuration);
462
463 remote()->transact(VALIDATE_ACTION, data, &reply);
464
465 return static_cast<bool>(reply.readInt32());
466}
467
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900468status_t BpDrmManagerService::removeRights(int uniqueId, const String8& path) {
Steve Block3856b092011-10-20 11:56:00 +0100469 ALOGV("removeRights");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900470 Parcel data, reply;
471
472 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
473 data.writeInt32(uniqueId);
474 data.writeString8(path);
475
476 remote()->transact(REMOVE_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900477 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900478}
479
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900480status_t BpDrmManagerService::removeAllRights(int uniqueId) {
Steve Block3856b092011-10-20 11:56:00 +0100481 ALOGV("removeAllRights");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900482 Parcel data, reply;
483
484 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
485 data.writeInt32(uniqueId);
486
487 remote()->transact(REMOVE_ALL_RIGHTS, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900488 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900489}
490
491int BpDrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) {
Steve Block3856b092011-10-20 11:56:00 +0100492 ALOGV("openConvertSession");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900493 Parcel data, reply;
494
495 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
496 data.writeInt32(uniqueId);
497 data.writeString8(mimeType);
498
499 remote()->transact(OPEN_CONVERT_SESSION, data, &reply);
500 return reply.readInt32();
501}
502
503DrmConvertedStatus* BpDrmManagerService::convertData(
504 int uniqueId, int convertId, const DrmBuffer* inputData) {
Steve Block3856b092011-10-20 11:56:00 +0100505 ALOGV("convertData");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900506 Parcel data, reply;
507
508 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
509 data.writeInt32(uniqueId);
510 data.writeInt32(convertId);
511 data.writeInt32(inputData->length);
512 data.write(inputData->data, inputData->length);
513
514 remote()->transact(CONVERT_DATA, data, &reply);
515
516 DrmConvertedStatus* drmConvertedStatus = NULL;
517
518 if (0 != reply.dataAvail()) {
519 //Filling DRM Converted Status
520 const int statusCode = reply.readInt32();
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800521 const off64_t offset = reply.readInt64();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900522
523 DrmBuffer* convertedData = NULL;
524 if (0 != reply.dataAvail()) {
525 const int bufferSize = reply.readInt32();
526 char* data = NULL;
527 if (0 < bufferSize) {
528 data = new char[bufferSize];
529 reply.read(data, bufferSize);
530 }
531 convertedData = new DrmBuffer(data, bufferSize);
532 }
533 drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
534 }
535 return drmConvertedStatus;
536}
537
538DrmConvertedStatus* BpDrmManagerService::closeConvertSession(int uniqueId, int convertId) {
Steve Block3856b092011-10-20 11:56:00 +0100539 ALOGV("closeConvertSession");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900540 Parcel data, reply;
541
542 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
543 data.writeInt32(uniqueId);
544 data.writeInt32(convertId);
545
546 remote()->transact(CLOSE_CONVERT_SESSION, data, &reply);
547
548 DrmConvertedStatus* drmConvertedStatus = NULL;
549
550 if (0 != reply.dataAvail()) {
551 //Filling DRM Converted Status
552 const int statusCode = reply.readInt32();
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800553 const off64_t offset = reply.readInt64();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900554
555 DrmBuffer* convertedData = NULL;
556 if (0 != reply.dataAvail()) {
557 const int bufferSize = reply.readInt32();
558 char* data = NULL;
559 if (0 < bufferSize) {
560 data = new char[bufferSize];
561 reply.read(data, bufferSize);
562 }
563 convertedData = new DrmBuffer(data, bufferSize);
564 }
565 drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
566 }
567 return drmConvertedStatus;
568}
569
570status_t BpDrmManagerService::getAllSupportInfo(
571 int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) {
Steve Block3856b092011-10-20 11:56:00 +0100572 ALOGV("Get All Support Info");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900573 Parcel data, reply;
574
575 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
576 data.writeInt32(uniqueId);
577
578 remote()->transact(GET_ALL_SUPPORT_INFO, data, &reply);
579
580 //Filling DRM Support Info
581 const int arraySize = reply.readInt32();
582 if (0 < arraySize) {
583 *drmSupportInfoArray = new DrmSupportInfo[arraySize];
584
585 for (int index = 0; index < arraySize; ++index) {
586 DrmSupportInfo drmSupportInfo;
587
588 const int fileSuffixVectorSize = reply.readInt32();
589 for (int i = 0; i < fileSuffixVectorSize; ++i) {
590 drmSupportInfo.addFileSuffix(reply.readString8());
591 }
592
593 const int mimeTypeVectorSize = reply.readInt32();
594 for (int i = 0; i < mimeTypeVectorSize; ++i) {
595 drmSupportInfo.addMimeType(reply.readString8());
596 }
597
598 drmSupportInfo.setDescription(reply.readString8());
599 (*drmSupportInfoArray)[index] = drmSupportInfo;
600 }
601 }
602 *length = arraySize;
603 return reply.readInt32();
604}
605
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700606sp<DecryptHandle> BpDrmManagerService::openDecryptSession(
James Dong9d2f3862012-01-10 08:24:37 -0800607 int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) {
Steve Block3856b092011-10-20 11:56:00 +0100608 ALOGV("Entering BpDrmManagerService::openDecryptSession");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900609 Parcel data, reply;
610
Takeshi Aimie943f842010-10-08 23:05:49 +0900611 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900612 data.writeInt32(uniqueId);
613 data.writeFileDescriptor(fd);
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800614 data.writeInt64(offset);
615 data.writeInt64(length);
James Dong9d2f3862012-01-10 08:24:37 -0800616 String8 mimeType;
617 if (mime) {
618 mimeType = mime;
619 }
620 data.writeString8(mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900621
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900622 remote()->transact(OPEN_DECRYPT_SESSION, data, &reply);
623
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700624 sp<DecryptHandle> handle;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900625 if (0 != reply.dataAvail()) {
626 handle = new DecryptHandle();
Gloria Wang1da9aa62011-03-20 10:25:16 -0700627 readDecryptHandleFromParcelData(handle, reply);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900628 }
629 return handle;
630}
631
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700632sp<DecryptHandle> BpDrmManagerService::openDecryptSession(
James Dong9d2f3862012-01-10 08:24:37 -0800633 int uniqueId, const char* uri, const char* mime) {
634
635 ALOGV("Entering BpDrmManagerService::openDecryptSession: mime=%s", mime? mime: "NULL");
Takeshi Aimie943f842010-10-08 23:05:49 +0900636 Parcel data, reply;
637
638 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
639 data.writeInt32(uniqueId);
640 data.writeString8(String8(uri));
James Dong9d2f3862012-01-10 08:24:37 -0800641 String8 mimeType;
642 if (mime) {
643 mimeType = mime;
644 }
645 data.writeString8(mimeType);
Takeshi Aimie943f842010-10-08 23:05:49 +0900646
647 remote()->transact(OPEN_DECRYPT_SESSION_FROM_URI, data, &reply);
648
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700649 sp<DecryptHandle> handle;
Takeshi Aimie943f842010-10-08 23:05:49 +0900650 if (0 != reply.dataAvail()) {
651 handle = new DecryptHandle();
Gloria Wang1da9aa62011-03-20 10:25:16 -0700652 readDecryptHandleFromParcelData(handle, reply);
Takeshi Aimie943f842010-10-08 23:05:49 +0900653 } else {
Steve Block3856b092011-10-20 11:56:00 +0100654 ALOGV("no decryptHandle is generated in service side");
Takeshi Aimie943f842010-10-08 23:05:49 +0900655 }
656 return handle;
657}
658
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700659sp<DecryptHandle> BpDrmManagerService::openDecryptSession(
Kei Takahashicba7b322012-01-18 17:10:19 +0900660 int uniqueId, const DrmBuffer& buf, const String8& mimeType) {
661 ALOGV("Entering BpDrmManagerService::openDecryptSession");
662 Parcel data, reply;
663
664 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
665 data.writeInt32(uniqueId);
666 if (buf.data != NULL && buf.length > 0) {
667 data.writeInt32(buf.length);
668 data.write(buf.data, buf.length);
669 } else {
670 data.writeInt32(0);
671 }
672 data.writeString8(mimeType);
673
674 remote()->transact(OPEN_DECRYPT_SESSION_FOR_STREAMING, data, &reply);
675
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700676 sp<DecryptHandle> handle;
Kei Takahashicba7b322012-01-18 17:10:19 +0900677 if (0 != reply.dataAvail()) {
678 handle = new DecryptHandle();
679 readDecryptHandleFromParcelData(handle, reply);
680 } else {
681 ALOGV("no decryptHandle is generated in service side");
682 }
683 return handle;
684}
685
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700686status_t BpDrmManagerService::closeDecryptSession(int uniqueId, sp<DecryptHandle>& decryptHandle) {
Steve Block3856b092011-10-20 11:56:00 +0100687 ALOGV("closeDecryptSession");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900688 Parcel data, reply;
689
690 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
691 data.writeInt32(uniqueId);
692
Gloria Wangc10ce332011-06-15 10:27:52 -0700693 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900694
695 remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply);
696
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900697 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900698}
699
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900700status_t BpDrmManagerService::initializeDecryptUnit(
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700701 int uniqueId, sp<DecryptHandle>& decryptHandle,
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900702 int decryptUnitId, const DrmBuffer* headerInfo) {
Steve Block3856b092011-10-20 11:56:00 +0100703 ALOGV("initializeDecryptUnit");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900704 Parcel data, reply;
705
706 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
707 data.writeInt32(uniqueId);
708
Gloria Wangc10ce332011-06-15 10:27:52 -0700709 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900710
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900711 data.writeInt32(decryptUnitId);
712
713 data.writeInt32(headerInfo->length);
714 data.write(headerInfo->data, headerInfo->length);
715
716 remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900717 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900718}
719
720status_t BpDrmManagerService::decrypt(
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700721 int uniqueId, sp<DecryptHandle>& decryptHandle, int decryptUnitId,
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900722 const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) {
Steve Block3856b092011-10-20 11:56:00 +0100723 ALOGV("decrypt");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900724 Parcel data, reply;
725
726 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
727 data.writeInt32(uniqueId);
728
Gloria Wangc10ce332011-06-15 10:27:52 -0700729 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900730
731 data.writeInt32(decryptUnitId);
732 data.writeInt32((*decBuffer)->length);
733
734 data.writeInt32(encBuffer->length);
735 data.write(encBuffer->data, encBuffer->length);
736
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900737 if (NULL != IV) {
738 data.writeInt32(IV->length);
739 data.write(IV->data, IV->length);
740 }
741
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900742 remote()->transact(DECRYPT, data, &reply);
743
744 const status_t status = reply.readInt32();
Steve Block3856b092011-10-20 11:56:00 +0100745 ALOGV("Return value of decrypt() is %d", status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900746
Jeff Tinker09ed70f2015-09-14 13:55:23 -0700747 if (status == NO_ERROR) {
748 const int size = reply.readInt32();
749 (*decBuffer)->length = size;
750 reply.read((void *)(*decBuffer)->data, size);
751 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900752
753 return status;
754}
755
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900756status_t BpDrmManagerService::finalizeDecryptUnit(
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700757 int uniqueId, sp<DecryptHandle>& decryptHandle, int decryptUnitId) {
Steve Block3856b092011-10-20 11:56:00 +0100758 ALOGV("finalizeDecryptUnit");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900759 Parcel data, reply;
760
761 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
762 data.writeInt32(uniqueId);
763
Gloria Wangc10ce332011-06-15 10:27:52 -0700764 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900765
766 data.writeInt32(decryptUnitId);
767
768 remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply);
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900769 return reply.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900770}
771
772ssize_t BpDrmManagerService::pread(
Jeff Tinker5d49bef2018-10-03 23:01:09 -0700773 int uniqueId, sp<DecryptHandle>& decryptHandle, void* buffer,
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800774 ssize_t numBytes, off64_t offset) {
Steve Block3856b092011-10-20 11:56:00 +0100775 ALOGV("read");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900776 Parcel data, reply;
777 int result;
778
779 data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
780 data.writeInt32(uniqueId);
781
Gloria Wangc10ce332011-06-15 10:27:52 -0700782 writeDecryptHandleToParcelData(decryptHandle, &data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900783
784 data.writeInt32(numBytes);
Gloria Wanga2cd44c2010-11-19 15:19:36 -0800785 data.writeInt64(offset);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900786
787 remote()->transact(PREAD, data, &reply);
788 result = reply.readInt32();
789 if (0 < result) {
790 reply.read(buffer, result);
791 }
792 return result;
793}
794
795IMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService");
796
797status_t BnDrmManagerService::onTransact(
798 uint32_t code, const Parcel& data,
799 Parcel* reply, uint32_t flags) {
Steve Block3856b092011-10-20 11:56:00 +0100800 ALOGV("Entering BnDrmManagerService::onTransact with code %d", code);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900801
802 switch (code) {
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900803 case ADD_UNIQUEID:
804 {
Steve Block3856b092011-10-20 11:56:00 +0100805 ALOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID");
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900806 CHECK_INTERFACE(IDrmManagerService, data, reply);
807 int uniqueId = addUniqueId(data.readInt32());
808 reply->writeInt32(uniqueId);
809 return DRM_NO_ERROR;
810 }
811
812 case REMOVE_UNIQUEID:
813 {
Steve Block3856b092011-10-20 11:56:00 +0100814 ALOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID");
Takeshi Aimi2272ee22010-09-20 23:40:41 +0900815 CHECK_INTERFACE(IDrmManagerService, data, reply);
816 removeUniqueId(data.readInt32());
817 return DRM_NO_ERROR;
818 }
819
Takeshi Aimie943f842010-10-08 23:05:49 +0900820 case ADD_CLIENT:
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900821 {
Steve Block3856b092011-10-20 11:56:00 +0100822 ALOGV("BnDrmManagerService::onTransact :ADD_CLIENT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900823 CHECK_INTERFACE(IDrmManagerService, data, reply);
Takeshi Aimie943f842010-10-08 23:05:49 +0900824 addClient(data.readInt32());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900825 return DRM_NO_ERROR;
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900826 }
827
Takeshi Aimie943f842010-10-08 23:05:49 +0900828 case REMOVE_CLIENT:
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900829 {
Steve Block3856b092011-10-20 11:56:00 +0100830 ALOGV("BnDrmManagerService::onTransact :REMOVE_CLIENT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900831 CHECK_INTERFACE(IDrmManagerService, data, reply);
Takeshi Aimie943f842010-10-08 23:05:49 +0900832 removeClient(data.readInt32());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900833 return DRM_NO_ERROR;
834 }
835
836 case SET_DRM_SERVICE_LISTENER:
837 {
Steve Block3856b092011-10-20 11:56:00 +0100838 ALOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900839 CHECK_INTERFACE(IDrmManagerService, data, reply);
840
841 const int uniqueId = data.readInt32();
842 const sp<IDrmServiceListener> drmServiceListener
843 = interface_cast<IDrmServiceListener> (data.readStrongBinder());
844
845 status_t status = setDrmServiceListener(uniqueId, drmServiceListener);
846
847 reply->writeInt32(status);
848 return DRM_NO_ERROR;
849 }
850
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900851 case GET_CONSTRAINTS_FROM_CONTENT:
852 {
Steve Block3856b092011-10-20 11:56:00 +0100853 ALOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900854 CHECK_INTERFACE(IDrmManagerService, data, reply);
855
856 const int uniqueId = data.readInt32();
857 const String8 path = data.readString8();
858
Gloria Wang197f0472011-08-01 10:31:24 -0700859 DrmConstraints* drmConstraints
860 = getConstraints(uniqueId, &path, data.readInt32());
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900861
862 if (NULL != drmConstraints) {
863 //Filling DRM Constraints contents
864 reply->writeInt32(drmConstraints->getCount());
865
866 DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator();
867 while (keyIt.hasNext()) {
868 const String8 key = keyIt.next();
869 reply->writeString8(key);
870 const char* value = drmConstraints->getAsByteArray(&key);
871 int bufferSize = 0;
872 if (NULL != value) {
873 bufferSize = strlen(value);
Hung Nguyen0bf43842012-06-05 13:19:53 +0200874 reply->writeInt32(bufferSize + 1);
875 reply->write(value, bufferSize + 1);
876 } else {
877 reply->writeInt32(0);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900878 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900879 }
880 }
881 delete drmConstraints; drmConstraints = NULL;
882 return DRM_NO_ERROR;
883 }
884
Takeshi Aimi34738462010-11-16 13:56:11 +0900885 case GET_METADATA_FROM_CONTENT:
886 {
Steve Block3856b092011-10-20 11:56:00 +0100887 ALOGV("BnDrmManagerService::onTransact :GET_METADATA_FROM_CONTENT");
Takeshi Aimi34738462010-11-16 13:56:11 +0900888 CHECK_INTERFACE(IDrmManagerService, data, reply);
889
890 const int uniqueId = data.readInt32();
891 const String8 path = data.readString8();
892
893 DrmMetadata* drmMetadata = getMetadata(uniqueId, &path);
894 if (NULL != drmMetadata) {
895 //Filling DRM Metadata contents
896 reply->writeInt32(drmMetadata->getCount());
897
898 DrmMetadata::KeyIterator keyIt = drmMetadata->keyIterator();
899 while (keyIt.hasNext()) {
900 const String8 key = keyIt.next();
901 reply->writeString8(key);
902 const char* value = drmMetadata->getAsByteArray(&key);
903 int bufferSize = 0;
904 if (NULL != value) {
905 bufferSize = strlen(value);
906 reply->writeInt32(bufferSize + 1);
907 reply->write(value, bufferSize + 1);
908 } else {
909 reply->writeInt32(0);
910 }
911 }
912 }
913 delete drmMetadata; drmMetadata = NULL;
914 return NO_ERROR;
915 }
916
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900917 case CAN_HANDLE:
918 {
Steve Block3856b092011-10-20 11:56:00 +0100919 ALOGV("BnDrmManagerService::onTransact :CAN_HANDLE");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900920 CHECK_INTERFACE(IDrmManagerService, data, reply);
921
922 const int uniqueId = data.readInt32();
923 const String8 path = data.readString8();
924 const String8 mimeType = data.readString8();
925
926 bool result = canHandle(uniqueId, path, mimeType);
927
928 reply->writeInt32(result);
929 return DRM_NO_ERROR;
930 }
931
932 case PROCESS_DRM_INFO:
933 {
Steve Block3856b092011-10-20 11:56:00 +0100934 ALOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900935 CHECK_INTERFACE(IDrmManagerService, data, reply);
936
937 const int uniqueId = data.readInt32();
938
939 //Filling DRM info
940 const int infoType = data.readInt32();
Jeff Tinkerb408fa22015-04-28 16:42:20 -0700941 const uint32_t bufferSize = data.readInt32();
942
943 if (bufferSize > data.dataAvail()) {
944 return BAD_VALUE;
945 }
946
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900947 char* buffer = NULL;
948 if (0 < bufferSize) {
949 buffer = (char *)data.readInplace(bufferSize);
950 }
951 const DrmBuffer drmBuffer(buffer, bufferSize);
952 DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8());
953
954 const int size = data.readInt32();
955 for (int index = 0; index < size; ++index) {
956 const String8 key(data.readString8());
957 const String8 value(data.readString8());
958 drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
959 }
960
961 DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo);
962
963 if (NULL != drmInfoStatus) {
964 //Filling DRM Info Status contents
965 reply->writeInt32(drmInfoStatus->statusCode);
Takeshi Aimie943f842010-10-08 23:05:49 +0900966 reply->writeInt32(drmInfoStatus->infoType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900967 reply->writeString8(drmInfoStatus->mimeType);
968
969 if (NULL != drmInfoStatus->drmBuffer) {
970 const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer;
971 const int bufferSize = drmBuffer->length;
972 reply->writeInt32(bufferSize);
973 if (0 < bufferSize) {
974 reply->write(drmBuffer->data, bufferSize);
975 }
976 delete [] drmBuffer->data;
977 delete drmBuffer; drmBuffer = NULL;
978 }
979 }
980 delete drmInfo; drmInfo = NULL;
981 delete drmInfoStatus; drmInfoStatus = NULL;
982 return DRM_NO_ERROR;
983 }
984
985 case ACQUIRE_DRM_INFO:
986 {
Steve Block3856b092011-10-20 11:56:00 +0100987 ALOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO");
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900988 CHECK_INTERFACE(IDrmManagerService, data, reply);
989
990 const int uniqueId = data.readInt32();
991
992 //Filling DRM info Request
Gloria Wang197f0472011-08-01 10:31:24 -0700993 const int infoType = data.readInt32();
994 const String8 mimeType = data.readString8();
995 DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(infoType, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +0900996
997 const int size = data.readInt32();
998 for (int index = 0; index < size; ++index) {
Jeff Tinkerb408fa22015-04-28 16:42:20 -0700999 if (!data.dataAvail()) {
1000 break;
1001 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001002 const String8 key(data.readString8());
Gene Morgan0abeaca2012-09-14 13:35:39 -07001003 if (key == String8("FileDescriptorKey")) {
1004 char buffer[16];
1005 int fd = data.readFileDescriptor();
1006 sprintf(buffer, "%lu", (unsigned long)fd);
1007 drmInfoRequest->put(key, String8(buffer));
1008 } else {
1009 const String8 value(data.readString8());
1010 drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value);
1011 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001012 }
1013
1014 DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest);
1015
1016 if (NULL != drmInfo) {
1017 //Filling DRM Info
1018 const DrmBuffer drmBuffer = drmInfo->getData();
1019 reply->writeInt32(drmInfo->getInfoType());
1020
1021 const int bufferSize = drmBuffer.length;
1022 reply->writeInt32(bufferSize);
1023 if (0 < bufferSize) {
1024 reply->write(drmBuffer.data, bufferSize);
1025 }
1026 reply->writeString8(drmInfo->getMimeType());
1027 reply->writeInt32(drmInfo->getCount());
1028
1029 DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
1030 while (keyIt.hasNext()) {
1031 const String8 key = keyIt.next();
1032 reply->writeString8(key);
1033 const String8 value = drmInfo->get(key);
1034 reply->writeString8((value == String8("")) ? String8("NULL") : value);
1035 }
1036 delete [] drmBuffer.data;
1037 }
1038 delete drmInfoRequest; drmInfoRequest = NULL;
1039 delete drmInfo; drmInfo = NULL;
1040 return DRM_NO_ERROR;
1041 }
1042
1043 case SAVE_RIGHTS:
1044 {
Steve Block3856b092011-10-20 11:56:00 +01001045 ALOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001046 CHECK_INTERFACE(IDrmManagerService, data, reply);
1047
1048 const int uniqueId = data.readInt32();
1049
1050 //Filling DRM Rights
Jeff Tinkerb408fa22015-04-28 16:42:20 -07001051 const uint32_t bufferSize = data.readInt32();
1052 if (bufferSize > data.dataAvail()) {
1053 reply->writeInt32(BAD_VALUE);
1054 return DRM_NO_ERROR;
1055 }
1056
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001057 const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1058
1059 const String8 mimeType(data.readString8());
1060 const String8 accountId(data.readString8());
1061 const String8 subscriptionId(data.readString8());
1062 const String8 rightsPath(data.readString8());
1063 const String8 contentPath(data.readString8());
1064
1065 DrmRights drmRights(drmBuffer,
1066 ((mimeType == String8("NULL")) ? String8("") : mimeType),
1067 ((accountId == String8("NULL")) ? String8("") : accountId),
1068 ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId));
1069
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001070 const status_t status = saveRights(uniqueId, drmRights,
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001071 ((rightsPath == String8("NULL")) ? String8("") : rightsPath),
1072 ((contentPath == String8("NULL")) ? String8("") : contentPath));
1073
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001074 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001075 return DRM_NO_ERROR;
1076 }
1077
1078 case GET_ORIGINAL_MIMETYPE:
1079 {
Steve Block3856b092011-10-20 11:56:00 +01001080 ALOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001081 CHECK_INTERFACE(IDrmManagerService, data, reply);
1082
Gloria Wang197f0472011-08-01 10:31:24 -07001083 const int uniqueId = data.readInt32();
1084 const String8 path = data.readString8();
James Dongbf5b3b22012-07-30 17:57:39 -07001085 const int32_t isFdValid = data.readInt32();
1086 int fd = -1;
1087 if (isFdValid) {
1088 fd = data.readFileDescriptor();
1089 }
1090 const String8 originalMimeType = getOriginalMimeType(uniqueId, path, fd);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001091
1092 reply->writeString8(originalMimeType);
1093 return DRM_NO_ERROR;
1094 }
1095
1096 case GET_DRM_OBJECT_TYPE:
1097 {
Steve Block3856b092011-10-20 11:56:00 +01001098 ALOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001099 CHECK_INTERFACE(IDrmManagerService, data, reply);
1100
Gloria Wang197f0472011-08-01 10:31:24 -07001101 const int uniqueId = data.readInt32();
1102 const String8 path = data.readString8();
1103 const String8 mimeType = data.readString8();
1104 const int drmObjectType = getDrmObjectType(uniqueId, path, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001105
1106 reply->writeInt32(drmObjectType);
1107 return DRM_NO_ERROR;
1108 }
1109
1110 case CHECK_RIGHTS_STATUS:
1111 {
Steve Block3856b092011-10-20 11:56:00 +01001112 ALOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001113 CHECK_INTERFACE(IDrmManagerService, data, reply);
1114
Gloria Wang197f0472011-08-01 10:31:24 -07001115 const int uniqueId = data.readInt32();
1116 const String8 path = data.readString8();
1117 const int action = data.readInt32();
1118 const int result = checkRightsStatus(uniqueId, path, action);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001119
1120 reply->writeInt32(result);
1121 return DRM_NO_ERROR;
1122 }
1123
1124 case CONSUME_RIGHTS:
1125 {
Steve Block3856b092011-10-20 11:56:00 +01001126 ALOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001127 CHECK_INTERFACE(IDrmManagerService, data, reply);
1128
1129 const int uniqueId = data.readInt32();
1130
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001131 sp<DecryptHandle> handle = new DecryptHandle();
1132 readDecryptHandleFromParcelData(handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001133
Gloria Wang197f0472011-08-01 10:31:24 -07001134 const int action = data.readInt32();
1135 const bool reserve = static_cast<bool>(data.readInt32());
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001136 const status_t status
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001137 = consumeRights(uniqueId, handle, action, reserve);
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001138 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001139
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001140 clearDecryptHandle(handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001141 return DRM_NO_ERROR;
1142 }
1143
1144 case SET_PLAYBACK_STATUS:
1145 {
Steve Block3856b092011-10-20 11:56:00 +01001146 ALOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001147 CHECK_INTERFACE(IDrmManagerService, data, reply);
1148
1149 const int uniqueId = data.readInt32();
1150
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001151 sp<DecryptHandle> handle = new DecryptHandle();
1152 readDecryptHandleFromParcelData(handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001153
Gloria Wang197f0472011-08-01 10:31:24 -07001154 const int playbackStatus = data.readInt32();
1155 const int64_t position = data.readInt64();
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001156 const status_t status
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001157 = setPlaybackStatus(uniqueId, handle, playbackStatus, position);
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001158 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001159
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001160 clearDecryptHandle(handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001161 return DRM_NO_ERROR;
1162 }
1163
1164 case VALIDATE_ACTION:
1165 {
Steve Block3856b092011-10-20 11:56:00 +01001166 ALOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001167 CHECK_INTERFACE(IDrmManagerService, data, reply);
1168
Gloria Wang197f0472011-08-01 10:31:24 -07001169 const int uniqueId = data.readInt32();
1170 const String8 path = data.readString8();
1171 const int action = data.readInt32();
1172 const int outputType = data.readInt32();
1173 const int configuration = data.readInt32();
1174 bool result = validateAction(uniqueId, path, action,
1175 ActionDescription(outputType, configuration));
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001176
1177 reply->writeInt32(result);
1178 return DRM_NO_ERROR;
1179 }
1180
1181 case REMOVE_RIGHTS:
1182 {
Steve Block3856b092011-10-20 11:56:00 +01001183 ALOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001184 CHECK_INTERFACE(IDrmManagerService, data, reply);
1185
Gloria Wang197f0472011-08-01 10:31:24 -07001186 int uniqueId = data.readInt32();
1187 String8 path = data.readString8();
1188 const status_t status = removeRights(uniqueId, path);
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001189 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001190
1191 return DRM_NO_ERROR;
1192 }
1193
1194 case REMOVE_ALL_RIGHTS:
1195 {
Steve Block3856b092011-10-20 11:56:00 +01001196 ALOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001197 CHECK_INTERFACE(IDrmManagerService, data, reply);
1198
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001199 const status_t status = removeAllRights(data.readInt32());
1200 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001201
1202 return DRM_NO_ERROR;
1203 }
1204
1205 case OPEN_CONVERT_SESSION:
1206 {
Steve Block3856b092011-10-20 11:56:00 +01001207 ALOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001208 CHECK_INTERFACE(IDrmManagerService, data, reply);
1209
Gloria Wang197f0472011-08-01 10:31:24 -07001210 const int uniqueId = data.readInt32();
1211 const String8 mimeType = data.readString8();
1212 const int convertId = openConvertSession(uniqueId, mimeType);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001213
1214 reply->writeInt32(convertId);
1215 return DRM_NO_ERROR;
1216 }
1217
1218 case CONVERT_DATA:
1219 {
Steve Block3856b092011-10-20 11:56:00 +01001220 ALOGV("BnDrmManagerService::onTransact :CONVERT_DATA");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001221 CHECK_INTERFACE(IDrmManagerService, data, reply);
1222
1223 const int uniqueId = data.readInt32();
1224 const int convertId = data.readInt32();
1225
1226 //Filling input data
Jeff Tinkerb408fa22015-04-28 16:42:20 -07001227 const uint32_t bufferSize = data.readInt32();
1228 if (bufferSize > data.dataAvail()) {
1229 return BAD_VALUE;
1230 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001231 DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1232
Jeff Tinkerb408fa22015-04-28 16:42:20 -07001233 DrmConvertedStatus* drmConvertedStatus = convertData(uniqueId, convertId, inputData);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001234
1235 if (NULL != drmConvertedStatus) {
1236 //Filling Drm Converted Ststus
1237 reply->writeInt32(drmConvertedStatus->statusCode);
Gloria Wanga2cd44c2010-11-19 15:19:36 -08001238 reply->writeInt64(drmConvertedStatus->offset);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001239
1240 if (NULL != drmConvertedStatus->convertedData) {
1241 const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
1242 const int bufferSize = convertedData->length;
1243 reply->writeInt32(bufferSize);
1244 if (0 < bufferSize) {
1245 reply->write(convertedData->data, bufferSize);
1246 }
1247 delete [] convertedData->data;
1248 delete convertedData; convertedData = NULL;
1249 }
1250 }
1251 delete inputData; inputData = NULL;
1252 delete drmConvertedStatus; drmConvertedStatus = NULL;
1253 return DRM_NO_ERROR;
1254 }
1255
1256 case CLOSE_CONVERT_SESSION:
1257 {
Steve Block3856b092011-10-20 11:56:00 +01001258 ALOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001259 CHECK_INTERFACE(IDrmManagerService, data, reply);
1260
Gloria Wang197f0472011-08-01 10:31:24 -07001261 const int uniqueId = data.readInt32();
1262 const int convertId = data.readInt32();
1263 DrmConvertedStatus* drmConvertedStatus
1264 = closeConvertSession(uniqueId, convertId);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001265
1266 if (NULL != drmConvertedStatus) {
1267 //Filling Drm Converted Ststus
1268 reply->writeInt32(drmConvertedStatus->statusCode);
Gloria Wanga2cd44c2010-11-19 15:19:36 -08001269 reply->writeInt64(drmConvertedStatus->offset);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001270
1271 if (NULL != drmConvertedStatus->convertedData) {
1272 const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
1273 const int bufferSize = convertedData->length;
1274 reply->writeInt32(bufferSize);
1275 if (0 < bufferSize) {
1276 reply->write(convertedData->data, bufferSize);
1277 }
1278 delete [] convertedData->data;
1279 delete convertedData; convertedData = NULL;
1280 }
1281 }
1282 delete drmConvertedStatus; drmConvertedStatus = NULL;
1283 return DRM_NO_ERROR;
1284 }
1285
1286 case GET_ALL_SUPPORT_INFO:
1287 {
Steve Block3856b092011-10-20 11:56:00 +01001288 ALOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001289 CHECK_INTERFACE(IDrmManagerService, data, reply);
1290
1291 const int uniqueId = data.readInt32();
1292 int length = 0;
1293 DrmSupportInfo* drmSupportInfoArray = NULL;
1294
1295 status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray);
1296
1297 reply->writeInt32(length);
1298 for (int i = 0; i < length; ++i) {
1299 DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i];
1300
1301 reply->writeInt32(drmSupportInfo.getFileSuffixCount());
1302 DrmSupportInfo::FileSuffixIterator fileSuffixIt
1303 = drmSupportInfo.getFileSuffixIterator();
1304 while (fileSuffixIt.hasNext()) {
1305 reply->writeString8(fileSuffixIt.next());
1306 }
1307
1308 reply->writeInt32(drmSupportInfo.getMimeTypeCount());
1309 DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator();
1310 while (mimeTypeIt.hasNext()) {
1311 reply->writeString8(mimeTypeIt.next());
1312 }
1313 reply->writeString8(drmSupportInfo.getDescription());
1314 }
1315 delete [] drmSupportInfoArray; drmSupportInfoArray = NULL;
1316 reply->writeInt32(status);
1317 return DRM_NO_ERROR;
1318 }
1319
1320 case OPEN_DECRYPT_SESSION:
1321 {
Steve Block3856b092011-10-20 11:56:00 +01001322 ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001323 CHECK_INTERFACE(IDrmManagerService, data, reply);
1324
1325 const int uniqueId = data.readInt32();
1326 const int fd = data.readFileDescriptor();
1327
Gloria Wang197f0472011-08-01 10:31:24 -07001328 const off64_t offset = data.readInt64();
1329 const off64_t length = data.readInt64();
James Dong9d2f3862012-01-10 08:24:37 -08001330 const String8 mime = data.readString8();
1331
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001332 sp<DecryptHandle> handle
James Dong9d2f3862012-01-10 08:24:37 -08001333 = openDecryptSession(uniqueId, fd, offset, length, mime.string());
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001334
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001335 if (NULL != handle.get()) {
1336 writeDecryptHandleToParcelData(handle.get(), reply);
Gloria Wang1da9aa62011-03-20 10:25:16 -07001337 clearDecryptHandle(handle);
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001338 handle.clear();
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001339 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001340 return DRM_NO_ERROR;
1341 }
1342
Takeshi Aimie943f842010-10-08 23:05:49 +09001343 case OPEN_DECRYPT_SESSION_FROM_URI:
1344 {
Steve Block3856b092011-10-20 11:56:00 +01001345 ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI");
Takeshi Aimie943f842010-10-08 23:05:49 +09001346 CHECK_INTERFACE(IDrmManagerService, data, reply);
1347
1348 const int uniqueId = data.readInt32();
1349 const String8 uri = data.readString8();
James Dong9d2f3862012-01-10 08:24:37 -08001350 const String8 mime = data.readString8();
Takeshi Aimie943f842010-10-08 23:05:49 +09001351
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001352 sp<DecryptHandle> handle = openDecryptSession(uniqueId, uri.string(), mime.string());
Takeshi Aimie943f842010-10-08 23:05:49 +09001353
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001354 if (NULL != handle.get()) {
1355 writeDecryptHandleToParcelData(handle.get(), reply);
Gloria Wang1da9aa62011-03-20 10:25:16 -07001356
1357 clearDecryptHandle(handle);
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001358 handle.clear();
Takeshi Aimie943f842010-10-08 23:05:49 +09001359 } else {
Steve Block3856b092011-10-20 11:56:00 +01001360 ALOGV("NULL decryptHandle is returned");
Takeshi Aimie943f842010-10-08 23:05:49 +09001361 }
Takeshi Aimie943f842010-10-08 23:05:49 +09001362 return DRM_NO_ERROR;
1363 }
1364
Kei Takahashicba7b322012-01-18 17:10:19 +09001365 case OPEN_DECRYPT_SESSION_FOR_STREAMING:
1366 {
1367 ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FOR_STREAMING");
1368 CHECK_INTERFACE(IDrmManagerService, data, reply);
1369
1370 const int uniqueId = data.readInt32();
1371 const int bufferSize = data.readInt32();
1372 DrmBuffer buf((bufferSize > 0) ? (char *)data.readInplace(bufferSize) : NULL,
1373 bufferSize);
1374 const String8 mimeType(data.readString8());
1375
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001376 sp<DecryptHandle> handle = openDecryptSession(uniqueId, buf, mimeType);
Kei Takahashicba7b322012-01-18 17:10:19 +09001377
1378 if (handle != NULL) {
1379 writeDecryptHandleToParcelData(handle, reply);
1380 clearDecryptHandle(handle);
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001381 handle.clear();
Kei Takahashicba7b322012-01-18 17:10:19 +09001382 } else {
1383 ALOGV("NULL decryptHandle is returned");
1384 }
1385 return DRM_NO_ERROR;
1386 }
1387
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001388 case CLOSE_DECRYPT_SESSION:
1389 {
Steve Block3856b092011-10-20 11:56:00 +01001390 ALOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001391 CHECK_INTERFACE(IDrmManagerService, data, reply);
1392
1393 const int uniqueId = data.readInt32();
1394
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001395 sp<DecryptHandle> handle = new DecryptHandle();
Gloria Wang1da9aa62011-03-20 10:25:16 -07001396 readDecryptHandleFromParcelData(handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001397
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001398 const status_t status = closeDecryptSession(uniqueId, handle);
1399 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001400 return DRM_NO_ERROR;
1401 }
1402
1403 case INITIALIZE_DECRYPT_UNIT:
1404 {
Steve Block3856b092011-10-20 11:56:00 +01001405 ALOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001406 CHECK_INTERFACE(IDrmManagerService, data, reply);
1407
1408 const int uniqueId = data.readInt32();
1409
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001410 sp<DecryptHandle> handle = new DecryptHandle();
1411 readDecryptHandleFromParcelData(handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001412
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001413 const int decryptUnitId = data.readInt32();
1414
1415 //Filling Header info
Jeff Tinkerb408fa22015-04-28 16:42:20 -07001416 const uint32_t bufferSize = data.readInt32();
1417 if (bufferSize > data.dataAvail()) {
1418 reply->writeInt32(BAD_VALUE);
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001419 clearDecryptHandle(handle);
Jeff Tinkerb408fa22015-04-28 16:42:20 -07001420 return DRM_NO_ERROR;
1421 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001422 DrmBuffer* headerInfo = NULL;
1423 headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
1424
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001425 const status_t status
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001426 = initializeDecryptUnit(uniqueId, handle, decryptUnitId, headerInfo);
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001427 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001428
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001429 clearDecryptHandle(handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001430 delete headerInfo; headerInfo = NULL;
1431 return DRM_NO_ERROR;
1432 }
1433
1434 case DECRYPT:
1435 {
Steve Block3856b092011-10-20 11:56:00 +01001436 ALOGV("BnDrmManagerService::onTransact :DECRYPT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001437 CHECK_INTERFACE(IDrmManagerService, data, reply);
1438
1439 const int uniqueId = data.readInt32();
1440
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001441 sp<DecryptHandle> handle = new DecryptHandle;
1442 readDecryptHandleFromParcelData(handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001443
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001444 const int decryptUnitId = data.readInt32();
Jeff Tinkerb408fa22015-04-28 16:42:20 -07001445 const uint32_t decBufferSize = data.readInt32();
1446 const uint32_t encBufferSize = data.readInt32();
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001447
Jeff Tinkerb408fa22015-04-28 16:42:20 -07001448 if (encBufferSize > data.dataAvail() ||
1449 decBufferSize > MAX_BINDER_TRANSACTION_SIZE) {
1450 reply->writeInt32(BAD_VALUE);
1451 reply->writeInt32(0);
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001452 clearDecryptHandle(handle);
Jeff Tinkerb408fa22015-04-28 16:42:20 -07001453 return DRM_NO_ERROR;
1454 }
1455
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001456 DrmBuffer* encBuffer
1457 = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize);
1458
1459 char* buffer = NULL;
1460 buffer = new char[decBufferSize];
1461 DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize);
1462
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001463 DrmBuffer* IV = NULL;
1464 if (0 != data.dataAvail()) {
Jeff Tinkerb408fa22015-04-28 16:42:20 -07001465 const uint32_t ivBufferlength = data.readInt32();
1466 if (ivBufferlength <= data.dataAvail()) {
1467 IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength);
1468 }
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001469 }
1470
1471 const status_t status
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001472 = decrypt(uniqueId, handle, decryptUnitId, encBuffer, &decBuffer, IV);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001473
1474 reply->writeInt32(status);
1475
Jeff Tinker09ed70f2015-09-14 13:55:23 -07001476 if (status == NO_ERROR) {
1477 const int size = decBuffer->length;
1478 reply->writeInt32(size);
1479 reply->write(decBuffer->data, size);
1480 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001481
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001482 clearDecryptHandle(handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001483 delete encBuffer; encBuffer = NULL;
1484 delete decBuffer; decBuffer = NULL;
1485 delete [] buffer; buffer = NULL;
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001486 delete IV; IV = NULL;
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001487 return DRM_NO_ERROR;
1488 }
1489
1490 case FINALIZE_DECRYPT_UNIT:
1491 {
Steve Block3856b092011-10-20 11:56:00 +01001492 ALOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001493 CHECK_INTERFACE(IDrmManagerService, data, reply);
1494
1495 const int uniqueId = data.readInt32();
1496
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001497 sp<DecryptHandle> handle = new DecryptHandle();
1498 readDecryptHandleFromParcelData(handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001499
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001500 const status_t status = finalizeDecryptUnit(uniqueId, handle, data.readInt32());
Takeshi Aimi2272ee22010-09-20 23:40:41 +09001501 reply->writeInt32(status);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001502
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001503 clearDecryptHandle(handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001504 return DRM_NO_ERROR;
1505 }
1506
1507 case PREAD:
1508 {
Steve Block3856b092011-10-20 11:56:00 +01001509 ALOGV("BnDrmManagerService::onTransact :READ");
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001510 CHECK_INTERFACE(IDrmManagerService, data, reply);
1511
1512 const int uniqueId = data.readInt32();
1513
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001514 sp<DecryptHandle> handle = new DecryptHandle();
1515 readDecryptHandleFromParcelData(handle, data);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001516
Jeff Tinkerb408fa22015-04-28 16:42:20 -07001517 const uint32_t numBytes = data.readInt32();
1518 if (numBytes > MAX_BINDER_TRANSACTION_SIZE) {
1519 reply->writeInt32(BAD_VALUE);
1520 return DRM_NO_ERROR;
1521 }
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001522 char* buffer = new char[numBytes];
1523
Gloria Wanga2cd44c2010-11-19 15:19:36 -08001524 const off64_t offset = data.readInt64();
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001525
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001526 ssize_t result = pread(uniqueId, handle, buffer, numBytes, offset);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001527 reply->writeInt32(result);
1528 if (0 < result) {
1529 reply->write(buffer, result);
1530 }
1531
Jeff Tinker5d49bef2018-10-03 23:01:09 -07001532 clearDecryptHandle(handle);
aimitakeshi27ed8ad2010-07-29 10:12:27 +09001533 delete [] buffer, buffer = NULL;
1534 return DRM_NO_ERROR;
1535 }
1536
1537 default:
1538 return BBinder::onTransact(code, data, reply, flags);
1539 }
1540}