127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi/*
227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Copyright (C) 2010 The Android Open Source Project
327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Licensed under the Apache License, Version 2.0 (the "License");
527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * you may not use this file except in compliance with the License.
627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * You may obtain a copy of the License at
727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *      http://www.apache.org/licenses/LICENSE-2.0
927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
1027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Unless required by applicable law or agreed to in writing, software
1127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * distributed under the License is distributed on an "AS IS" BASIS,
1227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * See the License for the specific language governing permissions and
1427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * limitations under the License.
1527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi */
1627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
172272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi//#define LOG_NDEBUG 0
1827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define LOG_TAG "IDrmManagerService(Native)"
1927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/Log.h>
2027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <stdint.h>
2227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <sys/types.h>
2327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <binder/IPCThreadState.h>
2427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfo.h>
2627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmConstraints.h>
273473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi#include <drm/DrmMetadata.h>
2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmRights.h>
2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoStatus.h>
3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmConvertedStatus.h>
3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoRequest.h>
3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmSupportInfo.h>
3327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "IDrmManagerService.h"
3527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define INVALID_BUFFER_LENGTH -1
3727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiusing namespace android;
3927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
40c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wangstatic void writeDecryptHandleToParcelData(
411da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        const DecryptHandle* handle, Parcel* data) {
421da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    data->writeInt32(handle->decryptId);
431da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    data->writeString8(handle->mimeType);
441da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    data->writeInt32(handle->decryptApiType);
451da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    data->writeInt32(handle->status);
461da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
471da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    int size = handle->copyControlVector.size();
481da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    data->writeInt32(size);
49c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    for (int i = 0; i < size; i++) {
501da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        data->writeInt32(handle->copyControlVector.keyAt(i));
511da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        data->writeInt32(handle->copyControlVector.valueAt(i));
521da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
531da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
546b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang    size = handle->extendedData.size();
556b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang    data->writeInt32(size);
56c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    for (int i = 0; i < size; i++) {
576b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang        data->writeString8(handle->extendedData.keyAt(i));
586b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang        data->writeString8(handle->extendedData.valueAt(i));
596b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang    }
606b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang
611da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    if (NULL != handle->decryptInfo) {
621da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        data->writeInt32(handle->decryptInfo->decryptBufferLength);
631da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    } else {
641da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        data->writeInt32(INVALID_BUFFER_LENGTH);
651da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
661da9aa606096e14985924e8433a087d04f68ea22Gloria Wang}
671da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
681da9aa606096e14985924e8433a087d04f68ea22Gloria Wangstatic void readDecryptHandleFromParcelData(
691da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        DecryptHandle* handle, const Parcel& data) {
701da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    if (0 == data.dataAvail()) {
711da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        return;
721da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
731da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
741da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    handle->decryptId = data.readInt32();
751da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    handle->mimeType = data.readString8();
761da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    handle->decryptApiType = data.readInt32();
771da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    handle->status = data.readInt32();
781da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
791da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    int size = data.readInt32();
80c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    for (int i = 0; i < size; i++) {
816b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang        DrmCopyControl key = (DrmCopyControl)data.readInt32();
826b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang        int value = data.readInt32();
836b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang        handle->copyControlVector.add(key, value);
846b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang    }
856b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang
866b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang    size = data.readInt32();
87c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    for (int i = 0; i < size; i++) {
886b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang        String8 key = data.readString8();
896b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang        String8 value = data.readString8();
906b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang        handle->extendedData.add(key, value);
911da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
921da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
931da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    handle->decryptInfo = NULL;
941da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    const int bufferLen = data.readInt32();
951da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    if (INVALID_BUFFER_LENGTH != bufferLen) {
961da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        handle->decryptInfo = new DecryptInfo();
971da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        handle->decryptInfo->decryptBufferLength = bufferLen;
981da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
991da9aa606096e14985924e8433a087d04f68ea22Gloria Wang}
1001da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
1011da9aa606096e14985924e8433a087d04f68ea22Gloria Wangstatic void clearDecryptHandle(DecryptHandle* handle) {
1021da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    if (handle == NULL) {
1031da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        return;
1041da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
1051da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    if (handle->decryptInfo) {
1061da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        delete handle->decryptInfo;
1071da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        handle->decryptInfo = NULL;
1081da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
1091da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    handle->copyControlVector.clear();
110ab00df4d8585b181e9058eb1b9c7996aa3bbaeabGloria Wang    handle->extendedData.clear();
1111da9aa606096e14985924e8433a087d04f68ea22Gloria Wang}
1121da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
1138f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wangint BpDrmManagerService::addUniqueId(bool isNative) {
1143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("add uniqueid");
1152272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    Parcel data, reply;
1162272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
1178f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang    data.writeInt32(isNative);
1182272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    remote()->transact(ADD_UNIQUEID, data, &reply);
1192272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
1202272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi}
1212272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
1222272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimivoid BpDrmManagerService::removeUniqueId(int uniqueId) {
1233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("remove uniqueid");
1242272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    Parcel data, reply;
1252272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
1262272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    data.writeInt32(uniqueId);
1272272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    remote()->transact(REMOVE_UNIQUEID, data, &reply);
1282272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi}
1292272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
130e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid BpDrmManagerService::addClient(int uniqueId) {
13127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
134e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    remote()->transact(ADD_CLIENT, data, &reply);
13527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
13627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
137e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid BpDrmManagerService::removeClient(int uniqueId) {
13827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
13927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
14027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
141e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    remote()->transact(REMOVE_CLIENT, data, &reply);
14227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
14327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::setDrmServiceListener(
14527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) {
1463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setDrmServiceListener");
14727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
14827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
15027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
15127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeStrongBinder(drmServiceListener->asBinder());
15227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(SET_DRM_SERVICE_LISTENER, data, &reply);
15327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
15427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
15527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::installDrmEngine(int uniqueId, const String8& drmEngineFile) {
1573856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Install DRM Engine");
15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
15927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
16027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
16127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(drmEngineFile);
16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
16427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(INSTALL_DRM_ENGINE, data, &reply);
16527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
16627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConstraints* BpDrmManagerService::getConstraints(
16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const String8* path, const int action) {
1703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Get Constraints");
17127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
17227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
17427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
17527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(*path);
17627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(action);
17727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
17827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(GET_CONSTRAINTS_FROM_CONTENT, data, &reply);
17927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
18027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConstraints* drmConstraints = NULL;
18127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
18227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling Drm Constraints
18327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmConstraints = new DrmConstraints();
18427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
18527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = reply.readInt32();
18627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < size; ++index) {
18727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 key(reply.readString8());
18827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = reply.readInt32();
18927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            char* data = NULL;
19027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
19127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                data = new char[bufferSize];
19227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply.read(data, bufferSize);
19327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
19427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmConstraints->put(&key, data);
19527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
19627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
19727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmConstraints;
19827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
19927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2003473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi AimiDrmMetadata* BpDrmManagerService::getMetadata(int uniqueId, const String8* path) {
2013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Get Metadata");
2023473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    Parcel data, reply;
2033473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
2043473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    data.writeInt32(uniqueId);
2053473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
2063473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    DrmMetadata* drmMetadata = NULL;
2073473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    data.writeString8(*path);
2083473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    remote()->transact(GET_METADATA_FROM_CONTENT, data, &reply);
2093473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
2103473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    if (0 != reply.dataAvail()) {
2113473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        //Filling Drm Metadata
2123473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        drmMetadata = new DrmMetadata();
2133473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
2143473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        const int size = reply.readInt32();
2153473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        for (int index = 0; index < size; ++index) {
2163473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            const String8 key(reply.readString8());
2173473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            const int bufferSize = reply.readInt32();
2183473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            char* data = NULL;
2193473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            if (0 < bufferSize) {
2203473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                data = new char[bufferSize];
2213473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                reply.read(data, bufferSize);
2223473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            }
2233473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            drmMetadata->put(&key, data);
2243473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        }
2253473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    }
2263473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    return drmMetadata;
2273473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi}
2283473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
22927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool BpDrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) {
2303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Can Handle");
23127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
23227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
23327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
23427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
23527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
23627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
23727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(mimeType);
23827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
23927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CAN_HANDLE, data, &reply);
24027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
24127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return static_cast<bool>(reply.readInt32());
24227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
24327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
24427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) {
2453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Process DRM Info");
24627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
24727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
24827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
24927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
25027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
25127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    //Filling DRM info
25227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(drmInfo->getInfoType());
25327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const DrmBuffer dataBuffer = drmInfo->getData();
25427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const int dataBufferSize = dataBuffer.length;
25527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(dataBufferSize);
25627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 < dataBufferSize) {
25727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.write(dataBuffer.data, dataBufferSize);
25827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
25927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(drmInfo->getMimeType());
26027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
26127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(drmInfo->getCount());
26227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
26327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
26427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    while (keyIt.hasNext()) {
26527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 key = keyIt.next();
26627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeString8(key);
26727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 value = drmInfo->get(key);
26827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeString8((value == String8("")) ? String8("NULL") : value);
26927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
27027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
27127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(PROCESS_DRM_INFO, data, &reply);
27227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
27327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfoStatus* drmInfoStatus = NULL;
27427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
27527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Info Status
27627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int statusCode = reply.readInt32();
277e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        const int infoType = reply.readInt32();
27827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 mimeType = reply.readString8();
27927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
28027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* drmBuffer = NULL;
28127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 != reply.dataAvail()) {
28227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = reply.readInt32();
28327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            char* data = NULL;
28427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
28527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                data = new char[bufferSize];
28627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply.read(data, bufferSize);
28727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
28827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmBuffer = new DrmBuffer(data, bufferSize);
28927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
290e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        drmInfoStatus = new DrmInfoStatus(statusCode, infoType, drmBuffer, mimeType);
29127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
29227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmInfoStatus;
29327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
29427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
29527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfo* BpDrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) {
2963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Acquire DRM Info");
29727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
29827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
29927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
30027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
30127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
30227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    //Filling DRM Info Request
30327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(drmInforequest->getInfoType());
30427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(drmInforequest->getMimeType());
30527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
30627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(drmInforequest->getCount());
30727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfoRequest::KeyIterator keyIt = drmInforequest->keyIterator();
30827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
30927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    while (keyIt.hasNext()) {
31027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 key = keyIt.next();
31127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeString8(key);
31227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 value = drmInforequest->get(key);
31327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeString8((value == String8("")) ? String8("NULL") : value);
31427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
31527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
31627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(ACQUIRE_DRM_INFO, data, &reply);
31727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
31827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfo* drmInfo = NULL;
31927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
32027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Info
32127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int infoType = reply.readInt32();
32227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = reply.readInt32();
32327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        char* data = NULL;
32427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
32527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 < bufferSize) {
32627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            data = new char[bufferSize];
32727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply.read(data, bufferSize);
32827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
32927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmInfo = new DrmInfo(infoType, DrmBuffer(data, bufferSize), reply.readString8());
33027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
33127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = reply.readInt32();
33227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < size; ++index) {
33327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 key(reply.readString8());
33427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 value(reply.readString8());
33527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
33627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
33727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
33827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmInfo;
33927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
34027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3412272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::saveRights(
34227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const DrmRights& drmRights,
34327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8& rightsPath, const String8& contentPath) {
3443856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Save Rights");
34527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
34627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
34727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
34827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
34927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
35027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    //Filling Drm Rights
35127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const DrmBuffer dataBuffer = drmRights.getData();
35227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(dataBuffer.length);
35327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.write(dataBuffer.data, dataBuffer.length);
35427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
35527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 mimeType = drmRights.getMimeType();
35627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((mimeType == String8("")) ? String8("NULL") : mimeType);
35727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
35827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 accountId = drmRights.getAccountId();
35927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((accountId == String8("")) ? String8("NULL") : accountId);
36027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
36127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 subscriptionId = drmRights.getSubscriptionId();
36227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((subscriptionId == String8("")) ? String8("NULL") : subscriptionId);
36327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
36427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((rightsPath == String8("")) ? String8("NULL") : rightsPath);
36527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((contentPath == String8("")) ? String8("NULL") : contentPath);
36627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
36727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(SAVE_RIGHTS, data, &reply);
3682272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
36927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
37027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
37127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 BpDrmManagerService::getOriginalMimeType(int uniqueId, const String8& path) {
3723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Get Original MimeType");
37327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
37427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
37527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
37627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
37727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
37827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
37927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(GET_ORIGINAL_MIMETYPE, data, &reply);
38027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readString8();
38127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
38227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
38327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::getDrmObjectType(
38427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const String8& path, const String8& mimeType) {
3853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Get Drm object type");
38627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
38727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
38827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
38927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
39027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
39127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(mimeType);
39227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
39327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(GET_DRM_OBJECT_TYPE, data, &reply);
39427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
39527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
39627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
39727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
39827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::checkRightsStatus(int uniqueId, const String8& path, int action) {
3993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("checkRightsStatus");
40027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
40127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
40227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
40327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
40427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
40527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(action);
40627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
40727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CHECK_RIGHTS_STATUS, data, &reply);
40827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
40927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
41027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
41127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4122272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::consumeRights(
41327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) {
4143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("consumeRights");
4152272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    Parcel data, reply;
41627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
41727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
41827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
41927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
420c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    writeDecryptHandleToParcelData(decryptHandle, &data);
42127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
42227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(action);
42327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(static_cast< int>(reserve));
42427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
42527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CONSUME_RIGHTS, data, &reply);
4262272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
42727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
42827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4292272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::setPlaybackStatus(
430a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) {
4313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setPlaybackStatus");
43227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
43327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
43427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
43527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
43627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
437c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    writeDecryptHandleToParcelData(decryptHandle, &data);
43827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
43927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(playbackStatus);
4402ed8a921ef55aa2f3dd4b7ac33b7ded6ec33d92dGloria Wang    data.writeInt64(position);
44127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
44227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(SET_PLAYBACK_STATUS, data, &reply);
4432272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
44427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
44527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
44627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool BpDrmManagerService::validateAction(
44727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const String8& path,
44827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int action, const ActionDescription& description) {
4493856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("validateAction");
45027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
45127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
45227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
45327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
45427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
45527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(action);
45627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(description.outputType);
45727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(description.configuration);
45827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
45927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(VALIDATE_ACTION, data, &reply);
46027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
46127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return static_cast<bool>(reply.readInt32());
46227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
46327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4642272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::removeRights(int uniqueId, const String8& path) {
4653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("removeRights");
46627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
46727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
46827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
46927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
47027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
47127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
47227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(REMOVE_RIGHTS, data, &reply);
4732272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
47427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
47527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4762272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::removeAllRights(int uniqueId) {
4773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("removeAllRights");
47827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
47927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
48027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
48127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
48227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
48327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(REMOVE_ALL_RIGHTS, data, &reply);
4842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
48527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
48627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
48727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) {
4883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("openConvertSession");
48927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
49027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
49127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
49227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
49327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(mimeType);
49427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
49527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(OPEN_CONVERT_SESSION, data, &reply);
49627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
49727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
49827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
49927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* BpDrmManagerService::convertData(
50027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, int convertId, const DrmBuffer* inputData) {
5013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("convertData");
50227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
50327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
50427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
50527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
50627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(convertId);
50727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(inputData->length);
50827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.write(inputData->data, inputData->length);
50927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
51027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CONVERT_DATA, data, &reply);
51127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
51227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConvertedStatus* drmConvertedStatus = NULL;
51327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
51427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
51527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Converted Status
51627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int statusCode = reply.readInt32();
517a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang        const off64_t offset = reply.readInt64();
51827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
51927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* convertedData = NULL;
52027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 != reply.dataAvail()) {
52127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = reply.readInt32();
52227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            char* data = NULL;
52327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
52427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                data = new char[bufferSize];
52527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply.read(data, bufferSize);
52627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
52727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            convertedData = new DrmBuffer(data, bufferSize);
52827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
52927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
53027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
53127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmConvertedStatus;
53227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
53327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
53427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* BpDrmManagerService::closeConvertSession(int uniqueId, int convertId) {
5353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("closeConvertSession");
53627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
53727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
53827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
53927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
54027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(convertId);
54127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
54227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CLOSE_CONVERT_SESSION, data, &reply);
54327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
54427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConvertedStatus* drmConvertedStatus = NULL;
54527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
54627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
54727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Converted Status
54827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int statusCode = reply.readInt32();
549a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang        const off64_t offset = reply.readInt64();
55027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
55127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* convertedData = NULL;
55227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 != reply.dataAvail()) {
55327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = reply.readInt32();
55427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            char* data = NULL;
55527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
55627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                data = new char[bufferSize];
55727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply.read(data, bufferSize);
55827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
55927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            convertedData = new DrmBuffer(data, bufferSize);
56027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
56127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
56227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
56327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmConvertedStatus;
56427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
56527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
56627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::getAllSupportInfo(
56727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) {
5683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Get All Support Info");
56927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
57027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
57127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
57227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
57327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
57427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(GET_ALL_SUPPORT_INFO, data, &reply);
57527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
57627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    //Filling DRM Support Info
57727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const int arraySize = reply.readInt32();
57827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 < arraySize) {
57927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        *drmSupportInfoArray = new DrmSupportInfo[arraySize];
58027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
58127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < arraySize; ++index) {
58227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo drmSupportInfo;
58327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
58427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int fileSuffixVectorSize = reply.readInt32();
58527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            for (int i = 0; i < fileSuffixVectorSize; ++i) {
58627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                drmSupportInfo.addFileSuffix(reply.readString8());
58727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
58827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
58927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int mimeTypeVectorSize = reply.readInt32();
59027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            for (int i = 0; i < mimeTypeVectorSize; ++i) {
59127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                drmSupportInfo.addMimeType(reply.readString8());
59227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
59327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
59427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmSupportInfo.setDescription(reply.readString8());
59527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            (*drmSupportInfoArray)[index] = drmSupportInfo;
59627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
59727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
59827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    *length = arraySize;
59927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
60027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
60127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
60227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDecryptHandle* BpDrmManagerService::openDecryptSession(
6039d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong            int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) {
6043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering BpDrmManagerService::openDecryptSession");
60527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
60627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
607e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
60827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
60927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeFileDescriptor(fd);
610a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang    data.writeInt64(offset);
611a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang    data.writeInt64(length);
6129d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    String8 mimeType;
6139d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    if (mime) {
6149d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        mimeType = mime;
6159d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    }
6169d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    data.writeString8(mimeType);
61727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
61827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(OPEN_DECRYPT_SESSION, data, &reply);
61927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
62027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DecryptHandle* handle = NULL;
62127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
62227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle = new DecryptHandle();
6231da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(handle, reply);
62427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
62527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return handle;
62627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
62727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6289d2f386dd2885eaffa11fd494ae258bb09fe6397James DongDecryptHandle* BpDrmManagerService::openDecryptSession(
6299d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        int uniqueId, const char* uri, const char* mime) {
6309d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong
6319d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    ALOGV("Entering BpDrmManagerService::openDecryptSession: mime=%s", mime? mime: "NULL");
632e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    Parcel data, reply;
633e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
634e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
635e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    data.writeInt32(uniqueId);
636e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    data.writeString8(String8(uri));
6379d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    String8 mimeType;
6389d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    if (mime) {
6399d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        mimeType = mime;
6409d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    }
6419d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    data.writeString8(mimeType);
642e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
643e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    remote()->transact(OPEN_DECRYPT_SESSION_FROM_URI, data, &reply);
644e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
645e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    DecryptHandle* handle = NULL;
646e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    if (0 != reply.dataAvail()) {
647e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        handle = new DecryptHandle();
6481da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(handle, reply);
649e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    } else {
6503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("no decryptHandle is generated in service side");
651e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    }
652e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    return handle;
653e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi}
654e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
6552272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) {
6563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("closeDecryptSession");
65727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
65827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
65927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
66027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
66127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
662c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    writeDecryptHandleToParcelData(decryptHandle, &data);
66327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
66427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply);
66527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6662272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
66727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
66827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6692272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::initializeDecryptUnit(
67027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle,
67127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int decryptUnitId, const DrmBuffer* headerInfo) {
6723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("initializeDecryptUnit");
67327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
67427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
67527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
67627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
67727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
678c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    writeDecryptHandleToParcelData(decryptHandle, &data);
67927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
68027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptUnitId);
68127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
68227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(headerInfo->length);
68327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.write(headerInfo->data, headerInfo->length);
68427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
68527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply);
6862272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
68727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
68827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
68927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::decrypt(
69027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,
6912272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) {
6923856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("decrypt");
69327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
69427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
69527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
69627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
69727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
698c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    writeDecryptHandleToParcelData(decryptHandle, &data);
69927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
70027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptUnitId);
70127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32((*decBuffer)->length);
70227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
70327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(encBuffer->length);
70427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.write(encBuffer->data, encBuffer->length);
70527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7062272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    if (NULL != IV) {
7072272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        data.writeInt32(IV->length);
7082272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        data.write(IV->data, IV->length);
7092272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    }
7102272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
71127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(DECRYPT, data, &reply);
71227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
71327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const status_t status = reply.readInt32();
7143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Return value of decrypt() is %d", status);
71527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
71627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const int size = reply.readInt32();
71727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    (*decBuffer)->length = size;
71827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    reply.read((void *)(*decBuffer)->data, size);
71927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
72027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return status;
72127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
72227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7232272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::finalizeDecryptUnit(
72427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) {
7253856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("finalizeDecryptUnit");
72627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
72727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
72827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
72927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
73027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
731c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    writeDecryptHandleToParcelData(decryptHandle, &data);
73227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
73327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptUnitId);
73427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
73527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply);
7362272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
73727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
73827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
73927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshissize_t BpDrmManagerService::pread(
74027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, void* buffer,
741a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            ssize_t numBytes, off64_t offset) {
7423856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("read");
74327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
74427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int result;
74527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
74627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
74727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
74827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
749c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    writeDecryptHandleToParcelData(decryptHandle, &data);
75027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
75127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(numBytes);
752a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang    data.writeInt64(offset);
75327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
75427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(PREAD, data, &reply);
75527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    result = reply.readInt32();
75627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 < result) {
75727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply.read(buffer, result);
75827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
75927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return result;
76027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
76127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
76227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiIMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService");
76327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
76427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BnDrmManagerService::onTransact(
76527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            uint32_t code, const Parcel& data,
76627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            Parcel* reply, uint32_t flags) {
7673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering BnDrmManagerService::onTransact with code %d", code);
76827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
76927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    switch (code) {
7702272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    case ADD_UNIQUEID:
7712272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    {
7723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID");
7732272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        CHECK_INTERFACE(IDrmManagerService, data, reply);
7742272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        int uniqueId = addUniqueId(data.readInt32());
7752272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(uniqueId);
7762272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        return DRM_NO_ERROR;
7772272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    }
7782272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
7792272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    case REMOVE_UNIQUEID:
7802272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    {
7813856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID");
7822272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        CHECK_INTERFACE(IDrmManagerService, data, reply);
7832272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        removeUniqueId(data.readInt32());
7842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        return DRM_NO_ERROR;
7852272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    }
7862272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
787e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    case ADD_CLIENT:
78827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
7893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :ADD_CLIENT");
79027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
791e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        addClient(data.readInt32());
79227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
79327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
79427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
795e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    case REMOVE_CLIENT:
79627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
7973856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :REMOVE_CLIENT");
79827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
799e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        removeClient(data.readInt32());
80027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
80127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
80227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
80327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case SET_DRM_SERVICE_LISTENER:
80427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
8053856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER");
80627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
80727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
80827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
80927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const sp<IDrmServiceListener> drmServiceListener
81027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            = interface_cast<IDrmServiceListener> (data.readStrongBinder());
81127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
81227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        status_t status = setDrmServiceListener(uniqueId, drmServiceListener);
81327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
81427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
81527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
81627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
81727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
81827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case INSTALL_DRM_ENGINE:
81927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
8203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :INSTALL_DRM_ENGINE");
82127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
82227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
823197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int uniqueId = data.readInt32();
824197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const String8 engineFile = data.readString8();
825197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        status_t status = installDrmEngine(uniqueId, engineFile);
82627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
82727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
82827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
82927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
83027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
83127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case GET_CONSTRAINTS_FROM_CONTENT:
83227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
8333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT");
83427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
83527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
83627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
83727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 path = data.readString8();
83827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
839197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        DrmConstraints* drmConstraints
840197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang            = getConstraints(uniqueId, &path, data.readInt32());
84127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
84227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmConstraints) {
84327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling DRM Constraints contents
84427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmConstraints->getCount());
84527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
84627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator();
84727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            while (keyIt.hasNext()) {
84827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const String8 key = keyIt.next();
84927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8(key);
85027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const char* value = drmConstraints->getAsByteArray(&key);
85127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                int bufferSize = 0;
85227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (NULL != value) {
85327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    bufferSize = strlen(value);
85427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
85527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(bufferSize + 1);
85627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->write(value, bufferSize + 1);
85727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
85827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
85927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmConstraints; drmConstraints = NULL;
86027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
86127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
86227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
8633473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    case GET_METADATA_FROM_CONTENT:
8643473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    {
8653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :GET_METADATA_FROM_CONTENT");
8663473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        CHECK_INTERFACE(IDrmManagerService, data, reply);
8673473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
8683473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        const int uniqueId = data.readInt32();
8693473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        const String8 path = data.readString8();
8703473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
8713473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        DrmMetadata* drmMetadata = getMetadata(uniqueId, &path);
8723473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        if (NULL != drmMetadata) {
8733473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            //Filling DRM Metadata contents
8743473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            reply->writeInt32(drmMetadata->getCount());
8753473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
8763473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            DrmMetadata::KeyIterator keyIt = drmMetadata->keyIterator();
8773473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            while (keyIt.hasNext()) {
8783473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                const String8 key = keyIt.next();
8793473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                reply->writeString8(key);
8803473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                const char* value = drmMetadata->getAsByteArray(&key);
8813473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                int bufferSize = 0;
8823473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                if (NULL != value) {
8833473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                    bufferSize = strlen(value);
8843473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                    reply->writeInt32(bufferSize + 1);
8853473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                    reply->write(value, bufferSize + 1);
8863473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                } else {
8873473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                    reply->writeInt32(0);
8883473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                }
8893473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            }
8903473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        }
8913473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        delete drmMetadata; drmMetadata = NULL;
8923473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        return NO_ERROR;
8933473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    }
8943473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
89527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CAN_HANDLE:
89627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
8973856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :CAN_HANDLE");
89827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
89927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
90027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
90127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 path = data.readString8();
90227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 mimeType = data.readString8();
90327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
90427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        bool result = canHandle(uniqueId, path, mimeType);
90527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
90627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(result);
90727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
90827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
90927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
91027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case PROCESS_DRM_INFO:
91127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
9123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO");
91327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
91427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
91527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
91627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
91727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM info
91827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int infoType = data.readInt32();
91927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = data.readInt32();
92027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        char* buffer = NULL;
92127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 < bufferSize) {
92227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            buffer = (char *)data.readInplace(bufferSize);
92327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
92427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const DrmBuffer drmBuffer(buffer, bufferSize);
92527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8());
92627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
92727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = data.readInt32();
92827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < size; ++index) {
92927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 key(data.readString8());
93027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 value(data.readString8());
93127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
93227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
93327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
93427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo);
93527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
93627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmInfoStatus) {
93727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling DRM Info Status contents
93827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmInfoStatus->statusCode);
939e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            reply->writeInt32(drmInfoStatus->infoType);
94027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeString8(drmInfoStatus->mimeType);
94127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
94227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (NULL != drmInfoStatus->drmBuffer) {
94327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer;
94427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const int bufferSize = drmBuffer->length;
94527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(bufferSize);
94627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (0 < bufferSize) {
94727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    reply->write(drmBuffer->data, bufferSize);
94827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
94927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete [] drmBuffer->data;
95027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete drmBuffer; drmBuffer = NULL;
95127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
95227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
95327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmInfo; drmInfo = NULL;
95427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmInfoStatus; drmInfoStatus = NULL;
95527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
95627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
95727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
95827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case ACQUIRE_DRM_INFO:
95927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
9603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO");
96127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
96227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
96327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
96427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
96527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM info Request
966197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int infoType = data.readInt32();
967197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const String8 mimeType = data.readString8();
968197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(infoType, mimeType);
96927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
97027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = data.readInt32();
97127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < size; ++index) {
97227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 key(data.readString8());
97327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 value(data.readString8());
97427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value);
97527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
97627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
97727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest);
97827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
97927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmInfo) {
98027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling DRM Info
98127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const DrmBuffer drmBuffer = drmInfo->getData();
98227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmInfo->getInfoType());
98327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
98427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = drmBuffer.length;
98527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(bufferSize);
98627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
98727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->write(drmBuffer.data, bufferSize);
98827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
98927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeString8(drmInfo->getMimeType());
99027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmInfo->getCount());
99127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
99227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
99327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            while (keyIt.hasNext()) {
99427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const String8 key = keyIt.next();
99527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8(key);
99627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const String8 value = drmInfo->get(key);
99727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8((value == String8("")) ? String8("NULL") : value);
99827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
99927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            delete [] drmBuffer.data;
100027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
100127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmInfoRequest; drmInfoRequest = NULL;
100227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmInfo; drmInfo = NULL;
100327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
100427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
100527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
100627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case SAVE_RIGHTS:
100727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
10083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS");
100927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
101027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
101127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
101227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
101327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Rights
101427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = data.readInt32();
101527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize);
101627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
101727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 mimeType(data.readString8());
101827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 accountId(data.readString8());
101927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 subscriptionId(data.readString8());
102027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 rightsPath(data.readString8());
102127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 contentPath(data.readString8());
102227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
102327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmRights drmRights(drmBuffer,
102427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((mimeType == String8("NULL")) ? String8("") : mimeType),
102527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((accountId == String8("NULL")) ? String8("") : accountId),
102627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId));
102727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10282272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status = saveRights(uniqueId, drmRights,
102927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((rightsPath == String8("NULL")) ? String8("") : rightsPath),
103027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((contentPath == String8("NULL")) ? String8("") : contentPath));
103127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10322272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
103327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
103427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
103527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
103627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case GET_ORIGINAL_MIMETYPE:
103727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
10383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE");
103927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
104027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1041197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int uniqueId = data.readInt32();
1042197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const String8 path = data.readString8();
1043197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const String8 originalMimeType = getOriginalMimeType(uniqueId, path);
104427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
104527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeString8(originalMimeType);
104627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
104727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
104827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
104927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case GET_DRM_OBJECT_TYPE:
105027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
10513856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE");
105227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
105327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1054197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int uniqueId = data.readInt32();
1055197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const String8 path = data.readString8();
1056197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const String8 mimeType = data.readString8();
1057197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int drmObjectType = getDrmObjectType(uniqueId, path, mimeType);
105827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
105927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(drmObjectType);
106027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
106127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
106227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
106327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CHECK_RIGHTS_STATUS:
106427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
10653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS");
106627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
106727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1068197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int uniqueId = data.readInt32();
1069197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const String8 path = data.readString8();
1070197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int action = data.readInt32();
1071197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int result = checkRightsStatus(uniqueId, path, action);
107227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
107327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(result);
107427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
107527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
107627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
107727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CONSUME_RIGHTS:
107827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
10793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS");
108027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
108127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
108227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
108327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
108427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
10851da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(&handle, data);
108627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1087197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int action = data.readInt32();
1088197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const bool reserve = static_cast<bool>(data.readInt32());
10892272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status
1090197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang            = consumeRights(uniqueId, &handle, action, reserve);
10912272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
109227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10931da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        clearDecryptHandle(&handle);
109427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
109527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
109627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
109727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case SET_PLAYBACK_STATUS:
109827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
10993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS");
110027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
110127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
110227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
110327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
110427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
11051da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(&handle, data);
110627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1107197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int playbackStatus = data.readInt32();
1108197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int64_t position = data.readInt64();
11092272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status
1110197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang            = setPlaybackStatus(uniqueId, &handle, playbackStatus, position);
11112272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
111227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
11131da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        clearDecryptHandle(&handle);
111427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
111527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
111627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
111727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case VALIDATE_ACTION:
111827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
11193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION");
112027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
112127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1122197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int uniqueId = data.readInt32();
1123197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const String8 path = data.readString8();
1124197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int action = data.readInt32();
1125197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int outputType = data.readInt32();
1126197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int configuration = data.readInt32();
1127197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        bool result = validateAction(uniqueId, path, action,
1128197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang                ActionDescription(outputType, configuration));
112927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
113027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(result);
113127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
113227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
113327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
113427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case REMOVE_RIGHTS:
113527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
11363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS");
113727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
113827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1139197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        int uniqueId = data.readInt32();
1140197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        String8 path = data.readString8();
1141197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const status_t status = removeRights(uniqueId, path);
11422272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
114327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
114427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
114527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
114627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
114727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case REMOVE_ALL_RIGHTS:
114827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
11493856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS");
115027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
115127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
11522272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status = removeAllRights(data.readInt32());
11532272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
115427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
115527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
115627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
115727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
115827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case OPEN_CONVERT_SESSION:
115927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
11603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION");
116127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
116227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1163197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int uniqueId = data.readInt32();
1164197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const String8 mimeType = data.readString8();
1165197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int convertId = openConvertSession(uniqueId, mimeType);
116627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
116727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(convertId);
116827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
116927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
117027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
117127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CONVERT_DATA:
117227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
11733856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :CONVERT_DATA");
117427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
117527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
117627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
117727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int convertId = data.readInt32();
117827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
117927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling input data
118027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = data.readInt32();
118127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
118227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
118327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmConvertedStatus*    drmConvertedStatus = convertData(uniqueId, convertId, inputData);
118427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
118527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmConvertedStatus) {
118627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling Drm Converted Ststus
118727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmConvertedStatus->statusCode);
1188a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            reply->writeInt64(drmConvertedStatus->offset);
118927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
119027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (NULL != drmConvertedStatus->convertedData) {
119127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
119227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const int bufferSize = convertedData->length;
119327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(bufferSize);
119427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (0 < bufferSize) {
119527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    reply->write(convertedData->data, bufferSize);
119627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
119727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete [] convertedData->data;
119827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete convertedData; convertedData = NULL;
119927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
120027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
120127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete inputData; inputData = NULL;
120227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmConvertedStatus; drmConvertedStatus = NULL;
120327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
120427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
120527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
120627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CLOSE_CONVERT_SESSION:
120727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
12083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION");
120927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
121027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1211197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int uniqueId = data.readInt32();
1212197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int convertId = data.readInt32();
1213197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        DrmConvertedStatus* drmConvertedStatus
1214197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang            = closeConvertSession(uniqueId, convertId);
121527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
121627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmConvertedStatus) {
121727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling Drm Converted Ststus
121827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmConvertedStatus->statusCode);
1219a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            reply->writeInt64(drmConvertedStatus->offset);
122027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
122127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (NULL != drmConvertedStatus->convertedData) {
122227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
122327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const int bufferSize = convertedData->length;
122427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(bufferSize);
122527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (0 < bufferSize) {
122627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    reply->write(convertedData->data, bufferSize);
122727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
122827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete [] convertedData->data;
122927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete convertedData; convertedData = NULL;
123027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
123127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
123227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmConvertedStatus; drmConvertedStatus = NULL;
123327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
123427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
123527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
123627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case GET_ALL_SUPPORT_INFO:
123727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
12383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO");
123927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
124027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
124127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
124227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        int length = 0;
124327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmSupportInfo* drmSupportInfoArray = NULL;
124427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
124527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray);
124627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
124727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(length);
124827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int i = 0; i < length; ++i) {
124927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i];
125027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
125127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmSupportInfo.getFileSuffixCount());
125227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo::FileSuffixIterator fileSuffixIt
125327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                = drmSupportInfo.getFileSuffixIterator();
125427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            while (fileSuffixIt.hasNext()) {
125527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8(fileSuffixIt.next());
125627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
125727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
125827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmSupportInfo.getMimeTypeCount());
125927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator();
126027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            while (mimeTypeIt.hasNext()) {
126127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8(mimeTypeIt.next());
126227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
126327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeString8(drmSupportInfo.getDescription());
126427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
126527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete [] drmSupportInfoArray; drmSupportInfoArray = NULL;
126627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
126727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
126827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
126927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
127027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case OPEN_DECRYPT_SESSION:
127127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
12723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION");
127327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
127427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
127527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
127627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int fd = data.readFileDescriptor();
127727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1278197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const off64_t offset = data.readInt64();
1279197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const off64_t length = data.readInt64();
12809d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        const String8 mime = data.readString8();
12819d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong
128227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle* handle
12839d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong            = openDecryptSession(uniqueId, fd, offset, length, mime.string());
128427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
128527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != handle) {
1286c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang            writeDecryptHandleToParcelData(handle, reply);
12871da9aa606096e14985924e8433a087d04f68ea22Gloria Wang            clearDecryptHandle(handle);
12881da9aa606096e14985924e8433a087d04f68ea22Gloria Wang            delete handle; handle = NULL;
128927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
129027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
1291e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    }
1292e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
1293e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    case OPEN_DECRYPT_SESSION_FROM_URI:
1294e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    {
12953856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI");
1296e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        CHECK_INTERFACE(IDrmManagerService, data, reply);
1297e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
1298e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        const int uniqueId = data.readInt32();
1299e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        const String8 uri = data.readString8();
13009d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        const String8 mime = data.readString8();
1301e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
13029d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        DecryptHandle* handle = openDecryptSession(uniqueId, uri.string(), mime.string());
1303e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
1304e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        if (NULL != handle) {
1305c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang            writeDecryptHandleToParcelData(handle, reply);
13061da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
13071da9aa606096e14985924e8433a087d04f68ea22Gloria Wang            clearDecryptHandle(handle);
13081da9aa606096e14985924e8433a087d04f68ea22Gloria Wang            delete handle; handle = NULL;
1309e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        } else {
13103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("NULL decryptHandle is returned");
1311e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        }
1312e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        return DRM_NO_ERROR;
131327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
131427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
131527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CLOSE_DECRYPT_SESSION:
131627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
13173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION");
131827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
131927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
132027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
132127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
132227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle* handle = new DecryptHandle();
13231da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(handle, data);
132427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13252272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status = closeDecryptSession(uniqueId, handle);
13262272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
132727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
132827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
132927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
133027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case INITIALIZE_DECRYPT_UNIT:
133127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
13323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT");
133327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
133427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
133527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
133627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
133727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
13381da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(&handle, data);
13391da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
134027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int decryptUnitId = data.readInt32();
134127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
134227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling Header info
134327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = data.readInt32();
134427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* headerInfo = NULL;
134527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
134627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13472272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status
13482272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo);
13492272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
135027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13511da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        clearDecryptHandle(&handle);
135227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete headerInfo; headerInfo = NULL;
135327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
135427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
135527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
135627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case DECRYPT:
135727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
13583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :DECRYPT");
135927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
136027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
136127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
136227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
136327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
13641da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(&handle, data);
13651da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
136627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int decryptUnitId = data.readInt32();
136727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int decBufferSize = data.readInt32();
136827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
136927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int encBufferSize = data.readInt32();
137027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* encBuffer
137127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize);
137227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
137327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        char* buffer = NULL;
137427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        buffer = new char[decBufferSize];
137527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize);
137627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13772272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        DrmBuffer* IV = NULL;
13782272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        if (0 != data.dataAvail()) {
13792272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            const int ivBufferlength = data.readInt32();
13802272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength);
13812272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        }
13822272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
13832272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status
13842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            = decrypt(uniqueId, &handle, decryptUnitId, encBuffer, &decBuffer, IV);
138527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
138627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
138727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
138827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = decBuffer->length;
138927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(size);
139027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->write(decBuffer->data, size);
139127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13921da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        clearDecryptHandle(&handle);
139327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete encBuffer; encBuffer = NULL;
139427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete decBuffer; decBuffer = NULL;
139527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete [] buffer; buffer = NULL;
13962272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        delete IV; IV = NULL;
139727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
139827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
139927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
140027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case FINALIZE_DECRYPT_UNIT:
140127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
14023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT");
140327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
140427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
140527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
140627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
140727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
14081da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(&handle, data);
140927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14102272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32());
14112272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
141227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14131da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        clearDecryptHandle(&handle);
141427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
141527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
141627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
141727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case PREAD:
141827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
14193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :READ");
142027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
142127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
142227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
142327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
142427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
14251da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(&handle, data);
142627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
142727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int numBytes = data.readInt32();
142827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        char* buffer = new char[numBytes];
142927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1430a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang        const off64_t offset = data.readInt64();
143127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
143227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        ssize_t result = pread(uniqueId, &handle, buffer, numBytes, offset);
143327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(result);
143427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 < result) {
143527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->write(buffer, result);
143627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
143727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14381da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        clearDecryptHandle(&handle);
143927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete [] buffer, buffer = NULL;
144027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
144127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
144227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
144327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    default:
144427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return BBinder::onTransact(code, data, reply, flags);
144527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
144627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
144727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1448