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