コード例 #1
0
        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);
                }
            });
        }
コード例 #2
0
        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();
        }