ssize_t ChromiumHTTPDataSource::readAt(off64_t offset, void *data, size_t size) { Mutex::Autolock autoLock(mLock); if (mState != CONNECTED) { return INVALID_OPERATION; } #if 0 char value[PROPERTY_VALUE_MAX]; if (property_get("media.stagefright.disable-net", value, 0) && (!strcasecmp(value, "true") || !strcmp(value, "1"))) { LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "Simulating that the network is down."); disconnect_l(); return ERROR_IO; } #endif if (offset != mCurrentOffset) { AString tmp = mURI; KeyedVector<String8, String8> tmpHeaders = mHeaders; disconnect_l(); status_t err = connect_l(tmp.c_str(), &tmpHeaders, offset); if (err != OK) { LCHLOGD1("err = %d", (int ) err); return err; } } mState = READING; int64_t startTimeUs = ALooper::GetNowUs(); mDelegate->initiateRead(data, size); while (mState == READING) { mCondition.wait(mLock); } if (mIOResult < OK) { return mIOResult; } if (mState == CONNECTED) { int64_t delayUs = ALooper::GetNowUs() - startTimeUs; // The read operation was successful, mIOResult contains // the number of bytes read. addBandwidthMeasurement(mIOResult, delayUs); mCurrentOffset += mIOResult; return mIOResult; } return ERROR_IO; }
status_t ChromiumHTTPDataSource::connect_l( const char *uri, const KeyedVector<String8, String8> *headers, off64_t offset) { if (mState != DISCONNECTED) { disconnect_l(); } LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "connect to <URL suppressed> @%lld", offset); mURI = uri; mContentType = String8("application/octet-stream"); if (headers != NULL) { mHeaders = *headers; } else { mHeaders.clear(); } mState = CONNECTING; mContentSize = -1; mCurrentOffset = offset; mDelegate->initiateConnection(mURI.c_str(), &mHeaders, offset); while (mState == CONNECTING || mState == DISCONNECTING) { mCondition.wait(mLock); } return mState == CONNECTED ? OK : mIOResult; }
void ChromiumHTTPDataSource::disconnect() { Mutex::Autolock autoLock(mLock); disconnect_l(); }
ssize_t ChromiumHTTPDataSource::readAt(off64_t offset, void *data, size_t size) { Mutex::Autolock autoLock(mLock); if (mState != CONNECTED) { return INVALID_OPERATION; } #if 0 char value[PROPERTY_VALUE_MAX]; if (property_get("media.stagefright.disable-net", value, 0) && (!strcasecmp(value, "true") || !strcmp(value, "1"))) { LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "Simulating that the network is down."); disconnect_l(); return ERROR_IO; } #endif if (offset != mCurrentOffset) { AString tmp = mURI; KeyedVector<String8, String8> tmpHeaders = mHeaders; disconnect_l(); status_t err = connect_l(tmp.c_str(), &tmpHeaders, offset); if (err != OK) { return err; } } mState = READING; int64_t startTimeUs = ALooper::GetNowUs(); mDelegate->initiateRead(data, size); int32_t bandwidth_bps; estimateBandwidth(&bandwidth_bps); int64_t readTimeoutUs = 0; if(bandwidth_bps > 0) { readTimeoutUs = (size * 8000000ll)/bandwidth_bps; } readTimeoutUs += mReadTimeoutUs; while (mState == READING) { //mCondition.wait(mLock); status_t err = mCondition.waitRelative(mLock, readTimeoutUs *1000ll); if(mForceDisconnect) { LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "disconnected, read return"); return ERROR_IO; } if(err == -ETIMEDOUT) { LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "Read data timeout," "maybe server didn't response us, return %d", err); return err; } } if (mIOResult < OK) { return mIOResult; } if (mState == CONNECTED) { int64_t delayUs = ALooper::GetNowUs() - startTimeUs; // The read operation was successful, mIOResult contains // the number of bytes read. addBandwidthMeasurement(mIOResult, delayUs); mCurrentOffset += mIOResult; return mIOResult; } return ERROR_IO; }