upload method
Implementation
Future<bool> upload() async {
if (this.isUploading) {
Log("already uploading");
return false;
}
this.isUploading = true;
this.isAborted = false;
List<Future> futures = <Future>[];
List<int> idxForFutures = <int>[];
int idx = this.setup(futures, idxForFutures);
var monitorInterval = Duration(milliseconds: this.config['monitorInterval']);
var monitorTimer = Timer.periodic(monitorInterval, this.monitor);
while (futures.length > 0 && !this.isAborted) {
try {
//Log("futures.length = " + futures.length.toString());
var completedIdx = await Future.any(futures);
Log("completedIdx = " + completedIdx.toString());
this.files[completedIdx]['status'] = FileStatus_Uploaded;
this.files[completedIdx]['loadedSize'] = this.files[completedIdx]['fileSize'];
for (var i = 0; i < idxForFutures.length; i++) {
if (idxForFutures[i] == completedIdx) {
if (idx < this.files.length) {
idxForFutures[i] = idx;
futures[i] = this.uploadFile(idx);
idx++;
}
else {
idxForFutures.removeAt(i);
futures.removeAt(i);
}
break;
}
}
}
on UploadException catch (e) {
//Log("e = " + e.toString());
if (e.value == -1) break;
var failedIdx = e.value;
// retrying...
for (var i = 0; i < idxForFutures.length; i++) {
if (idxForFutures[i] == failedIdx) {
Log("failedIdx = " + failedIdx.toString() + ", retryCount = " +
this.files[failedIdx]['retryCount'].toString());
if (this.files[failedIdx]['retryCount'] < this.config['maxRetry']) {
futures[i] = this.uploadFile(failedIdx);
this.files[failedIdx]['retryCount']++;
}
else {
idxForFutures.removeAt(i);
futures.removeAt(i);
this.files[failedIdx]['status'] = FileStatus_Failed;
this.abortEntireUpload();
}
break;
}
}
}
}
this.isUploading = false;
// debug output
//
for (var i = 0; i < this.files.length; i++) {
Log("idx: " + i.toString() +
", status: " + this.files[i]['status'].toString() +
", fileSize: " + this.files[i]['fileSize'].toString() +
", loadedSize: " + this.files[i]['loadedSize'].toString() +
", retryCount: " + this.files[i]['retryCount'].toString());
}
return !this.isAborted;
}