Exemplo n.º 1
0
        public ServerLogWindow(ShadowsocksController controller, WindowStatus status)
        {
            InitializeComponent();
            I18NUtil.SetLanguage(Resources, @"ServerLogWindow");
            LoadLanguage();

            _controller = controller;
            Closed     += (o, e) => { _controller.ConfigChanged -= controller_ConfigChanged; };
            _controller.ConfigChanged += controller_ConfigChanged;
            LoadConfig(true);

            ServerDataGrid.GridColumnSizer.SortIconWidth = 0;
            if (status == null)
            {
                SizeToContent                    = SizeToContent.Width;
                Height                           = 600;
                WindowStartupLocation            = WindowStartupLocation.CenterScreen;
                ServerDataGrid.ShowBusyIndicator = false;
            }
            else
            {
                ServerDataGrid.ShowBusyIndicator = true;
                SizeToContent = SizeToContent.Manual;
                status.SetStatus(this);
            }
        }
Exemplo n.º 2
0
 public static void CheckPort(int port)
 {
     if (port <= IPEndPoint.MinPort || port > IPEndPoint.MaxPort)
     {
         throw new ConfigurationException(I18NUtil.GetAppStringValue(@"PortOutOfRange"));
     }
 }
Exemplo n.º 3
0
        private void LoadLanguage()
        {
            UpdateTitle();

            foreach (var c in ViewUtils.FindVisualChildren <Label>(this))
            {
                c.Content = I18N.GetString(c.Content.ToString());
            }

            foreach (var c in ViewUtils.FindVisualChildren <Button>(this))
            {
                c.Content = I18N.GetString(c.Content.ToString());
            }

            foreach (var c in ViewUtils.FindVisualChildren <CheckBox>(this))
            {
                c.Content = I18N.GetString(c.Content.ToString());
            }

            foreach (var c in ViewUtils.FindVisualChildren <GroupBox>(this))
            {
                c.Header = I18N.GetString(c.Header.ToString());
            }

            ProxyTypeComboBox.Items.Add(I18N.GetString(@"Socks5(support UDP)"));
            ProxyTypeComboBox.Items.Add(I18N.GetString(@"Http tunnel"));
            ProxyTypeComboBox.Items.Add(I18N.GetString(@"TCP Port tunnel"));
            foreach (var value in Enum.GetValues(typeof(LoadBalance)))
            {
                var str = value.ToString();
                _balanceIndexMap.Add(str);
                BalanceComboBox.Items.Add(I18NUtil.GetAppStringValue(str));
            }
        }
Exemplo n.º 4
0
 public SettingsWindow(MainController controller)
 {
     InitializeComponent();
     I18NUtil.SetLanguage(Resources, @"SettingsWindow");
     Closed     += (o, e) => { _controller.ConfigChanged -= controller_ConfigChanged; };
     _controller = controller;
 }
        private static void ThrowSocketException(ref Exception e)
        {
            // TODO:translate Microsoft language into human language
            // i.e. An attempt was made to access a socket in a way forbidden by its access permissions => Port already in use
            // https://docs.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socketerror
            if (e is not SocketException se)
            {
                return;
            }

            switch (se.SocketErrorCode)
            {
            case SocketError.AddressAlreadyInUse:
            {
                e = new Exception(string.Format(I18NUtil.GetAppStringValue(@"PortInUse"), Global.GuiConfig.LocalPort), se);
                break;
            }

            case SocketError.AccessDenied:
            {
                e = new Exception(string.Format(I18NUtil.GetAppStringValue(@"PortReserved"), Global.GuiConfig.LocalPort), se);
                break;
            }
            }
        }
        public ServerConfigWindow(MainController controller, int focusIndex)
        {
            InitializeComponent();
            I18NUtil.SetLanguage(Resources, @"ConfigWindow");
            SizeChanged         += (o, args) => { GenQr(LinkTextBox.Text); };
            Splitter2.DragDelta += (o, args) => { GenQr(LinkTextBox.Text); };
            Closed += (o, e) =>
            {
                _controller.ConfigChanged            -= controller_ConfigChanged;
                ServerConfigViewModel.ServersChanged -= ServerViewModel_ServersChanged;
            };

            _controller = controller;
            foreach (var name in from name in EncryptorFactory.RegisteredEncryptors.Keys let info = EncryptorFactory.GetEncryptorInfo(name) where info.Display select name)
            {
                EncryptionComboBox.Items.Add(name);
            }
            foreach (var protocol in Protocols)
            {
                ProtocolComboBox.Items.Add(protocol);
            }
            foreach (var obfs in ObfsStrings)
            {
                ObfsComboBox.Items.Add(obfs);
            }

            _controller.ConfigChanged            += controller_ConfigChanged;
            ServerConfigViewModel.ServersChanged += ServerViewModel_ServersChanged;
            _focusIndex = focusIndex;
            ServersTreeView_OnSelectionChanged(this, new ItemSelectionChangedEventArgs());
        }
