public async Task <bool> Connect(string serverAddress = null) { _dialogService.ShowLoadingIndicator("Connecting..."); bool result = false; if (serverAddress == null) { // Get cached server address serverAddress = _repository.GetSettingValue <string>(Settings.ServerAddress); } if (serverAddress == null && !_isClient) { serverAddress = Api.Common.Utils.GetAddressFromHost("localhost"); } Logger.Info("Connecting to {0}", serverAddress); if (serverAddress != null) { _factory = GetFactory(new EndpointAddress(serverAddress)); CreateChannel(); // Try to connect bool response; if (Api.Common.Utils.TrySafeCall(() => _serverAppService.Ping(), out response) && response) { Logger.Info("Server responded to ping request, initializing client"); _repository.SaveSetting(Settings.ServerAddress, serverAddress); ServerState serverState; if (Api.Common.Utils.TrySafeCall(() => _serverAppService.InitClient(), out serverState)) { Logger.Info("Service state is '{0}'", serverState); switch (serverState) { case ServerState.Initializing: // Wait 120s while service is starting var startTime = DateTime.UtcNow; _dialogService.ShowLoadingIndicator("Waiting while service is starting..."); while ((DateTime.UtcNow - startTime).TotalMilliseconds < ServiceReadyTimeoutMs) { await TaskEx.Delay(1000); if (Api.Common.Utils.TrySafeCall(() => _serverAppService.InitClient(), out serverState) && serverState != ServerState.Initializing) { break; } } _dialogService.HideLoadingIndicator(); if (serverState == ServerState.Initializing) { _dialogService.HideLoadingIndicator(); _dialogService.Show("Cannot load data from the Chewsi plugin's service. Server is not ready.", "Error"); } else { return(await Connect(serverAddress).ConfigureAwait(false)); } break; case ServerState.Ready: SettingsDto settings; if (Api.Common.Utils.TrySafeCall(_serverAppService.GetSettings, out settings) && settings != null) { RaisePropertyChanged(() => Title); _settingsViewModel.InjectAppServiceAndInit(this, settings, serverAddress, _launcherService.GetLauncherStartup(), _isClient); await ReloadClaims().ConfigureAwait(false); SetState(ClientState.Ready); RaiseInitGetter(); result = true; // Start PMS if (settings.StartPms) { string pmsExePath; if (Api.Common.Utils.TrySafeCall(_serverAppService.GetPmsExecutablePath, out pmsExePath) && pmsExePath != null) { Logger.Info("Starting PMS: {0}", pmsExePath); _launcherService.StartPms(pmsExePath); } } } else { await TaskEx.Delay(2000); await Connect(serverAddress); } break; case ServerState.InvalidSettings: OpenSettingsForReview(serverAddress); break; default: throw new ArgumentOutOfRangeException(); } } else { await TaskEx.Delay(2000); await Connect(serverAddress).ConfigureAwait(false); } } else { Logger.Warn("Server didn't respond to ping request"); } } else { Logger.Warn("Server address is null, showing 'Connection' view"); serverAddress = Api.Common.Utils.GetAddressFromHost("localhost"); _connectViewModel.Show(serverAddress); } _dialogService.HideLoadingIndicator(); return(result); }