示例#1
0
        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);
        }