OSDN Git Service

プロキシを設定する処理を別のクラスに分離する
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Fri, 26 May 2017 21:42:16 +0000 (06:42 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 15 Jul 2017 13:41:58 +0000 (22:41 +0900)
KancolleSniffer/KancolleSniffer.csproj
KancolleSniffer/MainForm.cs
KancolleSniffer/ProxyManager.cs [new file with mode: 0644]

index a6b8941..461b626 100644 (file)
     </Compile>\r
     <Compile Include="NotificationManager.cs" />\r
     <Compile Include="PresetDeck.cs" />\r
+    <Compile Include="ProxyManager.cs" />\r
     <Compile Include="PushBullet.cs" />\r
     <Compile Include="RepairListForMain.cs">\r
       <SubType>Component</SubType>\r
index 608cd58..dfb423c 100644 (file)
@@ -19,14 +19,12 @@ using System.Drawing;
 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
@@ -36,6 +34,7 @@ namespace KancolleSniffer
         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
@@ -45,8 +44,7 @@ namespace KancolleSniffer
         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
@@ -75,6 +73,7 @@ namespace KancolleSniffer
             _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
@@ -183,18 +182,10 @@ namespace KancolleSniffer
             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
@@ -209,18 +200,10 @@ namespace KancolleSniffer
             _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
@@ -292,59 +275,7 @@ namespace KancolleSniffer
 \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
diff --git a/KancolleSniffer/ProxyManager.cs b/KancolleSniffer/ProxyManager.cs
new file mode 100644 (file)
index 0000000..95ee961
--- /dev/null
@@ -0,0 +1,114 @@
+// 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