in firebase-storage/src/main/java/com/google/firebase/storage/FileDownloadTask.java [184:261]
/*package*/ void run() {
if (mException != null) {
tryChangeState(INTERNAL_STATE_FAILURE, false);
return;
}
if (!tryChangeState(INTERNAL_STATE_IN_PROGRESS, false)) {
return;
}
do {
mBytesDownloaded = 0;
mException = null;
mSender.reset();
final NetworkRequest request =
new GetNetworkRequest(
mStorageRef.getStorageReferenceUri(), mStorageRef.getApp(), mResumeOffset);
mSender.sendWithExponentialBackoff(request, false);
mResultCode = request.getResultCode();
mException = request.getException() != null ? request.getException() : mException;
boolean success =
isValidHttpResponseCode(mResultCode)
&& mException == null
&& getInternalState() == INTERNAL_STATE_IN_PROGRESS;
if (success) {
mTotalBytes = request.getResultingContentLength() + mResumeOffset;
String newEtag = request.getResultString("ETag");
if (!TextUtils.isEmpty(newEtag)
&& mETagVerification != null
&& !mETagVerification.equals(newEtag)) {
Log.w(TAG, "The file at the server has changed. Restarting from the beginning.");
mResumeOffset = 0;
mETagVerification = null;
request.performRequestEnd();
schedule(); // reschedule
return;
}
mETagVerification = newEtag;
try {
success = processResponse(request);
} catch (IOException e) {
Log.e(TAG, "Exception occurred during file write. Aborting.", e);
mException = e;
}
}
request.performRequestEnd();
success = success && mException == null && getInternalState() == INTERNAL_STATE_IN_PROGRESS;
if (success) {
tryChangeState(INTERNAL_STATE_SUCCESS, false);
return;
} else {
File outputFile = new File(mDestinationFile.getPath());
if (outputFile.exists()) {
mResumeOffset = outputFile.length();
} else {
mResumeOffset = 0; // start over.
}
if (getInternalState() == INTERNAL_STATE_PAUSING) {
tryChangeState(INTERNAL_STATE_PAUSED, false);
return;
} else if (getInternalState() == INTERNAL_STATE_CANCELING) {
if (!tryChangeState(INTERNAL_STATE_CANCELED, false)) {
Log.w(TAG, "Unable to change download task to final state from " + getInternalState());
}
return;
}
}
} while (mBytesDownloaded > 0);
tryChangeState(INTERNAL_STATE_FAILURE, false);
}