async Task StartSyncing () { if (String.IsNullOrEmpty (userTextField.StringValue)) return; var startTime = DateTime.UtcNow; statusTextField.StringValue = String.Empty; detailedStatusTextField.StringValue = String.Empty; indeterminateProgressIndicator.StartAnimation (userTextField); indeterminateProgressIndicator.Hidden = false; progressIndicator.Hidden = true; progressIndicator.DoubleValue = 0; saveButton.Hidden = true; savedExportedDataUrl = null; saveButton.Title = "Save Exported Data…"; tabView.SelectAt (1); syncController = new UserSyncController (userTextField.StringValue, new RdioObjectStore ()); do { SyncState currentState; var previousState = syncController.SyncState; try { currentState = await syncController.SyncStepAsync (() => BeginInvokeOnMainThread (() => { progressIndicator.MinValue = 0; progressIndicator.MaxValue = syncController.TotalObjects; progressIndicator.DoubleValue = syncController.SyncedObjects; detailedStatusTextField.StringValue = String.Format ("{0} / {1}", syncController.SyncedObjects, syncController.TotalObjects); })); } catch (Exception e) { if (!(e is OperationCanceledException)) Console.Error.WriteLine (e); progressIndicator.Hidden = true; indeterminateProgressIndicator.Hidden = true; detailedStatusTextField.Hidden = true; actionButton.Title = "Go Back"; var webException = e as WebException; if (webException != null) statusTextField.StringValue = "connection error"; else if (e is UserNotFoundException) statusTextField.StringValue = "could not find Rdio user " + syncController.UserIdentifier; else if (e is OperationCanceledException) statusTextField.StringValue = "canceled"; else statusTextField.StringValue = e.Message; syncController = null; return; } Console.WriteLine ("{0} -> {1}", previousState, currentState); switch (syncController.SyncState) { case SyncState.Start: break; case SyncState.FindingUser: statusTextField.StringValue = "searching for " + syncController.UserIdentifier + "…"; break; case SyncState.FoundUser: break; case SyncState.SyncingUserKeys: statusTextField.StringValue = "fetching user keys…"; break; case SyncState.SyncedUserKeys: break; case SyncState.SyncingObjects: detailedStatusTextField.Hidden = false; indeterminateProgressIndicator.Hidden = true; progressIndicator.Hidden = false; statusTextField.StringValue = "fetching objects…"; break; case SyncState.SyncedObjects: break; case SyncState.Finished: statusTextField.StringValue = "done in " + (DateTime.UtcNow - startTime).ToFriendlyString (); progressIndicator.Hidden = true; indeterminateProgressIndicator.Hidden = true; detailedStatusTextField.Hidden = true; saveButton.Hidden = false; saveButton.BecomeFirstResponder (); saveButton.Highlight (true); saveButton.KeyEquivalent = "\r"; actionButton.Title = "Start Over"; break; } } while (syncController.SyncState != SyncState.Finished); }
async Task StartSyncing() { if (String.IsNullOrEmpty(userTextField.StringValue)) { return; } var startTime = DateTime.UtcNow; statusTextField.StringValue = String.Empty; detailedStatusTextField.StringValue = String.Empty; indeterminateProgressIndicator.StartAnimation(userTextField); indeterminateProgressIndicator.Hidden = false; progressIndicator.Hidden = true; progressIndicator.DoubleValue = 0; saveButton.Hidden = true; savedExportedDataUrl = null; saveButton.Title = "Save Exported Data…"; tabView.SelectAt(1); syncController = new UserSyncController(userTextField.StringValue, new RdioObjectStore()); do { SyncState currentState; var previousState = syncController.SyncState; try { currentState = await syncController.SyncStepAsync(() => BeginInvokeOnMainThread (() => { progressIndicator.MinValue = 0; progressIndicator.MaxValue = syncController.TotalObjects; progressIndicator.DoubleValue = syncController.SyncedObjects; detailedStatusTextField.StringValue = String.Format("{0} / {1}", syncController.SyncedObjects, syncController.TotalObjects); })); } catch (Exception e) { if (!(e is OperationCanceledException)) { Console.Error.WriteLine(e); } progressIndicator.Hidden = true; indeterminateProgressIndicator.Hidden = true; detailedStatusTextField.Hidden = true; actionButton.Title = "Go Back"; var webException = e as WebException; var httpException = e as HttpRequestException; if (webException != null || httpException != null) { statusTextField.StringValue = "connection error. rdio has probably " + "gone offline forever. RIP in Peace \ud83d\ude22"; } else if (e is UserNotFoundException) { statusTextField.StringValue = "could not find Rdio user " + syncController.UserIdentifier; } else if (e is OperationCanceledException) { statusTextField.StringValue = "canceled"; } else { statusTextField.StringValue = e.Message; } syncController = null; return; } Console.WriteLine("{0} -> {1}", previousState, currentState); switch (syncController.SyncState) { case SyncState.Start: break; case SyncState.FindingUser: statusTextField.StringValue = "searching for " + syncController.UserIdentifier + "…"; break; case SyncState.FoundUser: break; case SyncState.SyncingUserKeys: statusTextField.StringValue = "fetching user keys…"; break; case SyncState.SyncedUserKeys: break; case SyncState.SyncingObjects: detailedStatusTextField.Hidden = false; indeterminateProgressIndicator.Hidden = true; progressIndicator.Hidden = false; statusTextField.StringValue = "fetching objects…"; break; case SyncState.SyncedObjects: break; case SyncState.Finished: statusTextField.StringValue = "done in " + (DateTime.UtcNow - startTime).ToFriendlyString(); progressIndicator.Hidden = true; indeterminateProgressIndicator.Hidden = true; detailedStatusTextField.Hidden = true; saveButton.Hidden = false; saveButton.BecomeFirstResponder(); saveButton.Highlight(true); saveButton.KeyEquivalent = "\r"; actionButton.Title = "Start Over"; break; } } while (syncController.SyncState != SyncState.Finished); }