protected virtual void OnToastChanged(UploadToast toast) { base.ExecuteMethod("OnToastChanged", delegate() { var evnt = this.ToastChanged; if (evnt != null) { evnt(this, new ToastChangedEventArgs(toast)); } }); }
public virtual void EnqueueRequest(UploadRequest request) { base.ExecuteMethod("EnqueueRequest", delegate() { Task taskToStart = null; UploadToast toastToNotify = null; lock (_RequestSyncRoot) { this.FailedRequests.Remove(request); //jic this.Requests.Add(request); if (this.UploadTask == null || this.UploadTask.IsCompleted) { this.UploadTaskCancellationToken = new CancellationTokenSource(); taskToStart = new Task(DoUploads, UploadTaskCancellationToken.Token); this.UploadTask = taskToStart; } else { this.CurrentTotal++; toastToNotify = this.CurrentToast; } } if (toastToNotify != null && toastToNotify.IsProcessing) { string format = this.UploadingFormat; if (this.CurrentTotal == 1) { format = this.UploadingSingleFormat; } if (toastToNotify.Attempt > 1) { format = this.RetryingFormat; } if (request.IsPhoto) { toastToNotify.Message = string.Format(format, this.PhotoCaption, toastToNotify.CurrentIndex, this.CurrentTotal); } else { toastToNotify.Message = string.Format(format, this.VideoCaption, toastToNotify.CurrentIndex, this.CurrentTotal); } this.CurrentToast = toastToNotify; } if (taskToStart != null) { taskToStart.Start(TaskScheduler.Default); } }); }
protected virtual Task <bool> DoUploadItem(UploadRequest request, UploadToast uploadToast) { return(base.ExecuteFunctionAsync("DoUploadItem", async delegate() { bool success = false; request.UploadAttempt = 1; while (!success && !request.CancelRequested && (request.UploadAttempt < this.MaxUploadAttempts)) { request.UploadAttempt++; if (uploadToast != null) { uploadToast.Attempt = request.UploadAttempt; } request.InvokeProcessingActions(); if (request.IsPhoto) { success = await UploadPhotoItem(request); } else { success = await UploadVideoItem(request); } } request.Succeeded = success; request.InvokeProcessingActions(); if (request.StrongCallbackAction != null) { await request.StrongCallbackAction(request); } if (request.WeakCallbackAction != null) { Func <UploadRequest, Task> action = null; request.WeakCallbackAction.TryGetTarget(out action); if (action != null) { await action(request); } } request.StrongCallbackAction = null; request.WeakCallbackAction = null; return success; })); }
public void ForceStop() { base.ExecuteMethod("ForceStop", delegate() { if (this.UploadTask != null && this.UploadTaskCancellationToken != null) { this.UploadTaskCancellationToken.Cancel(); } UploadToast finishedToast = new UploadToast() { TimeOutSeconds = 2, IsProcessing = false, IsComplete = true, Message = this.UploadCancelledCaption }; this.CurrentToast = finishedToast; lock (_RequestSyncRoot) { this.Requests.Clear(); } }); }
public ToastChangedEventArgs(UploadToast toast) { Toast = toast; }
protected virtual void DoUploads() { try { base.ExecuteMethod("DoUploads", delegate() { // Get First UploadRequest nextRequest = null; CurrentTotal = 0; int current = 0; lock (_RequestSyncRoot) { if (this.Requests.Count > 0) { CurrentTotal = this.Requests.Count; nextRequest = this.Requests[0]; this.Requests.RemoveAt(0); current++; } } if (nextRequest == null) { return; } try { this.OnStarted(); bool hadError = false; string latestCachePrefix = ""; UploadToast lastToast = null; // Iterate while (nextRequest != null) { UploadRequest request = nextRequest; nextRequest = null; // while breaker this.CurrentToastRequest = request; latestCachePrefix = request.DataCachePrefix; // Notify About Process UploadToast uploadToast = new UploadToast() { TimeOutSeconds = 0, CurrentIndex = current, IsProcessing = true, NativeImagePreview = request.NativeImagePreview }; request.RelatedToast = uploadToast; string format = this.UploadingFormat; if (this.CurrentTotal == 1) { format = this.UploadingSingleFormat; } if (uploadToast.Attempt > 1) { format = RetryingFormat; } if (request.IsPhoto) { uploadToast.Message = string.Format(format, this.PhotoCaption, current, CurrentTotal); } else { uploadToast.Message = string.Format(format, this.VideoCaption, current, CurrentTotal); } this.CurrentToast = uploadToast; lastToast = uploadToast; // Process Task <bool> uploadTask = this.DoUploadItem(request, uploadToast); Task.WaitAll(new Task[] { uploadTask }); bool success = uploadTask.Result; if (!success) { hadError = true; } // Get Next lock (_RequestSyncRoot) { if (!success) { this.FailedRequests.Add(request); } if (this.Requests.Count > 0) { nextRequest = this.Requests[0]; this.Requests.RemoveAt(0); current++; } else { this.UploadTask = null; // weird, we clear our own reference so that new ones can be spawned } } } this.CurrentToastRequest = null; // Notify complete UploadToast finishedToast = lastToast; if (finishedToast == null) { finishedToast = new UploadToast(); } finishedToast.IsProcessing = false; finishedToast.Message = this.UploadCompleteCaption; if (hadError) { finishedToast.IsError = true; finishedToast.Message = this.UploadErrorCaption; } else { finishedToast.IsComplete = true; finishedToast.TimeOutSeconds = 4; } this.CurrentToast = finishedToast; if (!string.IsNullOrEmpty(latestCachePrefix)) { this.InvalidateCacheForPrefix(latestCachePrefix); } } finally { this.OnStopped(); } }); } catch (OperationCanceledException) { //gulp } }
public void DebugSetCurrentToast(UploadToast toast) { this.CurrentToast = toast; }