Exemplo n.º 7
0
        public ConfigWindow(ShadowsocksController controller, int focusIndex)
        {
            InitializeComponent();
            I18NUtil.SetLanguage(Resources, @"ConfigWindow");
            SizeChanged         += (o, args) => { GenQr(LinkTextBox.Text); };
            Splitter2.DragDelta += (o, args) => { GenQr(LinkTextBox.Text); };
            Closed += (o, e) =>
            {
                _controller.ConfigChanged      -= controller_ConfigChanged;
                ServerViewModel.ServersChanged -= ServerViewModel_ServersChanged;
            };

            _controller = controller;
            foreach (var name in from name in EncryptorFactory.RegisteredEncryptors.Keys let info = EncryptorFactory.GetEncryptorInfo(name) where info.Display select name)
            {
                EncryptionComboBox.Items.Add(name);
            }
            foreach (var protocol in Protocols)
            {
                ProtocolComboBox.Items.Add(protocol);
            }
            foreach (var obfs in ObfsStrings)
            {
                ObfsComboBox.Items.Add(obfs);
            }

            _controller.ConfigChanged      += controller_ConfigChanged;
            ServerViewModel.ServersChanged += ServerViewModel_ServersChanged;
            _focusIndex = focusIndex;
            ServerGroupBox.Visibility = ServersTreeView.SelectedValue == null ? Visibility.Hidden : Visibility.Visible;
        }
