PortProxyGUI.1.4.0
This commit is contained in:
parent
ff14a3532a
commit
f3bb505cfe
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using PortProxyGUI.Utils;
|
||||||
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
@ -14,7 +15,7 @@ namespace PortProxyGUI
|
||||||
PortProxyGUI = portProxyGUI;
|
PortProxyGUI = portProxyGUI;
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
Font = Util.UiFont;
|
Font = InterfaceUtil.UiFont;
|
||||||
|
|
||||||
label_version.Text = label_version.Text + " v" + Application.ProductVersion;
|
label_version.Text = label_version.Text + " v" + Application.ProductVersion;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
using System;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
namespace PortProxyGUI.Data
|
||||||
|
{
|
||||||
|
public class AppConfig
|
||||||
|
{
|
||||||
|
public Size MainWindowSize = new(720, 500);
|
||||||
|
public int[] PortProxyColumnWidths = new int[] { 24, 64, 140, 100, 140, 100, 100 };
|
||||||
|
|
||||||
|
private readonly Regex _intArrayRegex = new(@"^\[\s*(\d+)(?:\s*,\s*(\d+))*\s*\]$");
|
||||||
|
|
||||||
|
public AppConfig() { }
|
||||||
|
public AppConfig(Config[] rows)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
var item = rows.Where(x => x.Item == "MainWindow");
|
||||||
|
if (int.TryParse(item.FirstOrDefault(x => x.Key == "Width")?.Value, out var width)
|
||||||
|
&& int.TryParse(item.FirstOrDefault(x => x.Key == "Height")?.Value, out var height))
|
||||||
|
{
|
||||||
|
MainWindowSize = new Size(width, height);
|
||||||
|
}
|
||||||
|
else MainWindowSize = new Size(720, 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var item = rows.Where(x => x.Item == "PortProxy");
|
||||||
|
var s_ColumnWidths = item.FirstOrDefault(x => x.Key == "ColumnWidths").Value;
|
||||||
|
var match = _intArrayRegex.Match(s_ColumnWidths);
|
||||||
|
|
||||||
|
if (match.Success)
|
||||||
|
{
|
||||||
|
PortProxyColumnWidths = match.Groups
|
||||||
|
.OfType<Group>().Skip(1)
|
||||||
|
.SelectMany(x => x.Captures.OfType<Capture>())
|
||||||
|
.Select(x => int.Parse(x.Value))
|
||||||
|
.ToArray();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if NETCOREAPP3_0_OR_GREATER
|
||||||
|
PortProxyColumnWidths = Array.Empty<int>();
|
||||||
|
#else
|
||||||
|
PortProxyColumnWidths = new int[0];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,5 @@
|
||||||
using SQLib.Sqlite;
|
using NStandard;
|
||||||
|
using SQLib.Sqlite;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
@ -8,11 +9,27 @@ namespace PortProxyGUI.Data
|
||||||
{
|
{
|
||||||
public class ApplicationDbScope : SqliteScope<ApplicationDbScope>
|
public class ApplicationDbScope : SqliteScope<ApplicationDbScope>
|
||||||
{
|
{
|
||||||
public static readonly string DbDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "PortProxyGUI");
|
public static readonly string AppDbDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "PortProxyGUI");
|
||||||
public static readonly string DbFile = Path.Combine(DbDirectory, "config.db");
|
public static readonly string AppDbFile = Path.Combine(AppDbDirectory, "config.db");
|
||||||
private static readonly string ConnectionString = $"Data Source={DbFile}";
|
|
||||||
|
|
||||||
public static ApplicationDbScope UseDefault() => new ApplicationDbScope(ConnectionString);
|
public static ApplicationDbScope FromFile(string file)
|
||||||
|
{
|
||||||
|
var dir = Path.GetDirectoryName(file);
|
||||||
|
var fileName = Path.GetFileName(file);
|
||||||
|
|
||||||
|
if (!Directory.Exists(dir)) Directory.CreateDirectory(dir);
|
||||||
|
if (!File.Exists(fileName))
|
||||||
|
{
|
||||||
|
#if NETCOREAPP3_0_OR_GREATER
|
||||||
|
#else
|
||||||
|
System.Data.SQLite.SQLiteConnection.CreateFile(file);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
var scope = new ApplicationDbScope($"Data Source=\"{file}\"");
|
||||||
|
scope.Migrate();
|
||||||
|
return scope;
|
||||||
|
}
|
||||||
|
|
||||||
public ApplicationDbScope(string connectionString) : base(connectionString)
|
public ApplicationDbScope(string connectionString) : base(connectionString)
|
||||||
{
|
{
|
||||||
|
@ -20,16 +37,14 @@ namespace PortProxyGUI.Data
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
if (!Directory.Exists(DbDirectory)) Directory.CreateDirectory(DbDirectory);
|
|
||||||
if (!File.Exists(DbFile))
|
|
||||||
{
|
|
||||||
#if NET35 || NET45
|
|
||||||
System.Data.SQLite.SQLiteConnection.CreateFile(DbFile);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Migrate() => new ApplicationDbMigrationUtil(this).MigrateToLast();
|
public void Migrate() => new MigrationUtil(this).MigrateToLast();
|
||||||
|
|
||||||
|
public Migration GetLastMigration()
|
||||||
|
{
|
||||||
|
return SqlQuery<Migration>($"SELECT * FROM __history ORDER BY MigrationId DESC LIMIT 1;").First();
|
||||||
|
}
|
||||||
|
|
||||||
public IEnumerable<Rule> Rules => SqlQuery<Rule>($"SELECT * FROM Rules;");
|
public IEnumerable<Rule> Rules => SqlQuery<Rule>($"SELECT * FROM Rules;");
|
||||||
|
|
||||||
|
@ -79,5 +94,21 @@ namespace PortProxyGUI.Data
|
||||||
foreach (var obj in objs) Remove(obj);
|
foreach (var obj in objs) Remove(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AppConfig GetAppConfig()
|
||||||
|
{
|
||||||
|
var configRows = SqlQuery<Config>($"SELECT * FROM Configs;");
|
||||||
|
var appConfig = new AppConfig(configRows);
|
||||||
|
return appConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SaveAppConfig(AppConfig appConfig)
|
||||||
|
{
|
||||||
|
Sql($"UPDATE Configs SET Value = {appConfig.MainWindowSize.Width} WHERE Item = 'MainWindow' AND `Key` = 'Width';");
|
||||||
|
Sql($"UPDATE Configs SET Value = {appConfig.MainWindowSize.Height} WHERE Item = 'MainWindow' AND `Key` = 'Height';");
|
||||||
|
|
||||||
|
var s_portProxyColumnWidths = $"[{appConfig.PortProxyColumnWidths.Select(x => x.ToString()).Join(", ")}]";
|
||||||
|
Sql($"UPDATE Configs SET Value = {s_portProxyColumnWidths} WHERE Item = 'PortProxy' AND `Key` = 'ColumnWidths';");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
namespace PortProxyGUI.Data
|
||||||
|
{
|
||||||
|
public class Config
|
||||||
|
{
|
||||||
|
public string Item { get; set; }
|
||||||
|
public string Key { get; set; }
|
||||||
|
public string Value { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,11 +7,11 @@ using System.Windows.Forms;
|
||||||
|
|
||||||
namespace PortProxyGUI.Data
|
namespace PortProxyGUI.Data
|
||||||
{
|
{
|
||||||
public class ApplicationDbMigrationUtil
|
public class MigrationUtil
|
||||||
{
|
{
|
||||||
public ApplicationDbScope DbScope { get; private set; }
|
public ApplicationDbScope DbScope { get; private set; }
|
||||||
|
|
||||||
public ApplicationDbMigrationUtil(ApplicationDbScope context)
|
public MigrationUtil(ApplicationDbScope context)
|
||||||
{
|
{
|
||||||
DbScope = context;
|
DbScope = context;
|
||||||
EnsureHistoryTable();
|
EnsureHistoryTable();
|
||||||
|
@ -29,7 +29,7 @@ namespace PortProxyGUI.Data
|
||||||
|
|
||||||
public void EnsureUpdateVersion()
|
public void EnsureUpdateVersion()
|
||||||
{
|
{
|
||||||
var migration = GetLastMigration();
|
var migration = DbScope.GetLastMigration();
|
||||||
var assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version;
|
var assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version;
|
||||||
|
|
||||||
if (new Version(migration.ProductVersion) > assemblyVersion)
|
if (new Version(migration.ProductVersion) > assemblyVersion)
|
||||||
|
@ -47,14 +47,9 @@ Would you like to download it now?", "Upgrade", MessageBoxButtons.YesNo, Message
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Migration GetLastMigration()
|
|
||||||
{
|
|
||||||
return DbScope.SqlQuery<Migration>($"SELECT * FROM __history ORDER BY MigrationId DESC LIMIT 1;").First();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void MigrateToLast()
|
public void MigrateToLast()
|
||||||
{
|
{
|
||||||
var migration = GetLastMigration();
|
var migration = DbScope.GetLastMigration();
|
||||||
var migrationId = migration.MigrationId;
|
var migrationId = migration.MigrationId;
|
||||||
var pendingMigrations = migrationId != "000000000000"
|
var pendingMigrations = migrationId != "000000000000"
|
||||||
? History.SkipWhile(pair => pair.Key.MigrationId != migrationId).Skip(1)
|
? History.SkipWhile(pair => pair.Key.MigrationId != migrationId).Skip(1)
|
||||||
|
@ -112,6 +107,21 @@ Would you like to download it now?", "Upgrade", MessageBoxButtons.YesNo, Message
|
||||||
"INSERT INTO rules SELECT Id, Type, ListenOn, ListenPort, ConnectTo, ConnectPort, Note, `Group` FROM rulesOld;",
|
"INSERT INTO rules SELECT Id, Type, ListenOn, ListenPort, ConnectTo, ConnectPort, Note, `Group` FROM rulesOld;",
|
||||||
"DROP TABLE rulesOld;",
|
"DROP TABLE rulesOld;",
|
||||||
},
|
},
|
||||||
|
|
||||||
|
[new MigrationKey { MigrationId = "202303092024", ProductVersion = "1.4.0" }] = new[]
|
||||||
|
{
|
||||||
|
@"CREATE TABLE configs (
|
||||||
|
Item text,
|
||||||
|
`Key` text,
|
||||||
|
Value text
|
||||||
|
);",
|
||||||
|
|
||||||
|
"CREATE UNIQUE INDEX IX_Configs_Key ON configs ( Item, `Key` );",
|
||||||
|
|
||||||
|
"INSERT INTO configs ( Item, `Key`, Value ) VALUES ( 'MainWindow', 'Width', '720' );",
|
||||||
|
"INSERT INTO configs ( Item, `Key`, Value ) VALUES ( 'MainWindow', 'Height', '500' );",
|
||||||
|
"INSERT INTO configs ( Item, `Key`, Value ) VALUES ( 'PortProxy', 'ColumnWidths', '[24, 64, 140, 100, 140, 100, 100]' );",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -60,5 +60,10 @@ namespace PortProxyGUI.Data
|
||||||
if (int.TryParse(portString, out var port) && 0 < port && port < 65536) return port;
|
if (int.TryParse(portString, out var port) && 0 < port && port < 65536) return port;
|
||||||
else throw new NotSupportedException($"Invalid port string. ({portString})");
|
else throw new NotSupportedException($"Invalid port string. ({portString})");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override bool Equals(object obj)
|
||||||
|
{
|
||||||
|
return Equals(obj as Rule);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace PortProxyGUI.Native
|
||||||
|
{
|
||||||
|
[Flags]
|
||||||
|
public enum GenericRights : uint
|
||||||
|
{
|
||||||
|
GENERIC_READ = 0x80000000,
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace PortProxyGUI.Native
|
||||||
|
{
|
||||||
|
internal class NativeMethods
|
||||||
|
{
|
||||||
|
[DllImport("advapi32.dll", EntryPoint = "OpenSCManagerW", ExactSpelling = true, CharSet = CharSet.Unicode, SetLastError = true)]
|
||||||
|
public static extern IntPtr OpenSCManager(string machineName, string databaseName, uint dwAccess);
|
||||||
|
|
||||||
|
[DllImport("advapi32.dll", EntryPoint = "OpenServiceW", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||||
|
public static extern IntPtr OpenService(IntPtr hSCManager, string lpServiceName, ServiceRights dwDesiredAccess);
|
||||||
|
|
||||||
|
[DllImport("advapi32.dll", SetLastError = true)]
|
||||||
|
[return: MarshalAs(UnmanagedType.Bool)]
|
||||||
|
public static extern bool ControlService(IntPtr hService, ServiceControls dwControl, ref ServiceStatus lpServiceStatus);
|
||||||
|
|
||||||
|
[DllImport("advapi32.dll", SetLastError = true)]
|
||||||
|
[return: MarshalAs(UnmanagedType.Bool)]
|
||||||
|
public static extern bool CloseServiceHandle(IntPtr hSCObject);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace PortProxyGUI.Native
|
||||||
|
{
|
||||||
|
[Flags]
|
||||||
|
public enum ServiceControls : uint
|
||||||
|
{
|
||||||
|
SERVICE_CONTROL_PARAMCHANGE = 0x00000006,
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace PortProxyGUI.Native
|
||||||
|
{
|
||||||
|
[Flags]
|
||||||
|
public enum ServiceRights : uint
|
||||||
|
{
|
||||||
|
SERVICE_PAUSE_CONTINUE = 0x0040,
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace PortProxyGUI.Native
|
||||||
|
{
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public struct ServiceStatus
|
||||||
|
{
|
||||||
|
public uint dwServiceType;
|
||||||
|
public uint dwCurrentState;
|
||||||
|
public uint dwControlsAccepted;
|
||||||
|
public uint dwWin32ExitCode;
|
||||||
|
public uint dwServiceSpecificExitCode;
|
||||||
|
public uint dwCheckPoint;
|
||||||
|
public uint dwWaitHint;
|
||||||
|
}
|
||||||
|
}
|
|
@ -28,184 +28,219 @@
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
this.components = new System.ComponentModel.Container();
|
components = new System.ComponentModel.Container();
|
||||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PortProxyGUI));
|
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PortProxyGUI));
|
||||||
this.listViewProxies = new System.Windows.Forms.ListView();
|
listViewProxies = new System.Windows.Forms.ListView();
|
||||||
this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
|
columnHeader1 = new System.Windows.Forms.ColumnHeader();
|
||||||
this.columnHeader2 = new System.Windows.Forms.ColumnHeader();
|
columnHeader2 = new System.Windows.Forms.ColumnHeader();
|
||||||
this.columnHeader3 = new System.Windows.Forms.ColumnHeader();
|
columnHeader3 = new System.Windows.Forms.ColumnHeader();
|
||||||
this.columnHeader4 = new System.Windows.Forms.ColumnHeader();
|
columnHeader4 = new System.Windows.Forms.ColumnHeader();
|
||||||
this.columnHeader5 = new System.Windows.Forms.ColumnHeader();
|
columnHeader5 = new System.Windows.Forms.ColumnHeader();
|
||||||
this.columnHeader6 = new System.Windows.Forms.ColumnHeader();
|
columnHeader6 = new System.Windows.Forms.ColumnHeader();
|
||||||
this.columnHeader7 = new System.Windows.Forms.ColumnHeader();
|
columnHeader7 = new System.Windows.Forms.ColumnHeader();
|
||||||
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
|
contextMenuStrip_RightClick = new System.Windows.Forms.ContextMenuStrip(components);
|
||||||
this.toolStripMenuItem_Enable = new System.Windows.Forms.ToolStripMenuItem();
|
toolStripMenuItem_Enable = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolStripMenuItem_Disable = new System.Windows.Forms.ToolStripMenuItem();
|
toolStripMenuItem_Disable = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
|
toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
|
||||||
this.toolStripMenuItem_Refresh = new System.Windows.Forms.ToolStripMenuItem();
|
toolStripMenuItem_Refresh = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolStripMenuItem_FlushDnsCache = new System.Windows.Forms.ToolStripMenuItem();
|
toolStripMenuItem_FlushDnsCache = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
|
toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
|
||||||
this.toolStripMenuItem_New = new System.Windows.Forms.ToolStripMenuItem();
|
toolStripMenuItem_New = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolStripMenuItem_Modify = new System.Windows.Forms.ToolStripMenuItem();
|
toolStripMenuItem_Modify = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolStripMenuItem_Delete = new System.Windows.Forms.ToolStripMenuItem();
|
toolStripMenuItem_Delete = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
|
toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
|
||||||
this.toolStripMenuItem_About = new System.Windows.Forms.ToolStripMenuItem();
|
toolStripMenuItem_More = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.imageListProxies = new System.Windows.Forms.ImageList(this.components);
|
toolStripMenuItem_Import = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.contextMenuStrip1.SuspendLayout();
|
toolStripMenuItem_Export = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.SuspendLayout();
|
toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
|
||||||
|
toolStripMenuItem_About = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
imageListProxies = new System.Windows.Forms.ImageList(components);
|
||||||
|
saveFileDialog_Export = new System.Windows.Forms.SaveFileDialog();
|
||||||
|
openFileDialog_Import = new System.Windows.Forms.OpenFileDialog();
|
||||||
|
toolStripMenuItem_ResetWindowSize = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
|
||||||
|
contextMenuStrip_RightClick.SuspendLayout();
|
||||||
|
SuspendLayout();
|
||||||
//
|
//
|
||||||
// listViewProxies
|
// listViewProxies
|
||||||
//
|
//
|
||||||
this.listViewProxies.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
listViewProxies.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||||
this.listViewProxies.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
|
listViewProxies.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { columnHeader1, columnHeader2, columnHeader3, columnHeader4, columnHeader5, columnHeader6, columnHeader7 });
|
||||||
this.columnHeader1,
|
listViewProxies.ContextMenuStrip = contextMenuStrip_RightClick;
|
||||||
this.columnHeader2,
|
resources.ApplyResources(listViewProxies, "listViewProxies");
|
||||||
this.columnHeader3,
|
listViewProxies.FullRowSelect = true;
|
||||||
this.columnHeader4,
|
listViewProxies.HideSelection = false;
|
||||||
this.columnHeader5,
|
listViewProxies.Name = "listViewProxies";
|
||||||
this.columnHeader6,
|
listViewProxies.SmallImageList = imageListProxies;
|
||||||
this.columnHeader7});
|
listViewProxies.UseCompatibleStateImageBehavior = false;
|
||||||
this.listViewProxies.ContextMenuStrip = this.contextMenuStrip1;
|
listViewProxies.View = System.Windows.Forms.View.Details;
|
||||||
resources.ApplyResources(this.listViewProxies, "listViewProxies");
|
listViewProxies.ColumnClick += listView1_ColumnClick;
|
||||||
this.listViewProxies.FullRowSelect = true;
|
listViewProxies.ColumnWidthChanged += listViewProxies_ColumnWidthChanged;
|
||||||
this.listViewProxies.HideSelection = false;
|
listViewProxies.DoubleClick += listView1_DoubleClick;
|
||||||
this.listViewProxies.Name = "listViewProxies";
|
listViewProxies.KeyUp += listViewProxies_KeyUp;
|
||||||
this.listViewProxies.SmallImageList = this.imageListProxies;
|
listViewProxies.MouseUp += listView1_MouseUp;
|
||||||
this.listViewProxies.UseCompatibleStateImageBehavior = false;
|
|
||||||
this.listViewProxies.View = System.Windows.Forms.View.Details;
|
|
||||||
this.listViewProxies.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listView1_ColumnClick);
|
|
||||||
this.listViewProxies.DoubleClick += new System.EventHandler(this.listView1_DoubleClick);
|
|
||||||
this.listViewProxies.KeyUp += new System.Windows.Forms.KeyEventHandler(this.listViewProxies_KeyUp);
|
|
||||||
this.listViewProxies.MouseUp += new System.Windows.Forms.MouseEventHandler(this.listView1_MouseUp);
|
|
||||||
//
|
//
|
||||||
// columnHeader1
|
// columnHeader1
|
||||||
//
|
//
|
||||||
resources.ApplyResources(this.columnHeader1, "columnHeader1");
|
resources.ApplyResources(columnHeader1, "columnHeader1");
|
||||||
//
|
//
|
||||||
// columnHeader2
|
// columnHeader2
|
||||||
//
|
//
|
||||||
resources.ApplyResources(this.columnHeader2, "columnHeader2");
|
resources.ApplyResources(columnHeader2, "columnHeader2");
|
||||||
//
|
//
|
||||||
// columnHeader3
|
// columnHeader3
|
||||||
//
|
//
|
||||||
resources.ApplyResources(this.columnHeader3, "columnHeader3");
|
resources.ApplyResources(columnHeader3, "columnHeader3");
|
||||||
//
|
//
|
||||||
// columnHeader4
|
// columnHeader4
|
||||||
//
|
//
|
||||||
this.columnHeader4.Tag = "";
|
columnHeader4.Tag = "";
|
||||||
resources.ApplyResources(this.columnHeader4, "columnHeader4");
|
resources.ApplyResources(columnHeader4, "columnHeader4");
|
||||||
//
|
//
|
||||||
// columnHeader5
|
// columnHeader5
|
||||||
//
|
//
|
||||||
resources.ApplyResources(this.columnHeader5, "columnHeader5");
|
resources.ApplyResources(columnHeader5, "columnHeader5");
|
||||||
//
|
//
|
||||||
// columnHeader6
|
// columnHeader6
|
||||||
//
|
//
|
||||||
this.columnHeader6.Tag = "";
|
columnHeader6.Tag = "";
|
||||||
resources.ApplyResources(this.columnHeader6, "columnHeader6");
|
resources.ApplyResources(columnHeader6, "columnHeader6");
|
||||||
//
|
//
|
||||||
// columnHeader7
|
// columnHeader7
|
||||||
//
|
//
|
||||||
resources.ApplyResources(this.columnHeader7, "columnHeader7");
|
resources.ApplyResources(columnHeader7, "columnHeader7");
|
||||||
//
|
//
|
||||||
// contextMenuStrip1
|
// contextMenuStrip_RightClick
|
||||||
//
|
//
|
||||||
this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
contextMenuStrip_RightClick.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { toolStripMenuItem_Enable, toolStripMenuItem_Disable, toolStripSeparator3, toolStripMenuItem_Refresh, toolStripMenuItem_FlushDnsCache, toolStripSeparator2, toolStripMenuItem_New, toolStripMenuItem_Modify, toolStripMenuItem_Delete, toolStripSeparator1, toolStripMenuItem_More, toolStripSeparator4, toolStripMenuItem_About });
|
||||||
this.toolStripMenuItem_Enable,
|
contextMenuStrip_RightClick.Name = "contextMenuStrip1";
|
||||||
this.toolStripMenuItem_Disable,
|
resources.ApplyResources(contextMenuStrip_RightClick, "contextMenuStrip_RightClick");
|
||||||
this.toolStripSeparator3,
|
contextMenuStrip_RightClick.MouseClick += contextMenuStrip_RightClick_MouseClick;
|
||||||
this.toolStripMenuItem_Refresh,
|
|
||||||
this.toolStripMenuItem_FlushDnsCache,
|
|
||||||
this.toolStripSeparator2,
|
|
||||||
this.toolStripMenuItem_New,
|
|
||||||
this.toolStripMenuItem_Modify,
|
|
||||||
this.toolStripMenuItem_Delete,
|
|
||||||
this.toolStripSeparator1,
|
|
||||||
this.toolStripMenuItem_About});
|
|
||||||
this.contextMenuStrip1.Name = "contextMenuStrip1";
|
|
||||||
resources.ApplyResources(this.contextMenuStrip1, "contextMenuStrip1");
|
|
||||||
this.contextMenuStrip1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.contextMenuStrip1_MouseClick);
|
|
||||||
//
|
//
|
||||||
// toolStripMenuItem_Enable
|
// toolStripMenuItem_Enable
|
||||||
//
|
//
|
||||||
this.toolStripMenuItem_Enable.Name = "toolStripMenuItem_Enable";
|
toolStripMenuItem_Enable.Name = "toolStripMenuItem_Enable";
|
||||||
resources.ApplyResources(this.toolStripMenuItem_Enable, "toolStripMenuItem_Enable");
|
resources.ApplyResources(toolStripMenuItem_Enable, "toolStripMenuItem_Enable");
|
||||||
//
|
//
|
||||||
// toolStripMenuItem_Disable
|
// toolStripMenuItem_Disable
|
||||||
//
|
//
|
||||||
this.toolStripMenuItem_Disable.Name = "toolStripMenuItem_Disable";
|
toolStripMenuItem_Disable.Name = "toolStripMenuItem_Disable";
|
||||||
resources.ApplyResources(this.toolStripMenuItem_Disable, "toolStripMenuItem_Disable");
|
resources.ApplyResources(toolStripMenuItem_Disable, "toolStripMenuItem_Disable");
|
||||||
//
|
//
|
||||||
// toolStripSeparator3
|
// toolStripSeparator3
|
||||||
//
|
//
|
||||||
this.toolStripSeparator3.Name = "toolStripSeparator3";
|
toolStripSeparator3.Name = "toolStripSeparator3";
|
||||||
resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3");
|
resources.ApplyResources(toolStripSeparator3, "toolStripSeparator3");
|
||||||
//
|
//
|
||||||
// toolStripMenuItem_Refresh
|
// toolStripMenuItem_Refresh
|
||||||
//
|
//
|
||||||
this.toolStripMenuItem_Refresh.Name = "toolStripMenuItem_Refresh";
|
toolStripMenuItem_Refresh.Name = "toolStripMenuItem_Refresh";
|
||||||
resources.ApplyResources(this.toolStripMenuItem_Refresh, "toolStripMenuItem_Refresh");
|
resources.ApplyResources(toolStripMenuItem_Refresh, "toolStripMenuItem_Refresh");
|
||||||
//
|
//
|
||||||
// toolStripMenuItem_FlushDnsCache
|
// toolStripMenuItem_FlushDnsCache
|
||||||
//
|
//
|
||||||
this.toolStripMenuItem_FlushDnsCache.Name = "toolStripMenuItem_FlushDnsCache";
|
toolStripMenuItem_FlushDnsCache.Name = "toolStripMenuItem_FlushDnsCache";
|
||||||
resources.ApplyResources(this.toolStripMenuItem_FlushDnsCache, "toolStripMenuItem_FlushDnsCache");
|
resources.ApplyResources(toolStripMenuItem_FlushDnsCache, "toolStripMenuItem_FlushDnsCache");
|
||||||
//
|
//
|
||||||
// toolStripSeparator2
|
// toolStripSeparator2
|
||||||
//
|
//
|
||||||
this.toolStripSeparator2.Name = "toolStripSeparator2";
|
toolStripSeparator2.Name = "toolStripSeparator2";
|
||||||
resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2");
|
resources.ApplyResources(toolStripSeparator2, "toolStripSeparator2");
|
||||||
//
|
//
|
||||||
// toolStripMenuItem_New
|
// toolStripMenuItem_New
|
||||||
//
|
//
|
||||||
this.toolStripMenuItem_New.Name = "toolStripMenuItem_New";
|
toolStripMenuItem_New.Name = "toolStripMenuItem_New";
|
||||||
resources.ApplyResources(this.toolStripMenuItem_New, "toolStripMenuItem_New");
|
resources.ApplyResources(toolStripMenuItem_New, "toolStripMenuItem_New");
|
||||||
//
|
//
|
||||||
// toolStripMenuItem_Modify
|
// toolStripMenuItem_Modify
|
||||||
//
|
//
|
||||||
this.toolStripMenuItem_Modify.Name = "toolStripMenuItem_Modify";
|
toolStripMenuItem_Modify.Name = "toolStripMenuItem_Modify";
|
||||||
resources.ApplyResources(this.toolStripMenuItem_Modify, "toolStripMenuItem_Modify");
|
resources.ApplyResources(toolStripMenuItem_Modify, "toolStripMenuItem_Modify");
|
||||||
//
|
//
|
||||||
// toolStripMenuItem_Delete
|
// toolStripMenuItem_Delete
|
||||||
//
|
//
|
||||||
this.toolStripMenuItem_Delete.Name = "toolStripMenuItem_Delete";
|
toolStripMenuItem_Delete.Name = "toolStripMenuItem_Delete";
|
||||||
resources.ApplyResources(this.toolStripMenuItem_Delete, "toolStripMenuItem_Delete");
|
resources.ApplyResources(toolStripMenuItem_Delete, "toolStripMenuItem_Delete");
|
||||||
//
|
//
|
||||||
// toolStripSeparator1
|
// toolStripSeparator1
|
||||||
//
|
//
|
||||||
this.toolStripSeparator1.Name = "toolStripSeparator1";
|
toolStripSeparator1.Name = "toolStripSeparator1";
|
||||||
resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1");
|
resources.ApplyResources(toolStripSeparator1, "toolStripSeparator1");
|
||||||
|
//
|
||||||
|
// toolStripMenuItem_More
|
||||||
|
//
|
||||||
|
toolStripMenuItem_More.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { toolStripMenuItem_Import, toolStripMenuItem_Export, toolStripSeparator5, toolStripMenuItem_ResetWindowSize });
|
||||||
|
toolStripMenuItem_More.Name = "toolStripMenuItem_More";
|
||||||
|
resources.ApplyResources(toolStripMenuItem_More, "toolStripMenuItem_More");
|
||||||
|
//
|
||||||
|
// toolStripMenuItem_Import
|
||||||
|
//
|
||||||
|
toolStripMenuItem_Import.Name = "toolStripMenuItem_Import";
|
||||||
|
resources.ApplyResources(toolStripMenuItem_Import, "toolStripMenuItem_Import");
|
||||||
|
toolStripMenuItem_Import.Click += toolStripMenuItem_Import_Click;
|
||||||
|
//
|
||||||
|
// toolStripMenuItem_Export
|
||||||
|
//
|
||||||
|
toolStripMenuItem_Export.Name = "toolStripMenuItem_Export";
|
||||||
|
resources.ApplyResources(toolStripMenuItem_Export, "toolStripMenuItem_Export");
|
||||||
|
toolStripMenuItem_Export.Click += toolStripMenuItem_Export_Click;
|
||||||
|
//
|
||||||
|
// toolStripSeparator4
|
||||||
|
//
|
||||||
|
toolStripSeparator4.Name = "toolStripSeparator4";
|
||||||
|
resources.ApplyResources(toolStripSeparator4, "toolStripSeparator4");
|
||||||
//
|
//
|
||||||
// toolStripMenuItem_About
|
// toolStripMenuItem_About
|
||||||
//
|
//
|
||||||
this.toolStripMenuItem_About.Name = "toolStripMenuItem_About";
|
toolStripMenuItem_About.Name = "toolStripMenuItem_About";
|
||||||
resources.ApplyResources(this.toolStripMenuItem_About, "toolStripMenuItem_About");
|
resources.ApplyResources(toolStripMenuItem_About, "toolStripMenuItem_About");
|
||||||
//
|
//
|
||||||
// imageListProxies
|
// imageListProxies
|
||||||
//
|
//
|
||||||
this.imageListProxies.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
|
imageListProxies.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
|
||||||
this.imageListProxies.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListProxies.ImageStream")));
|
imageListProxies.ImageStream = (System.Windows.Forms.ImageListStreamer)resources.GetObject("imageListProxies.ImageStream");
|
||||||
this.imageListProxies.TransparentColor = System.Drawing.Color.Transparent;
|
imageListProxies.TransparentColor = System.Drawing.Color.Transparent;
|
||||||
this.imageListProxies.Images.SetKeyName(0, "disable.png");
|
imageListProxies.Images.SetKeyName(0, "disable.png");
|
||||||
this.imageListProxies.Images.SetKeyName(1, "enable.png");
|
imageListProxies.Images.SetKeyName(1, "enable.png");
|
||||||
|
//
|
||||||
|
// saveFileDialog_Export
|
||||||
|
//
|
||||||
|
resources.ApplyResources(saveFileDialog_Export, "saveFileDialog_Export");
|
||||||
|
//
|
||||||
|
// openFileDialog_Import
|
||||||
|
//
|
||||||
|
openFileDialog_Import.FileName = "openFileDialog1";
|
||||||
|
resources.ApplyResources(openFileDialog_Import, "openFileDialog_Import");
|
||||||
|
//
|
||||||
|
// toolStripMenuItem_ResetWindowSize
|
||||||
|
//
|
||||||
|
toolStripMenuItem_ResetWindowSize.Name = "toolStripMenuItem_ResetWindowSize";
|
||||||
|
resources.ApplyResources(toolStripMenuItem_ResetWindowSize, "toolStripMenuItem_ResetWindowSize");
|
||||||
|
toolStripMenuItem_ResetWindowSize.Click += toolStripMenuItem_ResetWindowSize_Click;
|
||||||
|
//
|
||||||
|
// toolStripSeparator5
|
||||||
|
//
|
||||||
|
toolStripSeparator5.Name = "toolStripSeparator5";
|
||||||
|
resources.ApplyResources(toolStripSeparator5, "toolStripSeparator5");
|
||||||
//
|
//
|
||||||
// PortProxyGUI
|
// PortProxyGUI
|
||||||
//
|
//
|
||||||
resources.ApplyResources(this, "$this");
|
resources.ApplyResources(this, "$this");
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.Controls.Add(this.listViewProxies);
|
Controls.Add(listViewProxies);
|
||||||
this.Name = "PortProxyGUI";
|
Name = "PortProxyGUI";
|
||||||
this.Load += new System.EventHandler(this.PortProxyGUI_Load);
|
FormClosing += PortProxyGUI_FormClosing;
|
||||||
this.Shown += new System.EventHandler(this.PortProxyGUI_Shown);
|
Load += PortProxyGUI_Load;
|
||||||
this.contextMenuStrip1.ResumeLayout(false);
|
Shown += PortProxyGUI_Shown;
|
||||||
this.ResumeLayout(false);
|
Resize += PortProxyGUI_Resize;
|
||||||
|
contextMenuStrip_RightClick.ResumeLayout(false);
|
||||||
|
ResumeLayout(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
private System.Windows.Forms.ColumnHeader columnHeader2;
|
private System.Windows.Forms.ColumnHeader columnHeader2;
|
||||||
private System.Windows.Forms.ColumnHeader columnHeader3;
|
private System.Windows.Forms.ColumnHeader columnHeader3;
|
||||||
private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
|
private System.Windows.Forms.ContextMenuStrip contextMenuStrip_RightClick;
|
||||||
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_New;
|
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_New;
|
||||||
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Delete;
|
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Delete;
|
||||||
private System.Windows.Forms.ColumnHeader columnHeader4;
|
private System.Windows.Forms.ColumnHeader columnHeader4;
|
||||||
|
@ -224,6 +259,14 @@
|
||||||
private System.Windows.Forms.ColumnHeader columnHeader7;
|
private System.Windows.Forms.ColumnHeader columnHeader7;
|
||||||
internal System.Windows.Forms.ListView listViewProxies;
|
internal System.Windows.Forms.ListView listViewProxies;
|
||||||
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_FlushDnsCache;
|
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_FlushDnsCache;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_More;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Export;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Import;
|
||||||
|
private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;
|
||||||
|
private System.Windows.Forms.SaveFileDialog saveFileDialog_Export;
|
||||||
|
private System.Windows.Forms.OpenFileDialog openFileDialog_Import;
|
||||||
|
private System.Windows.Forms.ToolStripSeparator toolStripSeparator5;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_ResetWindowSize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
using NStandard;
|
using NStandard;
|
||||||
|
using PortProxyGUI.Data;
|
||||||
|
using PortProxyGUI.UI;
|
||||||
|
using PortProxyGUI.Utils;
|
||||||
using System;
|
using System;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using static System.Windows.Forms.ListViewItem;
|
using static System.Windows.Forms.ListViewItem;
|
||||||
|
@ -9,21 +14,29 @@ namespace PortProxyGUI
|
||||||
{
|
{
|
||||||
public partial class PortProxyGUI : Form
|
public partial class PortProxyGUI : Form
|
||||||
{
|
{
|
||||||
|
private readonly ListViewColumnSorter lvwColumnSorter = new ListViewColumnSorter();
|
||||||
|
|
||||||
public SetProxy SetProxyForm;
|
public SetProxy SetProxyForm;
|
||||||
public About AboutForm;
|
public About AboutForm;
|
||||||
private ListViewColumnSorter lvwColumnSorter;
|
private AppConfig AppConfig;
|
||||||
|
|
||||||
public PortProxyGUI()
|
public PortProxyGUI()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
Font = Util.UiFont;
|
Font = InterfaceUtil.UiFont;
|
||||||
|
|
||||||
lvwColumnSorter = new ListViewColumnSorter();
|
|
||||||
listViewProxies.ListViewItemSorter = lvwColumnSorter;
|
listViewProxies.ListViewItemSorter = lvwColumnSorter;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PortProxyGUI_Load(object sender, EventArgs e)
|
private void PortProxyGUI_Load(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
AppConfig = Program.Database.GetAppConfig();
|
||||||
|
|
||||||
|
var size = AppConfig.MainWindowSize;
|
||||||
|
Left -= (size.Width - Width) / 2;
|
||||||
|
Top -= (size.Height - Height) / 2;
|
||||||
|
|
||||||
|
ResetWindowSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PortProxyGUI_Shown(object sender, EventArgs e)
|
private void PortProxyGUI_Shown(object sender, EventArgs e)
|
||||||
|
@ -31,6 +44,21 @@ namespace PortProxyGUI
|
||||||
RefreshProxyList();
|
RefreshProxyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ResetWindowSize()
|
||||||
|
{
|
||||||
|
Size = AppConfig.MainWindowSize;
|
||||||
|
|
||||||
|
if (AppConfig.PortProxyColumnWidths.Length != listViewProxies.Columns.Count)
|
||||||
|
{
|
||||||
|
Any.ReDim(ref AppConfig.PortProxyColumnWidths, listViewProxies.Columns.Count);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var (column, configWidth) in Any.Zip(listViewProxies.Columns.OfType<ColumnHeader>(), AppConfig.PortProxyColumnWidths))
|
||||||
|
{
|
||||||
|
column.Width = configWidth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private Data.Rule ParseRule(ListViewItem item)
|
private Data.Rule ParseRule(ListViewItem item)
|
||||||
{
|
{
|
||||||
var subItems = item.SubItems.OfType<ListViewSubItem>().ToArray();
|
var subItems = item.SubItems.OfType<ListViewSubItem>().ToArray();
|
||||||
|
@ -62,7 +90,7 @@ namespace PortProxyGUI
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var rule = ParseRule(item);
|
var rule = ParseRule(item);
|
||||||
PortProxyUtil.AddOrUpdateProxy(rule);
|
PortPorxyUtil.AddOrUpdateProxy(rule);
|
||||||
}
|
}
|
||||||
catch (NotSupportedException ex)
|
catch (NotSupportedException ex)
|
||||||
{
|
{
|
||||||
|
@ -70,6 +98,7 @@ namespace PortProxyGUI
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
PortPorxyUtil.ParamChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DisableSelectedProxies()
|
private void DisableSelectedProxies()
|
||||||
|
@ -82,7 +111,7 @@ namespace PortProxyGUI
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var rule = ParseRule(item);
|
var rule = ParseRule(item);
|
||||||
PortProxyUtil.DeleteProxy(rule);
|
PortPorxyUtil.DeleteProxy(rule);
|
||||||
}
|
}
|
||||||
catch (NotSupportedException ex)
|
catch (NotSupportedException ex)
|
||||||
{
|
{
|
||||||
|
@ -90,13 +119,14 @@ namespace PortProxyGUI
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
PortPorxyUtil.ParamChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DeleteSelectedProxies()
|
private void DeleteSelectedProxies()
|
||||||
{
|
{
|
||||||
var items = listViewProxies.SelectedItems.OfType<ListViewItem>();
|
var items = listViewProxies.SelectedItems.OfType<ListViewItem>();
|
||||||
DisableSelectedProxies();
|
DisableSelectedProxies();
|
||||||
Program.SqliteDbScope.RemoveRange(items.Select(x => new Data.Rule { Id = x.Tag.ToString() }));
|
Program.Database.RemoveRange(items.Select(x => new Data.Rule { Id = x.Tag.ToString() }));
|
||||||
foreach (var item in items) listViewProxies.Items.Remove(item);
|
foreach (var item in items) listViewProxies.Items.Remove(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,8 +202,8 @@ namespace PortProxyGUI
|
||||||
|
|
||||||
public void RefreshProxyList()
|
public void RefreshProxyList()
|
||||||
{
|
{
|
||||||
var proxies = PortProxyUtil.GetProxies();
|
var proxies = PortPorxyUtil.GetProxies();
|
||||||
var rules = Program.SqliteDbScope.Rules.ToArray();
|
var rules = Program.Database.Rules.ToArray();
|
||||||
foreach (var proxy in proxies)
|
foreach (var proxy in proxies)
|
||||||
{
|
{
|
||||||
var matchedRule = rules.FirstOrDefault(r => r.EqualsWithKeys(proxy));
|
var matchedRule = rules.FirstOrDefault(r => r.EqualsWithKeys(proxy));
|
||||||
|
@ -188,33 +218,19 @@ namespace PortProxyGUI
|
||||||
where proxy.Valid && proxy.Id is not null
|
where proxy.Valid && proxy.Id is not null
|
||||||
select proxy;
|
select proxy;
|
||||||
|
|
||||||
Program.SqliteDbScope.AddRange(pendingAdds);
|
Program.Database.AddRange(pendingAdds);
|
||||||
Program.SqliteDbScope.UpdateRange(pendingUpdates);
|
Program.Database.UpdateRange(pendingUpdates);
|
||||||
|
|
||||||
rules = Program.SqliteDbScope.Rules.ToArray();
|
rules = Program.Database.Rules.ToArray();
|
||||||
InitProxyGroups(rules);
|
InitProxyGroups(rules);
|
||||||
InitProxyItems(rules, proxies);
|
InitProxyItems(rules, proxies);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void FlushDnsCache()
|
private void contextMenuStrip_RightClick_MouseClick(object sender, MouseEventArgs e)
|
||||||
{
|
{
|
||||||
try
|
if (sender is ContextMenuStrip strip)
|
||||||
{
|
{
|
||||||
CmdUtil.FlushDNSCache();
|
var selected = strip.Items.OfType<ToolStripMenuItem>().Where(x => x.Selected).FirstOrDefault();
|
||||||
RefreshProxyList();
|
|
||||||
}
|
|
||||||
catch (NotSupportedException ex)
|
|
||||||
{
|
|
||||||
MessageBox.Show(ex.Message, "Exclamation", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void contextMenuStrip1_MouseClick(object sender, MouseEventArgs e)
|
|
||||||
{
|
|
||||||
if (sender is ContextMenuStrip _sender)
|
|
||||||
{
|
|
||||||
var selected = _sender.Items.OfType<ToolStripMenuItem>().Where(x => x.Selected).FirstOrDefault();
|
|
||||||
if (selected is null || !selected.Enabled) return;
|
if (selected is null || !selected.Enabled) return;
|
||||||
|
|
||||||
switch (selected)
|
switch (selected)
|
||||||
|
@ -238,7 +254,7 @@ namespace PortProxyGUI
|
||||||
RefreshProxyList();
|
RefreshProxyList();
|
||||||
break;
|
break;
|
||||||
case ToolStripMenuItem item when item == toolStripMenuItem_FlushDnsCache:
|
case ToolStripMenuItem item when item == toolStripMenuItem_FlushDnsCache:
|
||||||
FlushDnsCache();
|
DnsUtil.FlushCache();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ToolStripMenuItem item when item == toolStripMenuItem_Delete: DeleteSelectedProxies(); break;
|
case ToolStripMenuItem item when item == toolStripMenuItem_Delete: DeleteSelectedProxies(); break;
|
||||||
|
@ -257,21 +273,21 @@ namespace PortProxyGUI
|
||||||
|
|
||||||
private void listView1_MouseUp(object sender, MouseEventArgs e)
|
private void listView1_MouseUp(object sender, MouseEventArgs e)
|
||||||
{
|
{
|
||||||
if (sender is ListView _sender)
|
if (sender is ListView listView)
|
||||||
{
|
{
|
||||||
toolStripMenuItem_Enable.Enabled = e.Button == MouseButtons.Right && _sender.SelectedItems.OfType<ListViewItem>().Any(x => x.ImageIndex == 0);
|
toolStripMenuItem_Enable.Enabled = e.Button == MouseButtons.Right && listView.SelectedItems.OfType<ListViewItem>().Any(x => x.ImageIndex == 0);
|
||||||
toolStripMenuItem_Disable.Enabled = e.Button == MouseButtons.Right && _sender.SelectedItems.OfType<ListViewItem>().Any(x => x.ImageIndex == 1);
|
toolStripMenuItem_Disable.Enabled = e.Button == MouseButtons.Right && listView.SelectedItems.OfType<ListViewItem>().Any(x => x.ImageIndex == 1);
|
||||||
|
|
||||||
toolStripMenuItem_Delete.Enabled = e.Button == MouseButtons.Right && _sender.SelectedItems.OfType<ListViewItem>().Any();
|
toolStripMenuItem_Delete.Enabled = e.Button == MouseButtons.Right && listView.SelectedItems.OfType<ListViewItem>().Any();
|
||||||
toolStripMenuItem_Modify.Enabled = e.Button == MouseButtons.Right && _sender.SelectedItems.OfType<ListViewItem>().Count() == 1;
|
toolStripMenuItem_Modify.Enabled = e.Button == MouseButtons.Right && listView.SelectedItems.OfType<ListViewItem>().Count() == 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void listView1_DoubleClick(object sender, EventArgs e)
|
private void listView1_DoubleClick(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (sender is ListView _sender)
|
if (sender is ListView listView)
|
||||||
{
|
{
|
||||||
var selectAny = _sender.SelectedItems.OfType<ListViewItem>().Any();
|
var selectAny = listView.SelectedItems.OfType<ListViewItem>().Any();
|
||||||
if (selectAny)
|
if (selectAny)
|
||||||
{
|
{
|
||||||
if (SetProxyForm == null) SetProxyForm = new SetProxy(this);
|
if (SetProxyForm == null) SetProxyForm = new SetProxy(this);
|
||||||
|
@ -314,5 +330,69 @@ namespace PortProxyGUI
|
||||||
if (e.KeyCode == Keys.Delete) DeleteSelectedProxies();
|
if (e.KeyCode == Keys.Delete) DeleteSelectedProxies();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void listViewProxies_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (AppConfig is not null && sender is ListView listView)
|
||||||
|
{
|
||||||
|
AppConfig.PortProxyColumnWidths[e.ColumnIndex] = listView.Columns[e.ColumnIndex].Width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PortProxyGUI_FormClosing(object sender, FormClosingEventArgs e)
|
||||||
|
{
|
||||||
|
Program.Database.SaveAppConfig(AppConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PortProxyGUI_Resize(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (AppConfig is not null && sender is Form form)
|
||||||
|
{
|
||||||
|
AppConfig.MainWindowSize = form.Size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void toolStripMenuItem_Export_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
using var dialog = saveFileDialog_Export;
|
||||||
|
|
||||||
|
var result = dialog.ShowDialog();
|
||||||
|
if (result == DialogResult.OK)
|
||||||
|
{
|
||||||
|
var fileName = dialog.FileName;
|
||||||
|
File.Copy(ApplicationDbScope.AppDbFile, fileName, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void toolStripMenuItem_Import_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
using var dialog = openFileDialog_Import;
|
||||||
|
|
||||||
|
var result = dialog.ShowDialog();
|
||||||
|
if (result == DialogResult.OK)
|
||||||
|
{
|
||||||
|
var fileName = dialog.FileName;
|
||||||
|
using (var scope = ApplicationDbScope.FromFile(fileName))
|
||||||
|
{
|
||||||
|
foreach (var rule in scope.Rules)
|
||||||
|
{
|
||||||
|
var exsist = Program.Database.GetRule(rule.Type, rule.ListenOn, rule.ListenPort);
|
||||||
|
if (exsist is null)
|
||||||
|
{
|
||||||
|
rule.Id = Guid.NewGuid().ToString();
|
||||||
|
Program.Database.Add(rule);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RefreshProxyList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void toolStripMenuItem_ResetWindowSize_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
AppConfig = new AppConfig();
|
||||||
|
ResetWindowSize();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
<PackageTags>portproxy TCP/IP redirector</PackageTags>
|
<PackageTags>portproxy TCP/IP redirector</PackageTags>
|
||||||
<PackageLicenseFile>LICENSE.md</PackageLicenseFile>
|
<PackageLicenseFile>LICENSE.md</PackageLicenseFile>
|
||||||
<Copyright>Copyright © nstandard.net 2020</Copyright>
|
<Copyright>Copyright © nstandard.net 2020</Copyright>
|
||||||
<Version>1.3.2</Version>
|
<Version>1.4.0</Version>
|
||||||
<ApplicationIcon>icon.ico</ApplicationIcon>
|
<ApplicationIcon>icon.ico</ApplicationIcon>
|
||||||
<ApplicationDefaultFont>Microsoft Sans Serif, 8pt</ApplicationDefaultFont>
|
<ApplicationDefaultFont>Microsoft Sans Serif, 8pt</ApplicationDefaultFont>
|
||||||
<AssemblyName>PPGUI</AssemblyName>
|
<AssemblyName>PPGUI</AssemblyName>
|
||||||
|
@ -39,7 +39,7 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="SQLib.Sqlite" Version="0.8.6" />
|
<PackageReference Include="SQLib.Sqlite" Version="0.11.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -1,4 +1,64 @@
|
||||||
<root>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
@ -52,10 +112,10 @@
|
||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="columnHeader1.Text" xml:space="preserve">
|
<data name="columnHeader1.Text" xml:space="preserve">
|
||||||
<value />
|
<value />
|
||||||
|
@ -98,82 +158,112 @@
|
||||||
<value>Comment</value>
|
<value>Comment</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="columnHeader7.Width" type="System.Int32, mscorlib">
|
<data name="columnHeader7.Width" type="System.Int32, mscorlib">
|
||||||
<value>104</value>
|
<value>100</value>
|
||||||
</data>
|
</data>
|
||||||
<metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
|
||||||
<value>17, 17</value>
|
|
||||||
</metadata>
|
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||||
|
<data name="contextMenuStrip_RightClick.TrayLocation" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>17, 17</value>
|
||||||
|
</data>
|
||||||
<data name="toolStripMenuItem_Enable.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="toolStripMenuItem_Enable.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>180, 22</value>
|
<value>174, 22</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="toolStripMenuItem_Enable.Text" xml:space="preserve">
|
<data name="toolStripMenuItem_Enable.Text" xml:space="preserve">
|
||||||
<value>Enable (&E)</value>
|
<value>Enable (&E)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="toolStripMenuItem_Disable.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="toolStripMenuItem_Disable.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>180, 22</value>
|
<value>174, 22</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="toolStripMenuItem_Disable.Text" xml:space="preserve">
|
<data name="toolStripMenuItem_Disable.Text" xml:space="preserve">
|
||||||
<value>Disable (&I)</value>
|
<value>Disable (&I)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="toolStripSeparator3.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="toolStripSeparator3.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>177, 6</value>
|
<value>171, 6</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="toolStripMenuItem_Refresh.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="toolStripMenuItem_Refresh.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>180, 22</value>
|
<value>174, 22</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="toolStripMenuItem_Refresh.Text" xml:space="preserve">
|
<data name="toolStripMenuItem_Refresh.Text" xml:space="preserve">
|
||||||
<value>Refresh (&F)</value>
|
<value>Refresh (&F)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="toolStripMenuItem_FlushDnsCache.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="toolStripMenuItem_FlushDnsCache.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>180, 22</value>
|
<value>174, 22</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="toolStripMenuItem_FlushDnsCache.Text" xml:space="preserve">
|
<data name="toolStripMenuItem_FlushDnsCache.Text" xml:space="preserve">
|
||||||
<value>Flush DNS Cache</value>
|
<value>Flush DNS Cache</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="toolStripMenuItem_FlushDnsCache.ToolTipText" xml:space="preserve">
|
<data name="toolStripMenuItem_FlushDnsCache.ToolTipText" xml:space="preserve">
|
||||||
<value>Will perform ipconfig/flushDNS</value>
|
<value>Perform ipconfig /flushDNS</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="toolStripSeparator2.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="toolStripSeparator2.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>177, 6</value>
|
<value>171, 6</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="toolStripMenuItem_New.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="toolStripMenuItem_New.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>180, 22</value>
|
<value>174, 22</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="toolStripMenuItem_New.Text" xml:space="preserve">
|
<data name="toolStripMenuItem_New.Text" xml:space="preserve">
|
||||||
<value>New (&N) ...</value>
|
<value>New (&N) ...</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="toolStripMenuItem_Modify.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="toolStripMenuItem_Modify.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>180, 22</value>
|
<value>174, 22</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="toolStripMenuItem_Modify.Text" xml:space="preserve">
|
<data name="toolStripMenuItem_Modify.Text" xml:space="preserve">
|
||||||
<value>Modify (&M) ...</value>
|
<value>Modify (&M) ...</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="toolStripMenuItem_Delete.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="toolStripMenuItem_Delete.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>180, 22</value>
|
<value>174, 22</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="toolStripMenuItem_Delete.Text" xml:space="preserve">
|
<data name="toolStripMenuItem_Delete.Text" xml:space="preserve">
|
||||||
<value>Delete (&D)</value>
|
<value>Delete (&D)</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="toolStripSeparator1.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="toolStripSeparator1.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>177, 6</value>
|
<value>171, 6</value>
|
||||||
|
</data>
|
||||||
|
<data name="toolStripMenuItem_Import.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>186, 22</value>
|
||||||
|
</data>
|
||||||
|
<data name="toolStripMenuItem_Import.Text" xml:space="preserve">
|
||||||
|
<value>Import</value>
|
||||||
|
</data>
|
||||||
|
<data name="toolStripMenuItem_Export.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>186, 22</value>
|
||||||
|
</data>
|
||||||
|
<data name="toolStripMenuItem_Export.Text" xml:space="preserve">
|
||||||
|
<value>Export</value>
|
||||||
|
</data>
|
||||||
|
<data name="toolStripSeparator5.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>183, 6</value>
|
||||||
|
</data>
|
||||||
|
<data name="toolStripMenuItem_ResetWindowSize.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>186, 22</value>
|
||||||
|
</data>
|
||||||
|
<data name="toolStripMenuItem_ResetWindowSize.Text" xml:space="preserve">
|
||||||
|
<value>Reset Window</value>
|
||||||
|
</data>
|
||||||
|
<data name="toolStripMenuItem_More.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>174, 22</value>
|
||||||
|
</data>
|
||||||
|
<data name="toolStripMenuItem_More.Text" xml:space="preserve">
|
||||||
|
<value>More</value>
|
||||||
|
</data>
|
||||||
|
<data name="toolStripSeparator4.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>171, 6</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="toolStripMenuItem_About.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="toolStripMenuItem_About.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>180, 22</value>
|
<value>174, 22</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="toolStripMenuItem_About.Text" xml:space="preserve">
|
<data name="toolStripMenuItem_About.Text" xml:space="preserve">
|
||||||
<value>About</value>
|
<value>About</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="contextMenuStrip1.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="contextMenuStrip_RightClick.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>181, 220</value>
|
<value>175, 226</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>contextMenuStrip1.Name" xml:space="preserve">
|
<data name=">>contextMenuStrip_RightClick.Name" xml:space="preserve">
|
||||||
<value>contextMenuStrip1</value>
|
<value>contextMenuStrip_RightClick</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>contextMenuStrip1.Type" xml:space="preserve">
|
<data name=">>contextMenuStrip_RightClick.Type" xml:space="preserve">
|
||||||
<value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</data>
|
</data>
|
||||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||||
<data name="listViewProxies.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
<data name="listViewProxies.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||||
<value>Fill</value>
|
<value>Fill</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -187,54 +277,54 @@
|
||||||
<value>4, 3, 4, 3</value>
|
<value>4, 3, 4, 3</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="listViewProxies.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="listViewProxies.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>704, 456</value>
|
<value>704, 461</value>
|
||||||
|
</data>
|
||||||
|
<data name="imageListProxies.TrayLocation" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>239, 17</value>
|
||||||
</data>
|
</data>
|
||||||
<metadata name="imageListProxies.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
|
||||||
<value>182, 17</value>
|
|
||||||
</metadata>
|
|
||||||
<data name="imageListProxies.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
|
<data name="imageListProxies.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
<value>
|
<value>
|
||||||
AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
|
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
|
||||||
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
|
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
|
||||||
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAA3AgAAAJNU0Z0AUkBTAIBAQIB
|
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADc
|
||||||
AAEwAQEBMAEBARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMAAUADAAEQAwABAQEAAQgG
|
CAAAAk1TRnQBSQFMAgEBAgEAAYwBAQGQAQEBEAEAARABAAT/AQkBEAj/AUIBTQE2AQQGAAE2AQQCAAEo
|
||||||
AAEEGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEAAfABygGmAQABMwUAATMB
|
AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
|
||||||
AAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEAAYABfAH/AQACUAH/AQAB
|
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
|
||||||
kwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFmAwABmQMAAcwCAAEzAwAC
|
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
|
||||||
MwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZAgABZgHMAgABZgH/AgAB
|
AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
|
||||||
mQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFmAgABzAGZAgACzAIAAcwB
|
AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
|
||||||
/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEzAQABmQEAATMBAAHMAQAB
|
AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
|
||||||
MwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFmAgABMwFmATMBAAEzAmYB
|
ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
|
||||||
AAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFmAQABMwKZAQABMwGZAcwB
|
AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
|
||||||
AAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEAATMBzAH/AQABMwH/ATMB
|
AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
|
||||||
AAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFmAQABZgEAAWYBAAGZAQAB
|
AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
|
||||||
ZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFmATMBzAEAAWYBMwH/AQAC
|
AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
|
||||||
ZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFmAQABZgKZAQABZgGZAcwB
|
AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
|
||||||
AAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEAAWYB/wIAAWYB/wEzAQAB
|
AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
|
||||||
ZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZAQABmQEAAZkBAAHMAQAB
|
AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
|
||||||
mQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEzAQABmQEzAWYBAAGZAWYB
|
AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
|
||||||
mQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/AQABmQHMAgABmQHMATMB
|
ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
|
||||||
AAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEAAZkBzAFmAQABmQH/AZkB
|
Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
|
||||||
AAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHMAQABzAEAAZkBMwIAAcwC
|
AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
|
||||||
MwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFmATMBAAGZAmYBAAHMAWYB
|
AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
|
||||||
mQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZAQABzAGZAcwBAAHMAZkB
|
AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
|
||||||
/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/ATMBAAGZAf8BZgEAAcwB
|
ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
|
||||||
/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHMATMCAAH/AjMBAAH/ATMB
|
Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
|
||||||
ZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJmAQAB/wFmAZkBAAH/AWYB
|
AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
|
||||||
zAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHMAQAB/wGZAf8BAAH/AcwC
|
AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
|
||||||
AAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEAAcwB/wFmAQAC/wGZAQAC
|
AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
|
||||||
/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEAASEBAAGlAQADXwEAA3cB
|
AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
|
||||||
AAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7Af8BAAGkAqABAAOAAwAB
|
AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
|
||||||
/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/8EAAr0NAAB/wGUChcBlAH/AgAB/wG6CpUBugH/IgAB
|
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wQACvQ0AAH/AZQKFwGU
|
||||||
lAwXAZQCAAG6DJUBuiIADhcCAA6VIgAEFwEWAfQC/wH0ARYEFwIADpUiAAMXARYB/wG9ARYBlAH0Af8B
|
Af8CAAH/AboKlQG6Af8iAAGUDBcBlAIAAboMlQG6IgAOFwIADpUiAAQXARYB9AL/AfQBFgQXAgAOlSIA
|
||||||
FgMXAgAFlQK7B5UiAAMXAfQBvQIXAZQB/wL0AxcCAASVAboC/wHBBpUiAAMXAf8BFgEXAZQB/wKUAf8D
|
AxcBFgH/Ab0BFgGUAfQB/wEWAxcCAAWVArsHlSIAAxcB9AG9AhcBlAH/AvQDFwIABJUBugL/AcEGlSIA
|
||||||
FwIAA5UBugH/AcEBugH/AcEFlSIAAxcB/wKUAf8BlAEXARYB/wMXAgADlQH/AcEClQG6Af8BwQSVIgAD
|
AxcB/wEWARcBlAH/ApQB/wMXAgADlQG6Af8BwQG6Af8BwQWVIgADFwH/ApQB/wGUARcBFgH/AxcCAAOV
|
||||||
FwL0Af8BlAIXAb0B9AMXAgAIlQG6Af8BwQOVIgADFwEWAf8B9AGUARYBvQH/ARYDFwIACZUBugH/A5Ui
|
Af8BwQKVAboB/wHBBJUiAAMXAvQB/wGUAhcBvQH0AxcCAAiVAboB/wHBA5UiAAMXARYB/wH0AZQBFgG9
|
||||||
AAQXARYB9AL/AfQBFgQXAf8BAA6VAf8hAA4XAf8BAA6VAf8hAAGUDBcBlAIAAboMlQG6IgAB/wGUChcB
|
Af8BFgMXAgAJlQG6Af8DlSIABBcBFgH0Av8B9AEWBBcB/wEADpUB/yEADhcB/wEADpUB/yEAAZQMFwGU
|
||||||
lAH/AgAB/wG6CpUBugH/NAAB/wj0JAABQgFNAT4HAAE+AwABKAMAAUADAAEQAwABAQEAAQEFAAGAFwAD
|
AgABugyVAboiAAH/AZQKFwGUAf8CAAH/AboKlQG6Af80AAH/CPQkAAFCAU0BPgcAAT4DAAEoAwABQAMA
|
||||||
/wEAAeABBwL/BAABgAEBAYABAQQAAYABAQGAAQEEAAGAAQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEE
|
ARADAAEBAQABAQUAAYAXAAP/AQAB4AEHAv8EAAGAAQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAGA
|
||||||
AAGAAQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAGAAQEBgAEBBAABgAEBAYABAQQAAYABAAGABQAB
|
AQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAGAAQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAGA
|
||||||
gAEAAYAFAAGAAQEBgAEBBAABgAEBAYABAQQAAv8B4AEPBAAL
|
AQEBgAEBBAABgAEAAYAFAAGAAQABgAUAAYABAQGAAQEEAAGAAQEBgAEBBAAC/wHgAQ8aAAs=
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="listViewProxies.TabIndex" type="System.Int32, mscorlib">
|
<data name="listViewProxies.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
@ -252,14 +342,26 @@
|
||||||
<data name=">>listViewProxies.ZOrder" xml:space="preserve">
|
<data name=">>listViewProxies.ZOrder" xml:space="preserve">
|
||||||
<value>1</value>
|
<value>1</value>
|
||||||
</data>
|
</data>
|
||||||
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<data name="saveFileDialog_Export.TrayLocation" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>389, 17</value>
|
||||||
|
</data>
|
||||||
|
<data name="saveFileDialog_Export.Filter" xml:space="preserve">
|
||||||
|
<value>Database File|*.db</value>
|
||||||
|
</data>
|
||||||
|
<data name="openFileDialog_Import.TrayLocation" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>569, 17</value>
|
||||||
|
</data>
|
||||||
|
<data name="openFileDialog_Import.Filter" xml:space="preserve">
|
||||||
|
<value>Database File|*.db</value>
|
||||||
|
</data>
|
||||||
|
<data name="$this.Localizable" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
</metadata>
|
</data>
|
||||||
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
|
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
|
||||||
<value>6, 13</value>
|
<value>6, 13</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
|
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>704, 456</value>
|
<value>704, 461</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
|
@ -2530,6 +2632,30 @@
|
||||||
<data name=">>toolStripSeparator1.Type" xml:space="preserve">
|
<data name=">>toolStripSeparator1.Type" xml:space="preserve">
|
||||||
<value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name=">>toolStripMenuItem_More.Name" xml:space="preserve">
|
||||||
|
<value>toolStripMenuItem_More</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>toolStripMenuItem_More.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>toolStripMenuItem_Import.Name" xml:space="preserve">
|
||||||
|
<value>toolStripMenuItem_Import</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>toolStripMenuItem_Import.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>toolStripMenuItem_Export.Name" xml:space="preserve">
|
||||||
|
<value>toolStripMenuItem_Export</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>toolStripMenuItem_Export.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>toolStripSeparator4.Name" xml:space="preserve">
|
||||||
|
<value>toolStripSeparator4</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>toolStripSeparator4.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
<data name=">>toolStripMenuItem_About.Name" xml:space="preserve">
|
<data name=">>toolStripMenuItem_About.Name" xml:space="preserve">
|
||||||
<value>toolStripMenuItem_About</value>
|
<value>toolStripMenuItem_About</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -2542,6 +2668,30 @@
|
||||||
<data name=">>imageListProxies.Type" xml:space="preserve">
|
<data name=">>imageListProxies.Type" xml:space="preserve">
|
||||||
<value>System.Windows.Forms.ImageList, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Windows.Forms.ImageList, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name=">>saveFileDialog_Export.Name" xml:space="preserve">
|
||||||
|
<value>saveFileDialog_Export</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>saveFileDialog_Export.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.SaveFileDialog, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>openFileDialog_Import.Name" xml:space="preserve">
|
||||||
|
<value>openFileDialog_Import</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>openFileDialog_Import.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.OpenFileDialog, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>toolStripMenuItem_ResetWindowSize.Name" xml:space="preserve">
|
||||||
|
<value>toolStripMenuItem_ResetWindowSize</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>toolStripMenuItem_ResetWindowSize.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>toolStripSeparator5.Name" xml:space="preserve">
|
||||||
|
<value>toolStripSeparator5</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>toolStripSeparator5.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
<data name=">>$this.Name" xml:space="preserve">
|
<data name=">>$this.Name" xml:space="preserve">
|
||||||
<value>PortProxyGUI</value>
|
<value>PortProxyGUI</value>
|
||||||
</data>
|
</data>
|
||||||
|
|
|
@ -112,15 +112,15 @@
|
||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="columnHeader1.Text" xml:space="preserve">
|
<data name="columnHeader1.Text" xml:space="preserve">
|
||||||
<value />
|
<value />
|
||||||
</data>
|
</data>
|
||||||
<assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||||
<data name="columnHeader1.Width" type="System.Int32, mscorlib">
|
<data name="columnHeader1.Width" type="System.Int32, mscorlib">
|
||||||
<value>24</value>
|
<value>24</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -160,7 +160,7 @@
|
||||||
<data name="columnHeader7.Width" type="System.Int32, mscorlib">
|
<data name="columnHeader7.Width" type="System.Int32, mscorlib">
|
||||||
<value>104</value>
|
<value>104</value>
|
||||||
</data>
|
</data>
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||||
<data name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing">
|
<data name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing">
|
||||||
<value>17, 17</value>
|
<value>17, 17</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -173,7 +173,7 @@
|
||||||
<data name=">>contextMenuStrip1.Type" xml:space="preserve">
|
<data name=">>contextMenuStrip1.Type" xml:space="preserve">
|
||||||
<value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</data>
|
</data>
|
||||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||||
<data name="listViewProxies.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
<data name="listViewProxies.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||||
<value>Fill</value>
|
<value>Fill</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -194,10 +194,10 @@
|
||||||
</data>
|
</data>
|
||||||
<data name="imageListProxies.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
|
<data name="imageListProxies.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
<value>
|
<value>
|
||||||
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
|
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
|
||||||
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
|
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
|
||||||
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADc
|
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADc
|
||||||
CAAAAk1TRnQBSQFMAgEBAgEAASABAQEkAQEBEAEAARABAAT/AQkBEAj/AUIBTQE2AQQGAAE2AQQCAAEo
|
CAAAAk1TRnQBSQFMAgEBAgEAASABAQEwAQEBEAEAARABAAT/AQkBEAj/AUIBTQE2AQQGAAE2AQQCAAEo
|
||||||
AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
|
AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
|
||||||
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
|
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
|
||||||
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
|
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
|
||||||
|
@ -2593,4 +2593,22 @@
|
||||||
<data name=">>$this.Type" xml:space="preserve">
|
<data name=">>$this.Type" xml:space="preserve">
|
||||||
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="toolStripMenuItem_FlushDnsCache.Text" xml:space="preserve">
|
||||||
|
<value>清理 DNS 缓存</value>
|
||||||
|
</data>
|
||||||
|
<data name="toolStripMenuItem_FlushDnsCache.ToolTipText" xml:space="preserve">
|
||||||
|
<value>执行 ipconfig /flushDNS</value>
|
||||||
|
</data>
|
||||||
|
<data name="toolStripMenuItem_Export.Text" xml:space="preserve">
|
||||||
|
<value>导出</value>
|
||||||
|
</data>
|
||||||
|
<data name="toolStripMenuItem_Import.Text" xml:space="preserve">
|
||||||
|
<value>导入</value>
|
||||||
|
</data>
|
||||||
|
<data name="toolStripMenuItem_More.Text" xml:space="preserve">
|
||||||
|
<value>更多</value>
|
||||||
|
</data>
|
||||||
|
<data name="toolStripMenuItem_ResetWindowSize.Text" xml:space="preserve">
|
||||||
|
<value>重置窗口</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
|
@ -1,12 +1,15 @@
|
||||||
using PortProxyGUI.Data;
|
using PortProxyGUI.Data;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.IO;
|
||||||
|
using System.Threading;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
namespace PortProxyGUI
|
namespace PortProxyGUI
|
||||||
{
|
{
|
||||||
static class Program
|
static class Program
|
||||||
{
|
{
|
||||||
public static readonly ApplicationDbScope SqliteDbScope = ApplicationDbScope.UseDefault();
|
public static readonly ApplicationDbScope Database = ApplicationDbScope.FromFile(ApplicationDbScope.AppDbFile);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The main entry point for the application.
|
/// The main entry point for the application.
|
||||||
|
@ -14,8 +17,6 @@ namespace PortProxyGUI
|
||||||
[STAThread]
|
[STAThread]
|
||||||
static void Main()
|
static void Main()
|
||||||
{
|
{
|
||||||
SqliteDbScope.Migrate();
|
|
||||||
|
|
||||||
// To customize application configuration such as set high DPI settings or default font,
|
// To customize application configuration such as set high DPI settings or default font,
|
||||||
// see https://aka.ms/applicationconfiguration.
|
// see https://aka.ms/applicationconfiguration.
|
||||||
#if NET6_0_OR_GREATER
|
#if NET6_0_OR_GREATER
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using NStandard;
|
using NStandard;
|
||||||
using PortProxyGUI.Data;
|
using PortProxyGUI.Data;
|
||||||
|
using PortProxyGUI.Utils;
|
||||||
using System;
|
using System;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
@ -22,7 +23,7 @@ namespace PortProxyGUI
|
||||||
ParentWindow = parent;
|
ParentWindow = parent;
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
Font = Util.UiFont;
|
Font = InterfaceUtil.UiFont;
|
||||||
|
|
||||||
AutoTypeString = comboBox_Type.Text = comboBox_Type.Items.OfType<string>().First();
|
AutoTypeString = comboBox_Type.Text = comboBox_Type.Items.OfType<string>().First();
|
||||||
var groupNames = (
|
var groupNames = (
|
||||||
|
@ -115,22 +116,23 @@ namespace PortProxyGUI
|
||||||
|
|
||||||
if (_updateMode)
|
if (_updateMode)
|
||||||
{
|
{
|
||||||
var oldRule = Program.SqliteDbScope.GetRule(_itemRule.Type, _itemRule.ListenOn, _itemRule.ListenPort);
|
var oldRule = Program.Database.GetRule(_itemRule.Type, _itemRule.ListenOn, _itemRule.ListenPort);
|
||||||
PortProxyUtil.DeleteProxy(oldRule);
|
PortPorxyUtil.DeleteProxy(oldRule);
|
||||||
Program.SqliteDbScope.Remove(oldRule);
|
Program.Database.Remove(oldRule);
|
||||||
|
|
||||||
PortProxyUtil.AddOrUpdateProxy(rule);
|
PortPorxyUtil.AddOrUpdateProxy(rule);
|
||||||
Program.SqliteDbScope.Add(rule);
|
Program.Database.Add(rule);
|
||||||
|
|
||||||
ParentWindow.UpdateListViewItem(_listViewItem, rule, 1);
|
ParentWindow.UpdateListViewItem(_listViewItem, rule, 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PortProxyUtil.AddOrUpdateProxy(rule);
|
PortPorxyUtil.AddOrUpdateProxy(rule);
|
||||||
Program.SqliteDbScope.Add(rule);
|
Program.Database.Add(rule);
|
||||||
|
|
||||||
ParentWindow.RefreshProxyList();
|
ParentWindow.RefreshProxyList();
|
||||||
}
|
}
|
||||||
|
PortPorxyUtil.ParamChange();
|
||||||
|
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
namespace PortProxyGUI
|
namespace PortProxyGUI.UI
|
||||||
{
|
{
|
||||||
public class ListViewColumnSorter : IComparer
|
public class ListViewColumnSorter : IComparer
|
||||||
{
|
{
|
||||||
|
@ -68,7 +68,7 @@ namespace PortProxyGUI
|
||||||
else if (OrderOfSort == SortOrder.Descending)
|
else if (OrderOfSort == SortOrder.Descending)
|
||||||
{
|
{
|
||||||
// Descending sort is selected, return negative result of compare operation
|
// Descending sort is selected, return negative result of compare operation
|
||||||
return (-compareResult);
|
return -compareResult;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
|
@ -0,0 +1,18 @@
|
||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace PortProxyGUI.Utils
|
||||||
|
{
|
||||||
|
internal class DnsUtil
|
||||||
|
{
|
||||||
|
[DllImport("dnsapi.dll", EntryPoint = "DnsFlushResolverCache")]
|
||||||
|
static extern uint DnsFlushResolverCache();
|
||||||
|
|
||||||
|
public static void FlushCache()
|
||||||
|
{
|
||||||
|
var status = DnsFlushResolverCache();
|
||||||
|
if (status == 0) throw new InvalidOperationException("Flush DNS Cache failed.");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,9 +3,9 @@ using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace PortProxyGUI
|
namespace PortProxyGUI.Utils
|
||||||
{
|
{
|
||||||
public class Util
|
public class InterfaceUtil
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Compatibility between .NET Framework and .NET Core.
|
/// Compatibility between .NET Framework and .NET Core.
|
||||||
|
@ -15,3 +15,4 @@ namespace PortProxyGUI
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,114 @@
|
||||||
|
using Microsoft.Win32;
|
||||||
|
using PortProxyGUI.Data;
|
||||||
|
using PortProxyGUI.Native;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace PortProxyGUI.Utils
|
||||||
|
{
|
||||||
|
public static class PortPorxyUtil
|
||||||
|
{
|
||||||
|
private static InvalidOperationException InvalidPortProxyType(string type) => new($"Invalid port proxy type ({type}).");
|
||||||
|
private static readonly string[] ProxyTypes = new[] { "v4tov4", "v4tov6", "v6tov4", "v6tov6" };
|
||||||
|
|
||||||
|
private static string GetKeyName(string type)
|
||||||
|
{
|
||||||
|
return $@"SYSTEM\CurrentControlSet\Services\PortProxy\{type}\tcp";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Rule[] GetProxies()
|
||||||
|
{
|
||||||
|
var ruleList = new List<Rule>();
|
||||||
|
foreach (var type in ProxyTypes)
|
||||||
|
{
|
||||||
|
var keyName = GetKeyName(type);
|
||||||
|
var key = Registry.LocalMachine.OpenSubKey(keyName);
|
||||||
|
|
||||||
|
if (key is not null)
|
||||||
|
{
|
||||||
|
foreach (var name in key.GetValueNames())
|
||||||
|
{
|
||||||
|
var listenParts = name.Split('/');
|
||||||
|
var listenOn = listenParts[0];
|
||||||
|
if (!int.TryParse(listenParts[1], out var listenPort)) continue;
|
||||||
|
|
||||||
|
var connectParts = key.GetValue(name).ToString().Split('/');
|
||||||
|
var connectTo = connectParts[0];
|
||||||
|
if (!int.TryParse(connectParts[1], out var connectPort)) continue;
|
||||||
|
|
||||||
|
ruleList.Add(new Rule
|
||||||
|
{
|
||||||
|
Type = type,
|
||||||
|
ListenOn = listenOn,
|
||||||
|
ListenPort = listenPort,
|
||||||
|
ConnectTo = connectTo,
|
||||||
|
ConnectPort = connectPort,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ruleList.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void AddOrUpdateProxy(Rule rule)
|
||||||
|
{
|
||||||
|
// $"netsh interface portproxy add {rule.Type} listenaddress={rule.ListenOn} listenport={rule.ListenPort} connectaddress={rule.ConnectTo} connectport={rule.ConnectPort}"
|
||||||
|
|
||||||
|
if (!ProxyTypes.Contains(rule.Type)) throw InvalidPortProxyType(rule.Type);
|
||||||
|
|
||||||
|
var keyName = GetKeyName(rule.Type);
|
||||||
|
var key = Registry.LocalMachine.OpenSubKey(keyName, true);
|
||||||
|
var name = $"{rule.ListenOn}/{rule.ListenPort}";
|
||||||
|
var value = $"{rule.ConnectTo}/{rule.ConnectPort}";
|
||||||
|
|
||||||
|
if (key is null) Registry.LocalMachine.CreateSubKey(keyName);
|
||||||
|
key = Registry.LocalMachine.OpenSubKey(keyName, true);
|
||||||
|
key?.SetValue(name, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void DeleteProxy(Rule rule)
|
||||||
|
{
|
||||||
|
// $"netsh interface portproxy delete {rule.Type} listenaddress={rule.ListenOn} listenport={rule.ListenPort}"
|
||||||
|
|
||||||
|
if (!ProxyTypes.Contains(rule.Type)) throw InvalidPortProxyType(rule.Type);
|
||||||
|
|
||||||
|
var keyName = GetKeyName(rule.Type);
|
||||||
|
var key = Registry.LocalMachine.OpenSubKey(keyName, true);
|
||||||
|
var name = $"{rule.ListenOn}/{rule.ListenPort}";
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
key?.DeleteValue(name);
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ParamChange()
|
||||||
|
{
|
||||||
|
var hManager = NativeMethods.OpenSCManager(null, null, (uint)GenericRights.GENERIC_READ);
|
||||||
|
if (hManager == IntPtr.Zero) throw new InvalidOperationException("Open SC Manager failed.");
|
||||||
|
|
||||||
|
var serviceName = "iphlpsvc";
|
||||||
|
var hService = NativeMethods.OpenService(hManager, serviceName, ServiceRights.SERVICE_PAUSE_CONTINUE);
|
||||||
|
if (hService == IntPtr.Zero)
|
||||||
|
{
|
||||||
|
NativeMethods.CloseServiceHandle(hManager);
|
||||||
|
throw new InvalidOperationException($"Open Service ({serviceName}) failed.");
|
||||||
|
}
|
||||||
|
|
||||||
|
var serviceStatus = new ServiceStatus();
|
||||||
|
var success = NativeMethods.ControlService(hService, ServiceControls.SERVICE_CONTROL_PARAMCHANGE, ref serviceStatus);
|
||||||
|
|
||||||
|
NativeMethods.CloseServiceHandle(hService);
|
||||||
|
NativeMethods.CloseServiceHandle(hManager);
|
||||||
|
|
||||||
|
if (!success)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"Control Service ({serviceName}) ParamChange failed.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,27 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Diagnostics;
|
|
||||||
|
|
||||||
namespace PortProxyGUI
|
|
||||||
{
|
|
||||||
[Obsolete("The method of creating a new process is no longer used.")]
|
|
||||||
public static class CmdRunner
|
|
||||||
{
|
|
||||||
public static string Execute(string cmd)
|
|
||||||
{
|
|
||||||
var proc = Process.Start(new ProcessStartInfo
|
|
||||||
{
|
|
||||||
FileName = "cmd",
|
|
||||||
UseShellExecute = false,
|
|
||||||
RedirectStandardInput = true,
|
|
||||||
RedirectStandardOutput = true,
|
|
||||||
CreateNoWindow = true,
|
|
||||||
});
|
|
||||||
proc.Start();
|
|
||||||
|
|
||||||
proc.StandardInput.WriteLine($"{cmd} & exit");
|
|
||||||
var output = proc.StandardOutput.ReadToEnd();
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,89 +0,0 @@
|
||||||
using NStandard;
|
|
||||||
using PortProxyGUI.Data;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
|
|
||||||
namespace PortProxyGUI
|
|
||||||
{
|
|
||||||
[Obsolete("The method of creating a new process is no longer used.", true)]
|
|
||||||
public static class CmdUtil
|
|
||||||
{
|
|
||||||
private static Regex GetRegex(string fromType, string toType)
|
|
||||||
{
|
|
||||||
return new Regex($@"{fromType}[^:]*:[^\n]+?{toType}[^:]*:\r\n\r\n.+?\r\n--------------- ---------- --------------- ----------\r\n(.+?)\r\n\r\n", RegexOptions.Singleline);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static readonly Dictionary<string, Regex> RegexList = new Dictionary<string, Regex>()
|
|
||||||
{
|
|
||||||
["ipv4 to ipv4"] = GetRegex("ipv4", "ipv4"),
|
|
||||||
["ipv4 to ipv6"] = GetRegex("ipv4", "ipv6"),
|
|
||||||
["ipv6 to ipv4"] = GetRegex("ipv6", "ipv4"),
|
|
||||||
["ipv6 to ipv6"] = GetRegex("ipv6", "ipv6"),
|
|
||||||
};
|
|
||||||
|
|
||||||
private static readonly Regex LineRegex = new(@"^(.*?)\s{1,}(.*?)\s{1,}(.*?)\s{1,}(.*?)$");
|
|
||||||
|
|
||||||
public static Rule[] GetProxies()
|
|
||||||
{
|
|
||||||
var output = CmdRunner.Execute("netsh interface portproxy show all");
|
|
||||||
var types = new[]
|
|
||||||
{
|
|
||||||
new ProxyType("ipv4", "ipv4"),
|
|
||||||
new ProxyType("ipv4", "ipv6"),
|
|
||||||
new ProxyType("ipv6", "ipv4"),
|
|
||||||
new ProxyType("ipv6", "ipv6"),
|
|
||||||
};
|
|
||||||
|
|
||||||
var list = new List<Rule>();
|
|
||||||
foreach (var type in types)
|
|
||||||
{
|
|
||||||
var regex = RegexList[$"{type.From} to {type.To}"];
|
|
||||||
var settings = output.ExtractFirst(regex);
|
|
||||||
var lines = settings?.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
|
|
||||||
|
|
||||||
if (lines is not null)
|
|
||||||
{
|
|
||||||
foreach (var line in lines)
|
|
||||||
{
|
|
||||||
if (line.TryResolve(LineRegex, out var parts))
|
|
||||||
{
|
|
||||||
var realListenPort = parts[2].First();
|
|
||||||
var realConnectPort = parts[4].First();
|
|
||||||
|
|
||||||
_ = int.TryParse(realListenPort, out var listenPort);
|
|
||||||
_ = int.TryParse(realConnectPort, out var connectPort);
|
|
||||||
|
|
||||||
list.Add(new Rule
|
|
||||||
{
|
|
||||||
Type = type.Type,
|
|
||||||
ListenOn = parts[1].First(),
|
|
||||||
ListenPort = listenPort,
|
|
||||||
ConnectTo = parts[3].First(),
|
|
||||||
ConnectPort = connectPort,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return list.ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void AddOrUpdateProxy(Rule rule)
|
|
||||||
{
|
|
||||||
CmdRunner.Execute($"netsh interface portproxy add {rule.Type} listenaddress={rule.ListenOn} listenport={rule.ListenPort} connectaddress={rule.ConnectTo} connectport={rule.ConnectPort}");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void DeleteProxy(Rule rule)
|
|
||||||
{
|
|
||||||
CmdRunner.Execute($"netsh interface portproxy delete {rule.Type} listenaddress={rule.ListenOn} listenport={rule.ListenPort}");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string FlushDNSCache()
|
|
||||||
{
|
|
||||||
return CmdRunner.Execute("ipconfig /flushdns");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,71 +0,0 @@
|
||||||
using Microsoft.Win32;
|
|
||||||
using PortProxyGUI.Data;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace PortProxyGUI
|
|
||||||
{
|
|
||||||
public static class PortProxyUtil
|
|
||||||
{
|
|
||||||
private static InvalidOperationException InvalidPortProxyType(string type) => new($"Invalid port proxy type ({type}).");
|
|
||||||
private static readonly string[] ProxyTypes = new[] { "v4tov4", "v4tov6", "v6tov4", "v6tov6" };
|
|
||||||
|
|
||||||
public static Rule[] GetProxies()
|
|
||||||
{
|
|
||||||
var ruleList = new List<Rule>();
|
|
||||||
foreach (var type in ProxyTypes)
|
|
||||||
{
|
|
||||||
var keyName = $@"SYSTEM\ControlSet001\Services\PortProxy\{type}\tcp";
|
|
||||||
var key = Registry.LocalMachine.OpenSubKey(keyName);
|
|
||||||
|
|
||||||
if (key is not null)
|
|
||||||
{
|
|
||||||
foreach (var name in key.GetValueNames())
|
|
||||||
{
|
|
||||||
var listenParts = name.Split('/');
|
|
||||||
var listenOn = listenParts[0];
|
|
||||||
if (!int.TryParse(listenParts[1], out var listenPort)) continue;
|
|
||||||
|
|
||||||
var connectParts = key.GetValue(name).ToString().Split('/');
|
|
||||||
var connectTo = connectParts[0];
|
|
||||||
if (!int.TryParse(connectParts[1], out var connectPort)) continue;
|
|
||||||
|
|
||||||
ruleList.Add(new Rule
|
|
||||||
{
|
|
||||||
Type = type,
|
|
||||||
ListenOn = listenOn,
|
|
||||||
ListenPort = listenPort,
|
|
||||||
ConnectTo = connectTo,
|
|
||||||
ConnectPort = connectPort,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ruleList.ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void AddOrUpdateProxy(Rule rule)
|
|
||||||
{
|
|
||||||
if (!ProxyTypes.Contains(rule.Type)) throw InvalidPortProxyType(rule.Type);
|
|
||||||
|
|
||||||
var keyName = $@"SYSTEM\ControlSet001\Services\PortProxy\{rule.Type}\tcp";
|
|
||||||
var key = Registry.LocalMachine.OpenSubKey(keyName, true);
|
|
||||||
var valueName = $"{rule.ListenOn}/{rule.ListenPort}";
|
|
||||||
var value = $"{rule.ConnectTo}/{rule.ConnectPort}";
|
|
||||||
|
|
||||||
key.SetValue(valueName, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void DeleteProxy(Rule rule)
|
|
||||||
{
|
|
||||||
if (!ProxyTypes.Contains(rule.Type)) throw InvalidPortProxyType(rule.Type);
|
|
||||||
|
|
||||||
var keyName = $@"SYSTEM\ControlSet001\Services\PortProxy\{rule.Type}\tcp";
|
|
||||||
var key = Registry.LocalMachine.OpenSubKey(keyName, true);
|
|
||||||
var valueName = $"{rule.ListenOn}/{rule.ListenPort}";
|
|
||||||
|
|
||||||
key.DeleteValue(valueName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace PortProxyGUI
|
|
||||||
{
|
|
||||||
public class ProxyType
|
|
||||||
{
|
|
||||||
public ProxyType(string from, string to)
|
|
||||||
{
|
|
||||||
From = from;
|
|
||||||
To = to;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string From { get; set; }
|
|
||||||
public string To { get; set; }
|
|
||||||
public string Type
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (From == "ipv4" && To == "ipv4") return "v4tov4";
|
|
||||||
if (From == "ipv4" && To == "ipv6") return "v4tov6";
|
|
||||||
if (From == "ipv6" && To == "ipv4") return "v6tov4";
|
|
||||||
if (From == "ipv6" && To == "ipv6") return "v6tov6";
|
|
||||||
throw new NotSupportedException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
BIN
docs/ui.png
BIN
docs/ui.png
Binary file not shown.
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 17 KiB |
Loading…
Reference in New Issue