ChromiumHTTPDataSource.cpp revision b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163
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 281156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubernamespace android { 291156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 301156dc913a5ba7b2bc86489468d4914430f03d14Andreas HuberChromiumHTTPDataSource::ChromiumHTTPDataSource(uint32_t flags) 311156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber : mFlags(flags), 321156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState(DISCONNECTED), 331156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDelegate(new SfDelegate), 341156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCurrentOffset(0), 351156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mIOResult(OK), 361156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mContentSize(-1), 371156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDecryptHandle(NULL), 381156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDrmManagerClient(NULL) { 391156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDelegate->setOwner(this); 401156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 411156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 421156dc913a5ba7b2bc86489468d4914430f03d14Andreas HuberChromiumHTTPDataSource::~ChromiumHTTPDataSource() { 431156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber disconnect(); 441156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 451156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber delete mDelegate; 461156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDelegate = NULL; 471156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 481156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mDrmManagerClient != NULL) { 491156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber delete mDrmManagerClient; 501156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDrmManagerClient = NULL; 511156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 521156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 531156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 541156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberstatus_t ChromiumHTTPDataSource::connect( 551156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber const char *uri, 561156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber const KeyedVector<String8, String8> *headers, 571156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber off64_t offset) { 581156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 591156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 601156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return connect_l(uri, headers, offset); 611156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 621156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 631156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberstatus_t ChromiumHTTPDataSource::connect_l( 641156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber const char *uri, 651156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber const KeyedVector<String8, String8> *headers, 661156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber off64_t offset) { 671156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mState != DISCONNECTED) { 681156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber disconnect_l(); 691156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 701156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 711156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (!(mFlags & kFlagIncognito)) { 721156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "connect to %s @%lld", uri, offset); 731156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } else { 741156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, 751156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber "connect to <URL suppressed> @%lld", offset); 761156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 771156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 781156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mURI = uri; 796511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber mContentType = String8("application/octet-stream"); 801156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 811156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (headers != NULL) { 821156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mHeaders = *headers; 831156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } else { 841156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mHeaders.clear(); 851156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 861156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 871156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = CONNECTING; 881156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mContentSize = -1; 891156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCurrentOffset = offset; 901156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 911156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDelegate->initiateConnection(mURI.c_str(), &mHeaders, offset); 921156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 931156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber while (mState == CONNECTING) { 941156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.wait(mLock); 951156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 961156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 971156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return mState == CONNECTED ? OK : mIOResult; 981156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 991156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1006511c9755c3a3360ba869772600c7aae048a7ffcAndreas Hubervoid ChromiumHTTPDataSource::onConnectionEstablished( 1016511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber int64_t contentSize, const char *contentType) { 1021156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 1031156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = CONNECTED; 1041156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mContentSize = (contentSize < 0) ? -1 : contentSize + mCurrentOffset; 1056511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber mContentType = String8(contentType); 1061156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.broadcast(); 1071156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 1081156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1091156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::onConnectionFailed(status_t err) { 1101156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 1111156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = DISCONNECTED; 1121156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.broadcast(); 1131156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1141156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mURI.clear(); 1151156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1161156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mIOResult = err; 1171156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1181156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber clearDRMState_l(); 1191156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 1201156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1211156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::disconnect() { 1221156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 1231156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber disconnect_l(); 1241156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 1251156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1261156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::disconnect_l() { 1271156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mState == DISCONNECTED) { 1281156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return; 1291156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1301156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1311156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = DISCONNECTING; 1321156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mIOResult = -EINTR; 1331156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1341156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDelegate->initiateDisconnect(); 1351156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1361156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber while (mState == DISCONNECTING) { 1371156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.wait(mLock); 1381156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1391156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1401156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber CHECK_EQ((int)mState, (int)DISCONNECTED); 1411156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 1421156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1431156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberstatus_t ChromiumHTTPDataSource::initCheck() const { 1441156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 1451156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1461156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return mState == CONNECTED ? OK : NO_INIT; 1471156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 1481156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1491156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberssize_t ChromiumHTTPDataSource::readAt(off64_t offset, void *data, size_t size) { 1501156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 1511156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1521156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mState != CONNECTED) { 1531156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return ERROR_NOT_CONNECTED; 1541156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1551156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1561156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (offset != mCurrentOffset) { 1571156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber AString tmp = mURI; 1581156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber KeyedVector<String8, String8> tmpHeaders = mHeaders; 1591156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1601156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber disconnect_l(); 1611156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1621156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber status_t err = connect_l(tmp.c_str(), &tmpHeaders, offset); 1631156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1641156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (err != OK) { 1651156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return err; 1661156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1671156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1681156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1691156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = READING; 1701156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1711156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber int64_t startTimeUs = ALooper::GetNowUs(); 1721156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1731156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDelegate->initiateRead(data, size); 1741156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1751156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber while (mState == READING) { 1761156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.wait(mLock); 1771156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1781156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1791156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mIOResult < OK) { 1801156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return mIOResult; 1811156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1821156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1831156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mState == CONNECTED) { 1841156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber int64_t delayUs = ALooper::GetNowUs() - startTimeUs; 1851156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1861156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber // The read operation was successful, mIOResult contains 1871156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber // the number of bytes read. 1885b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong addBandwidthMeasurement(mIOResult, delayUs); 1891156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1901156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCurrentOffset += mIOResult; 1911156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return mIOResult; 1921156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 1931156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1941156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return ERROR_IO; 1951156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 1961156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 1971156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::onReadCompleted(ssize_t size) { 1981156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 1991156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2001156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mIOResult = size; 2011156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2021156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mState == READING) { 2031156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = CONNECTED; 2041156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.broadcast(); 2051156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2061156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2071156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2081156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberstatus_t ChromiumHTTPDataSource::getSize(off64_t *size) { 2091156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 2101156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2111156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mContentSize < 0) { 2121156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return ERROR_UNSUPPORTED; 2131156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2141156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2151156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber *size = mContentSize; 2161156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2171156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return OK; 2181156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2191156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2201156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberuint32_t ChromiumHTTPDataSource::flags() { 221b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong return kWantsPrefetching | kIsHTTPBasedSource; 2221156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2231156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2241156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber// static 2251156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::InitiateRead( 2261156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber ChromiumHTTPDataSource *me, void *data, size_t size) { 2271156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber me->initiateRead(data, size); 2281156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2291156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2301156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::initiateRead(void *data, size_t size) { 2311156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDelegate->initiateRead(data, size); 2321156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2331156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2341156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::onDisconnectComplete() { 2351156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 2361156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber CHECK_EQ((int)mState, (int)DISCONNECTING); 2371156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2381156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mState = DISCONNECTED; 2391156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mURI.clear(); 2401156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2411156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mCondition.broadcast(); 2421156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2431156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber clearDRMState_l(); 2441156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2451156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 246b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wangsp<DecryptHandle> ChromiumHTTPDataSource::DrmInitialization() { 2471156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 2481156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2491156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mDrmManagerClient == NULL) { 2501156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDrmManagerClient = new DrmManagerClient(); 2511156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2521156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2531156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mDrmManagerClient == NULL) { 2541156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return NULL; 2551156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2561156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2571156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mDecryptHandle == NULL) { 2581156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber /* Note if redirect occurs, mUri is the redirect uri instead of the 2591156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * original one 2601156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber */ 2611156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDecryptHandle = mDrmManagerClient->openDecryptSession( 2621156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber String8(mURI.c_str())); 2631156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2641156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2651156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mDecryptHandle == NULL) { 2661156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber delete mDrmManagerClient; 2671156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDrmManagerClient = NULL; 2681156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 2691156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2701156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return mDecryptHandle; 2711156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2721156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2731156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::getDrmInfo( 274b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang sp<DecryptHandle> &handle, DrmManagerClient **client) { 2751156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 2761156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 277b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang handle = mDecryptHandle; 2781156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber *client = mDrmManagerClient; 2791156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2801156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2811156dc913a5ba7b2bc86489468d4914430f03d14Andreas HuberString8 ChromiumHTTPDataSource::getUri() { 2821156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber Mutex::Autolock autoLock(mLock); 2831156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2841156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return String8(mURI.c_str()); 2851156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 2861156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2876511c9755c3a3360ba869772600c7aae048a7ffcAndreas HuberString8 ChromiumHTTPDataSource::getMIMEType() const { 2886511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber Mutex::Autolock autoLock(mLock); 2896511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber 2906511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber return mContentType; 2916511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber} 2926511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber 2931156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::clearDRMState_l() { 2941156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (mDecryptHandle != NULL) { 2951156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber // To release mDecryptHandle 2961156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber CHECK(mDrmManagerClient); 2971156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDrmManagerClient->closeDecryptSession(mDecryptHandle); 2981156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber mDecryptHandle = NULL; 2991156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 3001156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 3011156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 3021156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} // namespace android 3031156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 304