Exemplo n.º 8
0
        private async void BrowseCustom_Click(object sender, RoutedEventArgs e)
        {
            using (var openFileDialog = new CommonOpenFileDialog
            {
                IsFolderPicker = true,
                Title = "Select Folder"
            })
            {
                var result = openFileDialog.ShowDialog();
                if (result != CommonFileDialogResult.Ok)
                {
                    return;
                }
                var path = openFileDialog.FileName;
                try
                {
                    TbCustomPath.Text = path;
                    await Service.Get <OsuFileScanner>().CancelTaskAsync();

                    await Service.Get <OsuFileScanner>().NewScanAndAddAsync(path);

                    AppSettings.Default.General.CustomSongsPath = path;
                    AppSettings.SaveDefault();
                }
                catch (Exception ex)
                {
                    Logger.Error(ex, "Error while scanning custom folder: {0}", path);
                    MessageBox.Show(_configWindow, string.Format("{0}: {1}\r\n{2}",
                                                                 I18NUtil.GetString("err-custom-scan"), path, ex.Message),
                                    _configWindow.Title, MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
        }
Exemplo n.º 9
0
 public static void CheckPort(int port)
 {
     if (!IsPort(port))
     {
         throw new ConfigurationException(I18NUtil.GetAppStringValue(@"PortOutOfRange"));
     }
 }
Exemplo n.º 10
0
        private async void CheckUpdate_Click(object sender, RoutedEventArgs e)
        {
            //todo: action
            CheckUpdate.IsEnabled = false;
            bool?hasNew;

            try
            {
                hasNew = await Service.Get <UpdateInst>().CheckUpdateAsync();
            }
            catch (Exception ex)
            {
                MessageBox.Show(_configWindow, I18NUtil.GetString("ui-sets-content-errorWhileCheckingUpdate") + Environment.NewLine +
                                (ex.InnerException?.Message ?? ex.Message),
                                _configWindow.Title, MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            CheckUpdate.IsEnabled = true;

            AppSettings.Default.LastUpdateCheck = DateTime.Now;
            GetLastUpdate();
            AppSettings.SaveDefault();
            if (hasNew == true)
            {
                NewVersion.Visibility = Visibility.Visible;
                NewVersion_Click(sender, e);
            }
            else
            {
                MessageBox.Show(_configWindow, I18NUtil.GetString("ui-sets-content-alreadyNewest"), _configWindow.Title,
                                MessageBoxButton.OK, MessageBoxImage.Information);
            }
        }
 public PortSettingsWindow(ShadowsocksController controller)
 {
     InitializeComponent();
     I18NUtil.SetLanguage(Resources, @"PortSettingsWindow");
     Closed     += (o, e) => { _controller.ConfigChanged -= controller_ConfigChanged; };
     _controller = controller;
     LoadItems();
 }
Exemplo n.º 12
0
 public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
 {
     if (value is ProxyType type)
     {
         return(I18NUtil.GetAppStringValue(type.ToString()));
     }
     return(DependencyProperty.UnsetValue);
 }
Exemplo n.º 13
0
        private void Language_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var locale = I18NUtil.AvailableLangDic[(string)e.AddedItems[0]];

            I18NUtil.SwitchToLang(locale);
            AppSettings.Default.Interface.Locale = locale;
            AppSettings.SaveDefault();
        }
Exemplo n.º 14
0
 private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
 {
     if (Interlocked.Increment(ref _exited) == 1)
     {
         Logging.Log(LogLevel.Error, $@"{e.ExceptionObject}");
         MessageBox.Show(
             $@"{I18NUtil.GetAppStringValue(@"UnexpectedError")}{Environment.NewLine}{e.ExceptionObject}",
             UpdateChecker.Name, MessageBoxButton.OK, MessageBoxImage.Error);
         Application.Current.Shutdown();
     }
 }
Exemplo n.º 15
0
 public DnsSettingWindow()
 {
     InitializeComponent();
     I18NUtil.SetLanguage(Resources, @"DnsSettingWindow");
     Closed += (o, e) =>
     {
         DnsSettingViewModel.DnsClientsChanged -= DnsSettingViewModel_DnsClientsChanged;
     };
     DnsSettingViewModel.DnsClientsChanged += DnsSettingViewModel_DnsClientsChanged;
     LoadConfig();
 }
Exemplo n.º 16
0
 private void LoadItems()
 {
     ProxyTypeComboBox.Items.Add(this.GetWindowStringValue(@"Socks5"));
     ProxyTypeComboBox.Items.Add(this.GetWindowStringValue(@"Http"));
     ProxyTypeComboBox.Items.Add(this.GetWindowStringValue(@"TcpPortTunnel"));
     foreach (var value in Enum.GetValues(typeof(LoadBalance)))
     {
         var str = value.ToString();
         _balanceIndexMap.Add(str);
         BalanceComboBox.Items.Add(I18NUtil.GetAppStringValue(str));
     }
 }
Exemplo n.º 17
0
 private static void SingleInstance_ArgumentsReceived(object sender, ArgumentsReceivedEventArgs e)
 {
     if (e.Args.Contains(Constants.ParameterMultiplyInstance))
     {
         MessageBox.Show(I18NUtil.GetAppStringValue(@"SuccessiveInstancesMessage1") + Environment.NewLine +
                         I18NUtil.GetAppStringValue(@"SuccessiveInstancesMessage2"),
                         I18NUtil.GetAppStringValue(@"SuccessiveInstancesCaption"), MessageBoxButton.OK, MessageBoxImage.Information);
     }
     Application.Current.Dispatcher?.Invoke(() =>
     {
         _viewController.ImportAddress(string.Join(Environment.NewLine, e.Args));
     });
 }
Exemplo n.º 18
0
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (!(value is DeviceInfo b))
            {
                return(value);
            }
            if (b.Equals(DeviceInfo.DefaultWasapi))
            {
                return(I18NUtil.GetString("ui-sets-content-systemDefault"));
            }

            return($"({b.Provider}) {b.Name}");
        }
Exemplo n.º 19
0
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (!(value is IDeviceInfo b))
            {
                return(value);
            }
            if (b.Equals(WasapiInfo.Default))
            {
                return(I18NUtil.GetString("ui-sets-content-systemDefault"));
            }

            return($"({b.OutputMethod}) {b.FriendlyName}");
        }
 public SubscribeWindow(MainController controller)
 {
     InitializeComponent();
     I18NUtil.SetLanguage(Resources, @"SubscribeWindow");
     Closed += (o, e) =>
     {
         controller.ConfigChanged -= controller_ConfigChanged;
         SubscribeWindowViewModel.SubscribesChanged -= SubscribeWindowViewModel_SubscribesChanged;
     };
     _controller = controller;
     _controller.ConfigChanged += controller_ConfigChanged;
     LoadCurrentConfiguration();
     SubscribeWindowViewModel.SubscribesChanged += SubscribeWindowViewModel_SubscribesChanged;
 }
Exemplo n.º 21
0
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is bool enable)
            {
                if (targetType == typeof(string))
                {
                    return(I18NUtil.GetAppStringValue(enable ? @"Enabled" : @"Disabled"));
                }

                if (targetType == typeof(Brush))
                {
                    return(enable ? Brushes.Green : Brushes.Red);
                }
            }
            return(DependencyProperty.UnsetValue);
        }
