IDrmManagerService.cpp revision 27ed8ad2db653f6ac07dcf8bcc05e2409c8bb024
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
1727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#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>
2727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmRights.h>
2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoStatus.h>
2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmConvertedStatus.h>
3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoRequest.h>
3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmSupportInfo.h>
3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "IDrmManagerService.h"
3427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define INVALID_BUFFER_LENGTH -1
3627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiusing namespace android;
3827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::loadPlugIns(int uniqueId) {
4027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("load plugins");
4127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
4227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
4427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
4527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(LOAD_PLUGINS, data, &reply);
4727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
4827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
4927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
5027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::loadPlugIns(int uniqueId, const String8& plugInDirPath) {
5127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("load plugins from path");
5227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
5327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
5427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
5527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
5627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(plugInDirPath);
5727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
5827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(LOAD_PLUGINS_FROM_PATH, data, &reply);
5927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
6027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
6127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::setDrmServiceListener(
6327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) {
6427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("setDrmServiceListener");
6527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
6627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
6827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
6927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeStrongBinder(drmServiceListener->asBinder());
7027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(SET_DRM_SERVICE_LISTENER, data, &reply);
7127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
7227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
7327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::unloadPlugIns(int uniqueId) {
7527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("unload plugins");
7627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
7727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
7927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
8027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
8127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(UNLOAD_PLUGINS, data, &reply);
8227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
8327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
8427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
8527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::installDrmEngine(int uniqueId, const String8& drmEngineFile) {
8627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Install DRM Engine");
8727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
8827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
8927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
9027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
9127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(drmEngineFile);
9227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
9327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(INSTALL_DRM_ENGINE, data, &reply);
9427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
9527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
9627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
9727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConstraints* BpDrmManagerService::getConstraints(
9827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const String8* path, const int action) {
9927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Get Constraints");
10027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
10127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
10327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
10427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(*path);
10527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(action);
10627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(GET_CONSTRAINTS_FROM_CONTENT, data, &reply);
10827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConstraints* drmConstraints = NULL;
11027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
11127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling Drm Constraints
11227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmConstraints = new DrmConstraints();
11327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
11427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = reply.readInt32();
11527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < size; ++index) {
11627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 key(reply.readString8());
11727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = reply.readInt32();
11827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            char* data = NULL;
11927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
12027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                data = new char[bufferSize];
12127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply.read(data, bufferSize);
12227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
12327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmConstraints->put(&key, data);
12427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
12527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
12627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmConstraints;
12727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
12827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
12927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool BpDrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) {
13027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Can Handle");
13127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
13427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
13527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
13727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(mimeType);
13827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CAN_HANDLE, data, &reply);
14027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return static_cast<bool>(reply.readInt32());
14227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
14327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) {
14527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Process DRM Info");
14627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
14727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
14927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
15027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
15127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    //Filling DRM info
15227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(drmInfo->getInfoType());
15327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const DrmBuffer dataBuffer = drmInfo->getData();
15427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const int dataBufferSize = dataBuffer.length;
15527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(dataBufferSize);
15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 < dataBufferSize) {
15727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.write(dataBuffer.data, dataBufferSize);
15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
15927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(drmInfo->getMimeType());
16027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
16127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(drmInfo->getCount());
16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
16427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    while (keyIt.hasNext()) {
16527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 key = keyIt.next();
16627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeString8(key);
16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 value = drmInfo->get(key);
16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeString8((value == String8("")) ? String8("NULL") : value);
16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
17027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
17127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(PROCESS_DRM_INFO, data, &reply);
17227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfoStatus* drmInfoStatus = NULL;
17427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
17527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Info Status
17627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int statusCode = reply.readInt32();
17727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 mimeType = reply.readString8();
17827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
17927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* drmBuffer = NULL;
18027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 != reply.dataAvail()) {
18127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = reply.readInt32();
18227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            char* data = NULL;
18327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
18427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                data = new char[bufferSize];
18527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply.read(data, bufferSize);
18627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
18727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmBuffer = new DrmBuffer(data, bufferSize);
18827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
18927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmInfoStatus = new DrmInfoStatus(statusCode, drmBuffer, mimeType);
19027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
19127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmInfoStatus;
19227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
19327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
19427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfo* BpDrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) {
19527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Acquire DRM Info");
19627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
19727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
19827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
19927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
20027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
20127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    //Filling DRM Info Request
20227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(drmInforequest->getInfoType());
20327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(drmInforequest->getMimeType());
20427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
20527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(drmInforequest->getCount());
20627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfoRequest::KeyIterator keyIt = drmInforequest->keyIterator();
20727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
20827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    while (keyIt.hasNext()) {
20927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 key = keyIt.next();
21027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeString8(key);
21127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 value = drmInforequest->get(key);
21227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeString8((value == String8("")) ? String8("NULL") : value);
21327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
21427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
21527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(ACQUIRE_DRM_INFO, data, &reply);
21627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
21727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfo* drmInfo = NULL;
21827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
21927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Info
22027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int infoType = reply.readInt32();
22127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = reply.readInt32();
22227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        char* data = NULL;
22327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
22427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 < bufferSize) {
22527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            data = new char[bufferSize];
22627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply.read(data, bufferSize);
22727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
22827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmInfo = new DrmInfo(infoType, DrmBuffer(data, bufferSize), reply.readString8());
22927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
23027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = reply.readInt32();
23127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < size; ++index) {
23227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 key(reply.readString8());
23327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 value(reply.readString8());
23427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
23527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
23627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
23727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmInfo;
23827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
23927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
24027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid BpDrmManagerService::saveRights(
24127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const DrmRights& drmRights,
24227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8& rightsPath, const String8& contentPath) {
24327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Save Rights");
24427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
24527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
24627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
24727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
24827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
24927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    //Filling Drm Rights
25027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const DrmBuffer dataBuffer = drmRights.getData();
25127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(dataBuffer.length);
25227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.write(dataBuffer.data, dataBuffer.length);
25327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
25427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 mimeType = drmRights.getMimeType();
25527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((mimeType == String8("")) ? String8("NULL") : mimeType);
25627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
25727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 accountId = drmRights.getAccountId();
25827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((accountId == String8("")) ? String8("NULL") : accountId);
25927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
26027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 subscriptionId = drmRights.getSubscriptionId();
26127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((subscriptionId == String8("")) ? String8("NULL") : subscriptionId);
26227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
26327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((rightsPath == String8("")) ? String8("NULL") : rightsPath);
26427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((contentPath == String8("")) ? String8("NULL") : contentPath);
26527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
26627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(SAVE_RIGHTS, data, &reply);
26727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
26827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
26927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 BpDrmManagerService::getOriginalMimeType(int uniqueId, const String8& path) {
27027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Get Original MimeType");
27127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
27227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
27327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
27427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
27527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
27627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
27727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(GET_ORIGINAL_MIMETYPE, data, &reply);
27827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readString8();
27927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
28027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
28127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::getDrmObjectType(
28227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const String8& path, const String8& mimeType) {
28327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Get Drm object type");
28427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
28527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
28627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
28727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
28827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
28927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(mimeType);
29027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
29127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(GET_DRM_OBJECT_TYPE, data, &reply);
29227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
29327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
29427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
29527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
29627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::checkRightsStatus(int uniqueId, const String8& path, int action) {
29727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("checkRightsStatus");
29827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
29927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
30027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
30127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
30227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
30327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(action);
30427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
30527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CHECK_RIGHTS_STATUS, data, &reply);
30627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
30727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
30827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
30927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
31027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid BpDrmManagerService::consumeRights(
31127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) {
31227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("consumeRights");
31327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        Parcel data, reply;
31427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
31527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
31627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
31727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
31827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptId);
31927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(decryptHandle->mimeType);
32027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptApiType);
32127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->status);
32227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
32327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != decryptHandle->decryptInfo) {
32427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
32527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    } else {
32627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(INVALID_BUFFER_LENGTH);
32727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
32827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
32927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(action);
33027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(static_cast< int>(reserve));
33127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
33227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CONSUME_RIGHTS, data, &reply);
33327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
33427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
33527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid BpDrmManagerService::setPlaybackStatus(
33627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int position) {
33727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("setPlaybackStatus");
33827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
33927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
34027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
34127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
34227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
34327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptId);
34427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(decryptHandle->mimeType);
34527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptApiType);
34627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->status);
34727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
34827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != decryptHandle->decryptInfo) {
34927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
35027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    } else {
35127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(INVALID_BUFFER_LENGTH);
35227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
35327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
35427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(playbackStatus);
35527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(position);
35627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
35727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(SET_PLAYBACK_STATUS, data, &reply);
35827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
35927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
36027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool BpDrmManagerService::validateAction(
36127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const String8& path,
36227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int action, const ActionDescription& description) {
36327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("validateAction");
36427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
36527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
36627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
36727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
36827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
36927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(action);
37027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(description.outputType);
37127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(description.configuration);
37227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
37327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(VALIDATE_ACTION, data, &reply);
37427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
37527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return static_cast<bool>(reply.readInt32());
37627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
37727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
37827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid BpDrmManagerService::removeRights(int uniqueId, const String8& path) {
37927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("removeRights");
38027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
38127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
38227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
38327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
38427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
38527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
38627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(REMOVE_RIGHTS, data, &reply);
38727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
38827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
38927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid BpDrmManagerService::removeAllRights(int uniqueId) {
39027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("removeAllRights");
39127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
39227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
39327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
39427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
39527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
39627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(REMOVE_ALL_RIGHTS, data, &reply);
39727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
39827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
39927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) {
40027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("openConvertSession");
40127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
40227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
40327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
40427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
40527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(mimeType);
40627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
40727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(OPEN_CONVERT_SESSION, data, &reply);
40827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
40927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
41027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
41127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* BpDrmManagerService::convertData(
41227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, int convertId, const DrmBuffer* inputData) {
41327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("convertData");
41427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
41527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
41627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
41727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
41827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(convertId);
41927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(inputData->length);
42027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.write(inputData->data, inputData->length);
42127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
42227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CONVERT_DATA, data, &reply);
42327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
42427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConvertedStatus* drmConvertedStatus = NULL;
42527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
42627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
42727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Converted Status
42827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int statusCode = reply.readInt32();
42927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int offset = reply.readInt32();
43027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
43127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* convertedData = NULL;
43227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 != reply.dataAvail()) {
43327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = reply.readInt32();
43427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            char* data = NULL;
43527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
43627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                data = new char[bufferSize];
43727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply.read(data, bufferSize);
43827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
43927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            convertedData = new DrmBuffer(data, bufferSize);
44027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
44127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
44227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
44327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmConvertedStatus;
44427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
44527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
44627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* BpDrmManagerService::closeConvertSession(int uniqueId, int convertId) {
44727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("closeConvertSession");
44827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
44927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
45027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
45127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
45227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(convertId);
45327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
45427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CLOSE_CONVERT_SESSION, data, &reply);
45527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
45627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConvertedStatus* drmConvertedStatus = NULL;
45727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
45827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
45927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Converted Status
46027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int statusCode = reply.readInt32();
46127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int offset = reply.readInt32();
46227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
46327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* convertedData = NULL;
46427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 != reply.dataAvail()) {
46527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = reply.readInt32();
46627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            char* data = NULL;
46727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
46827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                data = new char[bufferSize];
46927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply.read(data, bufferSize);
47027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
47127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            convertedData = new DrmBuffer(data, bufferSize);
47227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
47327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
47427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
47527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmConvertedStatus;
47627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
47727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
47827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::getAllSupportInfo(
47927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) {
48027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Get All Support Info");
48127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
48227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
48327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
48427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
48527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
48627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(GET_ALL_SUPPORT_INFO, data, &reply);
48727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
48827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    //Filling DRM Support Info
48927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const int arraySize = reply.readInt32();
49027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 < arraySize) {
49127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        *drmSupportInfoArray = new DrmSupportInfo[arraySize];
49227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
49327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < arraySize; ++index) {
49427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo drmSupportInfo;
49527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
49627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int fileSuffixVectorSize = reply.readInt32();
49727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            for (int i = 0; i < fileSuffixVectorSize; ++i) {
49827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                drmSupportInfo.addFileSuffix(reply.readString8());
49927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
50027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
50127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int mimeTypeVectorSize = reply.readInt32();
50227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            for (int i = 0; i < mimeTypeVectorSize; ++i) {
50327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                drmSupportInfo.addMimeType(reply.readString8());
50427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
50527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
50627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmSupportInfo.setDescription(reply.readString8());
50727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            (*drmSupportInfoArray)[index] = drmSupportInfo;
50827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
50927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
51027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    *length = arraySize;
51127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
51227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
51327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
51427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDecryptHandle* BpDrmManagerService::openDecryptSession(
51527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, int fd, int offset, int length) {
51627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Entering BpDrmManagerService::openDecryptSession");
51727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
51827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
51927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String16 interfaceDescriptor = IDrmManagerService::getInterfaceDescriptor();
52027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("BpDrmManagerService::openDecryptSession: InterfaceDescriptor name is %s",
52127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        interfaceDescriptor.string());
52227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(interfaceDescriptor);
52327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
52427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeFileDescriptor(fd);
52527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(offset);
52627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(length);
52727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
52827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("try to invoke remote onTransact() with code OPEN_DECRYPT_SESSION");
52927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(OPEN_DECRYPT_SESSION, data, &reply);
53027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
53127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DecryptHandle* handle = NULL;
53227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
53327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle = new DecryptHandle();
53427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->decryptId = reply.readInt32();
53527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->mimeType = reply.readString8();
53627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->decryptApiType = reply.readInt32();
53727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->status = reply.readInt32();
53827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->decryptInfo = NULL;
53927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 != reply.dataAvail()) {
54027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle->decryptInfo = new DecryptInfo();
54127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle->decryptInfo->decryptBufferLength = reply.readInt32();
54227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
54327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    } else {
54427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGE("no decryptHandle is generated in service side");
54527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
54627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return handle;
54727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
54827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
54927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) {
55027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("closeDecryptSession");
55127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
55227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
55327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
55427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
55527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
55627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptId);
55727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(decryptHandle->mimeType);
55827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptApiType);
55927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->status);
56027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
56127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != decryptHandle->decryptInfo) {
56227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
56327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    } else {
56427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(INVALID_BUFFER_LENGTH);
56527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
56627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
56727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply);
56827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
56927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != decryptHandle->decryptInfo) {
57027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("deleting decryptInfo");
57127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete decryptHandle->decryptInfo; decryptHandle->decryptInfo = NULL;
57227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
57327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    delete decryptHandle; decryptHandle = NULL;
57427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
57527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
57627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid BpDrmManagerService::initializeDecryptUnit(
57727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle,
57827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int decryptUnitId, const DrmBuffer* headerInfo) {
57927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("initializeDecryptUnit");
58027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
58127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
58227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
58327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
58427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
58527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptId);
58627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(decryptHandle->mimeType);
58727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptApiType);
58827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->status);
58927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
59027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != decryptHandle->decryptInfo) {
59127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
59227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    } else {
59327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(INVALID_BUFFER_LENGTH);
59427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
59527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptUnitId);
59627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
59727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(headerInfo->length);
59827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.write(headerInfo->data, headerInfo->length);
59927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
60027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply);
60127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
60227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
60327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::decrypt(
60427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,
60527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const DrmBuffer* encBuffer, DrmBuffer** decBuffer) {
60627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("decrypt");
60727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
60827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
60927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
61027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
61127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
61227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptId);
61327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(decryptHandle->mimeType);
61427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptApiType);
61527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->status);
61627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
61727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != decryptHandle->decryptInfo) {
61827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
61927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    } else {
62027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(INVALID_BUFFER_LENGTH);
62127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
62227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
62327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptUnitId);
62427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32((*decBuffer)->length);
62527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
62627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(encBuffer->length);
62727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.write(encBuffer->data, encBuffer->length);
62827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
62927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(DECRYPT, data, &reply);
63027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
63127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const status_t status = reply.readInt32();
63227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Return value of decrypt() is %d", status);
63327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
63427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const int size = reply.readInt32();
63527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    (*decBuffer)->length = size;
63627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    reply.read((void *)(*decBuffer)->data, size);
63727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
63827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return status;
63927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
64027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
64127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshivoid BpDrmManagerService::finalizeDecryptUnit(
64227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) {
64327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("finalizeDecryptUnit");
64427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
64527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
64627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
64727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
64827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
64927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptId);
65027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(decryptHandle->mimeType);
65127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptApiType);
65227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->status);
65327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
65427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != decryptHandle->decryptInfo) {
65527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
65627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    } else {
65727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(INVALID_BUFFER_LENGTH);
65827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
65927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
66027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptUnitId);
66127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
66227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply);
66327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
66427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
66527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshissize_t BpDrmManagerService::pread(
66627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, void* buffer,
66727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            ssize_t numBytes, off_t offset) {
66827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("read");
66927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
67027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int result;
67127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
67227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
67327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
67427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
67527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptId);
67627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(decryptHandle->mimeType);
67727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->decryptApiType);
67827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptHandle->status);
67927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
68027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (NULL != decryptHandle->decryptInfo) {
68127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
68227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    } else {
68327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeInt32(INVALID_BUFFER_LENGTH);
68427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
68527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
68627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(numBytes);
68727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(offset);
68827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
68927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(PREAD, data, &reply);
69027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    result = reply.readInt32();
69127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 < result) {
69227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply.read(buffer, result);
69327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
69427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return result;
69527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
69627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
69727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiIMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService");
69827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
69927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BnDrmManagerService::onTransact(
70027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            uint32_t code, const Parcel& data,
70127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            Parcel* reply, uint32_t flags) {
70227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Entering BnDrmManagerService::onTransact with code %d", code);
70327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
70427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    switch (code) {
70527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case LOAD_PLUGINS:
70627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
70727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :LOAD_PLUGINS");
70827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
70927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
71027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        status_t status = loadPlugIns(data.readInt32());
71127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
71227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
71327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
71427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
71527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
71627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
71727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case LOAD_PLUGINS_FROM_PATH:
71827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
71927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :LOAD_PLUGINS_FROM_PATH");
72027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
72127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
72227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        status_t status = loadPlugIns(data.readInt32(), data.readString8());
72327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
72427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
72527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
72627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
72727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
72827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case SET_DRM_SERVICE_LISTENER:
72927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
73027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER");
73127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
73227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
73327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
73427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const sp<IDrmServiceListener> drmServiceListener
73527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            = interface_cast<IDrmServiceListener> (data.readStrongBinder());
73627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
73727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        status_t status = setDrmServiceListener(uniqueId, drmServiceListener);
73827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
73927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
74027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
74127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
74227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
74327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case UNLOAD_PLUGINS:
74427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
74527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :UNLOAD_PLUGINS");
74627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
74727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
74827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        status_t status = unloadPlugIns(data.readInt32());
74927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
75027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
75127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
75227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
75327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
75427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case INSTALL_DRM_ENGINE:
75527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
75627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :INSTALL_DRM_ENGINE");
75727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
75827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
75927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        status_t status = installDrmEngine(data.readInt32(), data.readString8());
76027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
76127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
76227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
76327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
76427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
76527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case GET_CONSTRAINTS_FROM_CONTENT:
76627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
76727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT");
76827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
76927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
77027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
77127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 path = data.readString8();
77227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
77327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmConstraints* drmConstraints = getConstraints(uniqueId, &path, data.readInt32());
77427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
77527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmConstraints) {
77627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling DRM Constraints contents
77727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmConstraints->getCount());
77827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
77927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator();
78027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            while (keyIt.hasNext()) {
78127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const String8 key = keyIt.next();
78227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8(key);
78327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const char* value = drmConstraints->getAsByteArray(&key);
78427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                int bufferSize = 0;
78527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (NULL != value) {
78627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    bufferSize = strlen(value);
78727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
78827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(bufferSize + 1);
78927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->write(value, bufferSize + 1);
79027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
79127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
79227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmConstraints; drmConstraints = NULL;
79327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
79427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
79527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
79627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CAN_HANDLE:
79727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
79827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :CAN_HANDLE");
79927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
80027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
80127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
80227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 path = data.readString8();
80327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 mimeType = data.readString8();
80427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
80527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        bool result = canHandle(uniqueId, path, mimeType);
80627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
80727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(result);
80827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
80927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
81027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
81127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case PROCESS_DRM_INFO:
81227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
81327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO");
81427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
81527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
81627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
81727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
81827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM info
81927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int infoType = data.readInt32();
82027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = data.readInt32();
82127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        char* buffer = NULL;
82227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 < bufferSize) {
82327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            buffer = (char *)data.readInplace(bufferSize);
82427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
82527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const DrmBuffer drmBuffer(buffer, bufferSize);
82627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8());
82727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
82827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = data.readInt32();
82927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < size; ++index) {
83027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 key(data.readString8());
83127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 value(data.readString8());
83227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
83327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
83427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
83527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo);
83627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
83727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmInfoStatus) {
83827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling DRM Info Status contents
83927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmInfoStatus->statusCode);
84027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeString8(drmInfoStatus->mimeType);
84127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
84227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (NULL != drmInfoStatus->drmBuffer) {
84327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer;
84427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const int bufferSize = drmBuffer->length;
84527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(bufferSize);
84627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (0 < bufferSize) {
84727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    reply->write(drmBuffer->data, bufferSize);
84827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
84927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete [] drmBuffer->data;
85027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete drmBuffer; drmBuffer = NULL;
85127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
85227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
85327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmInfo; drmInfo = NULL;
85427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmInfoStatus; drmInfoStatus = NULL;
85527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
85627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
85727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
85827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case ACQUIRE_DRM_INFO:
85927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
86027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO");
86127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
86227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
86327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
86427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
86527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM info Request
86627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(data.readInt32(), data.readString8());
86727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
86827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = data.readInt32();
86927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < size; ++index) {
87027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 key(data.readString8());
87127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 value(data.readString8());
87227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value);
87327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
87427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
87527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest);
87627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
87727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmInfo) {
87827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling DRM Info
87927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const DrmBuffer drmBuffer = drmInfo->getData();
88027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmInfo->getInfoType());
88127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
88227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = drmBuffer.length;
88327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(bufferSize);
88427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
88527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->write(drmBuffer.data, bufferSize);
88627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
88727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeString8(drmInfo->getMimeType());
88827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmInfo->getCount());
88927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
89027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
89127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            while (keyIt.hasNext()) {
89227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const String8 key = keyIt.next();
89327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8(key);
89427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const String8 value = drmInfo->get(key);
89527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8((value == String8("")) ? String8("NULL") : value);
89627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
89727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            delete [] drmBuffer.data;
89827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
89927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmInfoRequest; drmInfoRequest = NULL;
90027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmInfo; drmInfo = NULL;
90127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
90227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
90327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
90427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case SAVE_RIGHTS:
90527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
90627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS");
90727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
90827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
90927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
91027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
91127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Rights
91227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = data.readInt32();
91327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize);
91427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
91527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 mimeType(data.readString8());
91627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 accountId(data.readString8());
91727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 subscriptionId(data.readString8());
91827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 rightsPath(data.readString8());
91927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 contentPath(data.readString8());
92027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
92127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmRights drmRights(drmBuffer,
92227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((mimeType == String8("NULL")) ? String8("") : mimeType),
92327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((accountId == String8("NULL")) ? String8("") : accountId),
92427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId));
92527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
92627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        saveRights(uniqueId, drmRights,
92727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((rightsPath == String8("NULL")) ? String8("") : rightsPath),
92827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((contentPath == String8("NULL")) ? String8("") : contentPath));
92927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
93027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
93127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
93227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
93327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case GET_ORIGINAL_MIMETYPE:
93427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
93527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE");
93627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
93727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
93827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 originalMimeType = getOriginalMimeType(data.readInt32(), data.readString8());
93927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
94027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeString8(originalMimeType);
94127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
94227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
94327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
94427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case GET_DRM_OBJECT_TYPE:
94527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
94627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE");
94727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
94827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
94927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int drmObjectType
95027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            = getDrmObjectType(data.readInt32(), data.readString8(), data.readString8());
95127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
95227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(drmObjectType);
95327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
95427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
95527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
95627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CHECK_RIGHTS_STATUS:
95727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
95827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS");
95927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
96027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
96127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int result
96227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            = checkRightsStatus(data.readInt32(), data.readString8(), data.readInt32());
96327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
96427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(result);
96527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
96627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
96727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
96827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CONSUME_RIGHTS:
96927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
97027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS");
97127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
97227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
97327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
97427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
97527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
97627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptId = data.readInt32();
97727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.mimeType = data.readString8();
97827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptApiType = data.readInt32();
97927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.status = data.readInt32();
98027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptInfo = NULL;
98127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
98227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferLength = data.readInt32();
98327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (INVALID_BUFFER_LENGTH != bufferLength) {
98427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo = new DecryptInfo();
98527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo->decryptBufferLength = bufferLength;
98627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
98727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
98827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        consumeRights(uniqueId, &handle, data.readInt32(), static_cast<bool>(data.readInt32()));
98927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
99027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete handle.decryptInfo; handle.decryptInfo = NULL;
99127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
99227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
99327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
99427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case SET_PLAYBACK_STATUS:
99527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
99627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS");
99727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
99827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
99927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
100027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
100127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
100227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptId = data.readInt32();
100327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.mimeType = data.readString8();
100427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptApiType = data.readInt32();
100527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.status = data.readInt32();
100627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptInfo = NULL;
100727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
100827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferLength = data.readInt32();
100927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (INVALID_BUFFER_LENGTH != bufferLength) {
101027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo = new DecryptInfo();
101127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo->decryptBufferLength = bufferLength;
101227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
101327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
101427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        setPlaybackStatus(uniqueId, &handle, data.readInt32(), data.readInt32());
101527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
101627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete handle.decryptInfo; handle.decryptInfo = NULL;
101727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
101827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
101927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
102027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case VALIDATE_ACTION:
102127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
102227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION");
102327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
102427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
102527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        bool result = validateAction(
102627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                                data.readInt32(),
102727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                                data.readString8(),
102827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                                data.readInt32(),
102927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                                ActionDescription(data.readInt32(), data.readInt32()));
103027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
103127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(result);
103227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
103327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
103427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
103527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case REMOVE_RIGHTS:
103627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
103727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS");
103827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
103927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
104027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        removeRights(data.readInt32(), data.readString8());
104127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
104227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
104327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
104427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
104527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case REMOVE_ALL_RIGHTS:
104627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
104727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS");
104827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
104927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
105027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        removeAllRights(data.readInt32());
105127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
105227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
105327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
105427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
105527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case OPEN_CONVERT_SESSION:
105627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
105727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION");
105827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
105927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
106027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int convertId = openConvertSession(data.readInt32(), data.readString8());
106127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
106227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(convertId);
106327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
106427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
106527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
106627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CONVERT_DATA:
106727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
106827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :CONVERT_DATA");
106927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
107027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
107127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
107227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int convertId = data.readInt32();
107327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
107427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling input data
107527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = data.readInt32();
107627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
107727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
107827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmConvertedStatus*    drmConvertedStatus = convertData(uniqueId, convertId, inputData);
107927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
108027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmConvertedStatus) {
108127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling Drm Converted Ststus
108227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmConvertedStatus->statusCode);
108327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmConvertedStatus->offset);
108427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
108527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (NULL != drmConvertedStatus->convertedData) {
108627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
108727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const int bufferSize = convertedData->length;
108827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(bufferSize);
108927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (0 < bufferSize) {
109027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    reply->write(convertedData->data, bufferSize);
109127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
109227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete [] convertedData->data;
109327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete convertedData; convertedData = NULL;
109427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
109527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
109627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete inputData; inputData = NULL;
109727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmConvertedStatus; drmConvertedStatus = NULL;
109827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
109927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
110027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
110127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CLOSE_CONVERT_SESSION:
110227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
110327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION");
110427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
110527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
110627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmConvertedStatus*    drmConvertedStatus
110727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            = closeConvertSession(data.readInt32(), data.readInt32());
110827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
110927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmConvertedStatus) {
111027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling Drm Converted Ststus
111127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmConvertedStatus->statusCode);
111227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmConvertedStatus->offset);
111327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
111427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (NULL != drmConvertedStatus->convertedData) {
111527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
111627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const int bufferSize = convertedData->length;
111727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(bufferSize);
111827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (0 < bufferSize) {
111927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    reply->write(convertedData->data, bufferSize);
112027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
112127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete [] convertedData->data;
112227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete convertedData; convertedData = NULL;
112327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
112427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
112527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmConvertedStatus; drmConvertedStatus = NULL;
112627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
112727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
112827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
112927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case GET_ALL_SUPPORT_INFO:
113027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
113127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO");
113227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
113327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
113427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
113527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        int length = 0;
113627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmSupportInfo* drmSupportInfoArray = NULL;
113727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
113827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray);
113927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
114027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(length);
114127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int i = 0; i < length; ++i) {
114227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i];
114327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
114427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmSupportInfo.getFileSuffixCount());
114527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo::FileSuffixIterator fileSuffixIt
114627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                = drmSupportInfo.getFileSuffixIterator();
114727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            while (fileSuffixIt.hasNext()) {
114827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8(fileSuffixIt.next());
114927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
115027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
115127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmSupportInfo.getMimeTypeCount());
115227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator();
115327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            while (mimeTypeIt.hasNext()) {
115427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8(mimeTypeIt.next());
115527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
115627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeString8(drmSupportInfo.getDescription());
115727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
115827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete [] drmSupportInfoArray; drmSupportInfoArray = NULL;
115927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
116027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
116127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
116227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
116327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case OPEN_DECRYPT_SESSION:
116427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
116527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION");
116627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
116727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
116827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
116927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int fd = data.readFileDescriptor();
117027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
117127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle* handle
117227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            = openDecryptSession(uniqueId, fd, data.readInt32(), data.readInt32());
117327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
117427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != handle) {
117527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(handle->decryptId);
117627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeString8(handle->mimeType);
117727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(handle->decryptApiType);
117827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(handle->status);
117927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (NULL != handle->decryptInfo) {
118027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(handle->decryptInfo->decryptBufferLength);
118127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete handle->decryptInfo; handle->decryptInfo = NULL;
118227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
118327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        } else {
118427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            LOGE("NULL decryptHandle is returned");
118527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
118627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete handle; handle = NULL;
118727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
118827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
118927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
119027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CLOSE_DECRYPT_SESSION:
119127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
119227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION");
119327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
119427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
119527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
119627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
119727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle* handle = new DecryptHandle();
119827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->decryptId = data.readInt32();
119927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->mimeType = data.readString8();
120027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->decryptApiType = data.readInt32();
120127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->status = data.readInt32();
120227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle->decryptInfo = NULL;
120327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
120427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferLength = data.readInt32();
120527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (INVALID_BUFFER_LENGTH != bufferLength) {
120627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle->decryptInfo = new DecryptInfo();
120727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle->decryptInfo->decryptBufferLength = bufferLength;
120827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
120927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
121027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        closeDecryptSession(uniqueId, handle);
121127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
121227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
121327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
121427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case INITIALIZE_DECRYPT_UNIT:
121527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
121627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT");
121727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
121827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
121927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
122027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
122127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
122227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptId = data.readInt32();
122327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.mimeType = data.readString8();
122427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptApiType = data.readInt32();
122527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.status = data.readInt32();
122627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptInfo = NULL;
122727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
122827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferLength = data.readInt32();
122927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (INVALID_BUFFER_LENGTH != bufferLength) {
123027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo = new DecryptInfo();
123127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo->decryptBufferLength = bufferLength;
123227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
123327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int decryptUnitId = data.readInt32();
123427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
123527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling Header info
123627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = data.readInt32();
123727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* headerInfo = NULL;
123827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
123927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
124027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo);
124127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
124227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete handle.decryptInfo; handle.decryptInfo = NULL;
124327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete headerInfo; headerInfo = NULL;
124427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
124527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
124627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
124727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case DECRYPT:
124827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
124927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :DECRYPT");
125027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
125127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
125227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
125327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
125427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
125527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptId = data.readInt32();
125627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.mimeType = data.readString8();
125727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptApiType = data.readInt32();
125827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.status = data.readInt32();
125927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptInfo = NULL;
126027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
126127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferLength = data.readInt32();
126227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (INVALID_BUFFER_LENGTH != bufferLength) {
126327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo = new DecryptInfo();
126427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo->decryptBufferLength = bufferLength;
126527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
126627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int decryptUnitId = data.readInt32();
126727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int decBufferSize = data.readInt32();
126827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
126927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int encBufferSize = data.readInt32();
127027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* encBuffer
127127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize);
127227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
127327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        char* buffer = NULL;
127427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        buffer = new char[decBufferSize];
127527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize);
127627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
127727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const status_t status = decrypt(uniqueId, &handle, decryptUnitId, encBuffer, &decBuffer);
127827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
127927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
128027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
128127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = decBuffer->length;
128227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(size);
128327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->write(decBuffer->data, size);
128427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
128527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete handle.decryptInfo; handle.decryptInfo = NULL;
128627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete encBuffer; encBuffer = NULL;
128727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete decBuffer; decBuffer = NULL;
128827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete [] buffer; buffer = NULL;
128927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
129027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
129127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
129227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case FINALIZE_DECRYPT_UNIT:
129327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
129427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT");
129527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
129627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
129727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
129827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
129927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
130027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptId = data.readInt32();
130127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.mimeType = data.readString8();
130227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptApiType = data.readInt32();
130327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.status = data.readInt32();
130427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptInfo = NULL;
130527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
130627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferLength = data.readInt32();
130727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (INVALID_BUFFER_LENGTH != bufferLength) {
130827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo = new DecryptInfo();
130927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo->decryptBufferLength = bufferLength;
131027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
131127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
131227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        finalizeDecryptUnit(uniqueId, &handle, data.readInt32());
131327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
131427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete handle.decryptInfo; handle.decryptInfo = NULL;
131527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
131627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
131727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
131827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case PREAD:
131927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
132027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :READ");
132127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
132227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
132327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
132427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
132527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
132627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptId = data.readInt32();
132727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.mimeType = data.readString8();
132827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptApiType = data.readInt32();
132927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.status = data.readInt32();
133027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle.decryptInfo = NULL;
133127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
133227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferLength = data.readInt32();
133327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (INVALID_BUFFER_LENGTH != bufferLength) {
133427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo = new DecryptInfo();
133527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            handle.decryptInfo->decryptBufferLength = bufferLength;
133627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
133727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
133827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int numBytes = data.readInt32();
133927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        char* buffer = new char[numBytes];
134027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
134127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const off_t offset = data.readInt32();
134227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
134327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        ssize_t result = pread(uniqueId, &handle, buffer, numBytes, offset);
134427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(result);
134527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 < result) {
134627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->write(buffer, result);
134727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
134827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
134927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete handle.decryptInfo; handle.decryptInfo = NULL;
135027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete [] buffer, buffer = NULL;
135127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
135227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
135327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
135427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    default:
135527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return BBinder::onTransact(code, data, reply, flags);
135627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
135727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
135827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1359