using System.Globalization;\r
using System.IO;\r
using System.Linq;\r
-using System.Net.Sockets;\r
using System.Runtime.InteropServices;\r
using System.Text;\r
using System.Text.RegularExpressions;\r
using System.Threading.Tasks;\r
using System.Windows.Forms;\r
using Microsoft.CSharp.RuntimeBinder;\r
-using Microsoft.Win32;\r
using static System.Math;\r
\r
namespace KancolleSniffer\r
private readonly Sniffer _sniffer = new Sniffer();\r
private readonly Config _config = new Config();\r
private readonly ConfigDialog _configDialog;\r
+ private readonly ProxyManager _proxyManager;\r
private int _currentFleet;\r
private bool _combinedFleet;\r
private readonly Label[] _labelCheckFleets;\r
private bool _started;\r
private string _debugLogFile;\r
private IEnumerator<string> _playLog;\r
- private int _prevProxyPort;\r
- private readonly SystemProxy _systemProxy = new SystemProxy();\r
+\r
private readonly ErrorDialog _errorDialog = new ErrorDialog();\r
private bool _missionFinishTimeMode;\r
private bool _ndockFinishTimeMode;\r
_listForm = new ListForm(_sniffer, _config) {Owner = this};\r
_notificationManager = new NotificationManager(Ring);\r
_config.Load();\r
+ _proxyManager = new ProxyManager(_config, this);\r
PerformZoom();\r
_shipLabels.AdjustAkashiTimers();\r
_sniffer.LoadState();\r
ApplyDebugLogSetting();\r
ApplyLogSetting();\r
ApplyProxySetting();\r
- SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;\r
if (_config.KancolleDb.On)\r
_kancolleDb.Start(_config.KancolleDb.Token);\r
}\r
\r
- private void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)\r
- {\r
- if (e.Mode != PowerModes.Resume || !_config.Proxy.Auto)\r
- return;\r
- SystemProxy.Refresh();\r
- }\r
-\r
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)\r
{\r
using (var dialog = new ConfirmDialog())\r
_sniffer.FlashLog();\r
_config.Location = (WindowState == FormWindowState.Normal ? Bounds : RestoreBounds).Location;\r
_config.Save();\r
- Task.Run(() => ShutdownProxy());\r
- if (_config.Proxy.Auto)\r
- _systemProxy.RestoreSettings();\r
- SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged;\r
+ _proxyManager.Shutdown();\r
_kancolleDb.Stop();\r
}\r
\r
- private void ShutdownProxy()\r
- {\r
- HttpProxy.Shutdown();\r
- }\r
-\r
private void MainForm_Resize(object sender, EventArgs e)\r
{\r
ShowInTaskbar = !(_config.HideOnMinimized && WindowState == FormWindowState.Minimized);\r
\r
public bool ApplyProxySetting()\r
{\r
- if (!_config.Proxy.Auto)\r
- _systemProxy.RestoreSettings();\r
- if (_config.Proxy.UseUpstream)\r
- {\r
- HttpProxy.UpstreamProxyHost = "127.0.0.1";\r
- HttpProxy.UpstreamProxyPort = _config.Proxy.UpstreamPort;\r
- }\r
- HttpProxy.IsEnableUpstreamProxy = _config.Proxy.UseUpstream;\r
- var result = true;\r
- if (!HttpProxy.IsInListening || _config.Proxy.Listen != _prevProxyPort)\r
- {\r
- ShutdownProxy();\r
- result = StartProxy();\r
- }\r
- if (_config.Proxy.Auto && result)\r
- {\r
- _systemProxy.SetAutoProxyUrl($"http://localhost:{_config.Proxy.Listen}/proxy.pac");\r
- }\r
- _prevProxyPort = _config.Proxy.Listen;\r
- return result;\r
- }\r
-\r
- private bool StartProxy()\r
- {\r
- try\r
- {\r
- HttpProxy.Startup(_config.Proxy.Listen, false, false);\r
- }\r
- catch (SocketException e)\r
- {\r
- if (e.SocketErrorCode != SocketError.AddressAlreadyInUse)\r
- throw;\r
- if (WarnConflictPortNumber("プロキシサーバー", _config.Proxy.Listen, _config.Proxy.Auto) == DialogResult.No ||\r
- !_config.Proxy.Auto)\r
- {\r
- _systemProxy.RestoreSettings();\r
- return false;\r
- }\r
- HttpProxy.Startup(0, false, false);\r
- _config.Proxy.Listen = HttpProxy.LocalPort;\r
- }\r
- return true;\r
- }\r
-\r
- private DialogResult WarnConflictPortNumber(string name, int port, bool auto)\r
- {\r
- var msg = $"{name}のポート番号{port}は他のアプリケーションが使用中です。";\r
- var cap = "ポート番号の衝突";\r
- return auto\r
- ? MessageBox.Show(this, msg + "自動的に別の番号を割り当てますか?", cap,\r
- MessageBoxButtons.YesNo, MessageBoxIcon.Question)\r
- : MessageBox.Show(this, msg + "設定ダイアログでポート番号を変更してください。", cap,\r
- MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\r
+ return _proxyManager.ApplyConfig();\r
}\r
\r
public void ApplyLogSetting()\r
--- /dev/null
+// Copyright (C) 2017 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
+//\r
+// Licensed under the Apache License, Version 2.0 (the "License");\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+//\r
+// http://www.apache.org/licenses/LICENSE-2.0\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// See the License for the specific language governing permissions and\r
+// limitations under the License.\r
+\r
+using System.Net.Sockets;\r
+using System.Threading.Tasks;\r
+using System.Windows.Forms;\r
+using Microsoft.Win32;\r
+\r
+namespace KancolleSniffer\r
+{\r
+ public class ProxyManager\r
+ {\r
+ private readonly Config _config;\r
+ private readonly Control _parent;\r
+ private readonly SystemProxy _systemProxy = new SystemProxy();\r
+ private int _prevProxyPort;\r
+\r
+ public ProxyManager(Config config, Control parent)\r
+ {\r
+ _config = config;\r
+ _parent = parent;\r
+ SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;\r
+ }\r
+\r
+ public bool ApplyConfig()\r
+ {\r
+ if (!_config.Proxy.Auto)\r
+ _systemProxy.RestoreSettings();\r
+ if (_config.Proxy.UseUpstream)\r
+ {\r
+ HttpProxy.UpstreamProxyHost = "127.0.0.1";\r
+ HttpProxy.UpstreamProxyPort = _config.Proxy.UpstreamPort;\r
+ }\r
+ HttpProxy.IsEnableUpstreamProxy = _config.Proxy.UseUpstream;\r
+ var result = true;\r
+ if (!HttpProxy.IsInListening || _config.Proxy.Listen != _prevProxyPort)\r
+ {\r
+ ShutdownProxy();\r
+ result = StartProxy();\r
+ }\r
+ if (_config.Proxy.Auto && result)\r
+ {\r
+ _systemProxy.SetAutoProxyUrl($"http://localhost:{_config.Proxy.Listen}/proxy.pac");\r
+ }\r
+ _prevProxyPort = _config.Proxy.Listen;\r
+ return result;\r
+ }\r
+\r
+ private bool StartProxy()\r
+ {\r
+ try\r
+ {\r
+ HttpProxy.Startup(_config.Proxy.Listen, false, false);\r
+ }\r
+ catch (SocketException e)\r
+ {\r
+ if (e.SocketErrorCode != SocketError.AddressAlreadyInUse)\r
+ throw;\r
+ if (WarnConflictPortNumber("プロキシサーバー", _config.Proxy.Listen, _config.Proxy.Auto) == DialogResult.No ||\r
+ !_config.Proxy.Auto)\r
+ {\r
+ _systemProxy.RestoreSettings();\r
+ return false;\r
+ }\r
+ HttpProxy.Startup(0, false, false);\r
+ _config.Proxy.Listen = HttpProxy.LocalPort;\r
+ }\r
+ return true;\r
+ }\r
+\r
+ private DialogResult WarnConflictPortNumber(string name, int port, bool auto)\r
+ {\r
+ var msg = $"{name}のポート番号{port}は他のアプリケーションが使用中です。";\r
+ var cap = "ポート番号の衝突";\r
+ return auto\r
+ ? MessageBox.Show(_parent, msg + "自動的に別の番号を割り当てますか?", cap,\r
+ MessageBoxButtons.YesNo, MessageBoxIcon.Question)\r
+ : MessageBox.Show(_parent, msg + "設定ダイアログでポート番号を変更してください。", cap,\r
+ MessageBoxButtons.OK, MessageBoxIcon.Exclamation);\r
+ }\r
+\r
+ private void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)\r
+ {\r
+ if (e.Mode != PowerModes.Resume || !_config.Proxy.Auto)\r
+ return;\r
+ SystemProxy.Refresh();\r
+ }\r
+\r
+ public void Shutdown()\r
+ {\r
+ Task.Run(() => ShutdownProxy());\r
+ if (_config.Proxy.Auto)\r
+ _systemProxy.RestoreSettings();\r
+ SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged;\r
+\r
+ }\r
+\r
+ private void ShutdownProxy()\r
+ {\r
+ HttpProxy.Shutdown();\r
+ }\r
+ }\r
+}
\ No newline at end of file