upload method

Future<bool> upload()

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;
}