public LoginViewModel(IDispatcher dispatcher) { Status = "Ready"; Hosts = new BindingList <string>(); _loginService = new LinuxLoginService(dispatcher); //var canService = new CanDiscoveryService("_smb._tcp", Settings.Default.MDnsDomain); var canService = new CanDiscoveryService(); canService .Cans .ObserveOn(WindowsFormsSynchronizationContext.Current) .Subscribe(UpdateCans); //var insertion = Observable.Timer(TimeSpan.FromSeconds(5)) // .Select(_ => Tuple.Create(100u, Observable.Never<Unit>())); // insertion //.ObserveOn(WindowsFormsSynchronizationContext.Current) _cardService = new CardAuthenticationService(); var subscription = _cardService.Insertion .Subscribe( insert => { Debug.WriteLine("LoginViewModel: Card inserted"); _loginService.Connect( Settings.Default.CardHost, insert.Item1.ToString(), String.Empty, true); insert.Item2.Subscribe(_ => _loginService.Disconnect()); }, error => dispatcher.Dispatch(() => Status = error.Message)); Application.ApplicationExit += (s, e) => subscription.Dispose(); _loginCommand = new DelegateCommand <string>( _ => _loginService.Connect(Hostname, Username, Password), _ => CanLogin); _loginService.StateChanged .ObserveOn(WindowsFormsSynchronizationContext.Current) .Subscribe( state => { CanLogin = state.Status == LoginStatus.Disconnected; Status = state.Status.ToString(); if (state.Error != null) { MessageBox.Show(state.Error.Message + Environment.NewLine + state.Error.StackTrace); } }); }
public LoginViewModel( ILoginService loginService, ICanDiscoveryService canDiscoveryService) { _loginService = loginService; _canDiscovery = canDiscoveryService; Cans = new ObservableCollection <Can>(); _loginCommand = new DelegateCommand <PasswordBox>( pbx => _loginService.Connect(SelectedCan.HostName, Username, pbx.SecurePassword.String()), _ => CanLogin); _loginService.StateChanged .ObserveOn(SynchronizationContext.Current) .Subscribe( state => { _canLogin = state.Status == LoginStatus.Disconnected; _loginCommand.RaiseCanExecuteChanged(); Status = state.Status.ToString(); StatusMessage = (state.Error == null) ? String.Empty : state.Error.Message; }); _showSettingsCommand = new DelegateCommand <object>( _ => new Windows.SettingsWindow().ShowDialog()); StatusMessage = "Ready"; var settingsChanging = Observable.FromEventPattern <CancelEventArgs>(Settings.Default, "SettingsSaving"); var customCans = Observable.Defer(() => (from evt in settingsChanging let custom = Settings.Default.CustomHosts where custom != null select custom) .StartWith(Settings.Default.CustomHosts ?? Enumerable.Empty <Can>())); _canDiscovery .Cans.StartWith(Enumerable.Empty <Can>()) .CombineLatest(customCans, (a, b) => a.Concat(b)) .ObserveOn(SynchronizationContext.Current) .Do(_ => { }, ex => StatusMessage = "Zeroconf failed") .OnErrorResumeNext(customCans) .Subscribe(UpdateCans, ex => StatusMessage = "Cans failure"); var _cardService = new CardAuthenticationService(); var subscription = _cardService.Insertion .ObserveOn(SynchronizationContext.Current) // .Do(_ => { }, error => StatusMessage = error.Message) // .Retry() .Subscribe( insert => { Debug.WriteLine("LoginViewModel: Card inserted"); _loginService.Connect( Settings.Default.CardHost, insert.Item1.ToString(), String.Empty, true); insert.Item2 .ObserveOn(SynchronizationContext.Current) .Subscribe(_ => _loginService.Disconnect()); }, error => StatusMessage = error.Message); Application.Current.Exit += (s, e) => subscription.Dispose(); }