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