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( const char *uri, const KeyedVector<String8, String8> *headers, off64_t offset) { Mutex::Autolock autoLock(mLock); uid_t uid; if (getUID(&uid)) { mDelegate->setUID(uid); } LOG_PRI(ANDROID_LOG_VERBOSE, LOG_TAG, "connect on behalf of uid %d", uid); return connect_l(uri, headers, offset); }
status_t ChromiumHTTPDataSource::reconnectAtOffset(off64_t offset) { Mutex::Autolock autoLock(mLock); if (mURI.empty()) { return INVALID_OPERATION; } LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "Reconnecting..."); status_t err = connect_l(mURI.c_str(), &mHeaders, offset); if (err != OK) { LOG_PRI(ANDROID_LOG_INFO, LOG_TAG, "Reconnect failed w/ err 0x%08x", err); } return err; }
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; }