IDrmManagerService.cpp revision 1da9aa606096e14985924e8433a087d04f68ea22
127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi/*
227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Copyright (C) 2010 The Android Open Source Project
327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Licensed under the Apache License, Version 2.0 (the "License");
527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * you may not use this file except in compliance with the License.
627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * You may obtain a copy of the License at
727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *      http://www.apache.org/licenses/LICENSE-2.0
927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi *
1027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * Unless required by applicable law or agreed to in writing, software
1127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * distributed under the License is distributed on an "AS IS" BASIS,
1227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * See the License for the specific language governing permissions and
1427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi * limitations under the License.
1527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi */
1627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
172272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi//#define LOG_NDEBUG 0
1827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define LOG_TAG "IDrmManagerService(Native)"
1927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <utils/Log.h>
2027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <stdint.h>
2227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <sys/types.h>
2327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <binder/IPCThreadState.h>
2427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
2527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfo.h>
2627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmConstraints.h>
273473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi#include <drm/DrmMetadata.h>
2827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmRights.h>
2927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoStatus.h>
3027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmConvertedStatus.h>
3127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmInfoRequest.h>
3227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include <drm/DrmSupportInfo.h>
3327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#include "IDrmManagerService.h"
3527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi#define INVALID_BUFFER_LENGTH -1
3727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiusing namespace android;
3927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
401da9aa606096e14985924e8433a087d04f68ea22Gloria Wangstatic void writeDecrptHandleToParcelData(
411da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        const DecryptHandle* handle, Parcel* data) {
421da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    data->writeInt32(handle->decryptId);
431da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    data->writeString8(handle->mimeType);
441da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    data->writeInt32(handle->decryptApiType);
451da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    data->writeInt32(handle->status);
461da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
471da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    int size = handle->copyControlVector.size();
481da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    data->writeInt32(size);
491da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    for(int i = 0; i < size; i++) {
501da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        data->writeInt32(handle->copyControlVector.keyAt(i));
511da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        data->writeInt32(handle->copyControlVector.valueAt(i));
521da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
531da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
541da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    if (NULL != handle->decryptInfo) {
551da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        data->writeInt32(handle->decryptInfo->decryptBufferLength);
561da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    } else {
571da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        data->writeInt32(INVALID_BUFFER_LENGTH);
581da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
591da9aa606096e14985924e8433a087d04f68ea22Gloria Wang}
601da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
611da9aa606096e14985924e8433a087d04f68ea22Gloria Wangstatic void readDecryptHandleFromParcelData(
621da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        DecryptHandle* handle, const Parcel& data) {
631da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    if (0 == data.dataAvail()) {
641da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        return;
651da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
661da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
671da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    handle->decryptId = data.readInt32();
681da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    handle->mimeType = data.readString8();
691da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    handle->decryptApiType = data.readInt32();
701da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    handle->status = data.readInt32();
711da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
721da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    int size = data.readInt32();
731da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    for (int i = 0; i < size; i ++) {
741da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        handle->copyControlVector.add(
751da9aa606096e14985924e8433a087d04f68ea22Gloria Wang                (DrmCopyControl)data.readInt32(), data.readInt32());
761da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
771da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
781da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    handle->decryptInfo = NULL;
791da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    const int bufferLen = data.readInt32();
801da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    if (INVALID_BUFFER_LENGTH != bufferLen) {
811da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        handle->decryptInfo = new DecryptInfo();
821da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        handle->decryptInfo->decryptBufferLength = bufferLen;
831da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
841da9aa606096e14985924e8433a087d04f68ea22Gloria Wang}
851da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
861da9aa606096e14985924e8433a087d04f68ea22Gloria Wangstatic void clearDecryptHandle(DecryptHandle* handle) {
871da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    if (handle == NULL) {
881da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        return;
891da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
901da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    if (handle->decryptInfo) {
911da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        delete handle->decryptInfo;
921da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        handle->decryptInfo = NULL;
931da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    }
941da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    handle->copyControlVector.clear();
951da9aa606096e14985924e8433a087d04f68ea22Gloria Wang}
961da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
972272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimiint BpDrmManagerService::addUniqueId(int uniqueId) {
982272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    LOGV("add uniqueid");
992272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    Parcel data, reply;
1002272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
1012272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    data.writeInt32(uniqueId);
1022272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    remote()->transact(ADD_UNIQUEID, data, &reply);
1032272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
1042272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi}
1052272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
1062272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimivoid BpDrmManagerService::removeUniqueId(int uniqueId) {
1072272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    LOGV("remove uniqueid");
1082272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    Parcel data, reply;
1092272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
1102272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    data.writeInt32(uniqueId);
1112272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    remote()->transact(REMOVE_UNIQUEID, data, &reply);
1122272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi}
1132272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
114e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid BpDrmManagerService::addClient(int uniqueId) {
11527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
11627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
11727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
118e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    remote()->transact(ADD_CLIENT, data, &reply);
11927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
12027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
121e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimivoid BpDrmManagerService::removeClient(int uniqueId) {
12227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
12327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
12427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
125e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    remote()->transact(REMOVE_CLIENT, data, &reply);
12627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
12727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
12827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::setDrmServiceListener(
12927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const sp<IDrmServiceListener>& drmServiceListener) {
13027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("setDrmServiceListener");
13127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
13227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
13427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
13527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeStrongBinder(drmServiceListener->asBinder());
13627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(SET_DRM_SERVICE_LISTENER, data, &reply);
13727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
13827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
13927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::installDrmEngine(int uniqueId, const String8& drmEngineFile) {
14127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Install DRM Engine");
14227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
14327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
14527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
14627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(drmEngineFile);
14727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
14827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(INSTALL_DRM_ENGINE, data, &reply);
14927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
15027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
15127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
15227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConstraints* BpDrmManagerService::getConstraints(
15327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const String8* path, const int action) {
15427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Get Constraints");
15527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
15627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
15727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
15827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
15927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(*path);
16027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(action);
16127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
16227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(GET_CONSTRAINTS_FROM_CONTENT, data, &reply);
16327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
16427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConstraints* drmConstraints = NULL;
16527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
16627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling Drm Constraints
16727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmConstraints = new DrmConstraints();
16827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
16927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = reply.readInt32();
17027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < size; ++index) {
17127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 key(reply.readString8());
17227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = reply.readInt32();
17327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            char* data = NULL;
17427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
17527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                data = new char[bufferSize];
17627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply.read(data, bufferSize);
17727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
17827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmConstraints->put(&key, data);
17927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
18027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
18127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmConstraints;
18227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
18327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1843473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi AimiDrmMetadata* BpDrmManagerService::getMetadata(int uniqueId, const String8* path) {
1853473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    LOGV("Get Metadata");
1863473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    Parcel data, reply;
1873473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
1883473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    data.writeInt32(uniqueId);
1893473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
1903473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    DrmMetadata* drmMetadata = NULL;
1913473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    data.writeString8(*path);
1923473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    remote()->transact(GET_METADATA_FROM_CONTENT, data, &reply);
1933473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
1943473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    if (0 != reply.dataAvail()) {
1953473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        //Filling Drm Metadata
1963473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        drmMetadata = new DrmMetadata();
1973473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
1983473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        const int size = reply.readInt32();
1993473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        for (int index = 0; index < size; ++index) {
2003473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            const String8 key(reply.readString8());
2013473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            const int bufferSize = reply.readInt32();
2023473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            char* data = NULL;
2033473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            if (0 < bufferSize) {
2043473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                data = new char[bufferSize];
2053473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                reply.read(data, bufferSize);
2063473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            }
2073473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            drmMetadata->put(&key, data);
2083473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        }
2093473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    }
2103473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    return drmMetadata;
2113473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi}
2123473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
21327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool BpDrmManagerService::canHandle(int uniqueId, const String8& path, const String8& mimeType) {
21427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Can Handle");
21527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
21627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
21727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
21827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
21927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
22027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
22127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(mimeType);
22227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
22327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CAN_HANDLE, data, &reply);
22427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
22527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return static_cast<bool>(reply.readInt32());
22627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
22727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
22827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfoStatus* BpDrmManagerService::processDrmInfo(int uniqueId, const DrmInfo* drmInfo) {
22927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Process DRM Info");
23027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
23127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
23227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
23327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
23427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
23527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    //Filling DRM info
23627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(drmInfo->getInfoType());
23727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const DrmBuffer dataBuffer = drmInfo->getData();
23827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const int dataBufferSize = dataBuffer.length;
23927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(dataBufferSize);
24027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 < dataBufferSize) {
24127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.write(dataBuffer.data, dataBufferSize);
24227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
24327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(drmInfo->getMimeType());
24427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
24527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(drmInfo->getCount());
24627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
24727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
24827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    while (keyIt.hasNext()) {
24927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 key = keyIt.next();
25027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeString8(key);
25127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 value = drmInfo->get(key);
25227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeString8((value == String8("")) ? String8("NULL") : value);
25327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
25427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
25527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(PROCESS_DRM_INFO, data, &reply);
25627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
25727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfoStatus* drmInfoStatus = NULL;
25827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
25927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Info Status
26027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int statusCode = reply.readInt32();
261e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        const int infoType = reply.readInt32();
26227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 mimeType = reply.readString8();
26327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
26427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* drmBuffer = NULL;
26527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 != reply.dataAvail()) {
26627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = reply.readInt32();
26727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            char* data = NULL;
26827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
26927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                data = new char[bufferSize];
27027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply.read(data, bufferSize);
27127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
27227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmBuffer = new DrmBuffer(data, bufferSize);
27327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
274e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        drmInfoStatus = new DrmInfoStatus(statusCode, infoType, drmBuffer, mimeType);
27527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
27627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmInfoStatus;
27727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
27827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
27927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmInfo* BpDrmManagerService::acquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInforequest) {
28027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Acquire DRM Info");
28127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
28227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
28327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
28427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
28527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
28627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    //Filling DRM Info Request
28727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(drmInforequest->getInfoType());
28827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(drmInforequest->getMimeType());
28927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
29027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(drmInforequest->getCount());
29127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfoRequest::KeyIterator keyIt = drmInforequest->keyIterator();
29227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
29327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    while (keyIt.hasNext()) {
29427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 key = keyIt.next();
29527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeString8(key);
29627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 value = drmInforequest->get(key);
29727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        data.writeString8((value == String8("")) ? String8("NULL") : value);
29827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
29927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
30027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(ACQUIRE_DRM_INFO, data, &reply);
30127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
30227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmInfo* drmInfo = NULL;
30327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
30427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Info
30527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int infoType = reply.readInt32();
30627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = reply.readInt32();
30727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        char* data = NULL;
30827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
30927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 < bufferSize) {
31027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            data = new char[bufferSize];
31127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply.read(data, bufferSize);
31227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
31327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmInfo = new DrmInfo(infoType, DrmBuffer(data, bufferSize), reply.readString8());
31427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
31527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = reply.readInt32();
31627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < size; ++index) {
31727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 key(reply.readString8());
31827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 value(reply.readString8());
31927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
32027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
32127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
32227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmInfo;
32327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
32427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3252272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::saveRights(
32627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const DrmRights& drmRights,
32727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8& rightsPath, const String8& contentPath) {
32827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Save Rights");
32927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
33027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
33127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
33227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
33327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
33427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    //Filling Drm Rights
33527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const DrmBuffer dataBuffer = drmRights.getData();
33627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(dataBuffer.length);
33727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.write(dataBuffer.data, dataBuffer.length);
33827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
33927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 mimeType = drmRights.getMimeType();
34027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((mimeType == String8("")) ? String8("NULL") : mimeType);
34127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
34227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 accountId = drmRights.getAccountId();
34327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((accountId == String8("")) ? String8("NULL") : accountId);
34427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
34527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const String8 subscriptionId = drmRights.getSubscriptionId();
34627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((subscriptionId == String8("")) ? String8("NULL") : subscriptionId);
34727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
34827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((rightsPath == String8("")) ? String8("NULL") : rightsPath);
34927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8((contentPath == String8("")) ? String8("NULL") : contentPath);
35027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
35127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(SAVE_RIGHTS, data, &reply);
3522272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
35327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
35427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
35527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiString8 BpDrmManagerService::getOriginalMimeType(int uniqueId, const String8& path) {
35627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Get Original MimeType");
35727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
35827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
35927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
36027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
36127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
36227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
36327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(GET_ORIGINAL_MIMETYPE, data, &reply);
36427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readString8();
36527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
36627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
36727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::getDrmObjectType(
36827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const String8& path, const String8& mimeType) {
36927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Get Drm object type");
37027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
37127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
37227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
37327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
37427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
37527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(mimeType);
37627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
37727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(GET_DRM_OBJECT_TYPE, data, &reply);
37827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
37927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
38027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
38127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
38227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::checkRightsStatus(int uniqueId, const String8& path, int action) {
38327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("checkRightsStatus");
38427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
38527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
38627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
38727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
38827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
38927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(action);
39027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
39127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CHECK_RIGHTS_STATUS, data, &reply);
39227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
39327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
39427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
39527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
3962272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::consumeRights(
39727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) {
39827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("consumeRights");
3992272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    Parcel data, reply;
40027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
40127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
40227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
40327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4041da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    writeDecrptHandleToParcelData(decryptHandle, &data);
40527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
40627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(action);
40727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(static_cast< int>(reserve));
40827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
40927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CONSUME_RIGHTS, data, &reply);
4102272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
41127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
41227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4132272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::setPlaybackStatus(
414a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) {
41527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("setPlaybackStatus");
41627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
41727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
41827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
41927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
42027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4211da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    writeDecrptHandleToParcelData(decryptHandle, &data);
42227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
42327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(playbackStatus);
4242ed8a921ef55aa2f3dd4b7ac33b7ded6ec33d92dGloria Wang    data.writeInt64(position);
42527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
42627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(SET_PLAYBACK_STATUS, data, &reply);
4272272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
42827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
42927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
43027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshibool BpDrmManagerService::validateAction(
43127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, const String8& path,
43227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int action, const ActionDescription& description) {
43327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("validateAction");
43427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
43527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
43627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
43727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
43827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
43927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(action);
44027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(description.outputType);
44127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(description.configuration);
44227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
44327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(VALIDATE_ACTION, data, &reply);
44427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
44527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return static_cast<bool>(reply.readInt32());
44627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
44727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4482272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::removeRights(int uniqueId, const String8& path) {
44927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("removeRights");
45027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
45127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
45227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
45327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
45427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(path);
45527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
45627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(REMOVE_RIGHTS, data, &reply);
4572272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
45827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
45927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
4602272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::removeAllRights(int uniqueId) {
46127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("removeAllRights");
46227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
46327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
46427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
46527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
46627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
46727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(REMOVE_ALL_RIGHTS, data, &reply);
4682272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
46927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
47027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
47127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiint BpDrmManagerService::openConvertSession(int uniqueId, const String8& mimeType) {
47227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("openConvertSession");
47327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
47427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
47527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
47627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
47727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeString8(mimeType);
47827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
47927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(OPEN_CONVERT_SESSION, data, &reply);
48027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
48127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
48227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
48327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* BpDrmManagerService::convertData(
48427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, int convertId, const DrmBuffer* inputData) {
48527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("convertData");
48627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
48727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
48827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
48927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
49027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(convertId);
49127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(inputData->length);
49227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.write(inputData->data, inputData->length);
49327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
49427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CONVERT_DATA, data, &reply);
49527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
49627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConvertedStatus* drmConvertedStatus = NULL;
49727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
49827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
49927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Converted Status
50027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int statusCode = reply.readInt32();
501a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang        const off64_t offset = reply.readInt64();
50227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
50327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* convertedData = NULL;
50427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 != reply.dataAvail()) {
50527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = reply.readInt32();
50627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            char* data = NULL;
50727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
50827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                data = new char[bufferSize];
50927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply.read(data, bufferSize);
51027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
51127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            convertedData = new DrmBuffer(data, bufferSize);
51227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
51327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
51427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
51527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmConvertedStatus;
51627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
51727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
51827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDrmConvertedStatus* BpDrmManagerService::closeConvertSession(int uniqueId, int convertId) {
51927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("closeConvertSession");
52027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
52127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
52227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
52327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
52427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(convertId);
52527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
52627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CLOSE_CONVERT_SESSION, data, &reply);
52727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
52827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DrmConvertedStatus* drmConvertedStatus = NULL;
52927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
53027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
53127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Converted Status
53227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int statusCode = reply.readInt32();
533a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang        const off64_t offset = reply.readInt64();
53427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
53527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* convertedData = NULL;
53627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 != reply.dataAvail()) {
53727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = reply.readInt32();
53827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            char* data = NULL;
53927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
54027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                data = new char[bufferSize];
54127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply.read(data, bufferSize);
54227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
54327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            convertedData = new DrmBuffer(data, bufferSize);
54427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
54527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        drmConvertedStatus = new DrmConvertedStatus(statusCode, convertedData, offset);
54627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
54727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return drmConvertedStatus;
54827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
54927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
55027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::getAllSupportInfo(
55127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, int* length, DrmSupportInfo** drmSupportInfoArray) {
55227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Get All Support Info");
55327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
55427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
55527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
55627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
55727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
55827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(GET_ALL_SUPPORT_INFO, data, &reply);
55927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
56027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    //Filling DRM Support Info
56127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const int arraySize = reply.readInt32();
56227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 < arraySize) {
56327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        *drmSupportInfoArray = new DrmSupportInfo[arraySize];
56427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
56527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < arraySize; ++index) {
56627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo drmSupportInfo;
56727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
56827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int fileSuffixVectorSize = reply.readInt32();
56927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            for (int i = 0; i < fileSuffixVectorSize; ++i) {
57027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                drmSupportInfo.addFileSuffix(reply.readString8());
57127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
57227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
57327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int mimeTypeVectorSize = reply.readInt32();
57427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            for (int i = 0; i < mimeTypeVectorSize; ++i) {
57527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                drmSupportInfo.addMimeType(reply.readString8());
57627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
57727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
57827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmSupportInfo.setDescription(reply.readString8());
57927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            (*drmSupportInfoArray)[index] = drmSupportInfo;
58027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
58127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
58227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    *length = arraySize;
58327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return reply.readInt32();
58427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
58527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
58627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiDecryptHandle* BpDrmManagerService::openDecryptSession(
587a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            int uniqueId, int fd, off64_t offset, off64_t length) {
58827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Entering BpDrmManagerService::openDecryptSession");
58927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
59027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
591e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
59227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
59327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeFileDescriptor(fd);
594a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang    data.writeInt64(offset);
595a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang    data.writeInt64(length);
59627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
59727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(OPEN_DECRYPT_SESSION, data, &reply);
59827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
59927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    DecryptHandle* handle = NULL;
60027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 != reply.dataAvail()) {
60127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        handle = new DecryptHandle();
6021da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(handle, reply);
60327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
60427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return handle;
60527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
60627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
607e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi AimiDecryptHandle* BpDrmManagerService::openDecryptSession(int uniqueId, const char* uri) {
608e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    LOGV("Entering BpDrmManagerService::openDecryptSession");
609e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    Parcel data, reply;
610e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
611e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
612e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    data.writeInt32(uniqueId);
613e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    data.writeString8(String8(uri));
614e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
615e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    remote()->transact(OPEN_DECRYPT_SESSION_FROM_URI, data, &reply);
616e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
617e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    DecryptHandle* handle = NULL;
618e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    if (0 != reply.dataAvail()) {
619e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        handle = new DecryptHandle();
6201da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(handle, reply);
621e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    } else {
6226b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang        LOGV("no decryptHandle is generated in service side");
623e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    }
624e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    return handle;
625e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi}
626e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
6272272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) {
62827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("closeDecryptSession");
62927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
63027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
63127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
63227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
63327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6341da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    writeDecrptHandleToParcelData(decryptHandle, &data);
63527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
63627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply);
63727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6382272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
63927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
64027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6412272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::initializeDecryptUnit(
64227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle,
64327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int decryptUnitId, const DrmBuffer* headerInfo) {
64427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("initializeDecryptUnit");
64527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
64627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
64727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
64827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
64927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6501da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    writeDecrptHandleToParcelData(decryptHandle, &data);
65127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
65227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptUnitId);
65327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
65427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(headerInfo->length);
65527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.write(headerInfo->data, headerInfo->length);
65627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
65727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(INITIALIZE_DECRYPT_UNIT, data, &reply);
6582272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
65927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
66027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
66127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BpDrmManagerService::decrypt(
66227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,
6632272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) {
66427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("decrypt");
66527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
66627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
66727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
66827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
66927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6701da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    writeDecrptHandleToParcelData(decryptHandle, &data);
67127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
67227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptUnitId);
67327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32((*decBuffer)->length);
67427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
67527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(encBuffer->length);
67627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.write(encBuffer->data, encBuffer->length);
67727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6782272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    if (NULL != IV) {
6792272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        data.writeInt32(IV->length);
6802272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        data.write(IV->data, IV->length);
6812272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    }
6822272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
68327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(DECRYPT, data, &reply);
68427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
68527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const status_t status = reply.readInt32();
68627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Return value of decrypt() is %d", status);
68727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
68827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    const int size = reply.readInt32();
68927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    (*decBuffer)->length = size;
69027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    reply.read((void *)(*decBuffer)->data, size);
69127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
69227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return status;
69327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
69427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
6952272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimistatus_t BpDrmManagerService::finalizeDecryptUnit(
69627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) {
69727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("finalizeDecryptUnit");
69827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
69927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
70027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
70127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
70227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7031da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    writeDecrptHandleToParcelData(decryptHandle, &data);
70427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
70527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(decryptUnitId);
70627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
70727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(FINALIZE_DECRYPT_UNIT, data, &reply);
7082272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    return reply.readInt32();
70927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
71027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
71127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshissize_t BpDrmManagerService::pread(
71227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            int uniqueId, DecryptHandle* decryptHandle, void* buffer,
713a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            ssize_t numBytes, off64_t offset) {
71427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("read");
71527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    Parcel data, reply;
71627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    int result;
71727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
71827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
71927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(uniqueId);
72027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
7211da9aa606096e14985924e8433a087d04f68ea22Gloria Wang    writeDecrptHandleToParcelData(decryptHandle, &data);
72227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
72327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    data.writeInt32(numBytes);
724a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang    data.writeInt64(offset);
72527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
72627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    remote()->transact(PREAD, data, &reply);
72727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    result = reply.readInt32();
72827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    if (0 < result) {
72927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply.read(buffer, result);
73027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
73127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    return result;
73227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
73327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
73427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshiIMPLEMENT_META_INTERFACE(DrmManagerService, "drm.IDrmManagerService");
73527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
73627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshistatus_t BnDrmManagerService::onTransact(
73727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            uint32_t code, const Parcel& data,
73827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            Parcel* reply, uint32_t flags) {
73927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    LOGV("Entering BnDrmManagerService::onTransact with code %d", code);
74027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
74127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    switch (code) {
7422272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    case ADD_UNIQUEID:
7432272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    {
7442272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        LOGV("BnDrmManagerService::onTransact :ADD_UNIQUEID");
7452272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        CHECK_INTERFACE(IDrmManagerService, data, reply);
7462272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        int uniqueId = addUniqueId(data.readInt32());
7472272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(uniqueId);
7482272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        return DRM_NO_ERROR;
7492272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    }
7502272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
7512272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    case REMOVE_UNIQUEID:
7522272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    {
7532272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        LOGV("BnDrmManagerService::onTransact :REMOVE_UNIQUEID");
7542272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        CHECK_INTERFACE(IDrmManagerService, data, reply);
7552272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        removeUniqueId(data.readInt32());
7562272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        return DRM_NO_ERROR;
7572272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi    }
7582272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
759e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    case ADD_CLIENT:
76027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
761e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        LOGV("BnDrmManagerService::onTransact :ADD_CLIENT");
76227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
763e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        addClient(data.readInt32());
76427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
76527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
76627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
767e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    case REMOVE_CLIENT:
76827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
769e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        LOGV("BnDrmManagerService::onTransact :REMOVE_CLIENT");
77027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
771e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        removeClient(data.readInt32());
77227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
77327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
77427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
77527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case SET_DRM_SERVICE_LISTENER:
77627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
77727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER");
77827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
77927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
78027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
78127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const sp<IDrmServiceListener> drmServiceListener
78227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            = interface_cast<IDrmServiceListener> (data.readStrongBinder());
78327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
78427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        status_t status = setDrmServiceListener(uniqueId, drmServiceListener);
78527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
78627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
78727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
78827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
78927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
79027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case INSTALL_DRM_ENGINE:
79127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
79227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :INSTALL_DRM_ENGINE");
79327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
79427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
79527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        status_t status = installDrmEngine(data.readInt32(), data.readString8());
79627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
79727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
79827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
79927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
80027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
80127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case GET_CONSTRAINTS_FROM_CONTENT:
80227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
80327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :GET_CONSTRAINTS_FROM_CONTENT");
80427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
80527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
80627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
80727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 path = data.readString8();
80827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
80927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmConstraints* drmConstraints = getConstraints(uniqueId, &path, data.readInt32());
81027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
81127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmConstraints) {
81227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling DRM Constraints contents
81327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmConstraints->getCount());
81427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
81527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmConstraints::KeyIterator keyIt = drmConstraints->keyIterator();
81627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            while (keyIt.hasNext()) {
81727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const String8 key = keyIt.next();
81827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8(key);
81927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const char* value = drmConstraints->getAsByteArray(&key);
82027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                int bufferSize = 0;
82127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (NULL != value) {
82227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    bufferSize = strlen(value);
82327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
82427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(bufferSize + 1);
82527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->write(value, bufferSize + 1);
82627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
82727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
82827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmConstraints; drmConstraints = NULL;
82927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
83027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
83127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
8323473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    case GET_METADATA_FROM_CONTENT:
8333473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    {
8343473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        LOGV("BnDrmManagerService::onTransact :GET_METADATA_FROM_CONTENT");
8353473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        CHECK_INTERFACE(IDrmManagerService, data, reply);
8363473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
8373473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        const int uniqueId = data.readInt32();
8383473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        const String8 path = data.readString8();
8393473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
8403473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        DrmMetadata* drmMetadata = getMetadata(uniqueId, &path);
8413473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        if (NULL != drmMetadata) {
8423473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            //Filling DRM Metadata contents
8433473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            reply->writeInt32(drmMetadata->getCount());
8443473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
8453473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            DrmMetadata::KeyIterator keyIt = drmMetadata->keyIterator();
8463473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            while (keyIt.hasNext()) {
8473473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                const String8 key = keyIt.next();
8483473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                reply->writeString8(key);
8493473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                const char* value = drmMetadata->getAsByteArray(&key);
8503473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                int bufferSize = 0;
8513473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                if (NULL != value) {
8523473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                    bufferSize = strlen(value);
8533473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                    reply->writeInt32(bufferSize + 1);
8543473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                    reply->write(value, bufferSize + 1);
8553473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                } else {
8563473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                    reply->writeInt32(0);
8573473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi                }
8583473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi            }
8593473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        }
8603473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        delete drmMetadata; drmMetadata = NULL;
8613473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi        return NO_ERROR;
8623473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi    }
8633473846f64f5b28e1cbeb70ef5867073fc93159eTakeshi Aimi
86427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CAN_HANDLE:
86527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
86627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :CAN_HANDLE");
86727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
86827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
86927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
87027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 path = data.readString8();
87127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 mimeType = data.readString8();
87227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
87327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        bool result = canHandle(uniqueId, path, mimeType);
87427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
87527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(result);
87627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
87727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
87827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
87927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case PROCESS_DRM_INFO:
88027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
88127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :PROCESS_DRM_INFO");
88227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
88327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
88427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
88527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
88627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM info
88727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int infoType = data.readInt32();
88827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = data.readInt32();
88927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        char* buffer = NULL;
89027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 < bufferSize) {
89127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            buffer = (char *)data.readInplace(bufferSize);
89227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
89327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const DrmBuffer drmBuffer(buffer, bufferSize);
89427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmInfo* drmInfo = new DrmInfo(infoType, drmBuffer, data.readString8());
89527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
89627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = data.readInt32();
89727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < size; ++index) {
89827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 key(data.readString8());
89927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 value(data.readString8());
90027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmInfo->put(key, (value == String8("NULL")) ? String8("") : value);
90127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
90227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
90327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmInfoStatus* drmInfoStatus = processDrmInfo(uniqueId, drmInfo);
90427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
90527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmInfoStatus) {
90627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling DRM Info Status contents
90727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmInfoStatus->statusCode);
908e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi            reply->writeInt32(drmInfoStatus->infoType);
90927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeString8(drmInfoStatus->mimeType);
91027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
91127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (NULL != drmInfoStatus->drmBuffer) {
91227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const DrmBuffer* drmBuffer = drmInfoStatus->drmBuffer;
91327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const int bufferSize = drmBuffer->length;
91427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(bufferSize);
91527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (0 < bufferSize) {
91627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    reply->write(drmBuffer->data, bufferSize);
91727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
91827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete [] drmBuffer->data;
91927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete drmBuffer; drmBuffer = NULL;
92027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
92127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
92227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmInfo; drmInfo = NULL;
92327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmInfoStatus; drmInfoStatus = NULL;
92427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
92527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
92627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
92727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case ACQUIRE_DRM_INFO:
92827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
92927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :ACQUIRE_DRM_INFO");
93027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
93127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
93227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
93327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
93427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM info Request
93527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmInfoRequest* drmInfoRequest = new DrmInfoRequest(data.readInt32(), data.readString8());
93627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
93727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = data.readInt32();
93827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int index = 0; index < size; ++index) {
93927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 key(data.readString8());
94027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const String8 value(data.readString8());
94127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            drmInfoRequest->put(key, (value == String8("NULL")) ? String8("") : value);
94227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
94327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
94427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmInfo* drmInfo = acquireDrmInfo(uniqueId, drmInfoRequest);
94527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
94627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmInfo) {
94727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling DRM Info
94827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const DrmBuffer drmBuffer = drmInfo->getData();
94927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmInfo->getInfoType());
95027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
95127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            const int bufferSize = drmBuffer.length;
95227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(bufferSize);
95327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (0 < bufferSize) {
95427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->write(drmBuffer.data, bufferSize);
95527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
95627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeString8(drmInfo->getMimeType());
95727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmInfo->getCount());
95827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
95927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmInfo::KeyIterator keyIt = drmInfo->keyIterator();
96027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            while (keyIt.hasNext()) {
96127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const String8 key = keyIt.next();
96227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8(key);
96327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const String8 value = drmInfo->get(key);
96427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8((value == String8("")) ? String8("NULL") : value);
96527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
96627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            delete [] drmBuffer.data;
96727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
96827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmInfoRequest; drmInfoRequest = NULL;
96927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmInfo; drmInfo = NULL;
97027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
97127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
97227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
97327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case SAVE_RIGHTS:
97427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
97527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :SAVE_RIGHTS");
97627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
97727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
97827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
97927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
98027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling DRM Rights
98127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = data.readInt32();
98227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const DrmBuffer drmBuffer((char *)data.readInplace(bufferSize), bufferSize);
98327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
98427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 mimeType(data.readString8());
98527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 accountId(data.readString8());
98627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 subscriptionId(data.readString8());
98727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 rightsPath(data.readString8());
98827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 contentPath(data.readString8());
98927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
99027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmRights drmRights(drmBuffer,
99127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((mimeType == String8("NULL")) ? String8("") : mimeType),
99227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((accountId == String8("NULL")) ? String8("") : accountId),
99327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((subscriptionId == String8("NULL")) ? String8("") : subscriptionId));
99427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
9952272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status = saveRights(uniqueId, drmRights,
99627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((rightsPath == String8("NULL")) ? String8("") : rightsPath),
99727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                            ((contentPath == String8("NULL")) ? String8("") : contentPath));
99827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
9992272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
100027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
100127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
100227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
100327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case GET_ORIGINAL_MIMETYPE:
100427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
100527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :GET_ORIGINAL_MIMETYPE");
100627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
100727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
100827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const String8 originalMimeType = getOriginalMimeType(data.readInt32(), data.readString8());
100927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
101027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeString8(originalMimeType);
101127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
101227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
101327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
101427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case GET_DRM_OBJECT_TYPE:
101527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
101627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :GET_DRM_OBJECT_TYPE");
101727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
101827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
101927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int drmObjectType
102027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            = getDrmObjectType(data.readInt32(), data.readString8(), data.readString8());
102127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
102227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(drmObjectType);
102327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
102427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
102527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
102627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CHECK_RIGHTS_STATUS:
102727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
102827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :CHECK_RIGHTS_STATUS");
102927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
103027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
103127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int result
103227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            = checkRightsStatus(data.readInt32(), data.readString8(), data.readInt32());
103327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
103427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(result);
103527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
103627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
103727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
103827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CONSUME_RIGHTS:
103927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
104027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :CONSUME_RIGHTS");
104127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
104227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
104327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
104427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
104527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
10461da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(&handle, data);
104727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10482272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status
10492272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            = consumeRights(uniqueId, &handle, data.readInt32(),
10502272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi                static_cast<bool>(data.readInt32()));
10512272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
105227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10531da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        clearDecryptHandle(&handle);
105427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
105527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
105627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
105727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case SET_PLAYBACK_STATUS:
105827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
105927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :SET_PLAYBACK_STATUS");
106027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
106127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
106227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
106327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
106427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
10651da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(&handle, data);
106627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10672272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status
10682ed8a921ef55aa2f3dd4b7ac33b7ded6ec33d92dGloria Wang            = setPlaybackStatus(uniqueId, &handle, data.readInt32(), data.readInt64());
10692272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
107027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10711da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        clearDecryptHandle(&handle);
107227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
107327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
107427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
107527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case VALIDATE_ACTION:
107627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
107727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :VALIDATE_ACTION");
107827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
107927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
108027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        bool result = validateAction(
108127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                                data.readInt32(),
108227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                                data.readString8(),
108327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                                data.readInt32(),
108427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                                ActionDescription(data.readInt32(), data.readInt32()));
108527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
108627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(result);
108727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
108827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
108927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
109027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case REMOVE_RIGHTS:
109127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
109227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :REMOVE_RIGHTS");
109327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
109427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
10952272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status = removeRights(data.readInt32(), data.readString8());
10962272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
109727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
109827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
109927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
110027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
110127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case REMOVE_ALL_RIGHTS:
110227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
110327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :REMOVE_ALL_RIGHTS");
110427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
110527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
11062272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status = removeAllRights(data.readInt32());
11072272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
110827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
110927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
111027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
111127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
111227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case OPEN_CONVERT_SESSION:
111327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
111427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :OPEN_CONVERT_SESSION");
111527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
111627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
111727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int convertId = openConvertSession(data.readInt32(), data.readString8());
111827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
111927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(convertId);
112027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
112127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
112227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
112327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CONVERT_DATA:
112427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
112527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :CONVERT_DATA");
112627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
112727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
112827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
112927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int convertId = data.readInt32();
113027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
113127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling input data
113227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = data.readInt32();
113327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* inputData = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
113427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
113527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmConvertedStatus*    drmConvertedStatus = convertData(uniqueId, convertId, inputData);
113627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
113727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmConvertedStatus) {
113827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling Drm Converted Ststus
113927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmConvertedStatus->statusCode);
1140a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            reply->writeInt64(drmConvertedStatus->offset);
114127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
114227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (NULL != drmConvertedStatus->convertedData) {
114327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
114427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const int bufferSize = convertedData->length;
114527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(bufferSize);
114627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (0 < bufferSize) {
114727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    reply->write(convertedData->data, bufferSize);
114827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
114927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete [] convertedData->data;
115027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete convertedData; convertedData = NULL;
115127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
115227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
115327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete inputData; inputData = NULL;
115427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmConvertedStatus; drmConvertedStatus = NULL;
115527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
115627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
115727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
115827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CLOSE_CONVERT_SESSION:
115927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
116027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :CLOSE_CONVERT_SESSION");
116127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
116227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
116327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmConvertedStatus*    drmConvertedStatus
116427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            = closeConvertSession(data.readInt32(), data.readInt32());
116527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
116627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != drmConvertedStatus) {
116727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            //Filling Drm Converted Ststus
116827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmConvertedStatus->statusCode);
1169a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            reply->writeInt64(drmConvertedStatus->offset);
117027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
117127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            if (NULL != drmConvertedStatus->convertedData) {
117227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const DrmBuffer* convertedData = drmConvertedStatus->convertedData;
117327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                const int bufferSize = convertedData->length;
117427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeInt32(bufferSize);
117527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                if (0 < bufferSize) {
117627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                    reply->write(convertedData->data, bufferSize);
117727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                }
117827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete [] convertedData->data;
117927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                delete convertedData; convertedData = NULL;
118027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
118127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
118227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete drmConvertedStatus; drmConvertedStatus = NULL;
118327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
118427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
118527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
118627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case GET_ALL_SUPPORT_INFO:
118727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
118827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :GET_ALL_SUPPORT_INFO");
118927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
119027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
119127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
119227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        int length = 0;
119327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmSupportInfo* drmSupportInfoArray = NULL;
119427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
119527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        status_t status = getAllSupportInfo(uniqueId, &length, &drmSupportInfoArray);
119627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
119727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(length);
119827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        for (int i = 0; i < length; ++i) {
119927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo drmSupportInfo = drmSupportInfoArray[i];
120027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
120127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmSupportInfo.getFileSuffixCount());
120227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo::FileSuffixIterator fileSuffixIt
120327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                = drmSupportInfo.getFileSuffixIterator();
120427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            while (fileSuffixIt.hasNext()) {
120527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8(fileSuffixIt.next());
120627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
120727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
120827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeInt32(drmSupportInfo.getMimeTypeCount());
120927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            DrmSupportInfo::MimeTypeIterator mimeTypeIt = drmSupportInfo.getMimeTypeIterator();
121027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            while (mimeTypeIt.hasNext()) {
121127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi                reply->writeString8(mimeTypeIt.next());
121227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            }
121327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->writeString8(drmSupportInfo.getDescription());
121427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
121527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete [] drmSupportInfoArray; drmSupportInfoArray = NULL;
121627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
121727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
121827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
121927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
122027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case OPEN_DECRYPT_SESSION:
122127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
122227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION");
122327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
122427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
122527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
122627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int fd = data.readFileDescriptor();
122727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
122827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle* handle
1229a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang            = openDecryptSession(uniqueId, fd, data.readInt64(), data.readInt64());
123027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
123127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (NULL != handle) {
12321da9aa606096e14985924e8433a087d04f68ea22Gloria Wang            writeDecrptHandleToParcelData(handle, reply);
12331da9aa606096e14985924e8433a087d04f68ea22Gloria Wang            clearDecryptHandle(handle);
12341da9aa606096e14985924e8433a087d04f68ea22Gloria Wang            delete handle; handle = NULL;
123527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
123627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
1237e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    }
1238e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
1239e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    case OPEN_DECRYPT_SESSION_FROM_URI:
1240e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi    {
1241e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        LOGV("BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI");
1242e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        CHECK_INTERFACE(IDrmManagerService, data, reply);
1243e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
1244e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        const int uniqueId = data.readInt32();
1245e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        const String8 uri = data.readString8();
1246e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
1247e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        DecryptHandle* handle = openDecryptSession(uniqueId, uri.string());
1248e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi
1249e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        if (NULL != handle) {
12501da9aa606096e14985924e8433a087d04f68ea22Gloria Wang            writeDecrptHandleToParcelData(handle, reply);
12511da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
12521da9aa606096e14985924e8433a087d04f68ea22Gloria Wang            clearDecryptHandle(handle);
12531da9aa606096e14985924e8433a087d04f68ea22Gloria Wang            delete handle; handle = NULL;
1254e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        } else {
12556b610a3d31a225adfc5867223df25dba16637bd9Gloria Wang            LOGV("NULL decryptHandle is returned");
1256e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        }
1257e943f84129326ab885cc7a69dcfa17f766b72b89Takeshi Aimi        return DRM_NO_ERROR;
125827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
125927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
126027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case CLOSE_DECRYPT_SESSION:
126127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
126227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :CLOSE_DECRYPT_SESSION");
126327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
126427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
126527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
126627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
126727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle* handle = new DecryptHandle();
12681da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(handle, data);
126927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
12702272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status = closeDecryptSession(uniqueId, handle);
12712272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
127227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
127327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
127427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
127527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case INITIALIZE_DECRYPT_UNIT:
127627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
127727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :INITIALIZE_DECRYPT_UNIT");
127827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
127927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
128027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
128127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
128227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
12831da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(&handle, data);
12841da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
128527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int decryptUnitId = data.readInt32();
128627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
128727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        //Filling Header info
128827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int bufferSize = data.readInt32();
128927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* headerInfo = NULL;
129027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        headerInfo = new DrmBuffer((char *)data.readInplace(bufferSize), bufferSize);
129127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
12922272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status
12932272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo);
12942272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
129527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
12961da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        clearDecryptHandle(&handle);
129727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete headerInfo; headerInfo = NULL;
129827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
129927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
130027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
130127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case DECRYPT:
130227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
130327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :DECRYPT");
130427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
130527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
130627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
130727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
130827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
13091da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(&handle, data);
13101da9aa606096e14985924e8433a087d04f68ea22Gloria Wang
131127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int decryptUnitId = data.readInt32();
131227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int decBufferSize = data.readInt32();
131327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
131427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int encBufferSize = data.readInt32();
131527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* encBuffer
131627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            = new DrmBuffer((char *)data.readInplace(encBufferSize), encBufferSize);
131727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
131827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        char* buffer = NULL;
131927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        buffer = new char[decBufferSize];
132027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DrmBuffer* decBuffer = new DrmBuffer(buffer, decBufferSize);
132127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13222272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        DrmBuffer* IV = NULL;
13232272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        if (0 != data.dataAvail()) {
13242272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            const int ivBufferlength = data.readInt32();
13252272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            IV = new DrmBuffer((char *)data.readInplace(ivBufferlength), ivBufferlength);
13262272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        }
13272272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi
13282272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status
13292272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi            = decrypt(uniqueId, &handle, decryptUnitId, encBuffer, &decBuffer, IV);
133027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
133127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(status);
133227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
133327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int size = decBuffer->length;
133427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(size);
133527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->write(decBuffer->data, size);
133627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13371da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        clearDecryptHandle(&handle);
133827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete encBuffer; encBuffer = NULL;
133927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete decBuffer; decBuffer = NULL;
134027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete [] buffer; buffer = NULL;
13412272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        delete IV; IV = NULL;
134227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
134327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
134427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
134527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case FINALIZE_DECRYPT_UNIT:
134627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
134727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :FINALIZE_DECRYPT_UNIT");
134827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
134927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
135027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
135127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
135227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
13531da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(&handle, data);
135427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13552272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32());
13562272ee27d9022d173b6eab45c409b3c3f57f30ecTakeshi Aimi        reply->writeInt32(status);
135727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13581da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        clearDecryptHandle(&handle);
135927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
136027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
136127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
136227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    case PREAD:
136327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    {
136427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        LOGV("BnDrmManagerService::onTransact :READ");
136527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        CHECK_INTERFACE(IDrmManagerService, data, reply);
136627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
136727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int uniqueId = data.readInt32();
136827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
136927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        DecryptHandle handle;
13701da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        readDecryptHandleFromParcelData(&handle, data);
137127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
137227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        const int numBytes = data.readInt32();
137327ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        char* buffer = new char[numBytes];
137427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1375a2cd44cb5067b4fe98794860690394254d3ac73cGloria Wang        const off64_t offset = data.readInt64();
137627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
137727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        ssize_t result = pread(uniqueId, &handle, buffer, numBytes, offset);
137827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        reply->writeInt32(result);
137927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        if (0 < result) {
138027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi            reply->write(buffer, result);
138127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        }
138227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
13831da9aa606096e14985924e8433a087d04f68ea22Gloria Wang        clearDecryptHandle(&handle);
138427ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        delete [] buffer, buffer = NULL;
138527ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return DRM_NO_ERROR;
138627ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
138727ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
138827ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    default:
138927ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi        return BBinder::onTransact(code, data, reply, flags);
139027ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi    }
139127ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi}
139227ed8ad2db653f6ac07dcf8bcc05e2409c8bb024aimitakeshi
1393