IDrmManagerService.cpp revision b408fa26c782c57272f11b46a235cca8c9ccb9be
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
37b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker#define MAX_BINDER_TRANSACTION_SIZE ((1*1024*1024)-(4096*2))
3827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiusing namespace android;
4027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
41c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wangstatic void writeDecryptHandleToParcelData(
421da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        const DecryptHandle* handle, Parcel* data) {
431da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    data->writeInt32(handle->decryptId);
441da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    data->writeString8(handle->mimeType);
451da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    data->writeInt32(handle->decryptApiType);
461da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    data->writeInt32(handle->status);
471da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
481da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    int size = handle->copyControlVector.size();
491da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    data->writeInt32(size);
50c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    for (int i = 0; i < size; i++) {
511da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        data->writeInt32(handle->copyControlVector.keyAt(i));
521da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        data->writeInt32(handle->copyControlVector.valueAt(i));
531da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
541da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
556b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang    size = handle->extendedData.size();
566b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang    data->writeInt32(size);
57c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    for (int i = 0; i < size; i++) {
586b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang        data->writeString8(handle->extendedData.keyAt(i));
596b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang        data->writeString8(handle->extendedData.valueAt(i));
606b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang    }
616b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang
621da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    if (NULL != handle->decryptInfo) {
631da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        data->writeInt32(handle->decryptInfo->decryptBufferLength);
641da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    } else {
651da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        data->writeInt32(INVALID_BUFFER_LENGTH);
661da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
671da9aa606096e14985924e8433a087d04f68ea22Gloria Wang}
681da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
691da9aa606096e14985924e8433a087d04f68ea22Gloria Wangstatic void readDecryptHandleFromParcelData(
701da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        DecryptHandle* handle, const Parcel& data) {
711da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    if (0 == data.dataAvail()) {
721da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        return;
731da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
741da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
751da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    handle->decryptId = data.readInt32();
761da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    handle->mimeType = data.readString8();
771da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    handle->decryptApiType = data.readInt32();
781da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    handle->status = data.readInt32();
791da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
801da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    int size = data.readInt32();
81c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    for (int i = 0; i < size; i++) {
826b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang        DrmCopyControl key = (DrmCopyControl)data.readInt32();
836b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang        int value = data.readInt32();
846b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang        handle->copyControlVector.add(key, value);
856b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang    }
866b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang
876b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang    size = data.readInt32();
88c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    for (int i = 0; i < size; i++) {
896b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang        String8 key = data.readString8();
906b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang        String8 value = data.readString8();
916b2a35bbec228ce012065260ba153ee894f17a4eGloria Wang        handle->extendedData.add(key, value);
921da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
931da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
941da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    handle->decryptInfo = NULL;
951da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    const int bufferLen = data.readInt32();
961da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    if (INVALID_BUFFER_LENGTH != bufferLen) {
971da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        handle->decryptInfo = new DecryptInfo();
981da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        handle->decryptInfo->decryptBufferLength = bufferLen;
991da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
1001da9aa606096e14985924e8433a087d04f68ea22Gloria Wang}
1011da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
1021da9aa606096e14985924e8433a087d04f68ea22Gloria Wangstatic void clearDecryptHandle(DecryptHandle* handle) {
1031da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    if (handle == NULL) {
1041da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        return;
1051da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
1061da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    if (handle->decryptInfo) {
1071da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        delete handle->decryptInfo;
1081da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        handle->decryptInfo = NULL;
1091da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
1101da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    handle->copyControlVector.clear();
111ab00df4d8585b181e9058eb1b9c7996aa3bbaeabGloria Wang    handle->extendedData.clear();
1121da9aa606096e14985924e8433a087d04f68ea22Gloria Wang}
1131da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
1148f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wangint BpDrmManagerService::addUniqueId(bool isNative) {
1153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("add uniqueid");
1162272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    Parcel data, reply;
1172272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
1188f00151cbe693d52f3e233757c57fab3b6396d21Gloria Wang    data.writeInt32(isNative);
1192272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    remote()->transact(ADD_UNIQUEID, data, &reply);
1202272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
1212272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi}
1222272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
1232272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimivoid BpDrmManagerService::removeUniqueId(int uniqueId) {
1243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("remove uniqueid");
1252272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    Parcel data, reply;
1262272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
1272272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    data.writeInt32(uniqueId);
1282272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    remote()->transact(REMOVE_UNIQUEID, data, &reply);
1292272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi}
1302272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
131e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid BpDrmManagerService::addClient(int uniqueId) {
13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
13427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
135e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    remote()->transact(ADD_CLIENT, data, &reply);
13627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
13727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
138e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid BpDrmManagerService::removeClient(int uniqueId) {
13927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
14027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
14127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
142e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    remote()->transact(REMOVE_CLIENT, data, &reply);
14327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::setDrmServiceListener(
14627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) {
1473856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setDrmServiceListener");
14827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
14927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
15027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
15127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
15206b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen    data.writeStrongBinder(IInterface::asBinder(drmServiceListener));
15327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(SET_DRM_SERVICE_LISTENER, data, &reply);
15427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
15527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
15727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConstraints* BpDrmManagerService::getConstraints(
15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const String8* path, const int action) {
1593856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Get Constraints");
16027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
16127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
16427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(*path);
16527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(action);
16627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(GET_CONSTRAINTS_FROM_CONTENT, data, &reply);
16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConstraints* drmConstraints = NULL;
17027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
17127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling Drm Constraints
17227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmConstraints = new DrmConstraints();
17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
17427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = reply.readInt32();
17527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < size; ++index) {
17627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 key(reply.readString8());
17727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = reply.readInt32();
17827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            char* data = NULL;
17927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
18027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                data = new char[bufferSize];
18127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply.read(data, bufferSize);
1820bf43848adb00922122b0a0eed2fa0318bde8317Hung Nguyen                drmConstraints->put(&key, data);
1830bf43848adb00922122b0a0eed2fa0318bde8317Hung Nguyen                delete[] data;
18427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
18527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
18627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
18727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmConstraints;
18827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
18927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1903473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi AimiDrmMetadata* BpDrmManagerService::getMetadata(int uniqueId, const String8* path) {
1913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Get Metadata");
1923473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    Parcel data, reply;
1933473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
1943473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    data.writeInt32(uniqueId);
1953473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
1963473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    DrmMetadata* drmMetadata = NULL;
1973473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    data.writeString8(*path);
1983473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    remote()->transact(GET_METADATA_FROM_CONTENT, data, &reply);
1993473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
2003473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    if (0 != reply.dataAvail()) {
2013473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        //Filling Drm Metadata
2023473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        drmMetadata = new DrmMetadata();
2033473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
2043473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        const int size = reply.readInt32();
2053473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        for (int index = 0; index < size; ++index) {
2063473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            const String8 key(reply.readString8());
2073473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            const int bufferSize = reply.readInt32();
2083473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            char* data = NULL;
2093473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            if (0 < bufferSize) {
2103473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                data = new char[bufferSize];
2113473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                reply.read(data, bufferSize);
2120bf43848adb00922122b0a0eed2fa0318bde8317Hung Nguyen                drmMetadata->put(&key, data);
2130bf43848adb00922122b0a0eed2fa0318bde8317Hung Nguyen                delete[] data;
2143473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            }
2153473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        }
2163473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    }
2173473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    return drmMetadata;
2183473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi}
2193473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
22027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool BpDrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) {
2213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Can Handle");
22227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
22327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
22427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
22527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
22627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
22727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
22827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(mimeType);
22927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
23027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CAN_HANDLE, data, &reply);
23127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
23227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return static_cast<bool>(reply.readInt32());
23327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
23427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
23527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) {
2363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Process DRM Info");
23727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
23827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
23927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
24027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
24127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
24227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    //Filling DRM info
24327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(drmInfo->getInfoType());
24427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const DrmBuffer dataBuffer = drmInfo->getData();
24527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const int dataBufferSize = dataBuffer.length;
24627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(dataBufferSize);
24727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 < dataBufferSize) {
24827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.write(dataBuffer.data, dataBufferSize);
24927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
25027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(drmInfo->getMimeType());
25127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
25227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(drmInfo->getCount());
25327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
25427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
25527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    while (keyIt.hasNext()) {
25627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 key = keyIt.next();
25727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeString8(key);
25827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 value = drmInfo->get(key);
25927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeString8((value == String8("")) ? String8("NULL") : value);
26027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
26127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
26227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(PROCESS_DRM_INFO, data, &reply);
26327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
26427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfoStatus* drmInfoStatus = NULL;
26527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
26627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Info Status
26727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int statusCode = reply.readInt32();
268e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        const int infoType = reply.readInt32();
26927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 mimeType = reply.readString8();
27027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
27127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* drmBuffer = NULL;
27227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 != reply.dataAvail()) {
27327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = reply.readInt32();
27427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            char* data = NULL;
27527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
27627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                data = new char[bufferSize];
27727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply.read(data, bufferSize);
27827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
27927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmBuffer = new DrmBuffer(data, bufferSize);
28027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
281e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        drmInfoStatus = new DrmInfoStatus(statusCode, infoType, drmBuffer, mimeType);
28227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
28327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmInfoStatus;
28427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
28527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
28627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfo* BpDrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) {
2873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Acquire DRM Info");
28827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
28927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
29027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
29127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
29227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
29327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    //Filling DRM Info Request
29427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(drmInforequest->getInfoType());
29527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(drmInforequest->getMimeType());
29627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
29727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(drmInforequest->getCount());
29827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfoRequest::KeyIterator keyIt = drmInforequest->keyIterator();
29927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
30027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    while (keyIt.hasNext()) {
30127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 key = keyIt.next();
30227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeString8(key);
30327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 value = drmInforequest->get(key);
3040abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan        if (key == String8("FileDescriptorKey")) {
3050abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan            int fd = -1;
3060abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan            sscanf(value.string(), "FileDescriptor[%d]", &fd);
3070abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan            data.writeFileDescriptor(fd);
3080abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan        } else {
3090abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan            data.writeString8((value == String8("")) ? String8("NULL") : value);
3100abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan        }
31127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
31227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
31327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(ACQUIRE_DRM_INFO, data, &reply);
31427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
31527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfo* drmInfo = NULL;
31627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
31727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Info
31827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int infoType = reply.readInt32();
31927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = reply.readInt32();
32027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        char* data = NULL;
32127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
32227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 < bufferSize) {
32327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            data = new char[bufferSize];
32427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply.read(data, bufferSize);
32527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
32627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmInfo = new DrmInfo(infoType, DrmBuffer(data, bufferSize), reply.readString8());
32727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
32827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = reply.readInt32();
32927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < size; ++index) {
33027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 key(reply.readString8());
33127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 value(reply.readString8());
33227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
33327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
33427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
33527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmInfo;
33627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
33727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3382272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::saveRights(
33927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const DrmRights& drmRights,
34027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8& rightsPath, const String8& contentPath) {
3413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Save Rights");
34227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
34327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
34427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
34527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
34627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
34727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    //Filling Drm Rights
34827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const DrmBuffer dataBuffer = drmRights.getData();
34927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(dataBuffer.length);
35027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.write(dataBuffer.data, dataBuffer.length);
35127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
35227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 mimeType = drmRights.getMimeType();
35327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((mimeType == String8("")) ? String8("NULL") : mimeType);
35427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
35527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 accountId = drmRights.getAccountId();
35627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((accountId == String8("")) ? String8("NULL") : accountId);
35727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
35827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 subscriptionId = drmRights.getSubscriptionId();
35927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((subscriptionId == String8("")) ? String8("NULL") : subscriptionId);
36027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
36127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((rightsPath == String8("")) ? String8("NULL") : rightsPath);
36227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((contentPath == String8("")) ? String8("NULL") : contentPath);
36327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
36427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(SAVE_RIGHTS, data, &reply);
3652272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
36627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
36727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
368bf5b3b29e31b293313788d7464cfb258ac0da803James DongString8 BpDrmManagerService::getOriginalMimeType(int uniqueId, const String8& path, int fd) {
3693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Get Original MimeType");
37027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
37127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
37227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
37327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
37427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
375bf5b3b29e31b293313788d7464cfb258ac0da803James Dong    int32_t isFdValid = (fd >= 0);
376bf5b3b29e31b293313788d7464cfb258ac0da803James Dong    data.writeInt32(isFdValid);
377bf5b3b29e31b293313788d7464cfb258ac0da803James Dong    if (isFdValid) {
378bf5b3b29e31b293313788d7464cfb258ac0da803James Dong        data.writeFileDescriptor(fd);
379bf5b3b29e31b293313788d7464cfb258ac0da803James Dong    }
38027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
38127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(GET_ORIGINAL_MIMETYPE, data, &reply);
38227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readString8();
38327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
38427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
38527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::getDrmObjectType(
38627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const String8& path, const String8& mimeType) {
3873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Get Drm object type");
38827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
38927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
39027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
39127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
39227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
39327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(mimeType);
39427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
39527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(GET_DRM_OBJECT_TYPE, data, &reply);
39627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
39727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
39827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
39927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
40027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::checkRightsStatus(int uniqueId, const String8& path, int action) {
4013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("checkRightsStatus");
40227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
40327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
40427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
40527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
40627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
40727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(action);
40827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
40927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CHECK_RIGHTS_STATUS, data, &reply);
41027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
41127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
41227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
41327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4142272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::consumeRights(
41527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) {
4163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("consumeRights");
4172272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    Parcel data, reply;
41827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
41927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
42027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
42127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
422c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    writeDecryptHandleToParcelData(decryptHandle, &data);
42327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
42427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(action);
42527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(static_cast< int>(reserve));
42627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
42727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CONSUME_RIGHTS, data, &reply);
4282272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
42927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
43027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4312272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::setPlaybackStatus(
432a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) {
4333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setPlaybackStatus");
43427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
43527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
43627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
43727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
43827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
439c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    writeDecryptHandleToParcelData(decryptHandle, &data);
44027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
44127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(playbackStatus);
4422ed8a921ef55aa2f3dd4b7ac33b7ded6ec33d92dGloria Wang    data.writeInt64(position);
44327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
44427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(SET_PLAYBACK_STATUS, data, &reply);
4452272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
44627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
44727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
44827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool BpDrmManagerService::validateAction(
44927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const String8& path,
45027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int action, const ActionDescription& description) {
4513856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("validateAction");
45227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
45327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
45427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
45527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
45627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
45727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(action);
45827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(description.outputType);
45927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(description.configuration);
46027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
46127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(VALIDATE_ACTION, data, &reply);
46227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
46327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return static_cast<bool>(reply.readInt32());
46427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
46527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4662272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::removeRights(int uniqueId, const String8& path) {
4673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("removeRights");
46827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
46927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
47027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
47127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
47227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
47327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
47427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(REMOVE_RIGHTS, data, &reply);
4752272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
47627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
47727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4782272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::removeAllRights(int uniqueId) {
4793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("removeAllRights");
48027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
48127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
48227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
48327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
48427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
48527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(REMOVE_ALL_RIGHTS, data, &reply);
4862272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
48727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
48827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
48927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) {
4903856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("openConvertSession");
49127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
49227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
49327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
49427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
49527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(mimeType);
49627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
49727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(OPEN_CONVERT_SESSION, data, &reply);
49827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
49927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
50027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
50127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* BpDrmManagerService::convertData(
50227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, int convertId, const DrmBuffer* inputData) {
5033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("convertData");
50427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
50527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
50627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
50727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
50827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(convertId);
50927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(inputData->length);
51027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.write(inputData->data, inputData->length);
51127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
51227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CONVERT_DATA, data, &reply);
51327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
51427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConvertedStatus* drmConvertedStatus = NULL;
51527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
51627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
51727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Converted Status
51827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int statusCode = reply.readInt32();
519a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang        const off64_t offset = reply.readInt64();
52027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
52127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* convertedData = NULL;
52227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 != reply.dataAvail()) {
52327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = reply.readInt32();
52427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            char* data = NULL;
52527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
52627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                data = new char[bufferSize];
52727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply.read(data, bufferSize);
52827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
52927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            convertedData = new DrmBuffer(data, bufferSize);
53027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
53127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
53227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
53327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmConvertedStatus;
53427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
53527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
53627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* BpDrmManagerService::closeConvertSession(int uniqueId, int convertId) {
5373856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("closeConvertSession");
53827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
53927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
54027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
54127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
54227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(convertId);
54327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
54427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CLOSE_CONVERT_SESSION, data, &reply);
54527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
54627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConvertedStatus* drmConvertedStatus = NULL;
54727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
54827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
54927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Converted Status
55027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int statusCode = reply.readInt32();
551a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang        const off64_t offset = reply.readInt64();
55227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
55327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* convertedData = NULL;
55427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 != reply.dataAvail()) {
55527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = reply.readInt32();
55627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            char* data = NULL;
55727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
55827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                data = new char[bufferSize];
55927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply.read(data, bufferSize);
56027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
56127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            convertedData = new DrmBuffer(data, bufferSize);
56227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
56327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
56427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
56527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmConvertedStatus;
56627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
56727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
56827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::getAllSupportInfo(
56927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) {
5703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Get All Support Info");
57127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
57227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
57327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
57427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
57527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
57627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(GET_ALL_SUPPORT_INFO, data, &reply);
57727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
57827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    //Filling DRM Support Info
57927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const int arraySize = reply.readInt32();
58027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 < arraySize) {
58127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        *drmSupportInfoArray = new DrmSupportInfo[arraySize];
58227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
58327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < arraySize; ++index) {
58427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo drmSupportInfo;
58527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
58627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int fileSuffixVectorSize = reply.readInt32();
58727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            for (int i = 0; i < fileSuffixVectorSize; ++i) {
58827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                drmSupportInfo.addFileSuffix(reply.readString8());
58927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
59027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
59127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int mimeTypeVectorSize = reply.readInt32();
59227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            for (int i = 0; i < mimeTypeVectorSize; ++i) {
59327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                drmSupportInfo.addMimeType(reply.readString8());
59427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
59527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
59627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmSupportInfo.setDescription(reply.readString8());
59727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            (*drmSupportInfoArray)[index] = drmSupportInfo;
59827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
59927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
60027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    *length = arraySize;
60127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
60227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
60327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
60427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDecryptHandle* BpDrmManagerService::openDecryptSession(
6059d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong            int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) {
6063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering BpDrmManagerService::openDecryptSession");
60727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
60827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
609e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
61027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
61127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeFileDescriptor(fd);
612a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang    data.writeInt64(offset);
613a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang    data.writeInt64(length);
6149d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    String8 mimeType;
6159d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    if (mime) {
6169d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        mimeType = mime;
6179d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    }
6189d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    data.writeString8(mimeType);
61927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
62027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(OPEN_DECRYPT_SESSION, data, &reply);
62127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
62227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DecryptHandle* handle = NULL;
62327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
62427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle = new DecryptHandle();
6251da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(handle, reply);
62627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
62727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return handle;
62827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
62927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6309d2f386dd2885eaffa11fd494ae258bb09fe6397James DongDecryptHandle* BpDrmManagerService::openDecryptSession(
6319d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        int uniqueId, const char* uri, const char* mime) {
6329d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong
6339d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    ALOGV("Entering BpDrmManagerService::openDecryptSession: mime=%s", mime? mime: "NULL");
634e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    Parcel data, reply;
635e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
636e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
637e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    data.writeInt32(uniqueId);
638e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    data.writeString8(String8(uri));
6399d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    String8 mimeType;
6409d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    if (mime) {
6419d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        mimeType = mime;
6429d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    }
6439d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    data.writeString8(mimeType);
644e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
645e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    remote()->transact(OPEN_DECRYPT_SESSION_FROM_URI, data, &reply);
646e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
647e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    DecryptHandle* handle = NULL;
648e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    if (0 != reply.dataAvail()) {
649e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        handle = new DecryptHandle();
6501da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(handle, reply);
651e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    } else {
6523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("no decryptHandle is generated in service side");
653e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    }
654e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    return handle;
655e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi}
656e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
657cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei TakahashiDecryptHandle* BpDrmManagerService::openDecryptSession(
658cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi            int uniqueId, const DrmBuffer& buf, const String8& mimeType) {
659cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    ALOGV("Entering BpDrmManagerService::openDecryptSession");
660cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    Parcel data, reply;
661cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi
662cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
663cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    data.writeInt32(uniqueId);
664cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    if (buf.data != NULL && buf.length > 0) {
665cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi        data.writeInt32(buf.length);
666cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi        data.write(buf.data, buf.length);
667cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    } else {
668cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi        data.writeInt32(0);
669cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    }
670cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    data.writeString8(mimeType);
671cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi
672cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    remote()->transact(OPEN_DECRYPT_SESSION_FOR_STREAMING, data, &reply);
673cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi
674cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    DecryptHandle* handle = NULL;
675cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    if (0 != reply.dataAvail()) {
676cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi        handle = new DecryptHandle();
677cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi        readDecryptHandleFromParcelData(handle, reply);
678cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    } else {
679cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi        ALOGV("no decryptHandle is generated in service side");
680cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    }
681cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    return handle;
682cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi}
683cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi
6842272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) {
6853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("closeDecryptSession");
68627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
68727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
68827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
68927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
69027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
691c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    writeDecryptHandleToParcelData(decryptHandle, &data);
69227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
69327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply);
69427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6952272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
69627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
69727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6982272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::initializeDecryptUnit(
69927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle,
70027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int decryptUnitId, const DrmBuffer* headerInfo) {
7013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("initializeDecryptUnit");
70227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
70327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
70427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
70527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
70627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
707c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    writeDecryptHandleToParcelData(decryptHandle, &data);
70827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
70927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptUnitId);
71027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
71127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(headerInfo->length);
71227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.write(headerInfo->data, headerInfo->length);
71327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
71427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply);
7152272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
71627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
71727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
71827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::decrypt(
71927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,
7202272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) {
7213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("decrypt");
72227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
72327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
72427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
72527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
72627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
727c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    writeDecryptHandleToParcelData(decryptHandle, &data);
72827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
72927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptUnitId);
73027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32((*decBuffer)->length);
73127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
73227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(encBuffer->length);
73327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.write(encBuffer->data, encBuffer->length);
73427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7352272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    if (NULL != IV) {
7362272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        data.writeInt32(IV->length);
7372272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        data.write(IV->data, IV->length);
7382272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    }
7392272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
74027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(DECRYPT, data, &reply);
74127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
74227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const status_t status = reply.readInt32();
7433856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Return value of decrypt() is %d", status);
74427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
74527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const int size = reply.readInt32();
74627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    (*decBuffer)->length = size;
74727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    reply.read((void *)(*decBuffer)->data, size);
74827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
74927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return status;
75027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
75127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7522272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::finalizeDecryptUnit(
75327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) {
7543856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("finalizeDecryptUnit");
75527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
75627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
75727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
75827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
75927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
760c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    writeDecryptHandleToParcelData(decryptHandle, &data);
76127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
76227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptUnitId);
76327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
76427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply);
7652272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
76627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
76727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
76827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshissize_t BpDrmManagerService::pread(
76927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, void* buffer,
770a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            ssize_t numBytes, off64_t offset) {
7713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("read");
77227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
77327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int result;
77427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
77527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
77627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
77727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
778c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang    writeDecryptHandleToParcelData(decryptHandle, &data);
77927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
78027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(numBytes);
781a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang    data.writeInt64(offset);
78227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
78327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(PREAD, data, &reply);
78427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    result = reply.readInt32();
78527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 < result) {
78627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply.read(buffer, result);
78727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
78827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return result;
78927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
79027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
79127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiIMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService");
79227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
79327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BnDrmManagerService::onTransact(
79427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            uint32_t code, const Parcel& data,
79527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            Parcel* reply, uint32_t flags) {
7963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Entering BnDrmManagerService::onTransact with code %d", code);
79727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
79827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    switch (code) {
7992272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    case ADD_UNIQUEID:
8002272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    {
8013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID");
8022272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        CHECK_INTERFACE(IDrmManagerService, data, reply);
8032272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        int uniqueId = addUniqueId(data.readInt32());
8042272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(uniqueId);
8052272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        return DRM_NO_ERROR;
8062272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    }
8072272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
8082272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    case REMOVE_UNIQUEID:
8092272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    {
8103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID");
8112272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        CHECK_INTERFACE(IDrmManagerService, data, reply);
8122272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        removeUniqueId(data.readInt32());
8132272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        return DRM_NO_ERROR;
8142272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    }
8152272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
816e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    case ADD_CLIENT:
81727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
8183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :ADD_CLIENT");
81927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
820e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        addClient(data.readInt32());
82127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
82227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
82327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
824e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    case REMOVE_CLIENT:
82527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
8263856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :REMOVE_CLIENT");
82727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
828e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        removeClient(data.readInt32());
82927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
83027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
83127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
83227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case SET_DRM_SERVICE_LISTENER:
83327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
8343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER");
83527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
83627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
83727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
83827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const sp<IDrmServiceListener> drmServiceListener
83927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            = interface_cast<IDrmServiceListener> (data.readStrongBinder());
84027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
84127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        status_t status = setDrmServiceListener(uniqueId, drmServiceListener);
84227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
84327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
84427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
84527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
84627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
84727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case GET_CONSTRAINTS_FROM_CONTENT:
84827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
8493856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT");
85027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
85127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
85227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
85327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 path = data.readString8();
85427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
855197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        DrmConstraints* drmConstraints
856197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang            = getConstraints(uniqueId, &path, data.readInt32());
85727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
85827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmConstraints) {
85927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling DRM Constraints contents
86027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmConstraints->getCount());
86127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
86227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator();
86327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            while (keyIt.hasNext()) {
86427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const String8 key = keyIt.next();
86527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8(key);
86627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const char* value = drmConstraints->getAsByteArray(&key);
86727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                int bufferSize = 0;
86827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (NULL != value) {
86927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    bufferSize = strlen(value);
8700bf43848adb00922122b0a0eed2fa0318bde8317Hung Nguyen                    reply->writeInt32(bufferSize + 1);
8710bf43848adb00922122b0a0eed2fa0318bde8317Hung Nguyen                    reply->write(value, bufferSize + 1);
8720bf43848adb00922122b0a0eed2fa0318bde8317Hung Nguyen                } else {
8730bf43848adb00922122b0a0eed2fa0318bde8317Hung Nguyen                    reply->writeInt32(0);
87427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
87527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
87627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
87727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmConstraints; drmConstraints = NULL;
87827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
87927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
88027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
8813473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    case GET_METADATA_FROM_CONTENT:
8823473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    {
8833856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :GET_METADATA_FROM_CONTENT");
8843473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        CHECK_INTERFACE(IDrmManagerService, data, reply);
8853473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
8863473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        const int uniqueId = data.readInt32();
8873473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        const String8 path = data.readString8();
8883473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
8893473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        DrmMetadata* drmMetadata = getMetadata(uniqueId, &path);
8903473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        if (NULL != drmMetadata) {
8913473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            //Filling DRM Metadata contents
8923473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            reply->writeInt32(drmMetadata->getCount());
8933473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
8943473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            DrmMetadata::KeyIterator keyIt = drmMetadata->keyIterator();
8953473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            while (keyIt.hasNext()) {
8963473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                const String8 key = keyIt.next();
8973473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                reply->writeString8(key);
8983473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                const char* value = drmMetadata->getAsByteArray(&key);
8993473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                int bufferSize = 0;
9003473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                if (NULL != value) {
9013473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                    bufferSize = strlen(value);
9023473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                    reply->writeInt32(bufferSize + 1);
9033473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                    reply->write(value, bufferSize + 1);
9043473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                } else {
9053473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                    reply->writeInt32(0);
9063473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                }
9073473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            }
9083473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        }
9093473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        delete drmMetadata; drmMetadata = NULL;
9103473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        return NO_ERROR;
9113473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    }
9123473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
91327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CAN_HANDLE:
91427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
9153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :CAN_HANDLE");
91627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
91727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
91827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
91927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 path = data.readString8();
92027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 mimeType = data.readString8();
92127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
92227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        bool result = canHandle(uniqueId, path, mimeType);
92327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
92427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(result);
92527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
92627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
92727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
92827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case PROCESS_DRM_INFO:
92927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
9303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO");
93127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
93227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
93327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
93427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
93527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM info
93627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int infoType = data.readInt32();
937b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker        const uint32_t bufferSize = data.readInt32();
938b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker
939b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker        if (bufferSize > data.dataAvail()) {
940b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker            return BAD_VALUE;
941b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker        }
942b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker
94327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        char* buffer = NULL;
94427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 < bufferSize) {
94527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            buffer = (char *)data.readInplace(bufferSize);
94627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
94727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const DrmBuffer drmBuffer(buffer, bufferSize);
94827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8());
94927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
95027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = data.readInt32();
95127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < size; ++index) {
95227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 key(data.readString8());
95327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 value(data.readString8());
95427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
95527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
95627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
95727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo);
95827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
95927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmInfoStatus) {
96027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling DRM Info Status contents
96127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmInfoStatus->statusCode);
962e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            reply->writeInt32(drmInfoStatus->infoType);
96327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeString8(drmInfoStatus->mimeType);
96427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
96527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (NULL != drmInfoStatus->drmBuffer) {
96627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer;
96727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const int bufferSize = drmBuffer->length;
96827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(bufferSize);
96927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (0 < bufferSize) {
97027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    reply->write(drmBuffer->data, bufferSize);
97127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
97227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete [] drmBuffer->data;
97327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete drmBuffer; drmBuffer = NULL;
97427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
97527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
97627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmInfo; drmInfo = NULL;
97727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmInfoStatus; drmInfoStatus = NULL;
97827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
97927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
98027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
98127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case ACQUIRE_DRM_INFO:
98227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
9833856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO");
98427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
98527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
98627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
98727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
98827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM info Request
989197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int infoType = data.readInt32();
990197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const String8 mimeType = data.readString8();
991197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(infoType, mimeType);
99227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
99327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = data.readInt32();
99427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < size; ++index) {
995b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker            if (!data.dataAvail()) {
996b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker                break;
997b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker            }
99827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 key(data.readString8());
9990abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan            if (key == String8("FileDescriptorKey")) {
10000abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan                char buffer[16];
10010abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan                int fd = data.readFileDescriptor();
10020abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan                sprintf(buffer, "%lu", (unsigned long)fd);
10030abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan                drmInfoRequest->put(key, String8(buffer));
10040abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan            } else {
10050abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan                const String8 value(data.readString8());
10060abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan                drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value);
10070abeaca9d1b53ee40ce9c9d2ef543dd83b5a4cc2Gene Morgan            }
100827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
100927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
101027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest);
101127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
101227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmInfo) {
101327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling DRM Info
101427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const DrmBuffer drmBuffer = drmInfo->getData();
101527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmInfo->getInfoType());
101627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
101727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = drmBuffer.length;
101827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(bufferSize);
101927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
102027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->write(drmBuffer.data, bufferSize);
102127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
102227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeString8(drmInfo->getMimeType());
102327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmInfo->getCount());
102427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
102527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
102627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            while (keyIt.hasNext()) {
102727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const String8 key = keyIt.next();
102827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8(key);
102927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const String8 value = drmInfo->get(key);
103027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8((value == String8("")) ? String8("NULL") : value);
103127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
103227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            delete [] drmBuffer.data;
103327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
103427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmInfoRequest; drmInfoRequest = NULL;
103527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmInfo; drmInfo = NULL;
103627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
103727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
103827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
103927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case SAVE_RIGHTS:
104027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
10413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS");
104227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
104327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
104427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
104527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
104627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Rights
1047b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker        const uint32_t bufferSize = data.readInt32();
1048b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker        if (bufferSize > data.dataAvail()) {
1049b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker            reply->writeInt32(BAD_VALUE);
1050b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker            return DRM_NO_ERROR;
1051b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker        }
1052b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker
105327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize);
105427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
105527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 mimeType(data.readString8());
105627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 accountId(data.readString8());
105727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 subscriptionId(data.readString8());
105827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 rightsPath(data.readString8());
105927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 contentPath(data.readString8());
106027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
106127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmRights drmRights(drmBuffer,
106227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((mimeType == String8("NULL")) ? String8("") : mimeType),
106327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((accountId == String8("NULL")) ? String8("") : accountId),
106427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId));
106527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10662272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status = saveRights(uniqueId, drmRights,
106727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((rightsPath == String8("NULL")) ? String8("") : rightsPath),
106827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((contentPath == String8("NULL")) ? String8("") : contentPath));
106927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10702272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
107127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
107227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
107327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
107427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case GET_ORIGINAL_MIMETYPE:
107527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
10763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE");
107727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
107827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1079197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int uniqueId = data.readInt32();
1080197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const String8 path = data.readString8();
1081bf5b3b29e31b293313788d7464cfb258ac0da803James Dong        const int32_t isFdValid = data.readInt32();
1082bf5b3b29e31b293313788d7464cfb258ac0da803James Dong        int fd = -1;
1083bf5b3b29e31b293313788d7464cfb258ac0da803James Dong        if (isFdValid) {
1084bf5b3b29e31b293313788d7464cfb258ac0da803James Dong            fd = data.readFileDescriptor();
1085bf5b3b29e31b293313788d7464cfb258ac0da803James Dong        }
1086bf5b3b29e31b293313788d7464cfb258ac0da803James Dong        const String8 originalMimeType = getOriginalMimeType(uniqueId, path, fd);
108727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
108827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeString8(originalMimeType);
108927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
109027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
109127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
109227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case GET_DRM_OBJECT_TYPE:
109327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
10943856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE");
109527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
109627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1097197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int uniqueId = data.readInt32();
1098197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const String8 path = data.readString8();
1099197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const String8 mimeType = data.readString8();
1100197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int drmObjectType = getDrmObjectType(uniqueId, path, mimeType);
110127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
110227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(drmObjectType);
110327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
110427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
110527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
110627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CHECK_RIGHTS_STATUS:
110727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
11083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS");
110927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
111027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1111197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int uniqueId = data.readInt32();
1112197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const String8 path = data.readString8();
1113197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int action = data.readInt32();
1114197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int result = checkRightsStatus(uniqueId, path, action);
111527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
111627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(result);
111727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
111827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
111927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
112027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CONSUME_RIGHTS:
112127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
11223856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS");
112327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
112427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
112527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
112627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
112727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
11281da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(&handle, data);
112927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1130197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int action = data.readInt32();
1131197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const bool reserve = static_cast<bool>(data.readInt32());
11322272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status
1133197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang            = consumeRights(uniqueId, &handle, action, reserve);
11342272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
113527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
11361da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        clearDecryptHandle(&handle);
113727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
113827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
113927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
114027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case SET_PLAYBACK_STATUS:
114127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
11423856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS");
114327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
114427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
114527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
114627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
114727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
11481da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(&handle, data);
114927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1150197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int playbackStatus = data.readInt32();
1151197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int64_t position = data.readInt64();
11522272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status
1153197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang            = setPlaybackStatus(uniqueId, &handle, playbackStatus, position);
11542272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
115527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
11561da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        clearDecryptHandle(&handle);
115727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
115827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
115927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
116027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case VALIDATE_ACTION:
116127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
11623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION");
116327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
116427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1165197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int uniqueId = data.readInt32();
1166197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const String8 path = data.readString8();
1167197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int action = data.readInt32();
1168197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int outputType = data.readInt32();
1169197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int configuration = data.readInt32();
1170197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        bool result = validateAction(uniqueId, path, action,
1171197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang                ActionDescription(outputType, configuration));
117227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
117327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(result);
117427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
117527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
117627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
117727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case REMOVE_RIGHTS:
117827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
11793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS");
118027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
118127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1182197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        int uniqueId = data.readInt32();
1183197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        String8 path = data.readString8();
1184197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const status_t status = removeRights(uniqueId, path);
11852272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
118627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
118727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
118827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
118927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
119027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case REMOVE_ALL_RIGHTS:
119127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
11923856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS");
119327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
119427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
11952272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status = removeAllRights(data.readInt32());
11962272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
119727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
119827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
119927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
120027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
120127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case OPEN_CONVERT_SESSION:
120227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
12033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION");
120427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
120527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1206197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int uniqueId = data.readInt32();
1207197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const String8 mimeType = data.readString8();
1208197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int convertId = openConvertSession(uniqueId, mimeType);
120927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
121027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(convertId);
121127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
121227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
121327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
121427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CONVERT_DATA:
121527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
12163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :CONVERT_DATA");
121727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
121827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
121927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
122027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int convertId = data.readInt32();
122127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
122227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling input data
1223b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker        const uint32_t bufferSize = data.readInt32();
1224b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker        if (bufferSize > data.dataAvail()) {
1225b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker            return BAD_VALUE;
1226b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker        }
122727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
122827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1229b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker        DrmConvertedStatus* drmConvertedStatus = convertData(uniqueId, convertId, inputData);
123027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
123127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmConvertedStatus) {
123227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling Drm Converted Ststus
123327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmConvertedStatus->statusCode);
1234a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            reply->writeInt64(drmConvertedStatus->offset);
123527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
123627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (NULL != drmConvertedStatus->convertedData) {
123727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
123827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const int bufferSize = convertedData->length;
123927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(bufferSize);
124027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (0 < bufferSize) {
124127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    reply->write(convertedData->data, bufferSize);
124227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
124327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete [] convertedData->data;
124427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete convertedData; convertedData = NULL;
124527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
124627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
124727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete inputData; inputData = NULL;
124827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmConvertedStatus; drmConvertedStatus = NULL;
124927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
125027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
125127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
125227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CLOSE_CONVERT_SESSION:
125327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
12543856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION");
125527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
125627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1257197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int uniqueId = data.readInt32();
1258197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const int convertId = data.readInt32();
1259197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        DrmConvertedStatus* drmConvertedStatus
1260197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang            = closeConvertSession(uniqueId, convertId);
126127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
126227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmConvertedStatus) {
126327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling Drm Converted Ststus
126427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmConvertedStatus->statusCode);
1265a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            reply->writeInt64(drmConvertedStatus->offset);
126627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
126727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (NULL != drmConvertedStatus->convertedData) {
126827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
126927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const int bufferSize = convertedData->length;
127027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(bufferSize);
127127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (0 < bufferSize) {
127227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    reply->write(convertedData->data, bufferSize);
127327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
127427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete [] convertedData->data;
127527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete convertedData; convertedData = NULL;
127627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
127727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
127827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmConvertedStatus; drmConvertedStatus = NULL;
127927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
128027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
128127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
128227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case GET_ALL_SUPPORT_INFO:
128327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
12843856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO");
128527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
128627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
128727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
128827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        int length = 0;
128927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmSupportInfo* drmSupportInfoArray = NULL;
129027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
129127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray);
129227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
129327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(length);
129427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int i = 0; i < length; ++i) {
129527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i];
129627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
129727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmSupportInfo.getFileSuffixCount());
129827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo::FileSuffixIterator fileSuffixIt
129927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                = drmSupportInfo.getFileSuffixIterator();
130027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            while (fileSuffixIt.hasNext()) {
130127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8(fileSuffixIt.next());
130227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
130327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
130427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmSupportInfo.getMimeTypeCount());
130527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator();
130627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            while (mimeTypeIt.hasNext()) {
130727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8(mimeTypeIt.next());
130827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
130927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeString8(drmSupportInfo.getDescription());
131027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
131127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete [] drmSupportInfoArray; drmSupportInfoArray = NULL;
131227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
131327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
131427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
131527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
131627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case OPEN_DECRYPT_SESSION:
131727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
13183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION");
131927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
132027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
132127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
132227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int fd = data.readFileDescriptor();
132327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1324197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const off64_t offset = data.readInt64();
1325197f047db2909c3d8cc84b95f69d18410a935fb8Gloria Wang        const off64_t length = data.readInt64();
13269d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        const String8 mime = data.readString8();
13279d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong
132827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle* handle
13299d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong            = openDecryptSession(uniqueId, fd, offset, length, mime.string());
133027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
133127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != handle) {
1332c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang            writeDecryptHandleToParcelData(handle, reply);
13331da9aa606096e14985924e8433a087d04f68ea22Gloria Wang            clearDecryptHandle(handle);
13341da9aa606096e14985924e8433a087d04f68ea22Gloria Wang            delete handle; handle = NULL;
133527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
133627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
1337e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    }
1338e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
1339e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    case OPEN_DECRYPT_SESSION_FROM_URI:
1340e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    {
13413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI");
1342e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        CHECK_INTERFACE(IDrmManagerService, data, reply);
1343e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
1344e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        const int uniqueId = data.readInt32();
1345e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        const String8 uri = data.readString8();
13469d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        const String8 mime = data.readString8();
1347e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
13489d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        DecryptHandle* handle = openDecryptSession(uniqueId, uri.string(), mime.string());
1349e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
1350e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        if (NULL != handle) {
1351c10ce33302f91896fc2a87c13b00518a4bc26e3aGloria Wang            writeDecryptHandleToParcelData(handle, reply);
13521da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
13531da9aa606096e14985924e8433a087d04f68ea22Gloria Wang            clearDecryptHandle(handle);
13541da9aa606096e14985924e8433a087d04f68ea22Gloria Wang            delete handle; handle = NULL;
1355e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        } else {
13563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("NULL decryptHandle is returned");
1357cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi        }
1358cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi        return DRM_NO_ERROR;
1359cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    }
1360cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi
1361cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    case OPEN_DECRYPT_SESSION_FOR_STREAMING:
1362cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi    {
1363cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi        ALOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FOR_STREAMING");
1364cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi        CHECK_INTERFACE(IDrmManagerService, data, reply);
1365cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi
1366cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi        const int uniqueId = data.readInt32();
1367cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi        const int bufferSize = data.readInt32();
1368cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi        DrmBuffer buf((bufferSize > 0) ? (char *)data.readInplace(bufferSize) : NULL,
1369cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi                bufferSize);
1370cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi        const String8 mimeType(data.readString8());
1371cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi
1372cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi        DecryptHandle* handle = openDecryptSession(uniqueId, buf, mimeType);
1373cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi
1374cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi        if (handle != NULL) {
1375cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi            writeDecryptHandleToParcelData(handle, reply);
1376cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi            clearDecryptHandle(handle);
1377cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi            delete handle;
1378cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi            handle = NULL;
1379cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi        } else {
1380cba7b32d8f2c47632313f54118ed3733b4b02cc8Kei Takahashi            ALOGV("NULL decryptHandle is returned");
1381e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        }
1382e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        return DRM_NO_ERROR;
138327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
138427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
138527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CLOSE_DECRYPT_SESSION:
138627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
13873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION");
138827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
138927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
139027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
139127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
139227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle* handle = new DecryptHandle();
13931da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(handle, data);
139427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13952272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status = closeDecryptSession(uniqueId, handle);
13962272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
139727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
139827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
139927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
140027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case INITIALIZE_DECRYPT_UNIT:
140127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
14023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT");
140327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
140427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
140527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
140627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
140727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
14081da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(&handle, data);
14091da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
141027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int decryptUnitId = data.readInt32();
141127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
141227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling Header info
1413b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker        const uint32_t bufferSize = data.readInt32();
1414b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker        if (bufferSize > data.dataAvail()) {
1415b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker            reply->writeInt32(BAD_VALUE);
1416b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker            clearDecryptHandle(&handle);
1417b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker            return DRM_NO_ERROR;
1418b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker        }
141927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* headerInfo = NULL;
142027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
142127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14222272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status
14232272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo);
14242272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
142527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14261da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        clearDecryptHandle(&handle);
142727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete headerInfo; headerInfo = NULL;
142827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
142927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
143027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
143127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case DECRYPT:
143227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
14333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :DECRYPT");
143427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
143527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
143627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
143727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
143827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
14391da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(&handle, data);
14401da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
144127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int decryptUnitId = data.readInt32();
1442b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker        const uint32_t decBufferSize = data.readInt32();
1443b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker        const uint32_t encBufferSize = data.readInt32();
1444b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker
1445b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker        if (encBufferSize > data.dataAvail() ||
1446b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker            decBufferSize > MAX_BINDER_TRANSACTION_SIZE) {
1447b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker            reply->writeInt32(BAD_VALUE);
1448b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker            reply->writeInt32(0);
1449b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker            clearDecryptHandle(&handle);
1450b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker            return DRM_NO_ERROR;
1451b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker        }
145227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
145327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* encBuffer
145427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize);
145527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
145627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        char* buffer = NULL;
145727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        buffer = new char[decBufferSize];
145827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize);
145927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14602272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        DrmBuffer* IV = NULL;
14612272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        if (0 != data.dataAvail()) {
1462b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker            const uint32_t ivBufferlength = data.readInt32();
1463b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker            if (ivBufferlength <= data.dataAvail()) {
1464b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker                IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength);
1465b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker            }
14662272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        }
14672272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
14682272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status
14692272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            = decrypt(uniqueId, &handle, decryptUnitId, encBuffer, &decBuffer, IV);
147027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
147127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
147227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
147327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = decBuffer->length;
147427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(size);
147527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->write(decBuffer->data, size);
147627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14771da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        clearDecryptHandle(&handle);
147827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete encBuffer; encBuffer = NULL;
147927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete decBuffer; decBuffer = NULL;
148027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete [] buffer; buffer = NULL;
14812272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        delete IV; IV = NULL;
148227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
148327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
148427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
148527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case FINALIZE_DECRYPT_UNIT:
148627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
14873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT");
148827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
148927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
149027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
149127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
149227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
14931da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(&handle, data);
149427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14952272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32());
14962272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
149727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14981da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        clearDecryptHandle(&handle);
149927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
150027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
150127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
150227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case PREAD:
150327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
15043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("BnDrmManagerService::onTransact :READ");
150527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
150627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
150727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
150827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
150927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
15101da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(&handle, data);
151127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1512b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker        const uint32_t numBytes = data.readInt32();
1513b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker        if (numBytes > MAX_BINDER_TRANSACTION_SIZE) {
1514b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker            reply->writeInt32(BAD_VALUE);
1515b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker            return DRM_NO_ERROR;
1516b408fa26c782c57272f11b46a235cca8c9ccb9beJeff Tinker        }
151727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        char* buffer = new char[numBytes];
151827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1519a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang        const off64_t offset = data.readInt64();
152027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
152127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        ssize_t result = pread(uniqueId, &handle, buffer, numBytes, offset);
152227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(result);
152327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 < result) {
152427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->write(buffer, result);
152527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
152627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
15271da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        clearDecryptHandle(&handle);
152827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete [] buffer, buffer = NULL;
152927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
153027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
153127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
153227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    default:
153327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return BBinder::onTransact(code, data, reply, flags);
153427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
153527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
1536