Exemplo n.º 22
0
        private async void BtnDelCol_Click(object sender, RoutedEventArgs e)
        {
            var result = MessageBox.Show(_mainWindow, I18NUtil.GetString("ui-ensureRemoveCollection"), _mainWindow.Title, MessageBoxButton.OKCancel,
                                         MessageBoxImage.Exclamation);

            if (result != MessageBoxResult.OK)
            {
                return;
            }
            await using var dbContext = new ApplicationDbContext();

            await dbContext.DeleteCollection(ViewModel.Collection);

            _mainWindow.SwitchRecent.IsChecked = true;
            await _mainWindow.UpdateCollections();
        }
 public SubscribeWindow(ShadowsocksController controller, UpdateSubscribeManager updateSubscribeManager, UpdateNode updateNodeChecker)
 {
     InitializeComponent();
     I18NUtil.SetLanguage(Resources, @"SubscribeWindow");
     Closed += (o, e) =>
     {
         controller.ConfigChanged -= controller_ConfigChanged;
         SubscribeWindowViewModel.SubscribesChanged -= SubscribeWindowViewModel_SubscribesChanged;
     };
     _controller                = controller;
     _updateSubscribeManager    = updateSubscribeManager;
     _updateNodeChecker         = updateNodeChecker;
     _controller.ConfigChanged += controller_ConfigChanged;
     LoadCurrentConfiguration();
     SubscribeWindowViewModel.SubscribesChanged += SubscribeWindowViewModel_SubscribesChanged;
 }
        public ConfigWindow(ShadowsocksController controller, int focusIndex)
        {
            InitializeComponent();
            I18NUtil.SetLanguage(Resources, @"ConfigWindow");
            SizeChanged         += (o, args) => { GenQr(LinkTextBox.Text); };
            Splitter2.DragDelta += (o, args) => { GenQr(LinkTextBox.Text); };
            Closed += (o, e) =>
            {
                _controller.ConfigChanged      -= controller_ConfigChanged;
                ServerViewModel.ServersChanged -= ServerViewModel_ServersChanged;
            };

            _controller = controller;
            foreach (var name in from name in EncryptorFactory.GetEncryptor().Keys let info = EncryptorFactory.GetEncryptorInfo(name) where info.display select name)
            {
                EncryptionComboBox.Items.Add(name);
            }
            foreach (var protocol in Protocols)
            {
                ProtocolComboBox.Items.Add(protocol);
            }
            foreach (var obfs in ObfsStrings)
            {
                ObfsComboBox.Items.Add(obfs);
            }

            _controller.ConfigChanged += controller_ConfigChanged;

            LoadCurrentConfiguration();
            ServerViewModel.ServersChanged += ServerViewModel_ServersChanged;

            if (focusIndex == -1)
            {
                var index = _modifiedConfiguration.index + 1;
                if (index < 0 || index > _modifiedConfiguration.configs.Count)
                {
                    index = _modifiedConfiguration.configs.Count;
                }

                focusIndex = index;
            }

            if (focusIndex >= 0 && focusIndex < _modifiedConfiguration.configs.Count)
            {
                SetServerListSelectedIndex(focusIndex);
            }
        }
