IDrmManagerService.cpp revision 2ed8a921ef55aa2f3dd4b7ac33b7ded6ec33d92d
127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi/*
227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Copyright (C) 2010 The Android Open Source Project
327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Licensed under the Apache License, Version 2.0 (the "License");
527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * you may not use this file except in compliance with the License.
627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * You may obtain a copy of the License at
727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *      http://www.apache.org/licenses/LICENSE-2.0
927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
1027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Unless required by applicable law or agreed to in writing, software
1127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * distributed under the License is distributed on an "AS IS" BASIS,
1227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * See the License for the specific language governing permissions and
1427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * limitations under the License.
1527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi */
1627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
172272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi//#define LOG_NDEBUG 0
1827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define LOG_TAG "IDrmManagerService(Native)"
1927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/Log.h>
2027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <stdint.h>
2227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <sys/types.h>
2327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <binder/IPCThreadState.h>
2427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfo.h>
2627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmConstraints.h>
273473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi#include <drm/DrmMetadata.h>
2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmRights.h>
2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoStatus.h>
3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmConvertedStatus.h>
3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoRequest.h>
3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmSupportInfo.h>
3327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "IDrmManagerService.h"
3527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define INVALID_BUFFER_LENGTH -1
3727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiusing namespace android;
3927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
402272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimiint BpDrmManagerService::addUniqueId(int uniqueId) {
412272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    LOGV("add uniqueid");
422272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    Parcel data, reply;
432272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
442272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    data.writeInt32(uniqueId);
452272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    remote()->transact(ADD_UNIQUEID, data, &reply);
462272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
472272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi}
482272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
492272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimivoid BpDrmManagerService::removeUniqueId(int uniqueId) {
502272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    LOGV("remove uniqueid");
512272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    Parcel data, reply;
522272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
532272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    data.writeInt32(uniqueId);
542272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    remote()->transact(REMOVE_UNIQUEID, data, &reply);
552272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi}
562272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
57e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid BpDrmManagerService::addClient(int uniqueId) {
5827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
5927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
6027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
61e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    remote()->transact(ADD_CLIENT, data, &reply);
6227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
6327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
64e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid BpDrmManagerService::removeClient(int uniqueId) {
6527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
6627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
6727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
68e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    remote()->transact(REMOVE_CLIENT, data, &reply);
6927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
7027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::setDrmServiceListener(
7227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) {
7327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("setDrmServiceListener");
7427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
7527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
7727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
7827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeStrongBinder(drmServiceListener->asBinder());
7927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(SET_DRM_SERVICE_LISTENER, data, &reply);
8027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
8127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
8227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
8327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::installDrmEngine(int uniqueId, const String8& drmEngineFile) {
8427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Install DRM Engine");
8527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
8627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
8727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
8827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
8927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(drmEngineFile);
9027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
9127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(INSTALL_DRM_ENGINE, data, &reply);
9227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
9327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
9427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
9527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConstraints* BpDrmManagerService::getConstraints(
9627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const String8* path, const int action) {
9727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Get Constraints");
9827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
9927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
10127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
10227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(*path);
10327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(action);
10427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(GET_CONSTRAINTS_FROM_CONTENT, data, &reply);
10627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConstraints* drmConstraints = NULL;
10827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
10927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling Drm Constraints
11027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmConstraints = new DrmConstraints();
11127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
11227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = reply.readInt32();
11327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < size; ++index) {
11427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 key(reply.readString8());
11527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = reply.readInt32();
11627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            char* data = NULL;
11727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
11827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                data = new char[bufferSize];
11927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply.read(data, bufferSize);
12027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
12127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmConstraints->put(&key, data);
12227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
12327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
12427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmConstraints;
12527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
12627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1273473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi AimiDrmMetadata* BpDrmManagerService::getMetadata(int uniqueId, const String8* path) {
1283473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    LOGV("Get Metadata");
1293473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    Parcel data, reply;
1303473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
1313473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    data.writeInt32(uniqueId);
1323473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
1333473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    DrmMetadata* drmMetadata = NULL;
1343473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    data.writeString8(*path);
1353473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    remote()->transact(GET_METADATA_FROM_CONTENT, data, &reply);
1363473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
1373473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    if (0 != reply.dataAvail()) {
1383473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        //Filling Drm Metadata
1393473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        drmMetadata = new DrmMetadata();
1403473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
1413473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        const int size = reply.readInt32();
1423473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        for (int index = 0; index < size; ++index) {
1433473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            const String8 key(reply.readString8());
1443473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            const int bufferSize = reply.readInt32();
1453473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            char* data = NULL;
1463473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            if (0 < bufferSize) {
1473473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                data = new char[bufferSize];
1483473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                reply.read(data, bufferSize);
1493473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            }
1503473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            drmMetadata->put(&key, data);
1513473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        }
1523473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    }
1533473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    return drmMetadata;
1543473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi}
1553473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool BpDrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) {
15727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Can Handle");
15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
15927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
16027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
16127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
16427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(mimeType);
16527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
16627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CAN_HANDLE, data, &reply);
16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return static_cast<bool>(reply.readInt32());
16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
17027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
17127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) {
17227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Process DRM Info");
17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
17427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
17527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
17627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
17727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
17827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    //Filling DRM info
17927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(drmInfo->getInfoType());
18027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const DrmBuffer dataBuffer = drmInfo->getData();
18127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const int dataBufferSize = dataBuffer.length;
18227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(dataBufferSize);
18327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 < dataBufferSize) {
18427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.write(dataBuffer.data, dataBufferSize);
18527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
18627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(drmInfo->getMimeType());
18727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
18827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(drmInfo->getCount());
18927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
19027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
19127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    while (keyIt.hasNext()) {
19227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 key = keyIt.next();
19327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeString8(key);
19427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 value = drmInfo->get(key);
19527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeString8((value == String8("")) ? String8("NULL") : value);
19627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
19727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
19827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(PROCESS_DRM_INFO, data, &reply);
19927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
20027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfoStatus* drmInfoStatus = NULL;
20127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
20227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Info Status
20327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int statusCode = reply.readInt32();
204e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        const int infoType = reply.readInt32();
20527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 mimeType = reply.readString8();
20627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
20727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* drmBuffer = NULL;
20827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 != reply.dataAvail()) {
20927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = reply.readInt32();
21027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            char* data = NULL;
21127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
21227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                data = new char[bufferSize];
21327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply.read(data, bufferSize);
21427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
21527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmBuffer = new DrmBuffer(data, bufferSize);
21627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
217e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        drmInfoStatus = new DrmInfoStatus(statusCode, infoType, drmBuffer, mimeType);
21827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
21927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmInfoStatus;
22027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
22127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
22227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfo* BpDrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) {
22327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Acquire DRM Info");
22427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
22527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
22627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
22727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
22827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
22927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    //Filling DRM Info Request
23027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(drmInforequest->getInfoType());
23127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(drmInforequest->getMimeType());
23227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
23327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(drmInforequest->getCount());
23427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfoRequest::KeyIterator keyIt = drmInforequest->keyIterator();
23527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
23627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    while (keyIt.hasNext()) {
23727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 key = keyIt.next();
23827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeString8(key);
23927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 value = drmInforequest->get(key);
24027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeString8((value == String8("")) ? String8("NULL") : value);
24127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
24227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
24327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(ACQUIRE_DRM_INFO, data, &reply);
24427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
24527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfo* drmInfo = NULL;
24627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
24727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Info
24827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int infoType = reply.readInt32();
24927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = reply.readInt32();
25027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        char* data = NULL;
25127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
25227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 < bufferSize) {
25327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            data = new char[bufferSize];
25427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply.read(data, bufferSize);
25527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
25627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmInfo = new DrmInfo(infoType, DrmBuffer(data, bufferSize), reply.readString8());
25727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
25827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = reply.readInt32();
25927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < size; ++index) {
26027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 key(reply.readString8());
26127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 value(reply.readString8());
26227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
26327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
26427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
26527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmInfo;
26627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
26727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2682272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::saveRights(
26927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const DrmRights& drmRights,
27027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8& rightsPath, const String8& contentPath) {
27127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Save Rights");
27227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
27327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
27427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
27527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
27627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
27727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    //Filling Drm Rights
27827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const DrmBuffer dataBuffer = drmRights.getData();
27927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(dataBuffer.length);
28027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.write(dataBuffer.data, dataBuffer.length);
28127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
28227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 mimeType = drmRights.getMimeType();
28327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((mimeType == String8("")) ? String8("NULL") : mimeType);
28427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
28527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 accountId = drmRights.getAccountId();
28627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((accountId == String8("")) ? String8("NULL") : accountId);
28727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
28827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 subscriptionId = drmRights.getSubscriptionId();
28927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((subscriptionId == String8("")) ? String8("NULL") : subscriptionId);
29027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
29127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((rightsPath == String8("")) ? String8("NULL") : rightsPath);
29227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((contentPath == String8("")) ? String8("NULL") : contentPath);
29327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
29427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(SAVE_RIGHTS, data, &reply);
2952272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
29627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
29727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
29827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 BpDrmManagerService::getOriginalMimeType(int uniqueId, const String8& path) {
29927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Get Original MimeType");
30027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
30127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
30227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
30327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
30427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
30527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
30627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(GET_ORIGINAL_MIMETYPE, data, &reply);
30727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readString8();
30827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
30927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
31027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::getDrmObjectType(
31127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const String8& path, const String8& mimeType) {
31227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Get Drm object type");
31327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
31427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
31527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
31627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
31727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
31827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(mimeType);
31927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
32027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(GET_DRM_OBJECT_TYPE, data, &reply);
32127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
32227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
32327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
32427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
32527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::checkRightsStatus(int uniqueId, const String8& path, int action) {
32627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("checkRightsStatus");
32727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
32827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
32927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
33027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
33127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
33227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(action);
33327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
33427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CHECK_RIGHTS_STATUS, data, &reply);
33527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
33627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
33727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
33827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3392272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::consumeRights(
34027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) {
34127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("consumeRights");
3422272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    Parcel data, reply;
34327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
34427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
34527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
34627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
34727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptId);
34827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(decryptHandle->mimeType);
34927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptApiType);
35027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->status);
35127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
35227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != decryptHandle->decryptInfo) {
35327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
35427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    } else {
35527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(INVALID_BUFFER_LENGTH);
35627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
35727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
35827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(action);
35927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(static_cast< int>(reserve));
36027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
36127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CONSUME_RIGHTS, data, &reply);
3622272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
36327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
36427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3652272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::setPlaybackStatus(
366a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) {
36727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("setPlaybackStatus");
36827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
36927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
37027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
37127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
37227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
37327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptId);
37427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(decryptHandle->mimeType);
37527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptApiType);
37627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->status);
37727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
37827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != decryptHandle->decryptInfo) {
37927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
38027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    } else {
38127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(INVALID_BUFFER_LENGTH);
38227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
38327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
38427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(playbackStatus);
3852ed8a921ef55aa2f3dd4b7ac33b7ded6ec33d92dGloria Wang    data.writeInt64(position);
38627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
38727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(SET_PLAYBACK_STATUS, data, &reply);
3882272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
38927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
39027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
39127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool BpDrmManagerService::validateAction(
39227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const String8& path,
39327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int action, const ActionDescription& description) {
39427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("validateAction");
39527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
39627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
39727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
39827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
39927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
40027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(action);
40127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(description.outputType);
40227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(description.configuration);
40327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
40427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(VALIDATE_ACTION, data, &reply);
40527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
40627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return static_cast<bool>(reply.readInt32());
40727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
40827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4092272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::removeRights(int uniqueId, const String8& path) {
41027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("removeRights");
41127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
41227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
41327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
41427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
41527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
41627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
41727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(REMOVE_RIGHTS, data, &reply);
4182272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
41927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
42027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4212272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::removeAllRights(int uniqueId) {
42227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("removeAllRights");
42327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
42427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
42527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
42627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
42727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
42827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(REMOVE_ALL_RIGHTS, data, &reply);
4292272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
43027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
43127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
43227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) {
43327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("openConvertSession");
43427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
43527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
43627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
43727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
43827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(mimeType);
43927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
44027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(OPEN_CONVERT_SESSION, data, &reply);
44127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
44227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
44327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
44427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* BpDrmManagerService::convertData(
44527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, int convertId, const DrmBuffer* inputData) {
44627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("convertData");
44727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
44827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
44927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
45027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
45127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(convertId);
45227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(inputData->length);
45327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.write(inputData->data, inputData->length);
45427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
45527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CONVERT_DATA, data, &reply);
45627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
45727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConvertedStatus* drmConvertedStatus = NULL;
45827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
45927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
46027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Converted Status
46127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int statusCode = reply.readInt32();
462a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang        const off64_t offset = reply.readInt64();
46327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
46427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* convertedData = NULL;
46527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 != reply.dataAvail()) {
46627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = reply.readInt32();
46727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            char* data = NULL;
46827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
46927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                data = new char[bufferSize];
47027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply.read(data, bufferSize);
47127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
47227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            convertedData = new DrmBuffer(data, bufferSize);
47327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
47427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
47527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
47627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmConvertedStatus;
47727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
47827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
47927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* BpDrmManagerService::closeConvertSession(int uniqueId, int convertId) {
48027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("closeConvertSession");
48127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
48227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
48327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
48427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
48527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(convertId);
48627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
48727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CLOSE_CONVERT_SESSION, data, &reply);
48827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
48927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConvertedStatus* drmConvertedStatus = NULL;
49027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
49127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
49227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Converted Status
49327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int statusCode = reply.readInt32();
494a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang        const off64_t offset = reply.readInt64();
49527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
49627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* convertedData = NULL;
49727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 != reply.dataAvail()) {
49827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = reply.readInt32();
49927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            char* data = NULL;
50027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
50127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                data = new char[bufferSize];
50227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply.read(data, bufferSize);
50327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
50427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            convertedData = new DrmBuffer(data, bufferSize);
50527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
50627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
50727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
50827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmConvertedStatus;
50927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
51027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
51127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::getAllSupportInfo(
51227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) {
51327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Get All Support Info");
51427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
51527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
51627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
51727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
51827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
51927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(GET_ALL_SUPPORT_INFO, data, &reply);
52027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
52127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    //Filling DRM Support Info
52227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const int arraySize = reply.readInt32();
52327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 < arraySize) {
52427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        *drmSupportInfoArray = new DrmSupportInfo[arraySize];
52527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
52627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < arraySize; ++index) {
52727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo drmSupportInfo;
52827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
52927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int fileSuffixVectorSize = reply.readInt32();
53027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            for (int i = 0; i < fileSuffixVectorSize; ++i) {
53127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                drmSupportInfo.addFileSuffix(reply.readString8());
53227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
53327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
53427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int mimeTypeVectorSize = reply.readInt32();
53527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            for (int i = 0; i < mimeTypeVectorSize; ++i) {
53627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                drmSupportInfo.addMimeType(reply.readString8());
53727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
53827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
53927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmSupportInfo.setDescription(reply.readString8());
54027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            (*drmSupportInfoArray)[index] = drmSupportInfo;
54127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
54227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
54327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    *length = arraySize;
54427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
54527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
54627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
54727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDecryptHandle* BpDrmManagerService::openDecryptSession(
548a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            int uniqueId, int fd, off64_t offset, off64_t length) {
54927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Entering BpDrmManagerService::openDecryptSession");
55027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
55127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
552e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
55327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
55427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeFileDescriptor(fd);
555a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang    data.writeInt64(offset);
556a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang    data.writeInt64(length);
55727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
55827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(OPEN_DECRYPT_SESSION, data, &reply);
55927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
56027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DecryptHandle* handle = NULL;
56127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
56227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle = new DecryptHandle();
56327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->decryptId = reply.readInt32();
56427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->mimeType = reply.readString8();
56527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->decryptApiType = reply.readInt32();
56627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->status = reply.readInt32();
56727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->decryptInfo = NULL;
56827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 != reply.dataAvail()) {
56927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle->decryptInfo = new DecryptInfo();
57027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle->decryptInfo->decryptBufferLength = reply.readInt32();
57127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
57227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
57327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return handle;
57427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
57527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
576e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi AimiDecryptHandle* BpDrmManagerService::openDecryptSession(int uniqueId, const char* uri) {
577e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    LOGV("Entering BpDrmManagerService::openDecryptSession");
578e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    Parcel data, reply;
579e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
580e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
581e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    data.writeInt32(uniqueId);
582e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    data.writeString8(String8(uri));
583e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
584e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    remote()->transact(OPEN_DECRYPT_SESSION_FROM_URI, data, &reply);
585e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
586e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    DecryptHandle* handle = NULL;
587e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    if (0 != reply.dataAvail()) {
588e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        handle = new DecryptHandle();
589e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        handle->decryptId = reply.readInt32();
590e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        handle->mimeType = reply.readString8();
591e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        handle->decryptApiType = reply.readInt32();
592e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        handle->status = reply.readInt32();
593e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        handle->decryptInfo = NULL;
594e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        if (0 != reply.dataAvail()) {
595e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            handle->decryptInfo = new DecryptInfo();
596e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            handle->decryptInfo->decryptBufferLength = reply.readInt32();
597e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        }
598e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    } else {
599e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        LOGE("no decryptHandle is generated in service side");
600e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    }
601e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    return handle;
602e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi}
603e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
6042272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) {
60527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("closeDecryptSession");
60627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
60727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
60827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
60927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
61027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
61127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptId);
61227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(decryptHandle->mimeType);
61327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptApiType);
61427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->status);
61527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
61627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != decryptHandle->decryptInfo) {
61727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
61827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    } else {
61927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(INVALID_BUFFER_LENGTH);
62027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
62127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
62227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply);
62327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
62427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != decryptHandle->decryptInfo) {
62527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("deleting decryptInfo");
62627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete decryptHandle->decryptInfo; decryptHandle->decryptInfo = NULL;
62727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
62827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    delete decryptHandle; decryptHandle = NULL;
6292272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
63027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
63127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6322272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::initializeDecryptUnit(
63327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle,
63427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int decryptUnitId, const DrmBuffer* headerInfo) {
63527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("initializeDecryptUnit");
63627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
63727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
63827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
63927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
64027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
64127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptId);
64227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(decryptHandle->mimeType);
64327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptApiType);
64427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->status);
64527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
64627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != decryptHandle->decryptInfo) {
64727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
64827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    } else {
64927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(INVALID_BUFFER_LENGTH);
65027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
65127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptUnitId);
65227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
65327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(headerInfo->length);
65427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.write(headerInfo->data, headerInfo->length);
65527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
65627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply);
6572272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
65827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
65927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
66027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::decrypt(
66127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,
6622272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) {
66327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("decrypt");
66427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
66527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
66627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
66727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
66827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
66927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptId);
67027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(decryptHandle->mimeType);
67127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptApiType);
67227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->status);
67327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
67427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != decryptHandle->decryptInfo) {
67527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
67627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    } else {
67727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(INVALID_BUFFER_LENGTH);
67827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
67927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
68027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptUnitId);
68127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32((*decBuffer)->length);
68227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
68327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(encBuffer->length);
68427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.write(encBuffer->data, encBuffer->length);
68527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6862272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    if (NULL != IV) {
6872272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        data.writeInt32(IV->length);
6882272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        data.write(IV->data, IV->length);
6892272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    }
6902272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
69127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(DECRYPT, data, &reply);
69227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
69327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const status_t status = reply.readInt32();
69427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Return value of decrypt() is %d", status);
69527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
69627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const int size = reply.readInt32();
69727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    (*decBuffer)->length = size;
69827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    reply.read((void *)(*decBuffer)->data, size);
69927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
70027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return status;
70127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
70227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7032272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::finalizeDecryptUnit(
70427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) {
70527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("finalizeDecryptUnit");
70627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
70727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
70827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
70927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
71027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
71127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptId);
71227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(decryptHandle->mimeType);
71327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptApiType);
71427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->status);
71527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
71627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != decryptHandle->decryptInfo) {
71727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
71827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    } else {
71927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(INVALID_BUFFER_LENGTH);
72027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
72127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
72227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptUnitId);
72327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
72427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply);
7252272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
72627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
72727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
72827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshissize_t BpDrmManagerService::pread(
72927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, void* buffer,
730a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            ssize_t numBytes, off64_t offset) {
73127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("read");
73227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
73327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int result;
73427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
73527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
73627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
73727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
73827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptId);
73927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(decryptHandle->mimeType);
74027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptApiType);
74127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->status);
74227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
74327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != decryptHandle->decryptInfo) {
74427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
74527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    } else {
74627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(INVALID_BUFFER_LENGTH);
74727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
74827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
74927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(numBytes);
750a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang    data.writeInt64(offset);
75127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
75227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(PREAD, data, &reply);
75327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    result = reply.readInt32();
75427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 < result) {
75527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply.read(buffer, result);
75627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
75727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return result;
75827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
75927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
76027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiIMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService");
76127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
76227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BnDrmManagerService::onTransact(
76327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            uint32_t code, const Parcel& data,
76427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            Parcel* reply, uint32_t flags) {
76527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Entering BnDrmManagerService::onTransact with code %d", code);
76627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
76727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    switch (code) {
7682272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    case ADD_UNIQUEID:
7692272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    {
7702272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        LOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID");
7712272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        CHECK_INTERFACE(IDrmManagerService, data, reply);
7722272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        int uniqueId = addUniqueId(data.readInt32());
7732272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(uniqueId);
7742272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        return DRM_NO_ERROR;
7752272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    }
7762272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
7772272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    case REMOVE_UNIQUEID:
7782272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    {
7792272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        LOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID");
7802272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        CHECK_INTERFACE(IDrmManagerService, data, reply);
7812272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        removeUniqueId(data.readInt32());
7822272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        return DRM_NO_ERROR;
7832272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    }
7842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
785e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    case ADD_CLIENT:
78627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
787e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        LOGV("BnDrmManagerService::onTransact :ADD_CLIENT");
78827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
789e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        addClient(data.readInt32());
79027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
79127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
79227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
793e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    case REMOVE_CLIENT:
79427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
795e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        LOGV("BnDrmManagerService::onTransact :REMOVE_CLIENT");
79627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
797e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        removeClient(data.readInt32());
79827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
79927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
80027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
80127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case SET_DRM_SERVICE_LISTENER:
80227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
80327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER");
80427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
80527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
80627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
80727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const sp<IDrmServiceListener> drmServiceListener
80827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            = interface_cast<IDrmServiceListener> (data.readStrongBinder());
80927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
81027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        status_t status = setDrmServiceListener(uniqueId, drmServiceListener);
81127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
81227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
81327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
81427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
81527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
81627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case INSTALL_DRM_ENGINE:
81727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
81827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :INSTALL_DRM_ENGINE");
81927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
82027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
82127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        status_t status = installDrmEngine(data.readInt32(), data.readString8());
82227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
82327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
82427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
82527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
82627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
82727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case GET_CONSTRAINTS_FROM_CONTENT:
82827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
82927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT");
83027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
83127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
83227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
83327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 path = data.readString8();
83427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
83527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmConstraints* drmConstraints = getConstraints(uniqueId, &path, data.readInt32());
83627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
83727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmConstraints) {
83827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling DRM Constraints contents
83927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmConstraints->getCount());
84027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
84127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator();
84227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            while (keyIt.hasNext()) {
84327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const String8 key = keyIt.next();
84427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8(key);
84527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const char* value = drmConstraints->getAsByteArray(&key);
84627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                int bufferSize = 0;
84727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (NULL != value) {
84827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    bufferSize = strlen(value);
84927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
85027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(bufferSize + 1);
85127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->write(value, bufferSize + 1);
85227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
85327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
85427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmConstraints; drmConstraints = NULL;
85527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
85627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
85727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
8583473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    case GET_METADATA_FROM_CONTENT:
8593473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    {
8603473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        LOGV("BnDrmManagerService::onTransact :GET_METADATA_FROM_CONTENT");
8613473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        CHECK_INTERFACE(IDrmManagerService, data, reply);
8623473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
8633473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        const int uniqueId = data.readInt32();
8643473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        const String8 path = data.readString8();
8653473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
8663473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        DrmMetadata* drmMetadata = getMetadata(uniqueId, &path);
8673473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        if (NULL != drmMetadata) {
8683473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            //Filling DRM Metadata contents
8693473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            reply->writeInt32(drmMetadata->getCount());
8703473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
8713473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            DrmMetadata::KeyIterator keyIt = drmMetadata->keyIterator();
8723473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            while (keyIt.hasNext()) {
8733473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                const String8 key = keyIt.next();
8743473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                reply->writeString8(key);
8753473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                const char* value = drmMetadata->getAsByteArray(&key);
8763473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                int bufferSize = 0;
8773473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                if (NULL != value) {
8783473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                    bufferSize = strlen(value);
8793473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                    reply->writeInt32(bufferSize + 1);
8803473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                    reply->write(value, bufferSize + 1);
8813473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                } else {
8823473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                    reply->writeInt32(0);
8833473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                }
8843473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            }
8853473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        }
8863473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        delete drmMetadata; drmMetadata = NULL;
8873473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        return NO_ERROR;
8883473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    }
8893473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
89027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CAN_HANDLE:
89127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
89227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :CAN_HANDLE");
89327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
89427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
89527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
89627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 path = data.readString8();
89727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 mimeType = data.readString8();
89827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
89927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        bool result = canHandle(uniqueId, path, mimeType);
90027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
90127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(result);
90227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
90327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
90427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
90527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case PROCESS_DRM_INFO:
90627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
90727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO");
90827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
90927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
91027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
91127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
91227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM info
91327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int infoType = data.readInt32();
91427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = data.readInt32();
91527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        char* buffer = NULL;
91627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 < bufferSize) {
91727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            buffer = (char *)data.readInplace(bufferSize);
91827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
91927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const DrmBuffer drmBuffer(buffer, bufferSize);
92027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8());
92127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
92227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = data.readInt32();
92327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < size; ++index) {
92427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 key(data.readString8());
92527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 value(data.readString8());
92627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
92727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
92827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
92927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo);
93027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
93127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmInfoStatus) {
93227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling DRM Info Status contents
93327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmInfoStatus->statusCode);
934e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            reply->writeInt32(drmInfoStatus->infoType);
93527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeString8(drmInfoStatus->mimeType);
93627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
93727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (NULL != drmInfoStatus->drmBuffer) {
93827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer;
93927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const int bufferSize = drmBuffer->length;
94027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(bufferSize);
94127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (0 < bufferSize) {
94227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    reply->write(drmBuffer->data, bufferSize);
94327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
94427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete [] drmBuffer->data;
94527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete drmBuffer; drmBuffer = NULL;
94627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
94727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
94827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmInfo; drmInfo = NULL;
94927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmInfoStatus; drmInfoStatus = NULL;
95027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
95127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
95227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
95327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case ACQUIRE_DRM_INFO:
95427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
95527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO");
95627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
95727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
95827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
95927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
96027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM info Request
96127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(data.readInt32(), data.readString8());
96227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
96327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = data.readInt32();
96427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < size; ++index) {
96527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 key(data.readString8());
96627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 value(data.readString8());
96727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value);
96827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
96927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
97027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest);
97127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
97227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmInfo) {
97327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling DRM Info
97427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const DrmBuffer drmBuffer = drmInfo->getData();
97527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmInfo->getInfoType());
97627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
97727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = drmBuffer.length;
97827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(bufferSize);
97927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
98027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->write(drmBuffer.data, bufferSize);
98127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
98227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeString8(drmInfo->getMimeType());
98327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmInfo->getCount());
98427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
98527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
98627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            while (keyIt.hasNext()) {
98727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const String8 key = keyIt.next();
98827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8(key);
98927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const String8 value = drmInfo->get(key);
99027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8((value == String8("")) ? String8("NULL") : value);
99127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
99227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            delete [] drmBuffer.data;
99327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
99427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmInfoRequest; drmInfoRequest = NULL;
99527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmInfo; drmInfo = NULL;
99627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
99727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
99827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
99927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case SAVE_RIGHTS:
100027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
100127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS");
100227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
100327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
100427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
100527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
100627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Rights
100727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = data.readInt32();
100827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize);
100927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
101027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 mimeType(data.readString8());
101127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 accountId(data.readString8());
101227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 subscriptionId(data.readString8());
101327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 rightsPath(data.readString8());
101427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 contentPath(data.readString8());
101527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
101627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmRights drmRights(drmBuffer,
101727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((mimeType == String8("NULL")) ? String8("") : mimeType),
101827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((accountId == String8("NULL")) ? String8("") : accountId),
101927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId));
102027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10212272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status = saveRights(uniqueId, drmRights,
102227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((rightsPath == String8("NULL")) ? String8("") : rightsPath),
102327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((contentPath == String8("NULL")) ? String8("") : contentPath));
102427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10252272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
102627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
102727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
102827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
102927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case GET_ORIGINAL_MIMETYPE:
103027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
103127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE");
103227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
103327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
103427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 originalMimeType = getOriginalMimeType(data.readInt32(), data.readString8());
103527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
103627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeString8(originalMimeType);
103727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
103827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
103927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
104027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case GET_DRM_OBJECT_TYPE:
104127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
104227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE");
104327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
104427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
104527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int drmObjectType
104627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            = getDrmObjectType(data.readInt32(), data.readString8(), data.readString8());
104727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
104827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(drmObjectType);
104927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
105027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
105127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
105227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CHECK_RIGHTS_STATUS:
105327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
105427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS");
105527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
105627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
105727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int result
105827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            = checkRightsStatus(data.readInt32(), data.readString8(), data.readInt32());
105927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
106027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(result);
106127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
106227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
106327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
106427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CONSUME_RIGHTS:
106527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
106627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS");
106727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
106827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
106927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
107027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
107127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
107227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptId = data.readInt32();
107327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.mimeType = data.readString8();
107427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptApiType = data.readInt32();
107527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.status = data.readInt32();
107627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptInfo = NULL;
107727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
107827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferLength = data.readInt32();
107927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (INVALID_BUFFER_LENGTH != bufferLength) {
108027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo = new DecryptInfo();
108127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo->decryptBufferLength = bufferLength;
108227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
108327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status
10852272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            = consumeRights(uniqueId, &handle, data.readInt32(),
10862272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi                static_cast<bool>(data.readInt32()));
10872272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
108827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
108927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete handle.decryptInfo; handle.decryptInfo = NULL;
109027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
109127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
109227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
109327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case SET_PLAYBACK_STATUS:
109427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
109527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS");
109627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
109727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
109827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
109927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
110027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
110127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptId = data.readInt32();
110227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.mimeType = data.readString8();
110327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptApiType = data.readInt32();
110427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.status = data.readInt32();
110527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptInfo = NULL;
110627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
110727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferLength = data.readInt32();
110827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (INVALID_BUFFER_LENGTH != bufferLength) {
110927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo = new DecryptInfo();
111027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo->decryptBufferLength = bufferLength;
111127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
111227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
11132272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status
11142ed8a921ef55aa2f3dd4b7ac33b7ded6ec33d92dGloria Wang            = setPlaybackStatus(uniqueId, &handle, data.readInt32(), data.readInt64());
11152272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
111627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
111727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete handle.decryptInfo; handle.decryptInfo = NULL;
111827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
111927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
112027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
112127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case VALIDATE_ACTION:
112227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
112327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION");
112427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
112527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
112627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        bool result = validateAction(
112727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                                data.readInt32(),
112827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                                data.readString8(),
112927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                                data.readInt32(),
113027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                                ActionDescription(data.readInt32(), data.readInt32()));
113127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
113227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(result);
113327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
113427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
113527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
113627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case REMOVE_RIGHTS:
113727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
113827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS");
113927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
114027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
11412272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status = removeRights(data.readInt32(), data.readString8());
11422272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
114327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
114427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
114527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
114627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
114727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case REMOVE_ALL_RIGHTS:
114827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
114927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS");
115027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
115127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
11522272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status = removeAllRights(data.readInt32());
11532272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
115427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
115527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
115627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
115727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
115827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case OPEN_CONVERT_SESSION:
115927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
116027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION");
116127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
116227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
116327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int convertId = openConvertSession(data.readInt32(), data.readString8());
116427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
116527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(convertId);
116627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
116727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
116827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
116927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CONVERT_DATA:
117027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
117127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :CONVERT_DATA");
117227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
117327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
117427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
117527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int convertId = data.readInt32();
117627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
117727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling input data
117827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = data.readInt32();
117927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
118027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
118127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmConvertedStatus*    drmConvertedStatus = convertData(uniqueId, convertId, inputData);
118227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
118327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmConvertedStatus) {
118427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling Drm Converted Ststus
118527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmConvertedStatus->statusCode);
1186a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            reply->writeInt64(drmConvertedStatus->offset);
118727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
118827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (NULL != drmConvertedStatus->convertedData) {
118927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
119027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const int bufferSize = convertedData->length;
119127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(bufferSize);
119227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (0 < bufferSize) {
119327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    reply->write(convertedData->data, bufferSize);
119427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
119527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete [] convertedData->data;
119627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete convertedData; convertedData = NULL;
119727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
119827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
119927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete inputData; inputData = NULL;
120027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmConvertedStatus; drmConvertedStatus = NULL;
120127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
120227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
120327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
120427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CLOSE_CONVERT_SESSION:
120527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
120627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION");
120727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
120827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
120927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmConvertedStatus*    drmConvertedStatus
121027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            = closeConvertSession(data.readInt32(), data.readInt32());
121127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
121227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmConvertedStatus) {
121327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling Drm Converted Ststus
121427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmConvertedStatus->statusCode);
1215a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            reply->writeInt64(drmConvertedStatus->offset);
121627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
121727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (NULL != drmConvertedStatus->convertedData) {
121827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
121927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const int bufferSize = convertedData->length;
122027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(bufferSize);
122127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (0 < bufferSize) {
122227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    reply->write(convertedData->data, bufferSize);
122327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
122427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete [] convertedData->data;
122527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete convertedData; convertedData = NULL;
122627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
122727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
122827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmConvertedStatus; drmConvertedStatus = NULL;
122927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
123027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
123127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
123227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case GET_ALL_SUPPORT_INFO:
123327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
123427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO");
123527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
123627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
123727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
123827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        int length = 0;
123927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmSupportInfo* drmSupportInfoArray = NULL;
124027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
124127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray);
124227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
124327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(length);
124427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int i = 0; i < length; ++i) {
124527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i];
124627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
124727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmSupportInfo.getFileSuffixCount());
124827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo::FileSuffixIterator fileSuffixIt
124927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                = drmSupportInfo.getFileSuffixIterator();
125027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            while (fileSuffixIt.hasNext()) {
125127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8(fileSuffixIt.next());
125227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
125327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
125427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmSupportInfo.getMimeTypeCount());
125527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator();
125627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            while (mimeTypeIt.hasNext()) {
125727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8(mimeTypeIt.next());
125827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
125927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeString8(drmSupportInfo.getDescription());
126027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
126127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete [] drmSupportInfoArray; drmSupportInfoArray = NULL;
126227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
126327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
126427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
126527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
126627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case OPEN_DECRYPT_SESSION:
126727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
126827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION");
126927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
127027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
127127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
127227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int fd = data.readFileDescriptor();
127327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
127427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle* handle
1275a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            = openDecryptSession(uniqueId, fd, data.readInt64(), data.readInt64());
127627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
127727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != handle) {
127827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(handle->decryptId);
127927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeString8(handle->mimeType);
128027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(handle->decryptApiType);
128127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(handle->status);
128227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (NULL != handle->decryptInfo) {
128327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(handle->decryptInfo->decryptBufferLength);
128427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete handle->decryptInfo; handle->decryptInfo = NULL;
128527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
128627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
128727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete handle; handle = NULL;
128827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
1289e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    }
1290e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
1291e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    case OPEN_DECRYPT_SESSION_FROM_URI:
1292e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    {
1293e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        LOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI");
1294e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        CHECK_INTERFACE(IDrmManagerService, data, reply);
1295e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
1296e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        const int uniqueId = data.readInt32();
1297e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        const String8 uri = data.readString8();
1298e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
1299e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        DecryptHandle* handle = openDecryptSession(uniqueId, uri.string());
1300e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
1301e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        if (NULL != handle) {
1302e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            reply->writeInt32(handle->decryptId);
1303e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            reply->writeString8(handle->mimeType);
1304e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            reply->writeInt32(handle->decryptApiType);
1305e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            reply->writeInt32(handle->status);
1306e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            if (NULL != handle->decryptInfo) {
1307e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi                reply->writeInt32(handle->decryptInfo->decryptBufferLength);
1308e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi                delete handle->decryptInfo; handle->decryptInfo = NULL;
1309e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            }
1310e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        } else {
1311e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            LOGE("NULL decryptHandle is returned");
1312e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        }
1313e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        delete handle; handle = NULL;
1314e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        return DRM_NO_ERROR;
131527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
131627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
131727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CLOSE_DECRYPT_SESSION:
131827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
131927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION");
132027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
132127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
132227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
132327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
132427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle* handle = new DecryptHandle();
132527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->decryptId = data.readInt32();
132627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->mimeType = data.readString8();
132727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->decryptApiType = data.readInt32();
132827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->status = data.readInt32();
132927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->decryptInfo = NULL;
133027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
133127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferLength = data.readInt32();
133227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (INVALID_BUFFER_LENGTH != bufferLength) {
133327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle->decryptInfo = new DecryptInfo();
133427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle->decryptInfo->decryptBufferLength = bufferLength;
133527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
133627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13372272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status = closeDecryptSession(uniqueId, handle);
13382272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
133927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
134027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
134127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
134227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case INITIALIZE_DECRYPT_UNIT:
134327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
134427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT");
134527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
134627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
134727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
134827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
134927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
135027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptId = data.readInt32();
135127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.mimeType = data.readString8();
135227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptApiType = data.readInt32();
135327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.status = data.readInt32();
135427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptInfo = NULL;
135527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
135627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferLength = data.readInt32();
135727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (INVALID_BUFFER_LENGTH != bufferLength) {
135827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo = new DecryptInfo();
135927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo->decryptBufferLength = bufferLength;
136027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
136127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int decryptUnitId = data.readInt32();
136227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
136327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling Header info
136427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = data.readInt32();
136527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* headerInfo = NULL;
136627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
136727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13682272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status
13692272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo);
13702272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
137127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
137227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete handle.decryptInfo; handle.decryptInfo = NULL;
137327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete headerInfo; headerInfo = NULL;
137427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
137527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
137627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
137727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case DECRYPT:
137827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
137927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :DECRYPT");
138027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
138127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
138227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
138327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
138427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
138527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptId = data.readInt32();
138627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.mimeType = data.readString8();
138727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptApiType = data.readInt32();
138827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.status = data.readInt32();
138927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptInfo = NULL;
139027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
139127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferLength = data.readInt32();
139227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (INVALID_BUFFER_LENGTH != bufferLength) {
139327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo = new DecryptInfo();
139427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo->decryptBufferLength = bufferLength;
139527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
139627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int decryptUnitId = data.readInt32();
139727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int decBufferSize = data.readInt32();
139827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
139927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int encBufferSize = data.readInt32();
140027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* encBuffer
140127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize);
140227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
140327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        char* buffer = NULL;
140427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        buffer = new char[decBufferSize];
140527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize);
140627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14072272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        DrmBuffer* IV = NULL;
14082272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        if (0 != data.dataAvail()) {
14092272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            const int ivBufferlength = data.readInt32();
14102272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength);
14112272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        }
14122272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
14132272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status
14142272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            = decrypt(uniqueId, &handle, decryptUnitId, encBuffer, &decBuffer, IV);
141527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
141627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
141727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
141827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = decBuffer->length;
141927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(size);
142027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->write(decBuffer->data, size);
142127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
142227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete handle.decryptInfo; handle.decryptInfo = NULL;
142327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete encBuffer; encBuffer = NULL;
142427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete decBuffer; decBuffer = NULL;
142527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete [] buffer; buffer = NULL;
14262272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        delete IV; IV = NULL;
142727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
142827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
142927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
143027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case FINALIZE_DECRYPT_UNIT:
143127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
143227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT");
143327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
143427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
143527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
143627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
143727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
143827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptId = data.readInt32();
143927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.mimeType = data.readString8();
144027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptApiType = data.readInt32();
144127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.status = data.readInt32();
144227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptInfo = NULL;
144327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
144427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferLength = data.readInt32();
144527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (INVALID_BUFFER_LENGTH != bufferLength) {
144627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo = new DecryptInfo();
144727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo->decryptBufferLength = bufferLength;
144827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
144927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14502272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32());
14512272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
145227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
145327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete handle.decryptInfo; handle.decryptInfo = NULL;
145427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
145527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
145627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
145727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case PREAD:
145827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
145927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :READ");
146027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
146127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
146227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
146327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
146427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
146527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptId = data.readInt32();
146627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.mimeType = data.readString8();
146727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptApiType = data.readInt32();
146827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.status = data.readInt32();
146927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptInfo = NULL;
147027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
147127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferLength = data.readInt32();
147227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (INVALID_BUFFER_LENGTH != bufferLength) {
147327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo = new DecryptInfo();
147427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo->decryptBufferLength = bufferLength;
147527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
147627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
147727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int numBytes = data.readInt32();
147827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        char* buffer = new char[numBytes];
147927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1480a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang        const off64_t offset = data.readInt64();
148127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
148227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        ssize_t result = pread(uniqueId, &handle, buffer, numBytes, offset);
148327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(result);
148427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 < result) {
148527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->write(buffer, result);
148627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
148727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
148827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete handle.decryptInfo; handle.decryptInfo = NULL;
148927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete [] buffer, buffer = NULL;
149027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
149127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
149227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
149327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    default:
149427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return BBinder::onTransact(code, data, reply, flags);
149527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
149627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
149727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1498