11156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber/* 21156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * Copyright (C) 2011 The Android Open Source Project 31156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * 41156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 51156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * you may not use this file except in compliance with the License. 61156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * You may obtain a copy of the License at 71156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * 81156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 91156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * 101156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * Unless required by applicable law or agreed to in writing, software 111156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 121156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * See the License for the specific language governing permissions and 141156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * limitations under the License. 151156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber */ 161156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 171156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber//#define LOG_NDEBUG 0 181156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#define LOG_TAG "ChromiumHTTPDataSource" 191156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#include <media/stagefright/foundation/ADebug.h> 201156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 211156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#include "include/ChromiumHTTPDataSource.h" 221156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 231156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#include <media/stagefright/foundation/ALooper.h> 241156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#include <media/stagefright/MediaErrors.h> 251156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 261156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#include "support.h" 271156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 280683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber#include <cutils/properties.h> // for property_get 290683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber 301156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubernamespace android { 311156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 321156dc913a5ba7b2bc86489468d4914430f03d14Andreas HuberChromiumHTTPDataSource::ChromiumHTTPDataSource(uint32_t flags) 331156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber : mFlags(flags), 341156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState(DISCONNECTED), 351156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDelegate(new SfDelegate), 361156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCurrentOffset(0), 371156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mIOResult(OK), 381156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mContentSize(-1), 391156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDecryptHandle(NULL), 401156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDrmManagerClient(NULL) { 411156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDelegate->setOwner(this); 421156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 431156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 441156dc913a5ba7b2bc86489468d4914430f03d14Andreas HuberChromiumHTTPDataSource::~ChromiumHTTPDataSource() { 451156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber disconnect(); 461156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 471156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber delete mDelegate; 481156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDelegate = NULL; 491156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 5099930d45c40f2d79a7633d9dd9f8478d22307848Gloria Wang clearDRMState_l(); 5199930d45c40f2d79a7633d9dd9f8478d22307848Gloria Wang 521156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mDrmManagerClient != NULL) { 531156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber delete mDrmManagerClient; 541156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDrmManagerClient = NULL; 551156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 561156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 571156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 581156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberstatus_t ChromiumHTTPDataSource::connect( 591156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber const char *uri, 601156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber const KeyedVector<String8, String8> *headers, 611156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber off64_t offset) { 621156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 631156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 64a23456b306f35b9ecf973bf5818ca39295e9e029Ashish Sharma uid_t uid; 65a23456b306f35b9ecf973bf5818ca39295e9e029Ashish Sharma if (getUID(&uid)) { 66a23456b306f35b9ecf973bf5818ca39295e9e029Ashish Sharma mDelegate->setUID(uid); 67a23456b306f35b9ecf973bf5818ca39295e9e029Ashish Sharma } 68a23456b306f35b9ecf973bf5818ca39295e9e029Ashish Sharma LOG_PRI(ANDROID_LOG_VERBOSE, LOG_TAG, "connect on behalf of uid %d", uid); 69a23456b306f35b9ecf973bf5818ca39295e9e029Ashish Sharma 701156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return connect_l(uri, headers, offset); 711156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 721156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 731156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberstatus_t ChromiumHTTPDataSource::connect_l( 741156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber const char *uri, 751156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber const KeyedVector<String8, String8> *headers, 761156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber off64_t offset) { 771156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mState != DISCONNECTED) { 781156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber disconnect_l(); 791156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 801156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 811156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (!(mFlags & kFlagIncognito)) { 821156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "connect to %s @%lld", uri, offset); 831156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } else { 841156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, 851156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber "connect to <URL suppressed> @%lld", offset); 861156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 871156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 881156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mURI = uri; 896511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber mContentType = String8("application/octet-stream"); 901156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 911156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (headers != NULL) { 921156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mHeaders = *headers; 931156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } else { 941156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mHeaders.clear(); 951156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 961156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 971156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = CONNECTING; 981156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mContentSize = -1; 991156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCurrentOffset = offset; 1001156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1011156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDelegate->initiateConnection(mURI.c_str(), &mHeaders, offset); 1021156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1038b6bacd02a0478ed51b3b15a9e997624c95a7564Andreas Huber while (mState == CONNECTING || mState == DISCONNECTING) { 1041156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.wait(mLock); 1051156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1061156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1071156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return mState == CONNECTED ? OK : mIOResult; 1081156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 1091156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1106511c9755c3a3360ba869772600c7aae048a7ffcAndreas Hubervoid ChromiumHTTPDataSource::onConnectionEstablished( 1116511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber int64_t contentSize, const char *contentType) { 1121156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 1138b6bacd02a0478ed51b3b15a9e997624c95a7564Andreas Huber 1148b6bacd02a0478ed51b3b15a9e997624c95a7564Andreas Huber if (mState != CONNECTING) { 1158b6bacd02a0478ed51b3b15a9e997624c95a7564Andreas Huber // We may have initiated disconnection. 1168b6bacd02a0478ed51b3b15a9e997624c95a7564Andreas Huber CHECK_EQ(mState, DISCONNECTING); 1178b6bacd02a0478ed51b3b15a9e997624c95a7564Andreas Huber return; 1188b6bacd02a0478ed51b3b15a9e997624c95a7564Andreas Huber } 1198b6bacd02a0478ed51b3b15a9e997624c95a7564Andreas Huber 1201156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = CONNECTED; 1211156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mContentSize = (contentSize < 0) ? -1 : contentSize + mCurrentOffset; 1226511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber mContentType = String8(contentType); 1231156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.broadcast(); 1241156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 1251156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1261156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::onConnectionFailed(status_t err) { 1271156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 1281156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = DISCONNECTED; 1291156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.broadcast(); 1301156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1310683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber // mURI.clear(); 1321156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1331156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mIOResult = err; 1341156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 1351156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1361156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::disconnect() { 1371156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 1381156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber disconnect_l(); 1391156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 1401156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1411156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::disconnect_l() { 1421156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mState == DISCONNECTED) { 1431156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return; 1441156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1451156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1461156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = DISCONNECTING; 1471156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mIOResult = -EINTR; 1481156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1491156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDelegate->initiateDisconnect(); 1501156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1511156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber while (mState == DISCONNECTING) { 1521156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.wait(mLock); 1531156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1541156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1551156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber CHECK_EQ((int)mState, (int)DISCONNECTED); 1561156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 1571156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1581156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberstatus_t ChromiumHTTPDataSource::initCheck() const { 1591156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 1601156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1611156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return mState == CONNECTED ? OK : NO_INIT; 1621156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 1631156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1641156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberssize_t ChromiumHTTPDataSource::readAt(off64_t offset, void *data, size_t size) { 1651156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 1661156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1671156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mState != CONNECTED) { 1680683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber return INVALID_OPERATION; 1690683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber } 1700683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber 1710683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber#if 0 1720683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber char value[PROPERTY_VALUE_MAX]; 1730683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber if (property_get("media.stagefright.disable-net", value, 0) 1740683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber && (!strcasecmp(value, "true") || !strcmp(value, "1"))) { 1750683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "Simulating that the network is down."); 1760683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber disconnect_l(); 1770683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber return ERROR_IO; 1781156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1790683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber#endif 1801156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1811156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (offset != mCurrentOffset) { 1821156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber AString tmp = mURI; 1831156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber KeyedVector<String8, String8> tmpHeaders = mHeaders; 1841156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1851156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber disconnect_l(); 1861156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1871156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber status_t err = connect_l(tmp.c_str(), &tmpHeaders, offset); 1881156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1891156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (err != OK) { 1901156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return err; 1911156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1921156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1931156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1941156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = READING; 1951156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1961156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber int64_t startTimeUs = ALooper::GetNowUs(); 1971156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1981156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDelegate->initiateRead(data, size); 1991156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2001156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber while (mState == READING) { 2011156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.wait(mLock); 2021156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2031156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2041156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mIOResult < OK) { 2051156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return mIOResult; 2061156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2071156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2081156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mState == CONNECTED) { 2091156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber int64_t delayUs = ALooper::GetNowUs() - startTimeUs; 2101156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2111156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber // The read operation was successful, mIOResult contains 2121156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber // the number of bytes read. 2135b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong addBandwidthMeasurement(mIOResult, delayUs); 2141156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2151156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCurrentOffset += mIOResult; 2161156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return mIOResult; 2171156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2181156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2191156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return ERROR_IO; 2201156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2211156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2221156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::onReadCompleted(ssize_t size) { 2231156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 2241156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2251156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mIOResult = size; 2261156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2271156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mState == READING) { 2281156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = CONNECTED; 2291156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.broadcast(); 2301156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2311156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2321156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2331156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberstatus_t ChromiumHTTPDataSource::getSize(off64_t *size) { 2341156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 2351156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2361156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mContentSize < 0) { 2371156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return ERROR_UNSUPPORTED; 2381156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2391156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2401156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber *size = mContentSize; 2411156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2421156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return OK; 2431156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2441156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2451156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberuint32_t ChromiumHTTPDataSource::flags() { 246b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong return kWantsPrefetching | kIsHTTPBasedSource; 2471156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2481156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2491156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber// static 2501156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::InitiateRead( 2511156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber ChromiumHTTPDataSource *me, void *data, size_t size) { 2521156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber me->initiateRead(data, size); 2531156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2541156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2551156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::initiateRead(void *data, size_t size) { 2561156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDelegate->initiateRead(data, size); 2571156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2581156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2591156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::onDisconnectComplete() { 2601156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 2611156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber CHECK_EQ((int)mState, (int)DISCONNECTING); 2621156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2631156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = DISCONNECTED; 2640683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber // mURI.clear(); 2658b6bacd02a0478ed51b3b15a9e997624c95a7564Andreas Huber mIOResult = -ENOTCONN; 2661156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2671156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.broadcast(); 2681156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2691156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2709d2f386dd2885eaffa11fd494ae258bb09fe6397James Dongsp<DecryptHandle> ChromiumHTTPDataSource::DrmInitialization(const char* mime) { 2711156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 2721156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2731156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mDrmManagerClient == NULL) { 2741156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDrmManagerClient = new DrmManagerClient(); 2751156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2761156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2771156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mDrmManagerClient == NULL) { 2781156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return NULL; 2791156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2801156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2811156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mDecryptHandle == NULL) { 2821156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber /* Note if redirect occurs, mUri is the redirect uri instead of the 2831156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * original one 2841156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber */ 2851156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDecryptHandle = mDrmManagerClient->openDecryptSession( 2869d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong String8(mURI.c_str()), mime); 2871156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2881156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2891156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mDecryptHandle == NULL) { 2901156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber delete mDrmManagerClient; 2911156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDrmManagerClient = NULL; 2921156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2931156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2941156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return mDecryptHandle; 2951156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2961156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2971156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::getDrmInfo( 298b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang sp<DecryptHandle> &handle, DrmManagerClient **client) { 2991156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 3001156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 301b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang handle = mDecryptHandle; 3021156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber *client = mDrmManagerClient; 3031156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 3041156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 3051156dc913a5ba7b2bc86489468d4914430f03d14Andreas HuberString8 ChromiumHTTPDataSource::getUri() { 3061156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 3071156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 3081156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return String8(mURI.c_str()); 3091156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 3101156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 3116511c9755c3a3360ba869772600c7aae048a7ffcAndreas HuberString8 ChromiumHTTPDataSource::getMIMEType() const { 3126511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber Mutex::Autolock autoLock(mLock); 3136511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber 3146511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber return mContentType; 3156511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber} 3166511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber 3171156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::clearDRMState_l() { 3181156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mDecryptHandle != NULL) { 3191156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber // To release mDecryptHandle 3201156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber CHECK(mDrmManagerClient); 3211156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDrmManagerClient->closeDecryptSession(mDecryptHandle); 3221156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDecryptHandle = NULL; 3231156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 3241156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 3251156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 3260683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huberstatus_t ChromiumHTTPDataSource::reconnectAtOffset(off64_t offset) { 3270683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber Mutex::Autolock autoLock(mLock); 3280683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber 3290683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber if (mURI.empty()) { 3300683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber return INVALID_OPERATION; 3310683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber } 3320683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber 3330683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "Reconnecting..."); 3340683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber status_t err = connect_l(mURI.c_str(), &mHeaders, offset); 3350683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber if (err != OK) { 3360683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "Reconnect failed w/ err 0x%08x", err); 3370683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber } 3380683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber 3390683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber return err; 3400683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber} 3410683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber 3421156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} // namespace android 3431156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 344