public Uploader StartUpload(string apiKey, string apiSecret, string apiBase, DS4Session session) { Uploader uploader; if (!_uploaders.TryGetValue(session, out uploader)) { uploader = new Uploader(apiKey, apiSecret, apiBase, session); uploader.Completing += (sender, e) => { if (e.Success) { //session.Metadata.BodyhubPersonId = e.BodyhubPersonId; //_store.Save(); } }; _uploaders[session] = uploader; } if (!File.Exists(session.CompressedScanFile)) { // Something went wrong probably during Compression and file is deleted throw new InvalidOperationException("Compressed Scan file is missing!"); } session.Uploader = uploader; if (uploader.Waiting) { throw new InvalidOperationException("Uploader is already enqueued for upload"); } else if (uploader.InProgress) { throw new InvalidOperationException("Upload is already in progress"); } else if (uploader.ReTrying) { AutoReTryer autoReTryer = uploader.ReTryer; if (autoReTryer == null) { throw new InvalidOperationException("Uploader in ReTrying state should have a ReTryer registered"); } autoReTryer.StartNow(); } else { EnqueueUploadWork(uploader); } return(uploader); }
/// <summary> /// Processing upload result and re-upload using a linear back-off function /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Workqueue_UploadWorkCompleted(object sender, WorkCompletedEventArgs <Uploader, UploadResult> e) { Uploader uploader = e.WorkItem; UploadResult result = e.Result; if (result.Exception != null && !result.Canceled) { //Re-upload AutoReTryer autoReTryer = uploader.ReTryer; if (autoReTryer == null) { autoReTryer = new AutoReTryer( () => EnqueueUploadWork(uploader), (seq) => seq + 1, REUPLOAD_INTERVAL_IN_SECONDS); uploader.ReTryer = autoReTryer; } autoReTryer.StartOrContinueCountdown(); } }