Exemplo n.º 25
0
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var shown = (bool)value;

            if (System.Convert.ToString(parameter) == "string")
            {
                return(shown ? I18NUtil.GetString("ui-closeDesktopLyric") : I18NUtil.GetString("ui-openDesktopLyric"));
            }
            else if (System.Convert.ToString(parameter) == "bool")
            {
                return(shown);
            }
            else
            {
                return(null);
            }
        }
Exemplo n.º 26
0
        private async void SyncNow_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                await Service.Get <OsuDbInst>().SyncOsuDbAsync(AppSettings.Default.General.DbPath, false);

                AppSettings.Default.LastTimeScanOsuDb = DateTime.Now;
                AppSettings.SaveDefault();
            }
            catch (Exception ex)
            {
                var path = AppSettings.Default.General.DbPath;
                Logger.Error(ex, "Error while scanning custom folder: {0}", path);
                MessageBox.Show(_configWindow, string.Format("{0}: {1}\r\n{2}",
                                                             I18NUtil.GetString("err-custom-scan"), path, ex.Message),
                                _configWindow.Title, MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        private void ThrowSocketException(ref Exception e)
        {
            // translate Microsoft language into human language
            // i.e. An attempt was made to access a socket in a way forbidden by its access permissions => Port already in use
            if (e is SocketException se)
            {
                switch (se.SocketErrorCode)
                {
                case SocketError.AddressAlreadyInUse:
                {
                    e = new Exception(string.Format(I18NUtil.GetAppStringValue(@"PortInUse"), _config.localPort), se);
                    break;
                }

                case SocketError.AccessDenied:
                {
                    e = new Exception(string.Format(I18NUtil.GetAppStringValue(@"PortReserved"), _config.localPort), se);
                    break;
                }
                }
            }
        }
Exemplo n.º 28
0
        private async void Application_Startup(object sender, StartupEventArgs e)
        {
            AppDomain.CurrentDomain.UnhandledException += OnCurrentDomainOnUnhandledException;
            DispatcherUnhandledException += Application_DispatcherUnhandledException;

            await EntryStartup.StartupAsync();

            var controller = new ObservablePlayController();

            controller.PlayList.Mode = AppSettings.Default.Play.PlayListMode;

            Service.TryAddInstance(controller);
            Service.TryAddInstance(new OsuDbInst());
            Service.TryAddInstance(new LyricsInst());
            Service.TryAddInstance(new UpdateInst());
            Service.TryAddInstance(new OsuFileScanner());

            Service.Get <LyricsInst>().ReloadLyricProvider();

            Execute.SetMainThreadContext();
            I18NUtil.LoadI18N();
        }
Exemplo n.º 29
0
        private async void BrowseDb_Click(object sender, RoutedEventArgs e)
        {
            var result = CommonUtils.BrowseDb(out var path);

            if (!result.HasValue || !result.Value)
            {
                return;
            }
            try
            {
                await Service.Get <OsuDbInst>().SyncOsuDbAsync(path, false);

                TbDbPath.Text = path;
                AppSettings.Default.General.DbPath = path;
                AppSettings.SaveDefault();
            }
            catch (Exception ex)
            {
                Logger.Error(ex, "Error while syncing osu!db: {0}", path);
                MessageBox.Show(_configWindow, string.Format("{0}: {1}\r\n{2}",
                                                             I18NUtil.GetString("err-osudb-sync"), path, ex.Message),
                                _configWindow.Title, MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
Exemplo n.º 30
0
        private void Reload()
        {
            if (_port_map_listener != null)
            {
                foreach (var l in _port_map_listener)
                {
                    l.Stop();
                }
                _port_map_listener = null;
            }
            // some logic in configuration updated the config when saving, we need to read it again
            _config = MergeGetConfiguration(_config);
            _config.FlushPortMapCache();
            Logging.save_to_file = _config.logEnable;
            Logging.OpenLogFile();
            ReloadIPRange();

            var hostMap = new HostMap();

            hostMap.LoadHostFile();
            HostMap.Instance().Clear(hostMap);

            GlobalConfiguration.OSSupportsLocalIPv6 = Socket.OSSupportsIPv6;

            if (privoxyRunner == null)
            {
                privoxyRunner = new HttpProxyRunner();
            }
            if (_pacDaemon == null)
            {
                _pacDaemon = new PACDaemon();
                _pacDaemon.PACFileChanged      += PacDaemon_PACFileChanged;
                _pacDaemon.UserRuleFileChanged += PacDaemon_UserRuleFileChanged;
            }
            if (_pacServer == null)
            {
                _pacServer = new PACServer(_pacDaemon);
            }
            _pacServer.UpdatePacUrl(_config);
            if (gfwListUpdater == null)
            {
                gfwListUpdater = new GFWListUpdater();
                gfwListUpdater.UpdateCompleted += pacServer_PACUpdateCompleted;
                gfwListUpdater.Error           += pacServer_PACUpdateError;
            }
            if (chnDomainsAndIPUpdater == null)
            {
                chnDomainsAndIPUpdater = new ChnDomainsAndIPUpdater();
                chnDomainsAndIPUpdater.UpdateCompleted += pacServer_PACUpdateCompleted;
                chnDomainsAndIPUpdater.Error           += pacServer_PACUpdateError;
            }

            _listener?.Stop();

            privoxyRunner.Stop();
            // don't put privoxyRunner.Start() before pacServer.Stop()
            // or bind will fail when switching bind address from 0.0.0.0 to 127.0.0.1
            // though UseShellExecute is set to true now
            // http://stackoverflow.com/questions/10235093/socket-doesnt-close-after-application-exits-if-a-launched-process-is-open
            try
            {
                privoxyRunner.Start(_config);

                var local    = new Local(_config, _transfer, _rangeSet);
                var services = new List <Listener.IService>
                {
                    local,
                    _pacServer,
                    new APIServer(this, _config),
                    new HttpPortForwarder(privoxyRunner.RunningPort, _config)
                };
                _listener = new Listener(services);
                _listener.Start(_config, 0);
            }
            catch (Exception e)
            {
                // translate Microsoft language into human language
                // i.e. An attempt was made to access a socket in a way forbidden by its access permissions => Port already in use
                if (e is SocketException se)
                {
                    switch (se.SocketErrorCode)
                    {
                    case SocketError.AddressAlreadyInUse:
                    {
                        e = new Exception(string.Format(I18NUtil.GetAppStringValue(@"PortInUse"), _config.localPort), se);
                        break;
                    }

                    case SocketError.AccessDenied:
                    {
                        e = new Exception(string.Format(I18NUtil.GetAppStringValue(@"PortReserved"), _config.localPort), se);
                        break;
                    }
                    }
                }

                Logging.LogUsefulException(e);
                ReportError(e);
            }

            _port_map_listener = new List <Listener>();
            foreach (var pair in _config.GetPortMapCache())
            {
                try
                {
                    var local    = new Local(_config, _transfer, _rangeSet);
                    var services = new List <Listener.IService> {
                        local
                    };
                    var listener = new Listener(services);
                    listener.Start(_config, pair.Key);
                    _port_map_listener.Add(listener);
                }
                catch (Exception e)
                {
                    // translate Microsoft language into human language
                    // i.e. An attempt was made to access a socket in a way forbidden by its access permissions => Port already in use
                    if (e is SocketException se)
                    {
                        if (se.SocketErrorCode == SocketError.AddressAlreadyInUse)
                        {
                            e = new Exception(string.Format(I18NUtil.GetAppStringValue(@"PortInUse"), pair.Key), e);
                        }
                        else if (se.SocketErrorCode == SocketError.AccessDenied)
                        {
                            e = new Exception(string.Format(I18NUtil.GetAppStringValue(@"PortReserved"), pair.Key), se);
                        }
                    }
                    Logging.LogUsefulException(e);
                    ReportError(e);
                }
            }

            Application.Current.Dispatcher?.Invoke(() => { ConfigChanged?.Invoke(this, new EventArgs()); });

            UpdateSystemProxy();
            Utils.ReleaseMemory();
        }