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