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
8153ae1640ffbfc690962f7f94694b02680c6f66cbJames Dong    LOG_PRI(ANDROID_LOG_INFO, LOG_TAG,
821156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber                "connect to <URL suppressed> @%lld", offset);
831156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
841156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mURI = uri;
856511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber    mContentType = String8("application/octet-stream");
861156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
871156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (headers != NULL) {
881156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mHeaders = *headers;
891156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    } else {
901156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mHeaders.clear();
911156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
921156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
931156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mState = CONNECTING;
941156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mContentSize = -1;
951156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mCurrentOffset = offset;
961156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
971156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mDelegate->initiateConnection(mURI.c_str(), &mHeaders, offset);
981156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
998b6bacd02a0478ed51b3b15a9e997624c95a7564Andreas Huber    while (mState == CONNECTING || mState == DISCONNECTING) {
1001156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mCondition.wait(mLock);
1011156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
1021156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1031156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    return mState == CONNECTED ? OK : mIOResult;
1041156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
1051156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1066511c9755c3a3360ba869772600c7aae048a7ffcAndreas Hubervoid ChromiumHTTPDataSource::onConnectionEstablished(
1076511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber        int64_t contentSize, const char *contentType) {
1081156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
1098b6bacd02a0478ed51b3b15a9e997624c95a7564Andreas Huber
1108b6bacd02a0478ed51b3b15a9e997624c95a7564Andreas Huber    if (mState != CONNECTING) {
1118b6bacd02a0478ed51b3b15a9e997624c95a7564Andreas Huber        // We may have initiated disconnection.
1128b6bacd02a0478ed51b3b15a9e997624c95a7564Andreas Huber        CHECK_EQ(mState, DISCONNECTING);
1138b6bacd02a0478ed51b3b15a9e997624c95a7564Andreas Huber        return;
1148b6bacd02a0478ed51b3b15a9e997624c95a7564Andreas Huber    }
1158b6bacd02a0478ed51b3b15a9e997624c95a7564Andreas Huber
1161156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mState = CONNECTED;
1171156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mContentSize = (contentSize < 0) ? -1 : contentSize + mCurrentOffset;
1186511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber    mContentType = String8(contentType);
1191156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mCondition.broadcast();
1201156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
1211156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1221156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::onConnectionFailed(status_t err) {
1231156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
1241156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mState = DISCONNECTED;
1251156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mCondition.broadcast();
1261156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1270683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber    // mURI.clear();
1281156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1291156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mIOResult = err;
1301156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
1311156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1321156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::disconnect() {
1331156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
1341156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    disconnect_l();
1351156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
1361156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1371156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::disconnect_l() {
1381156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mState == DISCONNECTED) {
1391156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        return;
1401156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
1411156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1421156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mState = DISCONNECTING;
1431156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mIOResult = -EINTR;
1441156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1451156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mDelegate->initiateDisconnect();
1461156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1471156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    while (mState == DISCONNECTING) {
1481156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mCondition.wait(mLock);
1491156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
1501156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1511156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    CHECK_EQ((int)mState, (int)DISCONNECTED);
1521156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
1531156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1541156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberstatus_t ChromiumHTTPDataSource::initCheck() const {
1551156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
1561156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1571156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    return mState == CONNECTED ? OK : NO_INIT;
1581156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
1591156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1601156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberssize_t ChromiumHTTPDataSource::readAt(off64_t offset, void *data, size_t size) {
1611156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
1621156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1631156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mState != CONNECTED) {
1640683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber        return INVALID_OPERATION;
1650683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber    }
1660683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber
1670683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber#if 0
1680683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber    char value[PROPERTY_VALUE_MAX];
1690683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber    if (property_get("media.stagefright.disable-net", value, 0)
1700683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber            && (!strcasecmp(value, "true") || !strcmp(value, "1"))) {
1710683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber        LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "Simulating that the network is down.");
1720683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber        disconnect_l();
1730683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber        return ERROR_IO;
1741156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
1750683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber#endif
1761156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1771156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (offset != mCurrentOffset) {
1781156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        AString tmp = mURI;
1791156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        KeyedVector<String8, String8> tmpHeaders = mHeaders;
1801156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1811156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        disconnect_l();
1821156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1831156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        status_t err = connect_l(tmp.c_str(), &tmpHeaders, offset);
1841156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1851156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        if (err != OK) {
1861156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber            return err;
1871156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        }
1881156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
1891156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1901156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mState = READING;
1911156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1921156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    int64_t startTimeUs = ALooper::GetNowUs();
1931156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1941156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mDelegate->initiateRead(data, size);
1951156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
1961156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    while (mState == READING) {
1971156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mCondition.wait(mLock);
1981156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
1991156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2001156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mIOResult < OK) {
2011156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        return mIOResult;
2021156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
2031156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2041156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mState == CONNECTED) {
2051156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        int64_t delayUs = ALooper::GetNowUs() - startTimeUs;
2061156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2071156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        // The read operation was successful, mIOResult contains
2081156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        // the number of bytes read.
2095b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        addBandwidthMeasurement(mIOResult, delayUs);
2101156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2111156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mCurrentOffset += mIOResult;
2121156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        return mIOResult;
2131156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
2141156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2151156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    return ERROR_IO;
2161156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
2171156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2181156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::onReadCompleted(ssize_t size) {
2191156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
2201156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2211156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mIOResult = size;
2221156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2231156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mState == READING) {
2241156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mState = CONNECTED;
2251156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mCondition.broadcast();
2261156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
2271156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
2281156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2291156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberstatus_t ChromiumHTTPDataSource::getSize(off64_t *size) {
2301156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
2311156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2321156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mContentSize < 0) {
2331156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        return ERROR_UNSUPPORTED;
2341156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
2351156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2361156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    *size = mContentSize;
2371156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2381156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    return OK;
2391156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
2401156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2411156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huberuint32_t ChromiumHTTPDataSource::flags() {
242b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong    return kWantsPrefetching | kIsHTTPBasedSource;
2431156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
2441156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2451156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber// static
2461156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::InitiateRead(
2471156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        ChromiumHTTPDataSource *me, void *data, size_t size) {
2481156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    me->initiateRead(data, size);
2491156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
2501156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2511156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::initiateRead(void *data, size_t size) {
2521156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mDelegate->initiateRead(data, size);
2531156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
2541156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2551156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::onDisconnectComplete() {
2561156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
2571156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    CHECK_EQ((int)mState, (int)DISCONNECTING);
2581156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2591156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mState = DISCONNECTED;
2600683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber    // mURI.clear();
2618b6bacd02a0478ed51b3b15a9e997624c95a7564Andreas Huber    mIOResult = -ENOTCONN;
2621156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2631156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    mCondition.broadcast();
2641156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
2651156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2669d2f386dd2885eaffa11fd494ae258bb09fe6397James Dongsp<DecryptHandle> ChromiumHTTPDataSource::DrmInitialization(const char* mime) {
2671156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
2681156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2691156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mDrmManagerClient == NULL) {
2701156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mDrmManagerClient = new DrmManagerClient();
2711156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
2721156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2731156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mDrmManagerClient == NULL) {
2741156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        return NULL;
2751156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
2761156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2771156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mDecryptHandle == NULL) {
2781156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        /* Note if redirect occurs, mUri is the redirect uri instead of the
2791156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber         * original one
2801156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber         */
2811156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mDecryptHandle = mDrmManagerClient->openDecryptSession(
2829d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong                String8(mURI.c_str()), mime);
2831156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
2841156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2851156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mDecryptHandle == NULL) {
2861156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        delete mDrmManagerClient;
2871156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mDrmManagerClient = NULL;
2881156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
2891156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2901156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    return mDecryptHandle;
2911156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
2921156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
2931156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::getDrmInfo(
294b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang        sp<DecryptHandle> &handle, DrmManagerClient **client) {
2951156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
2961156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
297b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang    handle = mDecryptHandle;
2981156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    *client = mDrmManagerClient;
2991156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
3001156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
3011156dc913a5ba7b2bc86489468d4914430f03d14Andreas HuberString8 ChromiumHTTPDataSource::getUri() {
3021156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    Mutex::Autolock autoLock(mLock);
3031156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
3041156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    return String8(mURI.c_str());
3051156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
3061156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
3076511c9755c3a3360ba869772600c7aae048a7ffcAndreas HuberString8 ChromiumHTTPDataSource::getMIMEType() const {
3086511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber    Mutex::Autolock autoLock(mLock);
3096511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber
3106511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber    return mContentType;
3116511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber}
3126511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber
3131156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubervoid ChromiumHTTPDataSource::clearDRMState_l() {
3141156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    if (mDecryptHandle != NULL) {
3151156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        // To release mDecryptHandle
3161156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        CHECK(mDrmManagerClient);
3171156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mDrmManagerClient->closeDecryptSession(mDecryptHandle);
3181156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mDecryptHandle = NULL;
3191156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    }
3201156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}
3211156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
3220683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huberstatus_t ChromiumHTTPDataSource::reconnectAtOffset(off64_t offset) {
3230683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber    Mutex::Autolock autoLock(mLock);
3240683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber
3250683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber    if (mURI.empty()) {
3260683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber        return INVALID_OPERATION;
3270683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber    }
3280683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber
3290683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber    LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "Reconnecting...");
3300683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber    status_t err = connect_l(mURI.c_str(), &mHeaders, offset);
3310683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber    if (err != OK) {
3320683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber        LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "Reconnect failed w/ err 0x%08x", err);
3330683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber    }
3340683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber
3350683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber    return err;
3360683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber}
3370683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber
3381156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber}  // namespace android
3391156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber
340