FwdLockEngine.cpp revision bf5b3b29e31b293313788d7464cfb258ac0da803
151125a21eafc29c925cac3655b46cfd8ef55f764Ted Kremenek/*
24241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek * Copyright (C) 2010 The Android Open Source Project
34241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek *
44241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek * Licensed under the Apache License, Version 2.0 (the "License");
54241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek * you may not use this file except in compliance with the License.
64241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek * You may obtain a copy of the License at
74241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek *
84241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek *      http://www.apache.org/licenses/LICENSE-2.0
94241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek *
1051125a21eafc29c925cac3655b46cfd8ef55f764Ted Kremenek * Unless required by applicable law or agreed to in writing, software
1151125a21eafc29c925cac3655b46cfd8ef55f764Ted Kremenek * distributed under the License is distributed on an "AS IS" BASIS,
12b2213dc3dd8f58b611b91d2fce4834a767efcba7Jeffrey Yasskin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b2213dc3dd8f58b611b91d2fce4834a767efcba7Jeffrey Yasskin * See the License for the specific language governing permissions and
14b2213dc3dd8f58b611b91d2fce4834a767efcba7Jeffrey Yasskin * limitations under the License.
15b2213dc3dd8f58b611b91d2fce4834a767efcba7Jeffrey Yasskin */
164241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek
174241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "SessionMap.h"
184241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "FwdLockEngine.h"
195a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#include <utils/Log.h>
205a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#include <errno.h>
214241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include <stdio.h>
2263bbe5312cd89ce0ceb684bff68c5baef636e93cTed Kremenek#include <unistd.h>
2330a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "drm_framework_common.h"
2430a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include <fcntl.h>
2530a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include <limits.h>
2630a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include <DrmRights.h>
2730a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include <DrmConstraints.h>
284241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include <DrmMetadata.h>
2930a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include <DrmInfo.h>
3030a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include <DrmInfoStatus.h>
31f6f5ef4aaa66b60270e84d1fe1292886369d2f38Ted Kremenek#include <DrmInfoRequest.h>
3230a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include <DrmSupportInfo.h>
334241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include <DrmConvertedStatus.h>
3463bbe5312cd89ce0ceb684bff68c5baef636e93cTed Kremenek#include <utils/String8.h>
35626719bd2c09e27fe7c182724a812d27f59e3819Ted Kremenek#include "FwdLockConv.h"
364241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "FwdLockFile.h"
374241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "FwdLockGlue.h"
384a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek#include "MimeTypeUtil.h"
3911062b118476368fa5b294954713e5df97d8599fTed Kremenek
405a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#undef LOG_TAG
419ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek#define LOG_TAG "FwdLockEngine"
425a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
435fe4d9deb543a19f557e3d85c5f33867af97cd96Ted Kremenek#ifdef DRM_OMA_FL_ENGINE_DEBUG
4411062b118476368fa5b294954713e5df97d8599fTed Kremenek#define LOG_NDEBUG 0
45cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek#define LOG_VERBOSE(...) ALOGV(__VA_ARGS__)
46cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek#else
47cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek#define LOG_VERBOSE(...)
48cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek#endif
49cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek
501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpusing namespace android;
51bda1efd0daf6fca9f515c6ce38d1ed71a3cca5b7Zhongxing Xu// This extern "C" is mandatory to be managed by TPlugInManager
52bda1efd0daf6fca9f515c6ce38d1ed71a3cca5b7Zhongxing Xuextern "C" IDrmEngine* create() {
53bda1efd0daf6fca9f515c6ce38d1ed71a3cca5b7Zhongxing Xu    return new FwdLockEngine();
54c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu}
5538b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu
56d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis// This extern "C" is mandatory to be managed by TPlugInManager
57a19f4af7a94835ce4693bfe12d6270754e79eb56Anna Zaksextern "C" void destroy(IDrmEngine* plugIn) {
58d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis    delete plugIn;
59d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis}
60d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis
61e36de1fe51c39d9161915dd3dbef880954af6476Ted KremenekFwdLockEngine::FwdLockEngine() {
621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    LOG_VERBOSE("FwdLockEngine Construction");
631833d284346b9fa11aae4e6aa07381347c04745cJordan Rose}
641833d284346b9fa11aae4e6aa07381347c04745cJordan Rose
651833d284346b9fa11aae4e6aa07381347c04745cJordan RoseFwdLockEngine::~FwdLockEngine() {
661833d284346b9fa11aae4e6aa07381347c04745cJordan Rose    LOG_VERBOSE("FwdLockEngine Destruction");
671833d284346b9fa11aae4e6aa07381347c04745cJordan Rose
681833d284346b9fa11aae4e6aa07381347c04745cJordan Rose    int size = decodeSessionMap.getSize();
691833d284346b9fa11aae4e6aa07381347c04745cJordan Rose
701833d284346b9fa11aae4e6aa07381347c04745cJordan Rose    for (int i = 0; i < size; i++) {
711833d284346b9fa11aae4e6aa07381347c04745cJordan Rose        DecodeSession *session = (DecodeSession*) decodeSessionMap.getValueAt(i);
724c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek        FwdLockFile_detach(session->fileDesc);
7346e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose        ::close(session->fileDesc);
7446e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose    }
7546e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose
761833d284346b9fa11aae4e6aa07381347c04745cJordan Rose    size = convertSessionMap.getSize();
774c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek    for (int i = 0; i < size; i++) {
78d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek        ConvertSession *convSession = (ConvertSession*) convertSessionMap.getValueAt(i);
794c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek        FwdLockConv_CloseSession(convSession->uniqueId, &(convSession->output));
8046e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose    }
8146e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose}
8246e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose
831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpint FwdLockEngine::getConvertedStatus(FwdLockConv_Status_t status) {
8446e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose    int retStatus = DrmConvertedStatus::STATUS_ERROR;
851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8646e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose    switch(status) {
871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        case FwdLockConv_Status_OK:
885d5480380d7b7c3590a0283ddf239220e514e576Ted Kremenek            retStatus = DrmConvertedStatus::STATUS_OK;
891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            break;
9046e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose        case FwdLockConv_Status_SyntaxError:
911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        case FwdLockConv_Status_InvalidArgument:
921833d284346b9fa11aae4e6aa07381347c04745cJordan Rose        case FwdLockConv_Status_UnsupportedFileFormat:
931833d284346b9fa11aae4e6aa07381347c04745cJordan Rose        case FwdLockConv_Status_UnsupportedContentTransferEncoding:
941833d284346b9fa11aae4e6aa07381347c04745cJordan Rose            ALOGE("FwdLockEngine getConvertedStatus: file conversion Error %d. "
959c378f705405d37f49795d5e915989de774fe11fTed Kremenek                  "Returning STATUS_INPUTDATA_ERROR", status);
961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            retStatus = DrmConvertedStatus::STATUS_INPUTDATA_ERROR;
971833d284346b9fa11aae4e6aa07381347c04745cJordan Rose            break;
981833d284346b9fa11aae4e6aa07381347c04745cJordan Rose        default:
991833d284346b9fa11aae4e6aa07381347c04745cJordan Rose            ALOGE("FwdLockEngine getConvertedStatus: file conversion Error %d. "
1001833d284346b9fa11aae4e6aa07381347c04745cJordan Rose                  "Returning STATUS_ERROR", status);
1011833d284346b9fa11aae4e6aa07381347c04745cJordan Rose            retStatus = DrmConvertedStatus::STATUS_ERROR;
102d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek            break;
103d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek    }
1041833d284346b9fa11aae4e6aa07381347c04745cJordan Rose
105b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek    return retStatus;
10646e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose}
107f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek
1081eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDrmConstraints* FwdLockEngine::onGetConstraints(int uniqueId, const String8* path, int action) {
1091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    DrmConstraints* drmConstraints = NULL;
1104a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
1114a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    LOG_VERBOSE("FwdLockEngine::onGetConstraints");
1124a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
1131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (NULL != path &&
1144323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek        (RightsStatus::RIGHTS_VALID == onCheckRightsStatus(uniqueId, *path, action))) {
1158bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek        // Return the empty constraints to show no error condition.
1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        drmConstraints = new DrmConstraints();
1174a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    }
1184c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek
1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return drmConstraints;
1204a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek}
1214c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek
122c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing XuDrmMetadata* FwdLockEngine::onGetMetadata(int uniqueId, const String8* path) {
1234a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    DrmMetadata* drmMetadata = NULL;
124c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu
1255204d9e2fe0ea4e4b9c85087e355021c93221764Jordan Rose    LOG_VERBOSE("FwdLockEngine::onGetMetadata");
1266800ba622e4edf287801ac69c42c61e7e294b06bAnna Zaks
12746e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose    if (NULL != path) {
12846e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose        // Returns empty metadata to show no error condition.
129e40b69de464bc695afcaf7ef9602ad727d77b981Ted Kremenek        drmMetadata = new DrmMetadata();
130e40b69de464bc695afcaf7ef9602ad727d77b981Ted Kremenek    }
131a5888f61be9f8d76e9b48a453dbced50523bd2e0Argyrios Kyrtzidis
132c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu    return drmMetadata;
1334a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek}
1340f9063c116b7c3b05d8042b5976463c2dae04861Ted Kremenek
135c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xuandroid::status_t FwdLockEngine::onInitialize(int uniqueId) {
1361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    LOG_VERBOSE("FwdLockEngine::onInitialize");
1371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13825e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu    if (FwdLockGlue_InitializeKeyEncryption()) {
13925e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu        LOG_VERBOSE("FwdLockEngine::onInitialize -- FwdLockGlue_InitializeKeyEncryption succeeded");
140955cd444f445bcdbade1cdd3926254c8ee7890d8Anna Zaks    } else {
141955cd444f445bcdbade1cdd3926254c8ee7890d8Anna Zaks        ALOGE("FwdLockEngine::onInitialize -- FwdLockGlue_InitializeKeyEncryption failed:"
142955cd444f445bcdbade1cdd3926254c8ee7890d8Anna Zaks             "errno = %d", errno);
143955cd444f445bcdbade1cdd3926254c8ee7890d8Anna Zaks    }
1445032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu
1455032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu    return DRM_NO_ERROR;
1465032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu}
1475032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu
148b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xuandroid::status_t
149b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing XuFwdLockEngine::onSetOnInfoListener(int uniqueId, const IDrmEngine::OnInfoListener* infoListener) {
150a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek    // Not used
151a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek    LOG_VERBOSE("FwdLockEngine::onSetOnInfoListener");
152a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek
153c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu    return DRM_NO_ERROR;
154c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu}
1550a6e09f67c719c318856be19d57e19972101f62cJordan Rose
156b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xuandroid::status_t FwdLockEngine::onTerminate(int uniqueId) {
15752c3196a89a26cebcf069dd140c3396b743b8e33Ted Kremenek    LOG_VERBOSE("FwdLockEngine::onTerminate");
1587a95de68c093991047ed8d339479ccad51b88663David Blaikie
1597a95de68c093991047ed8d339479ccad51b88663David Blaikie    return DRM_NO_ERROR;
160dcd42fbb418cf662c136cb035e235a44b58ad91eJordan Rose}
161dcd42fbb418cf662c136cb035e235a44b58ad91eJordan Rose
1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// make sure that lower-case letters are used.
1636800ba622e4edf287801ac69c42c61e7e294b06bAnna Zaksconst String8 FwdLockEngine::FileSuffixes[] = {
1641831bd29572b6a7243da73d9606209190c0217deBenjamin Kramer    String8(".fl"),
1656800ba622e4edf287801ac69c42c61e7e294b06bAnna Zaks    String8(".dm"),
1665fe4d9deb543a19f557e3d85c5f33867af97cd96Ted Kremenek};
167a5888f61be9f8d76e9b48a453dbced50523bd2e0Argyrios Kyrtzidis
1686800ba622e4edf287801ac69c42c61e7e294b06bAnna Zaks// make sure that lower-case letters are used.
1695fe4d9deb543a19f557e3d85c5f33867af97cd96Ted Kremenekconst String8 FwdLockEngine::MimeTypes[] = {
170c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu    String8("application/x-android-drm-fl"),
171c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu    String8("application/vnd.oma.drm.message"),
172fbe4d36f1f83ca12b532e0a946cbffcdb54f904cJordan Rose};
173fbe4d36f1f83ca12b532e0a946cbffcdb54f904cJordan Rose
174c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xuconst String8 FwdLockEngine::Description("OMA V1 Forward Lock");
175c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu
1761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid FwdLockEngine::AddSupportedMimeTypes(DrmSupportInfo *info) {
177c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu    for (size_t i = 0, n = sizeof(MimeTypes)/sizeof(MimeTypes[0]); i < n; ++i) {
1789c378f705405d37f49795d5e915989de774fe11fTed Kremenek        info->addMimeType(MimeTypes[i]);
179c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu    }
1804a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek}
1814a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
1824a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenekvoid FwdLockEngine::AddSupportedFileSuffixes(DrmSupportInfo *info) {
1830e8a3c743b9b3e3039e329a1736122d3b5b5fed9Ted Kremenek    for (size_t i = 0, n = sizeof(FileSuffixes)/sizeof(FileSuffixes[0]); i < n; ++i) {
1841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        info->addFileSuffix(FileSuffixes[i]);
185ffe0f43806d4823271c2406c1fccc2373115c36aTed Kremenek    }
1864a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek}
1875903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks
1885903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaksbool FwdLockEngine::IsMimeTypeSupported(const String8& mime) {
1895903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks    String8 tmp(mime);
1905903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks    tmp.toLower();
1919c378f705405d37f49795d5e915989de774fe11fTed Kremenek    for (size_t i = 0, n = sizeof(MimeTypes)/sizeof(MimeTypes[0]); i < n; ++i) {
19252c3196a89a26cebcf069dd140c3396b743b8e33Ted Kremenek        if (tmp == MimeTypes[i]) {
19352c3196a89a26cebcf069dd140c3396b743b8e33Ted Kremenek            return true;
1941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        }
1959c378f705405d37f49795d5e915989de774fe11fTed Kremenek    }
19652c3196a89a26cebcf069dd140c3396b743b8e33Ted Kremenek    return false;
19752c3196a89a26cebcf069dd140c3396b743b8e33Ted Kremenek}
1981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1994a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenekbool FwdLockEngine::IsFileSuffixSupported(const String8& suffix) {
20046e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose    String8 tmp(suffix);
2013148eb4a75f70f2636075c364d03104223f004d3Ted Kremenek    tmp.toLower();
20246e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose    for (size_t i = 0, n = sizeof(FileSuffixes)/sizeof(FileSuffixes[0]); i < n; ++i) {
2033148eb4a75f70f2636075c364d03104223f004d3Ted Kremenek        if (tmp == FileSuffixes[i]) {
2044a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek            return true;
205c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu        }
206c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu    }
2074a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    return false;
2084a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek}
2094a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
2101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDrmSupportInfo* FwdLockEngine::onGetSupportInfo(int uniqueId) {
2114a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    DrmSupportInfo* pSupportInfo = new DrmSupportInfo();
2124a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
2134a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    LOG_VERBOSE("FwdLockEngine::onGetSupportInfo");
2144a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
215c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu    // fill all Forward Lock mimetypes and extensions
216c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu    if (NULL != pSupportInfo) {
2174a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        AddSupportedMimeTypes(pSupportInfo);
2184a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        AddSupportedFileSuffixes(pSupportInfo);
2194a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        pSupportInfo->setDescription(Description);
2204a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    }
2214a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
2224a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    return pSupportInfo;
2234a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek}
224c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu
225c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xubool FwdLockEngine::onCanHandle(int uniqueId, const String8& path) {
2261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    bool result = false;
227c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu
2281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    String8 extString = path.getPathExtension();
229c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu    return IsFileSuffixSupported(extString);
230c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu}
231c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu
2329c378f705405d37f49795d5e915989de774fe11fTed KremenekDrmInfoStatus* FwdLockEngine::onProcessDrmInfo(int uniqueId, const DrmInfo* drmInfo) {
233c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu    DrmInfoStatus *drmInfoStatus = NULL;
2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
235c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu    // Nothing to process
236d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek
237d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek    drmInfoStatus = new DrmInfoStatus((int)DrmInfoStatus::STATUS_OK, 0, NULL, String8(""));
238d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek
239d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek    LOG_VERBOSE("FwdLockEngine::onProcessDrmInfo");
240c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu
241c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu    return drmInfoStatus;
24238b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu}
24338b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu
24499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiestatus_t FwdLockEngine::onSaveRights(
24538b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu            int uniqueId,
2461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            const DrmRights& drmRights,
247c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu            const String8& rightsPath,
24838b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu            const String8& contentPath) {
2499c378f705405d37f49795d5e915989de774fe11fTed Kremenek    // No rights to save. Return
2501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    LOG_VERBOSE("FwdLockEngine::onSaveRights");
2517177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar    return DRM_ERROR_UNKNOWN;
25238b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu}
2534a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
2544a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted KremenekDrmInfo* FwdLockEngine::onAcquireDrmInfo(int uniqueId, const DrmInfoRequest* drmInfoRequest) {
25538b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu    DrmInfo* drmInfo = NULL;
2564241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek
257d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis    // Nothing to be done for Forward Lock file
258e96de2dfde487211fb52f9139cdcae64d051a406Zhongxing Xu    LOG_VERBOSE("FwdLockEngine::onAcquireDrmInfo");
2594241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek
260626719bd2c09e27fe7c182724a812d27f59e3819Ted Kremenek    return drmInfo;
2611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
262626719bd2c09e27fe7c182724a812d27f59e3819Ted Kremenek
2634241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenekint FwdLockEngine::onCheckRightsStatus(int uniqueId,
2644241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek                                       const String8& path,
2654241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek                                       int action) {
266626719bd2c09e27fe7c182724a812d27f59e3819Ted Kremenek    int result = RightsStatus::RIGHTS_INVALID;
2674241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek
268626719bd2c09e27fe7c182724a812d27f59e3819Ted Kremenek    LOG_VERBOSE("FwdLockEngine::onCheckRightsStatus");
269626719bd2c09e27fe7c182724a812d27f59e3819Ted Kremenek
270626719bd2c09e27fe7c182724a812d27f59e3819Ted Kremenek    // Only Transfer action is not allowed for forward Lock files.
27138b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu    if (onCanHandle(uniqueId, path)) {
27238b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu        switch(action) {
27338b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu            case Action::DEFAULT:
27438b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu            case Action::PLAY:
2755fe4d9deb543a19f557e3d85c5f33867af97cd96Ted Kremenek            case Action::RINGTONE:
2765fe4d9deb543a19f557e3d85c5f33867af97cd96Ted Kremenek            case Action::OUTPUT:
2775fe4d9deb543a19f557e3d85c5f33867af97cd96Ted Kremenek            case Action::PREVIEW:
2781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            case Action::EXECUTE:
27939b4c6c98d391b25c376782cf92346aa88c96f7eTed Kremenek            case Action::DISPLAY:
28039b4c6c98d391b25c376782cf92346aa88c96f7eTed Kremenek                result = RightsStatus::RIGHTS_VALID;
281d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek                break;
282d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek
2832ac58b7c09938bb28c51c7cd2deada609b75f94cTed Kremenek            case Action::TRANSFER:
284d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek            default:
285d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek                result = RightsStatus::RIGHTS_INVALID;
286626719bd2c09e27fe7c182724a812d27f59e3819Ted Kremenek                break;
287d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek        }
2884d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose    }
2894d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose
2904d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose    return result;
2914d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose}
2922ac58b7c09938bb28c51c7cd2deada609b75f94cTed Kremenek
2932ac58b7c09938bb28c51c7cd2deada609b75f94cTed Kremenekstatus_t FwdLockEngine::onConsumeRights(int uniqueId,
2944d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose                                        DecryptHandle* decryptHandle,
2954241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek                                        int action,
29638b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu                                        bool reserve) {
2976800ba622e4edf287801ac69c42c61e7e294b06bAnna Zaks    // No rights consumption
2986800ba622e4edf287801ac69c42c61e7e294b06bAnna Zaks    LOG_VERBOSE("FwdLockEngine::onConsumeRights");
29938b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu    return DRM_NO_ERROR;
3006800ba622e4edf287801ac69c42c61e7e294b06bAnna Zaks}
30138b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu
3028bef8238181a30e52dea380789a7e2d760eac532Ted Kremenekbool FwdLockEngine::onValidateAction(int uniqueId,
3036800ba622e4edf287801ac69c42c61e7e294b06bAnna Zaks                                     const String8& path,
30438b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu                                     int action,
3051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     const ActionDescription& description) {
30638b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu    LOG_VERBOSE("FwdLockEngine::onValidateAction");
307c77a55126fcad66fb086f8e100a494caa2496a2dZhongxing Xu
30838b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu    // For the forwardlock engine checkRights and ValidateAction are the same.
3094a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    return (onCheckRightsStatus(uniqueId, path, action) == RightsStatus::RIGHTS_VALID);
3104241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek}
3119c378f705405d37f49795d5e915989de774fe11fTed Kremenek
312ede5a4ba111f0590879670b6cb07f4d6d0bd9075Ted KremenekString8 FwdLockEngine::onGetOriginalMimeType(int uniqueId, const String8& path, int fd) {
313ede5a4ba111f0590879670b6cb07f4d6d0bd9075Ted Kremenek    LOG_VERBOSE("FwdLockEngine::onGetOriginalMimeType");
314ede5a4ba111f0590879670b6cb07f4d6d0bd9075Ted Kremenek    String8 mimeString = String8("");
3154241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek    int fileDesc = dup(fd);
3164241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek
3179c378f705405d37f49795d5e915989de774fe11fTed Kremenek    if (-1 < fileDesc) {
318ede5a4ba111f0590879670b6cb07f4d6d0bd9075Ted Kremenek        if (FwdLockFile_attach(fileDesc) < 0) {
319ede5a4ba111f0590879670b6cb07f4d6d0bd9075Ted Kremenek            return mimeString;
320ede5a4ba111f0590879670b6cb07f4d6d0bd9075Ted Kremenek        }
32138b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu        const char* pMimeType = FwdLockFile_GetContentType(fileDesc);
3229d0064e802e81d0833e8ccab8978b17c0bac3625Ted Kremenek
3234a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        if (NULL != pMimeType) {
324d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek            String8 contentType = String8(pMimeType);
325d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek            contentType.toLower();
3264241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek            mimeString = MimeTypeUtil::convertMimeType(contentType);
3274a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        }
3281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32939b4c6c98d391b25c376782cf92346aa88c96f7eTed Kremenek        FwdLockFile_close(fileDesc);
33039b4c6c98d391b25c376782cf92346aa88c96f7eTed Kremenek    }
331c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu
3324241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek    return mimeString;
33338b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu}
33438b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu
335626719bd2c09e27fe7c182724a812d27f59e3819Ted Kremenekint FwdLockEngine::onGetDrmObjectType(int uniqueId,
336626719bd2c09e27fe7c182724a812d27f59e3819Ted Kremenek                                      const String8& path,
337626719bd2c09e27fe7c182724a812d27f59e3819Ted Kremenek                                      const String8& mimeType) {
338626719bd2c09e27fe7c182724a812d27f59e3819Ted Kremenek    String8 mimeStr = String8(mimeType);
33938b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu
34038b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu    LOG_VERBOSE("FwdLockEngine::onGetDrmObjectType");
3411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
34238b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu    /* Checks whether
3437ebde953bb050caa69f791fc1de449d435c6a36fTed Kremenek    * 1. path and mime type both are not empty strings (meaning unavailable) else content is unknown
34438b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu    * 2. if one of them is empty string and if other is known then its a DRM Content Object.
3451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    * 3. if both of them are available, then both may be of known type
34638b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu    *    (regardless of the relation between them to make it compatible with other DRM Engines)
3471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    */
34838b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu    if (((0 == path.length()) || onCanHandle(uniqueId, path)) &&
3491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        ((0 == mimeType.length()) || IsMimeTypeSupported(mimeType)) && (mimeType != path) ) {
35038b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu            return DrmObjectType::CONTENT;
3511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
35238b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu
3531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return DrmObjectType::UNKNOWN;
35438b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu}
3551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatus_t FwdLockEngine::onRemoveRights(int uniqueId, const String8& path) {
3574241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek    // No Rights to remove
35838b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu    LOG_VERBOSE("FwdLockEngine::onRemoveRights");
3591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return DRM_NO_ERROR;
36038b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu}
3611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
36238b02b912e1a55c912f603c4369431264d36a381Zhongxing Xustatus_t FwdLockEngine::onRemoveAllRights(int uniqueId) {
3631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // No rights to remove
36438b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu    LOG_VERBOSE("FwdLockEngine::onRemoveAllRights");
36538b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu    return DRM_NO_ERROR;
3665fe4d9deb543a19f557e3d85c5f33867af97cd96Ted Kremenek}
3675fe4d9deb543a19f557e3d85c5f33867af97cd96Ted Kremenek
36838b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu#ifdef USE_64BIT_DRM_API
36938b02b912e1a55c912f603c4369431264d36a381Zhongxing Xustatus_t FwdLockEngine::onSetPlaybackStatus(int uniqueId, DecryptHandle* decryptHandle,
37038b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu                                            int playbackStatus, int64_t position) {
371c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu#else
372fe9e543a2a363df7fcaa899367d3b2580b63b27cTed Kremenekstatus_t FwdLockEngine::onSetPlaybackStatus(int uniqueId, DecryptHandle* decryptHandle,
37338b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu                                            int playbackStatus, int position) {
374cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek#endif
37538b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu    // Not used
37638b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu    LOG_VERBOSE("FwdLockEngine::onSetPlaybackStatus");
37738b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu    return DRM_NO_ERROR;
37838b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu}
379d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek
380d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenekstatus_t FwdLockEngine::onOpenConvertSession(int uniqueId,
3812ac58b7c09938bb28c51c7cd2deada609b75f94cTed Kremenek                                         int convertId) {
3824d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose    status_t result = DRM_ERROR_UNKNOWN;
3834d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose    LOG_VERBOSE("FwdLockEngine::onOpenConvertSession");
3844d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose    if (!convertSessionMap.isCreated(convertId)) {
385d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek        ConvertSession *newSession = new ConvertSession();
386d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek        if (FwdLockConv_Status_OK ==
387d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek            FwdLockConv_OpenSession(&(newSession->uniqueId), &(newSession->output))) {
3882ac58b7c09938bb28c51c7cd2deada609b75f94cTed Kremenek            convertSessionMap.addValue(convertId, newSession);
389841c96a885789afea9d32d1d842033768c6d2b19Ted Kremenek            result = DRM_NO_ERROR;
390841c96a885789afea9d32d1d842033768c6d2b19Ted Kremenek        } else {
391841c96a885789afea9d32d1d842033768c6d2b19Ted Kremenek            ALOGE("FwdLockEngine::onOpenConvertSession -- FwdLockConv_OpenSession failed.");
392841c96a885789afea9d32d1d842033768c6d2b19Ted Kremenek            delete newSession;
3934241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek        }
394cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek    }
395f6f5ef4aaa66b60270e84d1fe1292886369d2f38Ted Kremenek    return result;
396c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu}
397f6f5ef4aaa66b60270e84d1fe1292886369d2f38Ted Kremenek
3981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDrmConvertedStatus* FwdLockEngine::onConvertData(int uniqueId,
399f6f5ef4aaa66b60270e84d1fe1292886369d2f38Ted Kremenek                                                 int convertId,
4009c378f705405d37f49795d5e915989de774fe11fTed Kremenek                                                 const DrmBuffer* inputData) {
401c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu    FwdLockConv_Status_t retStatus = FwdLockConv_Status_InvalidArgument;
402f6f5ef4aaa66b60270e84d1fe1292886369d2f38Ted Kremenek    DrmBuffer *convResult = new DrmBuffer(NULL, 0);
403f6f5ef4aaa66b60270e84d1fe1292886369d2f38Ted Kremenek    int offset = -1;
4041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
405f6f5ef4aaa66b60270e84d1fe1292886369d2f38Ted Kremenek    if (NULL != inputData && convertSessionMap.isCreated(convertId)) {
4061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        ConvertSession *convSession = convertSessionMap.getValue(convertId);
4079c378f705405d37f49795d5e915989de774fe11fTed Kremenek
408c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu        if (NULL != convSession) {
409f6f5ef4aaa66b60270e84d1fe1292886369d2f38Ted Kremenek            retStatus = FwdLockConv_ConvertData(convSession->uniqueId,
4101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                                inputData->data,
411c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu                                                inputData->length,
412c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu                                                &(convSession->output));
413f6f5ef4aaa66b60270e84d1fe1292886369d2f38Ted Kremenek
414fee96e043108b6e24e7d4c5464bf89ac970a7f81Ted Kremenek            if (FwdLockConv_Status_OK == retStatus) {
415fee96e043108b6e24e7d4c5464bf89ac970a7f81Ted Kremenek                // return bytes from conversion if available
4161aae01a8308d2f8e31adab3f4d7ac35543aac680Anna Zaks                if (convSession->output.fromConvertData.numBytes > 0) {
417fee96e043108b6e24e7d4c5464bf89ac970a7f81Ted Kremenek                    convResult->data = new char[convSession->output.fromConvertData.numBytes];
418fee96e043108b6e24e7d4c5464bf89ac970a7f81Ted Kremenek
419fee96e043108b6e24e7d4c5464bf89ac970a7f81Ted Kremenek                    if (NULL != convResult->data) {
4202d950b15b2b2b650b102ecf0c6b50b45e0cb6a8aAnna Zaks                        convResult->length = convSession->output.fromConvertData.numBytes;
421fee96e043108b6e24e7d4c5464bf89ac970a7f81Ted Kremenek                        memcpy(convResult->data,
422fee96e043108b6e24e7d4c5464bf89ac970a7f81Ted Kremenek                               (char *)convSession->output.fromConvertData.pBuffer,
423fee96e043108b6e24e7d4c5464bf89ac970a7f81Ted Kremenek                               convResult->length);
424fee96e043108b6e24e7d4c5464bf89ac970a7f81Ted Kremenek                    }
425fee96e043108b6e24e7d4c5464bf89ac970a7f81Ted Kremenek                }
4261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            } else {
427f6f5ef4aaa66b60270e84d1fe1292886369d2f38Ted Kremenek                offset = convSession->output.fromConvertData.errorPos;
428f6f5ef4aaa66b60270e84d1fe1292886369d2f38Ted Kremenek            }
4291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        }
430f6f5ef4aaa66b60270e84d1fe1292886369d2f38Ted Kremenek    }
431f6f5ef4aaa66b60270e84d1fe1292886369d2f38Ted Kremenek    return new DrmConvertedStatus(getConvertedStatus(retStatus), convResult, offset);
4321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
4331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4345a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios KyrtzidisDrmConvertedStatus* FwdLockEngine::onCloseConvertSession(int uniqueId,
4355a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis                                                         int convertId) {
4364241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek    FwdLockConv_Status_t retStatus = FwdLockConv_Status_InvalidArgument;
4374241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek    DrmBuffer *convResult = new DrmBuffer(NULL, 0);
4384a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    int offset = -1;
4394a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
4404a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    LOG_VERBOSE("FwdLockEngine::onCloseConvertSession");
4419ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek
4429ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek    if (convertSessionMap.isCreated(convertId)) {
443c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu        ConvertSession *convSession = convertSessionMap.getValue(convertId);
4444a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
4451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        if (NULL != convSession) {
4464a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek            retStatus = FwdLockConv_CloseSession(convSession->uniqueId, &(convSession->output));
4474a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
4484a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek            if (FwdLockConv_Status_OK == retStatus) {
4491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                offset = convSession->output.fromCloseSession.fileOffset;
4504a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek                convResult->data = new char[FWD_LOCK_SIGNATURES_SIZE];
4514a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
4524a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek                if (NULL != convResult->data) {
4531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                      convResult->length = FWD_LOCK_SIGNATURES_SIZE;
4544a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek                      memcpy(convResult->data,
4554a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek                             (char *)convSession->output.fromCloseSession.signatures,
4564a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek                             convResult->length);
4571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                }
4584a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek            }
4594a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        }
4604a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        convertSessionMap.removeValue(convertId);
4611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
4624a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    return new DrmConvertedStatus(getConvertedStatus(retStatus), convResult, offset);
4634a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek}
4644a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
4654a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek#ifdef USE_64BIT_DRM_API
4661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatus_t FwdLockEngine::onOpenDecryptSession(int uniqueId,
4679ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek                                             DecryptHandle* decryptHandle,
4689ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek                                             int fd,
469c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu                                             off64_t offset,
4704a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek                                             off64_t length) {
4711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#else
4724a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenekstatus_t FwdLockEngine::onOpenDecryptSession(int uniqueId,
4734a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek                                             DecryptHandle* decryptHandle,
4744a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek                                             int fd,
4751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             int offset,
4764a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek                                             int length) {
4774a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek#endif
4784a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    status_t result = DRM_ERROR_CANNOT_HANDLE;
4791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    int fileDesc = -1;
4804a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
4814a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    LOG_VERBOSE("FwdLockEngine::onOpenDecryptSession");
4824a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
4831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if ((-1 < fd) &&
4844a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        (NULL != decryptHandle) &&
4854a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        (!decodeSessionMap.isCreated(decryptHandle->decryptId))) {
4864a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        fileDesc = dup(fd);
4871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    } else {
4884a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        ALOGE("FwdLockEngine::onOpenDecryptSession parameter error");
4894a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        return result;
4904a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek    }
4914a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek
4921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (-1 < fileDesc &&
4934a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        -1 < ::lseek(fileDesc, offset, SEEK_SET) &&
4944a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek        -1 < FwdLockFile_attach(fileDesc)) {
4954241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek        // check for file integrity. This must be done to protect the content mangling.
496        int retVal = FwdLockFile_CheckHeaderIntegrity(fileDesc);
497        DecodeSession* decodeSession = new DecodeSession(fileDesc);
498
499        if (retVal && NULL != decodeSession) {
500            decodeSessionMap.addValue(decryptHandle->decryptId, decodeSession);
501            const char *pmime= FwdLockFile_GetContentType(fileDesc);
502            String8 contentType = String8(pmime == NULL ? "" : pmime);
503            contentType.toLower();
504            decryptHandle->mimeType = MimeTypeUtil::convertMimeType(contentType);
505            decryptHandle->decryptApiType = DecryptApiType::CONTAINER_BASED;
506            decryptHandle->status = RightsStatus::RIGHTS_VALID;
507            decryptHandle->decryptInfo = NULL;
508            result = DRM_NO_ERROR;
509        } else {
510            LOG_VERBOSE("FwdLockEngine::onOpenDecryptSession Integrity Check failed for the fd");
511            FwdLockFile_detach(fileDesc);
512            delete decodeSession;
513        }
514    }
515
516    if (DRM_NO_ERROR != result && -1 < fileDesc) {
517        ::close(fileDesc);
518    }
519
520    LOG_VERBOSE("FwdLockEngine::onOpenDecryptSession Exit. result = %d", result);
521
522    return result;
523}
524
525status_t FwdLockEngine::onOpenDecryptSession(int uniqueId,
526                                             DecryptHandle* decryptHandle,
527                                             const char* uri) {
528    status_t result = DRM_ERROR_CANNOT_HANDLE;
529    const char fileTag [] = "file://";
530
531    if (NULL != decryptHandle && NULL != uri && strlen(uri) > sizeof(fileTag)) {
532        String8 uriTag = String8(uri);
533        uriTag.toLower();
534
535        if (0 == strncmp(uriTag.string(), fileTag, sizeof(fileTag) - 1)) {
536            const char *filePath = strchr(uri + sizeof(fileTag) - 1, '/');
537            if (NULL != filePath && onCanHandle(uniqueId, String8(filePath))) {
538                int fd = open(filePath, O_RDONLY);
539
540                if (-1 < fd) {
541                    // offset is always 0 and length is not used. so any positive size.
542                    result = onOpenDecryptSession(uniqueId, decryptHandle, fd, 0, 1);
543
544                    // fd is duplicated already if success. closing the file
545                    close(fd);
546                }
547            }
548        }
549    }
550
551    return result;
552}
553
554status_t FwdLockEngine::onCloseDecryptSession(int uniqueId,
555                                              DecryptHandle* decryptHandle) {
556    status_t result = DRM_ERROR_UNKNOWN;
557    LOG_VERBOSE("FwdLockEngine::onCloseDecryptSession");
558
559    if (NULL != decryptHandle && decodeSessionMap.isCreated(decryptHandle->decryptId)) {
560        DecodeSession* session = decodeSessionMap.getValue(decryptHandle->decryptId);
561        if (NULL != session && session->fileDesc > -1) {
562            FwdLockFile_detach(session->fileDesc);
563            ::close(session->fileDesc);
564            decodeSessionMap.removeValue(decryptHandle->decryptId);
565            result = DRM_NO_ERROR;
566        }
567    }
568
569    if (NULL != decryptHandle) {
570        if (NULL != decryptHandle->decryptInfo) {
571            delete decryptHandle->decryptInfo;
572            decryptHandle->decryptInfo = NULL;
573        }
574
575        decryptHandle->copyControlVector.clear();
576        decryptHandle->extendedData.clear();
577
578        delete decryptHandle;
579        decryptHandle = NULL;
580    }
581
582    LOG_VERBOSE("FwdLockEngine::onCloseDecryptSession Exit");
583    return result;
584}
585
586status_t FwdLockEngine::onInitializeDecryptUnit(int uniqueId,
587                                                DecryptHandle* decryptHandle,
588                                                int decryptUnitId,
589                                                const DrmBuffer* headerInfo) {
590    ALOGE("FwdLockEngine::onInitializeDecryptUnit is not supported for this DRM scheme");
591    return DRM_ERROR_UNKNOWN;
592}
593
594status_t FwdLockEngine::onDecrypt(int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,
595            const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) {
596    ALOGE("FwdLockEngine::onDecrypt is not supported for this DRM scheme");
597    return DRM_ERROR_UNKNOWN;
598}
599
600status_t FwdLockEngine::onDecrypt(int uniqueId,
601                                  DecryptHandle* decryptHandle,
602                                  int decryptUnitId,
603                                  const DrmBuffer* encBuffer,
604                                  DrmBuffer** decBuffer) {
605    ALOGE("FwdLockEngine::onDecrypt is not supported for this DRM scheme");
606    return DRM_ERROR_UNKNOWN;
607}
608
609status_t FwdLockEngine::onFinalizeDecryptUnit(int uniqueId,
610                                              DecryptHandle* decryptHandle,
611                                              int decryptUnitId) {
612    ALOGE("FwdLockEngine::onFinalizeDecryptUnit is not supported for this DRM scheme");
613    return DRM_ERROR_UNKNOWN;
614}
615
616ssize_t FwdLockEngine::onRead(int uniqueId,
617                              DecryptHandle* decryptHandle,
618                              void* buffer,
619                              int numBytes) {
620    ssize_t size = -1;
621
622    if (NULL != decryptHandle &&
623       decodeSessionMap.isCreated(decryptHandle->decryptId) &&
624        NULL != buffer &&
625        numBytes > -1) {
626        DecodeSession* session = decodeSessionMap.getValue(decryptHandle->decryptId);
627        if (NULL != session && session->fileDesc > -1) {
628            size = FwdLockFile_read(session->fileDesc, buffer, numBytes);
629
630            if (0 > size) {
631                session->offset = ((off_t)-1);
632            } else {
633                session->offset += size;
634            }
635        }
636    }
637
638    return size;
639}
640
641#ifdef USE_64BIT_DRM_API
642off64_t FwdLockEngine::onLseek(int uniqueId, DecryptHandle* decryptHandle,
643                               off64_t offset, int whence) {
644#else
645off_t FwdLockEngine::onLseek(int uniqueId, DecryptHandle* decryptHandle,
646                             off_t offset, int whence) {
647#endif
648    off_t offval = -1;
649
650    if (NULL != decryptHandle && decodeSessionMap.isCreated(decryptHandle->decryptId)) {
651        DecodeSession* session = decodeSessionMap.getValue(decryptHandle->decryptId);
652        if (NULL != session && session->fileDesc > -1) {
653            offval = FwdLockFile_lseek(session->fileDesc, offset, whence);
654            session->offset = offval;
655        }
656    }
657
658    return offval;
659}
660
661#ifdef USE_64BIT_DRM_API
662ssize_t FwdLockEngine::onPread(int uniqueId,
663                               DecryptHandle* decryptHandle,
664                               void* buffer,
665                               ssize_t numBytes,
666                               off64_t offset) {
667#else
668ssize_t FwdLockEngine::onPread(int uniqueId,
669                               DecryptHandle* decryptHandle,
670                               void* buffer,
671                               ssize_t numBytes,
672                               off_t offset) {
673#endif
674    ssize_t bytesRead = -1;
675
676    DecodeSession* decoderSession = NULL;
677
678    if ((NULL != decryptHandle) &&
679        (NULL != (decoderSession = decodeSessionMap.getValue(decryptHandle->decryptId))) &&
680        (NULL != buffer) &&
681        (numBytes > -1) &&
682        (offset > -1)) {
683        if (offset != decoderSession->offset) {
684            decoderSession->offset = onLseek(uniqueId, decryptHandle, offset, SEEK_SET);
685        }
686
687        if (((off_t)-1) != decoderSession->offset) {
688            bytesRead = onRead(uniqueId, decryptHandle, buffer, numBytes);
689            if (bytesRead < 0) {
690                ALOGE("FwdLockEngine::onPread error reading");
691            }
692        }
693    } else {
694        ALOGE("FwdLockEngine::onPread decryptId not found");
695    }
696
697    return bytesRead;
698}
699