Compare commits

..

No commits in common. "master" and "v1.1.2" have entirely different histories.

96 changed files with 28722 additions and 3249 deletions

85
PortProxyGUI - NET35/About.Designer.cs generated Normal file
View File

@ -0,0 +1,85 @@
namespace PortProxyGUI
{
partial class About
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(About));
this.linkLabel1 = new System.Windows.Forms.LinkLabel();
this.label1 = new System.Windows.Forms.Label();
this.label_version = new System.Windows.Forms.Label();
this.label_Star = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// linkLabel1
//
resources.ApplyResources(this.linkLabel1, "linkLabel1");
this.linkLabel1.Name = "linkLabel1";
this.linkLabel1.TabStop = true;
this.linkLabel1.Click += new System.EventHandler(this.linkLabel1_Click);
//
// label1
//
resources.ApplyResources(this.label1, "label1");
this.label1.Name = "label1";
//
// label_version
//
resources.ApplyResources(this.label_version, "label_version");
this.label_version.Name = "label_version";
//
// label_Star
//
resources.ApplyResources(this.label_Star, "label_Star");
this.label_Star.Name = "label_Star";
//
// About
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.label_Star);
this.Controls.Add(this.label_version);
this.Controls.Add(this.label1);
this.Controls.Add(this.linkLabel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "About";
this.TopMost = true;
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.About_FormClosing);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.LinkLabel linkLabel1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label_version;
private System.Windows.Forms.Label label_Star;
}
}

View File

@ -0,0 +1,31 @@
using System;
using System.Diagnostics;
using System.Windows.Forms;
namespace PortProxyGUI
{
public partial class About : Form
{
public readonly PortProxyGUI PortProxyGUI;
public About(PortProxyGUI portProxyGUI)
{
PortProxyGUI = portProxyGUI;
InitializeComponent();
label_version.Text = label_version.Text + " v" + Application.ProductVersion;
}
private void linkLabel1_Click(object sender, EventArgs e)
{
if (sender is LinkLabel _sender)
{
Process.Start("explorer", _sender.Text);
}
}
private void About_FormClosing(object sender, FormClosingEventArgs e)
{
PortProxyGUI.AboutForm = null;
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,179 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{56FB1CBC-BD89-47D7-A9D5-86F02EEF480F}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>PortProxyGUI</RootNamespace>
<AssemblyName>PortProxyGUI</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
<IsWebBootstrapper>false</IsWebBootstrapper>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<PublishWizardCompleted>true</PublishWizardCompleted>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>none</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE;NET35</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>icon.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<ManifestCertificateThumbprint>BEF27898E4C102E806F3241497048E740EC39033</ManifestCertificateThumbprint>
</PropertyGroup>
<PropertyGroup>
<ManifestKeyFile>PortProxyGUI - NET_TemporaryKey.pfx</ManifestKeyFile>
</PropertyGroup>
<PropertyGroup>
<GenerateManifests>false</GenerateManifests>
</PropertyGroup>
<PropertyGroup>
<SignManifests>true</SignManifests>
</PropertyGroup>
<PropertyGroup>
<TargetZone>LocalIntranet</TargetZone>
</PropertyGroup>
<ItemGroup>
<Reference Include="NStandard, Version=0.6.7.1, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\NStandard.0.6.7.1\lib\net35\NStandard.dll</HintPath>
</Reference>
<Reference Include="SQLib, Version=0.8.6.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\SQLib.0.8.6\lib\net35\SQLib.dll</HintPath>
</Reference>
<Reference Include="SQLib.Sqlite, Version=0.8.6.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\SQLib.Sqlite.0.8.6\lib\net35\SQLib.Sqlite.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data.SQLite, Version=1.0.113.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
<HintPath>..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.113.3\lib\net20\System.Data.SQLite.dll</HintPath>
</Reference>
<Reference Include="System.Web" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="About.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="About.Designer.cs">
<DependentUpon>About.cs</DependentUpon>
</Compile>
<Compile Include="SetProxyForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="SetProxyForm.Designer.cs">
<DependentUpon>SetProxyForm.cs</DependentUpon>
</Compile>
<Compile Include="PortProxyGUI.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="PortProxyGUI.Designer.cs">
<DependentUpon>PortProxyGUI.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="About.resx">
<DependentUpon>About.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="About.zh-CN.resx">
<DependentUpon>About.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="SetProxyForm.resx">
<DependentUpon>SetProxyForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="SetProxyForm.zh-CN.resx">
<DependentUpon>SetProxyForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="PortProxyGUI.resx">
<DependentUpon>PortProxyGUI.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="PortProxyGUI.zh-CN.resx">
<DependentUpon>PortProxyGUI.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="app.config" />
<None Include="app.manifest" />
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<Content Include="icon.ico" />
</ItemGroup>
<Import Project="..\PortProxyGUI.Shared\PortProxyGUI.Shared.projitems" Label="Shared" />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.113.3\build\net20\Stub.System.Data.SQLite.Core.NetFramework.targets" Condition="Exists('..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.113.3\build\net20\Stub.System.Data.SQLite.Core.NetFramework.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.113.3\build\net20\Stub.System.Data.SQLite.Core.NetFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.113.3\build\net20\Stub.System.Data.SQLite.Core.NetFramework.targets'))" />
</Target>
</Project>

View File

@ -0,0 +1,211 @@
namespace PortProxyGUI
{
partial class PortProxyGUI
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PortProxyGUI));
this.listViewProxies = new System.Windows.Forms.ListView();
this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
this.toolStripMenuItem_Enable = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem_Disable = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripMenuItem_New = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem_Modify = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem_Delete = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripMenuItem_Refresh = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripMenuItem_About = new System.Windows.Forms.ToolStripMenuItem();
this.imageListProxies = new System.Windows.Forms.ImageList(this.components);
this.contextMenuStrip1.SuspendLayout();
this.SuspendLayout();
//
// listViewProxies
//
this.listViewProxies.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.listViewProxies.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeader1,
this.columnHeader2,
this.columnHeader3,
this.columnHeader4,
this.columnHeader5,
this.columnHeader6});
this.listViewProxies.ContextMenuStrip = this.contextMenuStrip1;
resources.ApplyResources(this.listViewProxies, "listViewProxies");
this.listViewProxies.FullRowSelect = true;
this.listViewProxies.HideSelection = false;
this.listViewProxies.Name = "listViewProxies";
this.listViewProxies.SmallImageList = this.imageListProxies;
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.MouseUp += new System.Windows.Forms.MouseEventHandler(this.listView1_MouseUp);
//
// columnHeader1
//
resources.ApplyResources(this.columnHeader1, "columnHeader1");
//
// columnHeader2
//
resources.ApplyResources(this.columnHeader2, "columnHeader2");
//
// columnHeader3
//
resources.ApplyResources(this.columnHeader3, "columnHeader3");
//
// columnHeader4
//
resources.ApplyResources(this.columnHeader4, "columnHeader4");
//
// columnHeader5
//
resources.ApplyResources(this.columnHeader5, "columnHeader5");
//
// columnHeader6
//
resources.ApplyResources(this.columnHeader6, "columnHeader6");
//
// contextMenuStrip1
//
this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripMenuItem_Enable,
this.toolStripMenuItem_Disable,
this.toolStripSeparator3,
this.toolStripMenuItem_Refresh,
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
//
this.toolStripMenuItem_Enable.Name = "toolStripMenuItem_Enable";
resources.ApplyResources(this.toolStripMenuItem_Enable, "toolStripMenuItem_Enable");
//
// toolStripMenuItem_Disable
//
this.toolStripMenuItem_Disable.Name = "toolStripMenuItem_Disable";
resources.ApplyResources(this.toolStripMenuItem_Disable, "toolStripMenuItem_Disable");
//
// toolStripSeparator3
//
this.toolStripSeparator3.Name = "toolStripSeparator3";
resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3");
//
// toolStripMenuItem_New
//
this.toolStripMenuItem_New.Name = "toolStripMenuItem_New";
resources.ApplyResources(this.toolStripMenuItem_New, "toolStripMenuItem_New");
//
// toolStripMenuItem_Modify
//
this.toolStripMenuItem_Modify.Name = "toolStripMenuItem_Modify";
resources.ApplyResources(this.toolStripMenuItem_Modify, "toolStripMenuItem_Modify");
//
// toolStripMenuItem_Delete
//
this.toolStripMenuItem_Delete.Name = "toolStripMenuItem_Delete";
resources.ApplyResources(this.toolStripMenuItem_Delete, "toolStripMenuItem_Delete");
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1");
//
// toolStripMenuItem_Refresh
//
this.toolStripMenuItem_Refresh.Name = "toolStripMenuItem_Refresh";
resources.ApplyResources(this.toolStripMenuItem_Refresh, "toolStripMenuItem_Refresh");
//
// toolStripSeparator2
//
this.toolStripSeparator2.Name = "toolStripSeparator2";
resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2");
//
// toolStripMenuItem_About
//
this.toolStripMenuItem_About.Name = "toolStripMenuItem_About";
resources.ApplyResources(this.toolStripMenuItem_About, "toolStripMenuItem_About");
//
// imageListProxies
//
this.imageListProxies.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListProxies.ImageStream")));
this.imageListProxies.TransparentColor = System.Drawing.Color.Transparent;
this.imageListProxies.Images.SetKeyName(0, "disable.png");
this.imageListProxies.Images.SetKeyName(1, "enable.png");
//
// PortProxyGUI
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.listViewProxies);
this.Name = "PortProxyGUI";
this.Load += new System.EventHandler(this.PortProxyGUI_Load);
this.Shown += new System.EventHandler(this.PortProxyGUI_Shown);
this.contextMenuStrip1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.ListView listViewProxies;
private System.Windows.Forms.ColumnHeader columnHeader2;
private System.Windows.Forms.ColumnHeader columnHeader3;
private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_New;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Delete;
private System.Windows.Forms.ColumnHeader columnHeader4;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Refresh;
private System.Windows.Forms.ColumnHeader columnHeader5;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_About;
private System.Windows.Forms.ColumnHeader columnHeader6;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Modify;
private System.Windows.Forms.ColumnHeader columnHeader1;
private System.Windows.Forms.ImageList imageListProxies;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Enable;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Disable;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
}
}

View File

@ -0,0 +1,198 @@
using NStandard;
using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using static System.Windows.Forms.ListViewItem;
namespace PortProxyGUI
{
public partial class PortProxyGUI : Form
{
public SetProxyForm SetProxyForm;
public About AboutForm;
private ListViewColumnSorter lvwColumnSorter;
public PortProxyGUI()
{
InitializeComponent();
lvwColumnSorter = new ListViewColumnSorter();
listViewProxies.ListViewItemSorter = lvwColumnSorter;
}
private void PortProxyGUI_Load(object sender, EventArgs e)
{
}
private void PortProxyGUI_Shown(object sender, EventArgs e)
{
RefreshProxyList();
}
private void EnableSelectedProxies()
{
var items = listViewProxies.SelectedItems.OfType<ListViewItem>();
foreach (var item in items)
{
item.ImageIndex = 1;
var subItems = item.SubItems.OfType<ListViewSubItem>().ToArray();
CmdUtil.AddProxy("add", subItems[1].Text, subItems[2].Text, int.Parse(subItems[3].Text), subItems[4].Text, int.Parse(subItems[5].Text));
}
}
private void DisableSelectedProxies()
{
var items = listViewProxies.SelectedItems.OfType<ListViewItem>();
foreach (var item in items)
{
item.ImageIndex = 0;
var subItems = item.SubItems.OfType<ListViewSubItem>().ToArray();
CmdUtil.DeleteProxy(subItems[1].Text, subItems[2].Text, int.Parse(subItems[3].Text));
}
}
private void DeleteSelectedProxies()
{
var items = listViewProxies.SelectedItems.OfType<ListViewItem>();
DisableSelectedProxies();
Program.SqliteDbScope.RemoveRange(items.Select(x => new Data.Rule { Id = x.Tag.ToString() }));
foreach (var item in items) listViewProxies.Items.Remove(item);
}
private void SetProxyForUpdate(SetProxyForm form)
{
var item = listViewProxies.SelectedItems.OfType<ListViewItem>().FirstOrDefault();
var subItems = item.SubItems.OfType<ListViewSubItem>().ToArray();
if (int.TryParse(subItems[3].Text, out var listenPort) && 0 < listenPort && listenPort < 65536)
{
form.UseUpdateMode(item, subItems[1].Text, subItems[2].Text, listenPort, subItems[4].Text, subItems[5].Text);
}
else MessageBox.Show("无效端口号。", "无效端口号", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
public void RefreshProxyList()
{
var proxies = CmdUtil.GetProxies();
var rules = Program.SqliteDbScope.Rules;
foreach (var proxy in proxies)
{
var matchedRule = rules.FirstOrDefault(r => r.EqualsWithKeys(proxy));
proxy.Id = matchedRule?.Id;
}
var pendingAdds = proxies.Where(x => x.Id == null);
var pendingUpdates = proxies.Where(x => x.Id != null && !x.Equals(rules.First(r => r.Id == x.Id)));
Program.SqliteDbScope.AddRange(pendingAdds);
Program.SqliteDbScope.UpdateRange(pendingUpdates);
listViewProxies.Items.Clear();
rules = Program.SqliteDbScope.Rules;
foreach (var rule in rules)
{
var imageIndex = proxies.Any(p => p.EqualsWithKeys(rule)) ? 1 : 0;
var item = new ListViewItem { ImageIndex = imageIndex, Tag = rule.Id }.Then(vitem =>
{
vitem.SubItems.AddRange(new[] { rule.Type, rule.ListenOn, rule.ListenPort.ToString(), rule.ConnectTo, rule.ConnectPort.ToString() });
});
listViewProxies.Items.Add(item);
}
}
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;
switch (selected)
{
case ToolStripMenuItem item when item == toolStripMenuItem_Enable: EnableSelectedProxies(); break;
case ToolStripMenuItem item when item == toolStripMenuItem_Disable: DisableSelectedProxies(); break;
case ToolStripMenuItem item when item == toolStripMenuItem_New:
if (SetProxyForm == null) SetProxyForm = new SetProxyForm(this);
SetProxyForm.UseNormalMode();
SetProxyForm.ShowDialog();
break;
case ToolStripMenuItem item when item == toolStripMenuItem_Modify:
if (SetProxyForm == null) SetProxyForm = new SetProxyForm(this);
SetProxyForUpdate(SetProxyForm);
SetProxyForm.ShowDialog();
break;
case ToolStripMenuItem item when item == toolStripMenuItem_Refresh:
RefreshProxyList();
break;
case ToolStripMenuItem item when item == toolStripMenuItem_Delete: DeleteSelectedProxies(); break;
case ToolStripMenuItem item when item == toolStripMenuItem_About:
if (AboutForm == null)
{
AboutForm = new About(this);
AboutForm.Show();
}
else AboutForm.Show();
break;
}
}
}
private void listView1_MouseUp(object sender, MouseEventArgs e)
{
if (sender is ListView _sender)
{
toolStripMenuItem_Enable.Enabled = e.Button == MouseButtons.Right && _sender.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_Delete.Enabled = e.Button == MouseButtons.Right && _sender.SelectedItems.OfType<ListViewItem>().Any();
toolStripMenuItem_Modify.Enabled = e.Button == MouseButtons.Right && _sender.SelectedItems.OfType<ListViewItem>().Count() == 1;
}
}
private void listView1_DoubleClick(object sender, EventArgs e)
{
if (sender is ListView _sender)
{
var selectAny = _sender.SelectedItems.OfType<ListViewItem>().Any();
if (selectAny)
{
if (SetProxyForm == null) SetProxyForm = new SetProxyForm(this);
SetProxyForUpdate(SetProxyForm);
SetProxyForm.ShowDialog();
}
}
}
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
// Determine if clicked column is already the column that is being sorted.
if (e.Column == lvwColumnSorter.SortColumn)
{
// Reverse the current sort direction for this column.
if (lvwColumnSorter.Order == SortOrder.Ascending)
{
lvwColumnSorter.Order = SortOrder.Descending;
}
else
{
lvwColumnSorter.Order = SortOrder.Ascending;
}
}
else
{
// Set the column number that is to be sorted; default to ascending.
lvwColumnSorter.SortColumn = e.Column;
lvwColumnSorter.Order = SortOrder.Ascending;
}
// Perform the sort with these new sort options.
listViewProxies.Sort();
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,23 @@
using PortProxyGUI.Data;
using System;
using System.Windows.Forms;
namespace PortProxyGUI
{
static class Program
{
public static readonly ApplicationDbScope SqliteDbScope = ApplicationDbScope.UseDefault();
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
SqliteDbScope.Migrate();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new PortProxyGUI());
}
}
}

View File

@ -0,0 +1,35 @@
using System.Reflection;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("PortProxyGUI - NET")]
[assembly: AssemblyDescription("A manager of the netsh interface portproxy which is to evaluate TCP/IP port redirect on windows.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("nstandard.net")]
[assembly: AssemblyProduct("PortProxyGUI - NET")]
[assembly: AssemblyCopyright("Copyright © nstandard.net 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("1b166039-e98c-404a-89a5-c981364b5546")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.1.2.0")]
[assembly: AssemblyFileVersion("1.1.2.0")]

View File

@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace PortProxyGUI.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PortProxyGUI.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

View File

@ -0,0 +1,117 @@
<?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.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:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace PortProxyGUI.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.6.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View File

@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

View File

@ -0,0 +1,151 @@
namespace PortProxyGUI
{
partial class SetProxyForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SetProxyForm));
this.label1 = new System.Windows.Forms.Label();
this.textBox_listenOn = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.textBox_connectTo = new System.Windows.Forms.TextBox();
this.textBox_connectPort = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.button_submit = new System.Windows.Forms.Button();
this.label4 = new System.Windows.Forms.Label();
this.label5 = new System.Windows.Forms.Label();
this.textBox_listenPort = new System.Windows.Forms.TextBox();
this.comboBox_type = new System.Windows.Forms.ComboBox();
this.SuspendLayout();
//
// label1
//
resources.ApplyResources(this.label1, "label1");
this.label1.Name = "label1";
//
// textBox_listenOn
//
resources.ApplyResources(this.textBox_listenOn, "textBox_listenOn");
this.textBox_listenOn.Name = "textBox_listenOn";
//
// label2
//
resources.ApplyResources(this.label2, "label2");
this.label2.Name = "label2";
//
// textBox_connectTo
//
resources.ApplyResources(this.textBox_connectTo, "textBox_connectTo");
this.textBox_connectTo.Name = "textBox_connectTo";
//
// textBox_connectPort
//
resources.ApplyResources(this.textBox_connectPort, "textBox_connectPort");
this.textBox_connectPort.Name = "textBox_connectPort";
//
// label3
//
resources.ApplyResources(this.label3, "label3");
this.label3.Name = "label3";
//
// button_submit
//
resources.ApplyResources(this.button_submit, "button_submit");
this.button_submit.Name = "button_submit";
this.button_submit.UseVisualStyleBackColor = true;
this.button_submit.Click += new System.EventHandler(this.button_submit_Click);
//
// label4
//
resources.ApplyResources(this.label4, "label4");
this.label4.Name = "label4";
//
// label5
//
resources.ApplyResources(this.label5, "label5");
this.label5.Name = "label5";
//
// textBox_listenPort
//
resources.ApplyResources(this.textBox_listenPort, "textBox_listenPort");
this.textBox_listenPort.Name = "textBox_listenPort";
//
// comboBox_type
//
resources.ApplyResources(this.comboBox_type, "comboBox_type");
this.comboBox_type.FormattingEnabled = true;
this.comboBox_type.Items.AddRange(new object[] {
resources.GetString("comboBox_type.Items"),
resources.GetString("comboBox_type.Items1"),
resources.GetString("comboBox_type.Items2"),
resources.GetString("comboBox_type.Items3"),
resources.GetString("comboBox_type.Items4")});
this.comboBox_type.Name = "comboBox_type";
//
// SetProxyForm
//
this.AcceptButton = this.button_submit;
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.comboBox_type);
this.Controls.Add(this.textBox_listenPort);
this.Controls.Add(this.label5);
this.Controls.Add(this.label4);
this.Controls.Add(this.button_submit);
this.Controls.Add(this.label3);
this.Controls.Add(this.textBox_connectPort);
this.Controls.Add(this.textBox_connectTo);
this.Controls.Add(this.label2);
this.Controls.Add(this.textBox_listenOn);
this.Controls.Add(this.label1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "SetProxyForm";
this.TopMost = true;
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.SetProxyForm_FormClosing);
this.Load += new System.EventHandler(this.SetProxyForm_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox textBox_listenOn;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox textBox_connectTo;
private System.Windows.Forms.TextBox textBox_connectPort;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Button button_submit;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.TextBox textBox_listenPort;
private System.Windows.Forms.ComboBox comboBox_type;
}
}

View File

@ -0,0 +1,141 @@
using NStandard;
using System;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace PortProxyGUI
{
public partial class SetProxyForm : Form
{
public readonly PortProxyGUI ParentWindow;
private string AutoTypeString { get; }
private bool _updateMode;
private ListViewItem _updateLiveViewItem;
private string _oldType;
private string _oldListenOn;
private int _oldListenPort;
public SetProxyForm(PortProxyGUI parent)
{
ParentWindow = parent;
InitializeComponent();
AutoTypeString = comboBox_type.Text = comboBox_type.Items.OfType<string>().First();
}
public void UseNormalMode()
{
_updateMode = false;
_updateLiveViewItem = null;
_oldType = null;
_oldListenOn = null;
_oldListenPort = 0;
comboBox_type.Text = AutoTypeString;
textBox_listenOn.Text = "*";
textBox_listenPort.Text = "";
textBox_connectTo.Text = "";
textBox_connectPort.Text = "";
}
public void UseUpdateMode(ListViewItem item, string type, string listenOn, int listenPort, string connectTo, string connectPort)
{
_updateMode = true;
_updateLiveViewItem = item;
_oldType = type;
_oldListenOn = listenOn.Trim().ToLower();
_oldListenPort = listenPort;
comboBox_type.Text = type;
textBox_listenOn.Text = listenOn.ToString();
textBox_listenPort.Text = listenPort.ToString();
textBox_connectTo.Text = connectTo;
textBox_connectPort.Text = connectPort;
}
private bool IsIPv6(string ip)
{
return ip.IsMatch(new Regex(@"^[\dABCDEF]{2}(?::(?:[\dABCDEF]{2})){5}$"));
}
private string GetPassType(string listenOn, string connectTo)
{
var from = IsIPv6(listenOn) ? "v6" : "v4";
var to = IsIPv6(connectTo) ? "v6" : "v4";
return $"{from}to{to}";
}
private void button_submit_Click(object sender, EventArgs e)
{
var type = comboBox_type.Text.Trim();
var listenOn = textBox_listenOn.Text.Trim().ToLower();
var connectTo = textBox_connectTo.Text.Trim().ToLower();
var listenPort = textBox_listenPort.Text.Trim();
var connectPort = textBox_connectPort.Text.Trim();
if (!int.TryParse(listenPort, out var _listenPort) || _listenPort < 0 || _listenPort > 65535)
{
MessageBox.Show($"The listen port is invalid.", "Fail", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (!int.TryParse(connectPort, out var _connectPort) || _connectPort < 0 || _connectPort > 65535)
{
MessageBox.Show($"The connect port is invalid.", "Fail", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (type == AutoTypeString) type = GetPassType(listenOn, connectTo);
if (!new[] { "v4tov4", "v4tov6", "v6tov4", "v6tov6" }.Contains(type))
{
MessageBox.Show($"Unknow type for ({listenOn} -> {connectTo}).", "Fail", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (_updateMode)
{
var rule = Program.SqliteDbScope.GetRule(_oldType, _oldListenOn, _oldListenPort);
CmdUtil.DeleteProxy(_oldType, _oldListenOn, _oldListenPort);
Program.SqliteDbScope.Remove(rule);
rule.Type = type;
rule.ListenOn = listenOn;
rule.ListenPort = _listenPort;
rule.ConnectTo = connectTo;
rule.ConnectPort = _connectPort;
CmdUtil.AddProxy("add", type, listenOn, _listenPort, connectTo, _connectPort);
Program.SqliteDbScope.Add(rule);
_updateLiveViewItem.ImageIndex = 1;
var subItems = _updateLiveViewItem.SubItems;
subItems[1].Text = type;
subItems[2].Text = listenOn;
subItems[3].Text = _listenPort.ToString();
subItems[4].Text = connectTo;
subItems[5].Text = _connectPort.ToString();
}
else
{
CmdUtil.AddProxy("add", type, listenOn, _listenPort, connectTo, _connectPort);
ParentWindow.RefreshProxyList();
}
Close();
}
private void SetProxyForm_Load(object sender, EventArgs e)
{
Top = ParentWindow.Top + (ParentWindow.Height - Height) / 2;
Left = ParentWindow.Left + (ParentWindow.Width - Width) / 2;
}
private void SetProxyForm_FormClosing(object sender, FormClosingEventArgs e)
{
ParentWindow.SetProxyForm = null;
}
}
}

View File

@ -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:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
@ -57,506 +117,329 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="label_ListenOn.AutoSize" type="System.Boolean, mscorlib">
<assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="label1.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="label_ListenOn.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="label1.Location" type="System.Drawing.Point, System.Drawing">
<value>13, 11</value>
</data>
<data name="label_ListenOn.Location" type="System.Drawing.Point, System.Drawing">
<value>14, 62</value>
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
<value>59, 12</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="label_ListenOn.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 0, 4, 0</value>
</data>
<data name="label_ListenOn.Size" type="System.Drawing.Size, System.Drawing">
<value>60, 17</value>
</data>
<data name="label_ListenOn.TabIndex" type="System.Int32, mscorlib">
<data name="label1.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label_ListenOn.Text" xml:space="preserve">
<data name="label1.Text" xml:space="preserve">
<value>Listen on</value>
</data>
<data name="&gt;&gt;label_ListenOn.Name" xml:space="preserve">
<value>label_ListenOn</value>
<data name="&gt;&gt;label1.Name" xml:space="preserve">
<value>label1</value>
</data>
<data name="&gt;&gt;label_ListenOn.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="&gt;&gt;label1.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label_ListenOn.Parent" xml:space="preserve">
<data name="&gt;&gt;label1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label_ListenOn.ZOrder" xml:space="preserve">
<value>14</value>
</data>
<data name="textBox_ListenOn.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="textBox_ListenOn.Location" type="System.Drawing.Point, System.Drawing">
<value>97, 58</value>
</data>
<data name="textBox_ListenOn.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
</data>
<data name="textBox_ListenOn.Size" type="System.Drawing.Size, System.Drawing">
<value>146, 23</value>
</data>
<data name="textBox_ListenOn.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="textBox_ListenOn.Text" xml:space="preserve">
<value>*</value>
</data>
<data name="textBox_ListenOn.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="&gt;&gt;textBox_ListenOn.Name" xml:space="preserve">
<value>textBox_ListenOn</value>
</data>
<data name="&gt;&gt;textBox_ListenOn.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_ListenOn.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_ListenOn.ZOrder" xml:space="preserve">
<value>13</value>
</data>
<data name="label_ConnectTo.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label_ConnectTo.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="label_ConnectTo.Location" type="System.Drawing.Point, System.Drawing">
<value>14, 93</value>
</data>
<data name="label_ConnectTo.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 0, 4, 0</value>
</data>
<data name="label_ConnectTo.Size" type="System.Drawing.Size, System.Drawing">
<value>71, 17</value>
</data>
<data name="label_ConnectTo.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label_ConnectTo.Text" xml:space="preserve">
<value>Connect to</value>
</data>
<data name="&gt;&gt;label_ConnectTo.Name" xml:space="preserve">
<value>label_ConnectTo</value>
</data>
<data name="&gt;&gt;label_ConnectTo.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label_ConnectTo.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label_ConnectTo.ZOrder" xml:space="preserve">
<value>12</value>
</data>
<data name="textBox_ConnectTo.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="textBox_ConnectTo.Location" type="System.Drawing.Point, System.Drawing">
<value>97, 90</value>
</data>
<data name="textBox_ConnectTo.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
</data>
<data name="textBox_ConnectTo.Size" type="System.Drawing.Size, System.Drawing">
<value>146, 23</value>
</data>
<data name="textBox_ConnectTo.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="textBox_ConnectTo.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="&gt;&gt;textBox_ConnectTo.Name" xml:space="preserve">
<value>textBox_ConnectTo</value>
</data>
<data name="&gt;&gt;textBox_ConnectTo.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_ConnectTo.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_ConnectTo.ZOrder" xml:space="preserve">
<value>11</value>
</data>
<data name="textBox_ConnectPort.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="textBox_ConnectPort.Location" type="System.Drawing.Point, System.Drawing">
<value>299, 90</value>
</data>
<data name="textBox_ConnectPort.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
</data>
<data name="textBox_ConnectPort.Size" type="System.Drawing.Size, System.Drawing">
<value>84, 23</value>
</data>
<data name="textBox_ConnectPort.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="textBox_ConnectPort.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="&gt;&gt;textBox_ConnectPort.Name" xml:space="preserve">
<value>textBox_ConnectPort</value>
</data>
<data name="&gt;&gt;textBox_ConnectPort.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_ConnectPort.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_ConnectPort.ZOrder" xml:space="preserve">
<data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
<value>10</value>
</data>
<data name="label_ConnectPort.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
<data name="textBox_listenOn.Location" type="System.Drawing.Point, System.Drawing">
<value>79, 8</value>
</data>
<data name="label_ConnectPort.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="textBox_listenOn.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="label_ConnectPort.Location" type="System.Drawing.Point, System.Drawing">
<value>251, 93</value>
<data name="textBox_listenOn.Size" type="System.Drawing.Size, System.Drawing">
<value>125, 21</value>
</data>
<data name="label_ConnectPort.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 0, 4, 0</value>
</data>
<data name="label_ConnectPort.Size" type="System.Drawing.Size, System.Drawing">
<value>32, 17</value>
</data>
<data name="label_ConnectPort.TabIndex" type="System.Int32, mscorlib">
<data name="textBox_listenOn.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label_ConnectPort.Text" xml:space="preserve">
<value>Port</value>
<data name="textBox_listenOn.Text" xml:space="preserve">
<value>*</value>
</data>
<data name="&gt;&gt;label_ConnectPort.Name" xml:space="preserve">
<value>label_ConnectPort</value>
<data name="textBox_listenOn.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="&gt;&gt;label_ConnectPort.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="&gt;&gt;textBox_listenOn.Name" xml:space="preserve">
<value>textBox_listenOn</value>
</data>
<data name="&gt;&gt;label_ConnectPort.Parent" xml:space="preserve">
<data name="&gt;&gt;textBox_listenOn.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_listenOn.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label_ConnectPort.ZOrder" xml:space="preserve">
<data name="&gt;&gt;textBox_listenOn.ZOrder" xml:space="preserve">
<value>9</value>
</data>
<data name="button_Set.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
<data name="label2.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="button_Set.Location" type="System.Drawing.Point, System.Drawing">
<value>260, 134</value>
<data name="label2.Location" type="System.Drawing.Point, System.Drawing">
<value>13, 35</value>
</data>
<data name="button_Set.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 5, 4, 5</value>
<data name="label2.Size" type="System.Drawing.Size, System.Drawing">
<value>65, 12</value>
</data>
<data name="button_Set.Size" type="System.Drawing.Size, System.Drawing">
<value>125, 31</value>
<data name="label2.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="button_Set.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
<data name="label2.Text" xml:space="preserve">
<value>Connect to</value>
</data>
<data name="button_Set.Text" xml:space="preserve">
<value>Set</value>
<data name="&gt;&gt;label2.Name" xml:space="preserve">
<value>label2</value>
</data>
<data name="&gt;&gt;button_Set.Name" xml:space="preserve">
<value>button_Set</value>
<data name="&gt;&gt;label2.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;button_Set.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;button_Set.Parent" xml:space="preserve">
<data name="&gt;&gt;label2.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;button_Set.ZOrder" xml:space="preserve">
<data name="&gt;&gt;label2.ZOrder" xml:space="preserve">
<value>8</value>
</data>
<data name="label_Type.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
<data name="textBox_connectTo.Location" type="System.Drawing.Point, System.Drawing">
<value>79, 32</value>
</data>
<data name="label_Type.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
<data name="textBox_connectTo.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="label_Type.Location" type="System.Drawing.Point, System.Drawing">
<value>14, 16</value>
<data name="textBox_connectTo.Size" type="System.Drawing.Size, System.Drawing">
<value>125, 21</value>
</data>
<data name="label_Type.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 0, 4, 0</value>
</data>
<data name="label_Type.Size" type="System.Drawing.Size, System.Drawing">
<value>36, 17</value>
</data>
<data name="label_Type.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label_Type.Text" xml:space="preserve">
<value>Type</value>
</data>
<data name="&gt;&gt;label_Type.Name" xml:space="preserve">
<value>label_Type</value>
</data>
<data name="&gt;&gt;label_Type.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label_Type.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label_Type.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="label_ListenPort.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label_ListenPort.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="label_ListenPort.Location" type="System.Drawing.Point, System.Drawing">
<value>251, 62</value>
</data>
<data name="label_ListenPort.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 0, 4, 0</value>
</data>
<data name="label_ListenPort.Size" type="System.Drawing.Size, System.Drawing">
<value>32, 17</value>
</data>
<data name="label_ListenPort.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label_ListenPort.Text" xml:space="preserve">
<value>Port</value>
</data>
<data name="&gt;&gt;label_ListenPort.Name" xml:space="preserve">
<value>label_ListenPort</value>
</data>
<data name="&gt;&gt;label_ListenPort.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label_ListenPort.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label_ListenPort.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="textBox_ListenPort.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="textBox_ListenPort.Location" type="System.Drawing.Point, System.Drawing">
<value>299, 58</value>
</data>
<data name="textBox_ListenPort.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
</data>
<data name="textBox_ListenPort.Size" type="System.Drawing.Size, System.Drawing">
<value>84, 23</value>
</data>
<data name="textBox_ListenPort.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="textBox_ListenPort.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="&gt;&gt;textBox_ListenPort.Name" xml:space="preserve">
<value>textBox_ListenPort</value>
</data>
<data name="&gt;&gt;textBox_ListenPort.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_ListenPort.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_ListenPort.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="comboBox_Type.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="comboBox_Type.Items" xml:space="preserve">
<value>(Auto)</value>
</data>
<data name="comboBox_Type.Items1" xml:space="preserve">
<value>v4tov4</value>
</data>
<data name="comboBox_Type.Items2" xml:space="preserve">
<value>v4tov6</value>
</data>
<data name="comboBox_Type.Items3" xml:space="preserve">
<value>v6tov4</value>
</data>
<data name="comboBox_Type.Items4" xml:space="preserve">
<value>v6tov6</value>
</data>
<data name="comboBox_Type.Location" type="System.Drawing.Point, System.Drawing">
<value>97, 13</value>
</data>
<data name="comboBox_Type.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
</data>
<data name="comboBox_Type.Size" type="System.Drawing.Size, System.Drawing">
<value>146, 25</value>
</data>
<data name="comboBox_Type.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="&gt;&gt;comboBox_Type.Name" xml:space="preserve">
<value>comboBox_Type</value>
</data>
<data name="&gt;&gt;comboBox_Type.Type" xml:space="preserve">
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;comboBox_Type.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;comboBox_Type.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="label_Comment.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label_Comment.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="label_Comment.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="label_Comment.Location" type="System.Drawing.Point, System.Drawing">
<value>14, 141</value>
</data>
<data name="label_Comment.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 0, 4, 0</value>
</data>
<data name="label_Comment.Size" type="System.Drawing.Size, System.Drawing">
<value>64, 17</value>
</data>
<data name="label_Comment.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
</data>
<data name="label_Comment.Text" xml:space="preserve">
<value>Comment</value>
</data>
<data name="&gt;&gt;label_Comment.Name" xml:space="preserve">
<value>label_Comment</value>
</data>
<data name="&gt;&gt;label_Comment.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label_Comment.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label_Comment.ZOrder" xml:space="preserve">
<data name="textBox_connectTo.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="textBox_Comment.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="textBox_Comment.Location" type="System.Drawing.Point, System.Drawing">
<value>97, 138</value>
</data>
<data name="textBox_Comment.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
</data>
<data name="textBox_Comment.Size" type="System.Drawing.Size, System.Drawing">
<value>146, 23</value>
</data>
<data name="textBox_Comment.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="textBox_Comment.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<data name="textBox_connectTo.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="&gt;&gt;textBox_Comment.Name" xml:space="preserve">
<value>textBox_Comment</value>
<data name="&gt;&gt;textBox_connectTo.Name" xml:space="preserve">
<value>textBox_connectTo</value>
</data>
<data name="&gt;&gt;textBox_Comment.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="&gt;&gt;textBox_connectTo.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_Comment.Parent" xml:space="preserve">
<data name="&gt;&gt;textBox_connectTo.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_Comment.ZOrder" xml:space="preserve">
<value>2</value>
<data name="&gt;&gt;textBox_connectTo.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="label_Group.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
<data name="textBox_connectPort.Location" type="System.Drawing.Point, System.Drawing">
<value>244, 32</value>
</data>
<data name="label_Group.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
<data name="textBox_connectPort.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="label_Group.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
<data name="textBox_connectPort.Size" type="System.Drawing.Size, System.Drawing">
<value>57, 21</value>
</data>
<data name="label_Group.Location" type="System.Drawing.Point, System.Drawing">
<value>251, 16</value>
<data name="textBox_connectPort.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="label_Group.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 0, 4, 0</value>
<data name="textBox_connectPort.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="label_Group.Size" type="System.Drawing.Size, System.Drawing">
<value>45, 17</value>
<data name="&gt;&gt;textBox_connectPort.Name" xml:space="preserve">
<value>textBox_connectPort</value>
</data>
<data name="label_Group.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
<data name="&gt;&gt;textBox_connectPort.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="label_Group.Text" xml:space="preserve">
<value>Group</value>
</data>
<data name="&gt;&gt;label_Group.Name" xml:space="preserve">
<value>label_Group</value>
</data>
<data name="&gt;&gt;label_Group.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label_Group.Parent" xml:space="preserve">
<data name="&gt;&gt;textBox_connectPort.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label_Group.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="comboBox_Group.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="comboBox_Group.Location" type="System.Drawing.Point, System.Drawing">
<value>299, 13</value>
</data>
<data name="comboBox_Group.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
</data>
<data name="comboBox_Group.Size" type="System.Drawing.Size, System.Drawing">
<value>84, 25</value>
</data>
<data name="comboBox_Group.TabIndex" type="System.Int32, mscorlib">
<data name="&gt;&gt;textBox_connectPort.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="&gt;&gt;comboBox_Group.Name" xml:space="preserve">
<value>comboBox_Group</value>
<data name="label3.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="&gt;&gt;comboBox_Group.Type" xml:space="preserve">
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="label3.Location" type="System.Drawing.Point, System.Drawing">
<value>210, 35</value>
</data>
<data name="&gt;&gt;comboBox_Group.Parent" xml:space="preserve">
<value>$this</value>
<data name="label3.Size" type="System.Drawing.Size, System.Drawing">
<value>29, 12</value>
</data>
<data name="&gt;&gt;comboBox_Group.ZOrder" xml:space="preserve">
<data name="label3.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<data name="label3.Text" xml:space="preserve">
<value>Port</value>
</data>
<data name="&gt;&gt;label3.Name" xml:space="preserve">
<value>label3</value>
</data>
<data name="&gt;&gt;label3.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label3.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label3.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="button_submit.Location" type="System.Drawing.Point, System.Drawing">
<value>227, 62</value>
</data>
<data name="button_submit.Size" type="System.Drawing.Size, System.Drawing">
<value>74, 22</value>
</data>
<data name="button_submit.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="button_submit.Text" xml:space="preserve">
<value>Set</value>
</data>
<data name="&gt;&gt;button_submit.Name" xml:space="preserve">
<value>button_submit</value>
</data>
<data name="&gt;&gt;button_submit.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;button_submit.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;button_submit.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="label4.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label4.Location" type="System.Drawing.Point, System.Drawing">
<value>14, 66</value>
</data>
<data name="label4.Size" type="System.Drawing.Size, System.Drawing">
<value>29, 12</value>
</data>
<data name="label4.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label4.Text" xml:space="preserve">
<value>Type</value>
</data>
<data name="&gt;&gt;label4.Name" xml:space="preserve">
<value>label4</value>
</data>
<data name="&gt;&gt;label4.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label4.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label4.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="label5.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label5.Location" type="System.Drawing.Point, System.Drawing">
<value>210, 11</value>
</data>
<data name="label5.Size" type="System.Drawing.Size, System.Drawing">
<value>29, 12</value>
</data>
<data name="label5.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label5.Text" xml:space="preserve">
<value>Port</value>
</data>
<data name="&gt;&gt;label5.Name" xml:space="preserve">
<value>label5</value>
</data>
<data name="&gt;&gt;label5.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label5.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label5.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="textBox_listenPort.Location" type="System.Drawing.Point, System.Drawing">
<value>244, 8</value>
</data>
<data name="textBox_listenPort.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="textBox_listenPort.Size" type="System.Drawing.Size, System.Drawing">
<value>57, 21</value>
</data>
<data name="textBox_listenPort.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="textBox_listenPort.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="&gt;&gt;textBox_listenPort.Name" xml:space="preserve">
<value>textBox_listenPort</value>
</data>
<data name="&gt;&gt;textBox_listenPort.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_listenPort.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_listenPort.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="comboBox_type.FlatStyle" type="System.Windows.Forms.FlatStyle, System.Windows.Forms">
<value>Popup</value>
</data>
<data name="comboBox_type.Items" xml:space="preserve">
<value>(Auto)</value>
</data>
<data name="comboBox_type.Items1" xml:space="preserve">
<value>v4tov4</value>
</data>
<data name="comboBox_type.Items2" xml:space="preserve">
<value>v4tov6</value>
</data>
<data name="comboBox_type.Items3" xml:space="preserve">
<value>v6tov4</value>
</data>
<data name="comboBox_type.Items4" xml:space="preserve">
<value>v6tov6</value>
</data>
<data name="comboBox_type.Location" type="System.Drawing.Point, System.Drawing">
<value>78, 64</value>
</data>
<data name="comboBox_type.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="comboBox_type.Size" type="System.Drawing.Size, System.Drawing">
<value>126, 20</value>
</data>
<data name="comboBox_type.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="&gt;&gt;comboBox_type.Name" xml:space="preserve">
<value>comboBox_type</value>
</data>
<data name="&gt;&gt;comboBox_type.Type" xml:space="preserve">
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;comboBox_type.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;comboBox_type.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>6, 13</value>
<value>6, 12</value>
</data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>398, 183</value>
<value>313, 95</value>
</data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
@ -2717,7 +2600,7 @@
</value>
</data>
<data name="$this.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
<value>3, 2, 3, 2</value>
</data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
<value>Manual</value>
@ -2726,9 +2609,9 @@
<value>Set Proxy</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>SetProxy</value>
<value>SetProxyForm</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.Form, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@ -0,0 +1,459 @@
<?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:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="label1.Text" xml:space="preserve">
<value>监听地址</value>
</data>
<data name="&gt;&gt;label1.Name" xml:space="preserve">
<value>label1</value>
</data>
<data name="&gt;&gt;label1.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
<value>10</value>
</data>
<data name="textBox_listenOn.Text" xml:space="preserve">
<value>*</value>
</data>
<data name="&gt;&gt;textBox_listenOn.Name" xml:space="preserve">
<value>textBox_listenOn</value>
</data>
<data name="&gt;&gt;textBox_listenOn.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_listenOn.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_listenOn.ZOrder" xml:space="preserve">
<value>9</value>
</data>
<data name="label2.Text" xml:space="preserve">
<value>连接地址</value>
</data>
<data name="&gt;&gt;label2.Name" xml:space="preserve">
<value>label2</value>
</data>
<data name="&gt;&gt;label2.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label2.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label2.ZOrder" xml:space="preserve">
<value>8</value>
</data>
<data name="&gt;&gt;textBox_connectTo.Name" xml:space="preserve">
<value>textBox_connectTo</value>
</data>
<data name="&gt;&gt;textBox_connectTo.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_connectTo.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_connectTo.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="&gt;&gt;textBox_connectPort.Name" xml:space="preserve">
<value>textBox_connectPort</value>
</data>
<data name="&gt;&gt;textBox_connectPort.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_connectPort.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_connectPort.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="label3.Text" xml:space="preserve">
<value>端口</value>
</data>
<data name="&gt;&gt;label3.Name" xml:space="preserve">
<value>label3</value>
</data>
<data name="&gt;&gt;label3.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label3.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label3.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="button_submit.Text" xml:space="preserve">
<value>设置</value>
</data>
<data name="&gt;&gt;button1.Name" xml:space="preserve">
<value>button1</value>
</data>
<data name="&gt;&gt;button1.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;button1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;button1.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="label4.Text" xml:space="preserve">
<value>类型</value>
</data>
<data name="&gt;&gt;label4.Name" xml:space="preserve">
<value>label4</value>
</data>
<data name="&gt;&gt;label4.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label4.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label4.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="label5.Text" xml:space="preserve">
<value>端口</value>
</data>
<data name="&gt;&gt;label5.Name" xml:space="preserve">
<value>label5</value>
</data>
<data name="&gt;&gt;label5.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label5.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label5.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="&gt;&gt;textBox_listenPort.Name" xml:space="preserve">
<value>textBox_listenPort</value>
</data>
<data name="&gt;&gt;textBox_listenPort.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_listenPort.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_listenPort.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="comboBox_type.Items1" xml:space="preserve">
<value>v4tov4</value>
</data>
<data name="comboBox_type.Items2" xml:space="preserve">
<value>v4tov6</value>
</data>
<data name="comboBox_type.Items3" xml:space="preserve">
<value>v6tov4</value>
</data>
<data name="comboBox_type.Items4" xml:space="preserve">
<value>v6tov6</value>
</data>
<data name="&gt;&gt;comboBox_type.Name" xml:space="preserve">
<value>comboBox_type</value>
</data>
<data name="&gt;&gt;comboBox_type.Type" xml:space="preserve">
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;comboBox_type.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;comboBox_type.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>设置映射</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>NewProxy</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>6, 12</value>
</data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>313, 95</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="$this.Localizable" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="$this.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
<value>CenterScreen</value>
</data>
<data name="button1.Location" type="System.Drawing.Point, System.Drawing">
<value>227, 62</value>
</data>
<data name="button1.Size" type="System.Drawing.Size, System.Drawing">
<value>74, 22</value>
</data>
<data name="button1.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="comboBox_type.FlatStyle" type="System.Windows.Forms.FlatStyle, System.Windows.Forms">
<value>Popup</value>
</data>
<data name="comboBox_type.Location" type="System.Drawing.Point, System.Drawing">
<value>78, 64</value>
</data>
<data name="comboBox_type.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="comboBox_type.Size" type="System.Drawing.Size, System.Drawing">
<value>126, 20</value>
</data>
<data name="comboBox_type.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="label1.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label1.Location" type="System.Drawing.Point, System.Drawing">
<value>13, 11</value>
</data>
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
<value>59, 12</value>
</data>
<data name="label1.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label2.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label2.Location" type="System.Drawing.Point, System.Drawing">
<value>13, 35</value>
</data>
<data name="label2.Size" type="System.Drawing.Size, System.Drawing">
<value>65, 12</value>
</data>
<data name="label2.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label3.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label3.Location" type="System.Drawing.Point, System.Drawing">
<value>210, 35</value>
</data>
<data name="label3.Size" type="System.Drawing.Size, System.Drawing">
<value>29, 12</value>
</data>
<data name="label3.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label4.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label4.Location" type="System.Drawing.Point, System.Drawing">
<value>14, 66</value>
</data>
<data name="label4.Size" type="System.Drawing.Size, System.Drawing">
<value>29, 12</value>
</data>
<data name="label4.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label5.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label5.Location" type="System.Drawing.Point, System.Drawing">
<value>210, 11</value>
</data>
<data name="label5.Size" type="System.Drawing.Size, System.Drawing">
<value>29, 12</value>
</data>
<data name="label5.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="textBox_connectPort.Location" type="System.Drawing.Point, System.Drawing">
<value>244, 32</value>
</data>
<data name="textBox_connectPort.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="textBox_connectPort.Size" type="System.Drawing.Size, System.Drawing">
<value>57, 21</value>
</data>
<data name="textBox_connectPort.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="textBox_connectPort.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="textBox_connectTo.Location" type="System.Drawing.Point, System.Drawing">
<value>79, 32</value>
</data>
<data name="textBox_connectTo.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="textBox_connectTo.Size" type="System.Drawing.Size, System.Drawing">
<value>125, 21</value>
</data>
<data name="textBox_connectTo.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="textBox_connectTo.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="textBox_listenOn.Location" type="System.Drawing.Point, System.Drawing">
<value>79, 8</value>
</data>
<data name="textBox_listenOn.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="textBox_listenOn.Size" type="System.Drawing.Size, System.Drawing">
<value>125, 21</value>
</data>
<data name="textBox_listenOn.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="textBox_listenOn.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="textBox_listenPort.Location" type="System.Drawing.Point, System.Drawing">
<value>244, 8</value>
</data>
<data name="textBox_listenPort.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="textBox_listenPort.Size" type="System.Drawing.Size, System.Drawing">
<value>57, 21</value>
</data>
<data name="textBox_listenPort.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="textBox_listenPort.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="comboBox_type.Items" xml:space="preserve">
<value>(自动)</value>
</data>
</root>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
</configuration>

View File

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC Manifest Options
If you want to change the Windows User Account Control level replace the
requestedExecutionLevel node with one of the following.
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Specifying requestedExecutionLevel element will disable file and registry virtualization.
Remove this element if your application requires this virtualization for backwards
compatibility.
-->
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
<applicationRequestMinimum>
<PermissionSet Unrestricted="true" ID="Custom" SameSite="site" />
<defaultAssemblyRequest permissionSetReference="Custom" />
</applicationRequestMinimum>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- A list of the Windows versions that this application has been tested on
and is designed to work with. Uncomment the appropriate elements
and Windows will automatically select the most compatible environment. -->
<!-- Windows Vista -->
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
<!-- Windows 7 -->
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
<!-- Windows 8 -->
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
<!-- Windows 8.1 -->
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
<!-- Windows 10 -->
<!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->
</application>
</compatibility>
<!-- Indicates that the application is DPI-aware and will not be automatically scaled by Windows at higher
DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need
to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should
also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config. -->
<!--
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
-->
<!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->
<!--
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
-->
</assembly>

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="NStandard" version="0.6.7.1" targetFramework="net35" />
<package id="SQLib" version="0.8.6" targetFramework="net35" />
<package id="SQLib.Sqlite" version="0.8.6" targetFramework="net35" />
<package id="Stub.System.Data.SQLite.Core.NetFramework" version="1.0.113.3" targetFramework="net35" />
<package id="System.Data.SQLite.Core" version="1.0.113.7" targetFramework="net35" />
</packages>

85
PortProxyGUI - NET45/About.Designer.cs generated Normal file
View File

@ -0,0 +1,85 @@
namespace PortProxyGUI
{
partial class About
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(About));
this.linkLabel1 = new System.Windows.Forms.LinkLabel();
this.label1 = new System.Windows.Forms.Label();
this.label_version = new System.Windows.Forms.Label();
this.label_Star = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// linkLabel1
//
resources.ApplyResources(this.linkLabel1, "linkLabel1");
this.linkLabel1.Name = "linkLabel1";
this.linkLabel1.TabStop = true;
this.linkLabel1.Click += new System.EventHandler(this.linkLabel1_Click);
//
// label1
//
resources.ApplyResources(this.label1, "label1");
this.label1.Name = "label1";
//
// label_version
//
resources.ApplyResources(this.label_version, "label_version");
this.label_version.Name = "label_version";
//
// label_Star
//
resources.ApplyResources(this.label_Star, "label_Star");
this.label_Star.Name = "label_Star";
//
// About
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.label_Star);
this.Controls.Add(this.label_version);
this.Controls.Add(this.label1);
this.Controls.Add(this.linkLabel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "About";
this.TopMost = true;
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.About_FormClosing);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.LinkLabel linkLabel1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label_version;
private System.Windows.Forms.Label label_Star;
}
}

View File

@ -0,0 +1,31 @@
using System;
using System.Diagnostics;
using System.Windows.Forms;
namespace PortProxyGUI
{
public partial class About : Form
{
public readonly PortProxyGUI PortProxyGUI;
public About(PortProxyGUI portProxyGUI)
{
PortProxyGUI = portProxyGUI;
InitializeComponent();
label_version.Text = label_version.Text + " v" + Application.ProductVersion;
}
private void linkLabel1_Click(object sender, EventArgs e)
{
if (sender is LinkLabel _sender)
{
Process.Start("explorer", _sender.Text);
}
}
private void About_FormClosing(object sender, FormClosingEventArgs e)
{
PortProxyGUI.AboutForm = null;
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,184 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{1B166039-E98C-404A-89A5-C981364B5546}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>PortProxyGUI</RootNamespace>
<AssemblyName>PortProxyGUI</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
<IsWebBootstrapper>false</IsWebBootstrapper>
<TargetFrameworkProfile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<PublishWizardCompleted>true</PublishWizardCompleted>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>none</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE;NET45</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup>
<ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>icon.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<ManifestCertificateThumbprint>BEF27898E4C102E806F3241497048E740EC39033</ManifestCertificateThumbprint>
</PropertyGroup>
<PropertyGroup>
<ManifestKeyFile>PortProxyGUI - NET_TemporaryKey.pfx</ManifestKeyFile>
</PropertyGroup>
<PropertyGroup>
<GenerateManifests>false</GenerateManifests>
</PropertyGroup>
<PropertyGroup>
<SignManifests>true</SignManifests>
</PropertyGroup>
<PropertyGroup>
<TargetZone>LocalIntranet</TargetZone>
</PropertyGroup>
<ItemGroup>
<Reference Include="NStandard, Version=0.6.7.1, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\NStandard.0.6.7.1\lib\net45\NStandard.dll</HintPath>
</Reference>
<Reference Include="SQLib, Version=0.8.6.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\SQLib.0.8.6\lib\net45\SQLib.dll</HintPath>
</Reference>
<Reference Include="SQLib.Sqlite, Version=0.8.6.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\SQLib.Sqlite.0.8.6\lib\net45\SQLib.Sqlite.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Core" />
<Reference Include="System.Data.SQLite, Version=1.0.113.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
<HintPath>..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.113.3\lib\net45\System.Data.SQLite.dll</HintPath>
</Reference>
<Reference Include="System.Web" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="About.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="About.Designer.cs">
<DependentUpon>About.cs</DependentUpon>
</Compile>
<Compile Include="SetProxyForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="SetProxyForm.Designer.cs">
<DependentUpon>SetProxyForm.cs</DependentUpon>
</Compile>
<Compile Include="PortProxyGUI.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="PortProxyGUI.Designer.cs">
<DependentUpon>PortProxyGUI.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="About.resx">
<DependentUpon>About.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="About.zh-CN.resx">
<DependentUpon>About.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="PortProxyGUI.zh-CN.resx">
<DependentUpon>PortProxyGUI.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="SetProxyForm.resx">
<DependentUpon>SetProxyForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="SetProxyForm.zh-CN.resx">
<DependentUpon>SetProxyForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="PortProxyGUI.resx">
<DependentUpon>PortProxyGUI.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="app.config" />
<None Include="app.manifest" />
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<Content Include="icon.ico" />
</ItemGroup>
<Import Project="..\PortProxyGUI.Shared\PortProxyGUI.Shared.projitems" Label="Shared" />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.113.3\build\net45\Stub.System.Data.SQLite.Core.NetFramework.targets" Condition="Exists('..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.113.3\build\net45\Stub.System.Data.SQLite.Core.NetFramework.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.113.3\build\net45\Stub.System.Data.SQLite.Core.NetFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.113.3\build\net45\Stub.System.Data.SQLite.Core.NetFramework.targets'))" />
</Target>
</Project>

View File

@ -0,0 +1,211 @@
namespace PortProxyGUI
{
partial class PortProxyGUI
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PortProxyGUI));
this.listViewProxies = new System.Windows.Forms.ListView();
this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
this.toolStripMenuItem_Enable = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem_Disable = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripMenuItem_New = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem_Modify = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem_Delete = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripMenuItem_Refresh = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripMenuItem_About = new System.Windows.Forms.ToolStripMenuItem();
this.imageListProxies = new System.Windows.Forms.ImageList(this.components);
this.contextMenuStrip1.SuspendLayout();
this.SuspendLayout();
//
// listViewProxies
//
this.listViewProxies.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.listViewProxies.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeader1,
this.columnHeader2,
this.columnHeader3,
this.columnHeader4,
this.columnHeader5,
this.columnHeader6});
this.listViewProxies.ContextMenuStrip = this.contextMenuStrip1;
resources.ApplyResources(this.listViewProxies, "listViewProxies");
this.listViewProxies.FullRowSelect = true;
this.listViewProxies.HideSelection = false;
this.listViewProxies.Name = "listViewProxies";
this.listViewProxies.SmallImageList = this.imageListProxies;
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.MouseUp += new System.Windows.Forms.MouseEventHandler(this.listView1_MouseUp);
//
// columnHeader1
//
resources.ApplyResources(this.columnHeader1, "columnHeader1");
//
// columnHeader2
//
resources.ApplyResources(this.columnHeader2, "columnHeader2");
//
// columnHeader3
//
resources.ApplyResources(this.columnHeader3, "columnHeader3");
//
// columnHeader4
//
resources.ApplyResources(this.columnHeader4, "columnHeader4");
//
// columnHeader5
//
resources.ApplyResources(this.columnHeader5, "columnHeader5");
//
// columnHeader6
//
resources.ApplyResources(this.columnHeader6, "columnHeader6");
//
// contextMenuStrip1
//
this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripMenuItem_Enable,
this.toolStripMenuItem_Disable,
this.toolStripSeparator3,
this.toolStripMenuItem_Refresh,
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
//
this.toolStripMenuItem_Enable.Name = "toolStripMenuItem_Enable";
resources.ApplyResources(this.toolStripMenuItem_Enable, "toolStripMenuItem_Enable");
//
// toolStripMenuItem_Disable
//
this.toolStripMenuItem_Disable.Name = "toolStripMenuItem_Disable";
resources.ApplyResources(this.toolStripMenuItem_Disable, "toolStripMenuItem_Disable");
//
// toolStripSeparator3
//
this.toolStripSeparator3.Name = "toolStripSeparator3";
resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3");
//
// toolStripMenuItem_New
//
this.toolStripMenuItem_New.Name = "toolStripMenuItem_New";
resources.ApplyResources(this.toolStripMenuItem_New, "toolStripMenuItem_New");
//
// toolStripMenuItem_Modify
//
this.toolStripMenuItem_Modify.Name = "toolStripMenuItem_Modify";
resources.ApplyResources(this.toolStripMenuItem_Modify, "toolStripMenuItem_Modify");
//
// toolStripMenuItem_Delete
//
this.toolStripMenuItem_Delete.Name = "toolStripMenuItem_Delete";
resources.ApplyResources(this.toolStripMenuItem_Delete, "toolStripMenuItem_Delete");
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1");
//
// toolStripMenuItem_Refresh
//
this.toolStripMenuItem_Refresh.Name = "toolStripMenuItem_Refresh";
resources.ApplyResources(this.toolStripMenuItem_Refresh, "toolStripMenuItem_Refresh");
//
// toolStripSeparator2
//
this.toolStripSeparator2.Name = "toolStripSeparator2";
resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2");
//
// toolStripMenuItem_About
//
this.toolStripMenuItem_About.Name = "toolStripMenuItem_About";
resources.ApplyResources(this.toolStripMenuItem_About, "toolStripMenuItem_About");
//
// imageListProxies
//
this.imageListProxies.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListProxies.ImageStream")));
this.imageListProxies.TransparentColor = System.Drawing.Color.Transparent;
this.imageListProxies.Images.SetKeyName(0, "disable.png");
this.imageListProxies.Images.SetKeyName(1, "enable.png");
//
// PortProxyGUI
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.listViewProxies);
this.Name = "PortProxyGUI";
this.Load += new System.EventHandler(this.PortProxyGUI_Load);
this.Shown += new System.EventHandler(this.PortProxyGUI_Shown);
this.contextMenuStrip1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.ListView listViewProxies;
private System.Windows.Forms.ColumnHeader columnHeader2;
private System.Windows.Forms.ColumnHeader columnHeader3;
private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_New;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Delete;
private System.Windows.Forms.ColumnHeader columnHeader4;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Refresh;
private System.Windows.Forms.ColumnHeader columnHeader5;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_About;
private System.Windows.Forms.ColumnHeader columnHeader6;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Modify;
private System.Windows.Forms.ColumnHeader columnHeader1;
private System.Windows.Forms.ImageList imageListProxies;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Enable;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Disable;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
}
}

View File

@ -0,0 +1,198 @@
using NStandard;
using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using static System.Windows.Forms.ListViewItem;
namespace PortProxyGUI
{
public partial class PortProxyGUI : Form
{
public SetProxyForm SetProxyForm;
public About AboutForm;
private ListViewColumnSorter lvwColumnSorter;
public PortProxyGUI()
{
InitializeComponent();
lvwColumnSorter = new ListViewColumnSorter();
listViewProxies.ListViewItemSorter = lvwColumnSorter;
}
private void PortProxyGUI_Load(object sender, EventArgs e)
{
}
private void PortProxyGUI_Shown(object sender, EventArgs e)
{
RefreshProxyList();
}
private void EnableSelectedProxies()
{
var items = listViewProxies.SelectedItems.OfType<ListViewItem>();
foreach (var item in items)
{
item.ImageIndex = 1;
var subItems = item.SubItems.OfType<ListViewSubItem>().ToArray();
CmdUtil.AddProxy("add", subItems[1].Text, subItems[2].Text, int.Parse(subItems[3].Text), subItems[4].Text, int.Parse(subItems[5].Text));
}
}
private void DisableSelectedProxies()
{
var items = listViewProxies.SelectedItems.OfType<ListViewItem>();
foreach (var item in items)
{
item.ImageIndex = 0;
var subItems = item.SubItems.OfType<ListViewSubItem>().ToArray();
CmdUtil.DeleteProxy(subItems[1].Text, subItems[2].Text, int.Parse(subItems[3].Text));
}
}
private void DeleteSelectedProxies()
{
var items = listViewProxies.SelectedItems.OfType<ListViewItem>();
DisableSelectedProxies();
Program.SqliteDbScope.RemoveRange(items.Select(x => new Data.Rule { Id = x.Tag.ToString() }));
foreach (var item in items) listViewProxies.Items.Remove(item);
}
private void SetProxyForUpdate(SetProxyForm form)
{
var item = listViewProxies.SelectedItems.OfType<ListViewItem>().FirstOrDefault();
var subItems = item.SubItems.OfType<ListViewSubItem>().ToArray();
if (int.TryParse(subItems[3].Text, out var listenPort) && 0 < listenPort && listenPort < 65536)
{
form.UseUpdateMode(item, subItems[1].Text, subItems[2].Text, listenPort, subItems[4].Text, subItems[5].Text);
}
else MessageBox.Show("无效端口号。", "无效端口号", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
public void RefreshProxyList()
{
var proxies = CmdUtil.GetProxies();
var rules = Program.SqliteDbScope.Rules;
foreach (var proxy in proxies)
{
var matchedRule = rules.FirstOrDefault(r => r.EqualsWithKeys(proxy));
proxy.Id = matchedRule?.Id;
}
var pendingAdds = proxies.Where(x => x.Id == null);
var pendingUpdates = proxies.Where(x => x.Id != null && !x.Equals(rules.First(r => r.Id == x.Id)));
Program.SqliteDbScope.AddRange(pendingAdds);
Program.SqliteDbScope.UpdateRange(pendingUpdates);
listViewProxies.Items.Clear();
rules = Program.SqliteDbScope.Rules;
foreach (var rule in rules)
{
var imageIndex = proxies.Any(p => p.EqualsWithKeys(rule)) ? 1 : 0;
var item = new ListViewItem { ImageIndex = imageIndex, Tag = rule.Id }.Then(vitem =>
{
vitem.SubItems.AddRange(new[] { rule.Type, rule.ListenOn, rule.ListenPort.ToString(), rule.ConnectTo, rule.ConnectPort.ToString() });
});
listViewProxies.Items.Add(item);
}
}
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;
switch (selected)
{
case ToolStripMenuItem item when item == toolStripMenuItem_Enable: EnableSelectedProxies(); break;
case ToolStripMenuItem item when item == toolStripMenuItem_Disable: DisableSelectedProxies(); break;
case ToolStripMenuItem item when item == toolStripMenuItem_New:
if (SetProxyForm == null) SetProxyForm = new SetProxyForm(this);
SetProxyForm.UseNormalMode();
SetProxyForm.ShowDialog();
break;
case ToolStripMenuItem item when item == toolStripMenuItem_Modify:
if (SetProxyForm == null) SetProxyForm = new SetProxyForm(this);
SetProxyForUpdate(SetProxyForm);
SetProxyForm.ShowDialog();
break;
case ToolStripMenuItem item when item == toolStripMenuItem_Refresh:
RefreshProxyList();
break;
case ToolStripMenuItem item when item == toolStripMenuItem_Delete: DeleteSelectedProxies(); break;
case ToolStripMenuItem item when item == toolStripMenuItem_About:
if (AboutForm == null)
{
AboutForm = new About(this);
AboutForm.Show();
}
else AboutForm.Show();
break;
}
}
}
private void listView1_MouseUp(object sender, MouseEventArgs e)
{
if (sender is ListView _sender)
{
toolStripMenuItem_Enable.Enabled = e.Button == MouseButtons.Right && _sender.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_Delete.Enabled = e.Button == MouseButtons.Right && _sender.SelectedItems.OfType<ListViewItem>().Any();
toolStripMenuItem_Modify.Enabled = e.Button == MouseButtons.Right && _sender.SelectedItems.OfType<ListViewItem>().Count() == 1;
}
}
private void listView1_DoubleClick(object sender, EventArgs e)
{
if (sender is ListView _sender)
{
var selectAny = _sender.SelectedItems.OfType<ListViewItem>().Any();
if (selectAny)
{
if (SetProxyForm == null) SetProxyForm = new SetProxyForm(this);
SetProxyForUpdate(SetProxyForm);
SetProxyForm.ShowDialog();
}
}
}
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
// Determine if clicked column is already the column that is being sorted.
if (e.Column == lvwColumnSorter.SortColumn)
{
// Reverse the current sort direction for this column.
if (lvwColumnSorter.Order == SortOrder.Ascending)
{
lvwColumnSorter.Order = SortOrder.Descending;
}
else
{
lvwColumnSorter.Order = SortOrder.Ascending;
}
}
else
{
// Set the column number that is to be sorted; default to ascending.
lvwColumnSorter.SortColumn = e.Column;
lvwColumnSorter.Order = SortOrder.Ascending;
}
// Perform the sort with these new sort options.
listViewProxies.Sort();
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,23 @@
using PortProxyGUI.Data;
using System;
using System.Windows.Forms;
namespace PortProxyGUI
{
static class Program
{
public static readonly ApplicationDbScope SqliteDbScope = ApplicationDbScope.UseDefault();
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
SqliteDbScope.Migrate();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new PortProxyGUI());
}
}
}

View File

@ -0,0 +1,35 @@
using System.Reflection;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("PortProxyGUI - NET")]
[assembly: AssemblyDescription("A manager of the netsh interface portproxy which is to evaluate TCP/IP port redirect on windows.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("nstandard.net")]
[assembly: AssemblyProduct("PortProxyGUI - NET")]
[assembly: AssemblyCopyright("Copyright © nstandard.net 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("1b166039-e98c-404a-89a5-c981364b5546")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.1.2.0")]
[assembly: AssemblyFileVersion("1.1.2.0")]

View File

@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace PortProxyGUI.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PortProxyGUI.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

View File

@ -0,0 +1,117 @@
<?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.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:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace PortProxyGUI.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.8.1.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View File

@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

View File

@ -0,0 +1,151 @@
namespace PortProxyGUI
{
partial class SetProxyForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SetProxyForm));
this.label1 = new System.Windows.Forms.Label();
this.textBox_listenOn = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.textBox_connectTo = new System.Windows.Forms.TextBox();
this.textBox_connectPort = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.button_submit = new System.Windows.Forms.Button();
this.label4 = new System.Windows.Forms.Label();
this.label5 = new System.Windows.Forms.Label();
this.textBox_listenPort = new System.Windows.Forms.TextBox();
this.comboBox_type = new System.Windows.Forms.ComboBox();
this.SuspendLayout();
//
// label1
//
resources.ApplyResources(this.label1, "label1");
this.label1.Name = "label1";
//
// textBox_listenOn
//
resources.ApplyResources(this.textBox_listenOn, "textBox_listenOn");
this.textBox_listenOn.Name = "textBox_listenOn";
//
// label2
//
resources.ApplyResources(this.label2, "label2");
this.label2.Name = "label2";
//
// textBox_connectTo
//
resources.ApplyResources(this.textBox_connectTo, "textBox_connectTo");
this.textBox_connectTo.Name = "textBox_connectTo";
//
// textBox_connectPort
//
resources.ApplyResources(this.textBox_connectPort, "textBox_connectPort");
this.textBox_connectPort.Name = "textBox_connectPort";
//
// label3
//
resources.ApplyResources(this.label3, "label3");
this.label3.Name = "label3";
//
// button_submit
//
resources.ApplyResources(this.button_submit, "button_submit");
this.button_submit.Name = "button_submit";
this.button_submit.UseVisualStyleBackColor = true;
this.button_submit.Click += new System.EventHandler(this.button_submit_Click);
//
// label4
//
resources.ApplyResources(this.label4, "label4");
this.label4.Name = "label4";
//
// label5
//
resources.ApplyResources(this.label5, "label5");
this.label5.Name = "label5";
//
// textBox_listenPort
//
resources.ApplyResources(this.textBox_listenPort, "textBox_listenPort");
this.textBox_listenPort.Name = "textBox_listenPort";
//
// comboBox_type
//
resources.ApplyResources(this.comboBox_type, "comboBox_type");
this.comboBox_type.FormattingEnabled = true;
this.comboBox_type.Items.AddRange(new object[] {
resources.GetString("comboBox_type.Items"),
resources.GetString("comboBox_type.Items1"),
resources.GetString("comboBox_type.Items2"),
resources.GetString("comboBox_type.Items3"),
resources.GetString("comboBox_type.Items4")});
this.comboBox_type.Name = "comboBox_type";
//
// SetProxyForm
//
this.AcceptButton = this.button_submit;
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.comboBox_type);
this.Controls.Add(this.textBox_listenPort);
this.Controls.Add(this.label5);
this.Controls.Add(this.label4);
this.Controls.Add(this.button_submit);
this.Controls.Add(this.label3);
this.Controls.Add(this.textBox_connectPort);
this.Controls.Add(this.textBox_connectTo);
this.Controls.Add(this.label2);
this.Controls.Add(this.textBox_listenOn);
this.Controls.Add(this.label1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "SetProxyForm";
this.TopMost = true;
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.SetProxyForm_FormClosing);
this.Load += new System.EventHandler(this.SetProxyForm_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox textBox_listenOn;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox textBox_connectTo;
private System.Windows.Forms.TextBox textBox_connectPort;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Button button_submit;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.TextBox textBox_listenPort;
private System.Windows.Forms.ComboBox comboBox_type;
}
}

View File

@ -0,0 +1,141 @@
using NStandard;
using System;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace PortProxyGUI
{
public partial class SetProxyForm : Form
{
public readonly PortProxyGUI ParentWindow;
private string AutoTypeString { get; }
private bool _updateMode;
private ListViewItem _updateLiveViewItem;
private string _oldType;
private string _oldListenOn;
private int _oldListenPort;
public SetProxyForm(PortProxyGUI parent)
{
ParentWindow = parent;
InitializeComponent();
AutoTypeString = comboBox_type.Text = comboBox_type.Items.OfType<string>().First();
}
public void UseNormalMode()
{
_updateMode = false;
_updateLiveViewItem = null;
_oldType = null;
_oldListenOn = null;
_oldListenPort = 0;
comboBox_type.Text = AutoTypeString;
textBox_listenOn.Text = "*";
textBox_listenPort.Text = "";
textBox_connectTo.Text = "";
textBox_connectPort.Text = "";
}
public void UseUpdateMode(ListViewItem item, string type, string listenOn, int listenPort, string connectTo, string connectPort)
{
_updateMode = true;
_updateLiveViewItem = item;
_oldType = type;
_oldListenOn = listenOn.Trim().ToLower();
_oldListenPort = listenPort;
comboBox_type.Text = type;
textBox_listenOn.Text = listenOn.ToString();
textBox_listenPort.Text = listenPort.ToString();
textBox_connectTo.Text = connectTo;
textBox_connectPort.Text = connectPort;
}
private bool IsIPv6(string ip)
{
return ip.IsMatch(new Regex(@"^[\dABCDEF]{2}(?::(?:[\dABCDEF]{2})){5}$"));
}
private string GetPassType(string listenOn, string connectTo)
{
var from = IsIPv6(listenOn) ? "v6" : "v4";
var to = IsIPv6(connectTo) ? "v6" : "v4";
return $"{from}to{to}";
}
private void button_submit_Click(object sender, EventArgs e)
{
var type = comboBox_type.Text.Trim();
var listenOn = textBox_listenOn.Text.Trim().ToLower();
var connectTo = textBox_connectTo.Text.Trim().ToLower();
var listenPort = textBox_listenPort.Text.Trim();
var connectPort = textBox_connectPort.Text.Trim();
if (!int.TryParse(listenPort, out var _listenPort) || _listenPort < 0 || _listenPort > 65535)
{
MessageBox.Show($"The listen port is invalid.", "Fail", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (!int.TryParse(connectPort, out var _connectPort) || _connectPort < 0 || _connectPort > 65535)
{
MessageBox.Show($"The connect port is invalid.", "Fail", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (type == AutoTypeString) type = GetPassType(listenOn, connectTo);
if (!new[] { "v4tov4", "v4tov6", "v6tov4", "v6tov6" }.Contains(type))
{
MessageBox.Show($"Unknow type for ({listenOn} -> {connectTo}).", "Fail", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (_updateMode)
{
var rule = Program.SqliteDbScope.GetRule(_oldType, _oldListenOn, _oldListenPort);
CmdUtil.DeleteProxy(_oldType, _oldListenOn, _oldListenPort);
Program.SqliteDbScope.Remove(rule);
rule.Type = type;
rule.ListenOn = listenOn;
rule.ListenPort = _listenPort;
rule.ConnectTo = connectTo;
rule.ConnectPort = _connectPort;
CmdUtil.AddProxy("add", type, listenOn, _listenPort, connectTo, _connectPort);
Program.SqliteDbScope.Add(rule);
_updateLiveViewItem.ImageIndex = 1;
var subItems = _updateLiveViewItem.SubItems;
subItems[1].Text = type;
subItems[2].Text = listenOn;
subItems[3].Text = _listenPort.ToString();
subItems[4].Text = connectTo;
subItems[5].Text = _connectPort.ToString();
}
else
{
CmdUtil.AddProxy("add", type, listenOn, _listenPort, connectTo, _connectPort);
ParentWindow.RefreshProxyList();
}
Close();
}
private void SetProxyForm_Load(object sender, EventArgs e)
{
Top = ParentWindow.Top + (ParentWindow.Height - Height) / 2;
Left = ParentWindow.Left + (ParentWindow.Width - Width) / 2;
}
private void SetProxyForm_FormClosing(object sender, FormClosingEventArgs e)
{
ParentWindow.SetProxyForm = null;
}
}
}

View File

@ -112,511 +112,334 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="label_ListenOn.AutoSize" type="System.Boolean, mscorlib">
<assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="label1.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="label_ListenOn.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="label1.Location" type="System.Drawing.Point, System.Drawing">
<value>13, 11</value>
</data>
<data name="label_ListenOn.Location" type="System.Drawing.Point, System.Drawing">
<value>14, 62</value>
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
<value>59, 12</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="label_ListenOn.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 0, 4, 0</value>
</data>
<data name="label_ListenOn.Size" type="System.Drawing.Size, System.Drawing">
<value>60, 17</value>
</data>
<data name="label_ListenOn.TabIndex" type="System.Int32, mscorlib">
<data name="label1.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label_ListenOn.Text" xml:space="preserve">
<value>监听地址</value>
<data name="label1.Text" xml:space="preserve">
<value>Listen on</value>
</data>
<data name="&gt;&gt;label_ListenOn.Name" xml:space="preserve">
<value>label_ListenOn</value>
<data name="&gt;&gt;label1.Name" xml:space="preserve">
<value>label1</value>
</data>
<data name="&gt;&gt;label_ListenOn.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="&gt;&gt;label1.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label_ListenOn.Parent" xml:space="preserve">
<data name="&gt;&gt;label1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label_ListenOn.ZOrder" xml:space="preserve">
<value>14</value>
</data>
<data name="textBox_ListenOn.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="textBox_ListenOn.Location" type="System.Drawing.Point, System.Drawing">
<value>97, 58</value>
</data>
<data name="textBox_ListenOn.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
</data>
<data name="textBox_ListenOn.Size" type="System.Drawing.Size, System.Drawing">
<value>146, 23</value>
</data>
<data name="textBox_ListenOn.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="textBox_ListenOn.Text" xml:space="preserve">
<value>*</value>
</data>
<data name="textBox_ListenOn.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="&gt;&gt;textBox_ListenOn.Name" xml:space="preserve">
<value>textBox_ListenOn</value>
</data>
<data name="&gt;&gt;textBox_ListenOn.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_ListenOn.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_ListenOn.ZOrder" xml:space="preserve">
<value>13</value>
</data>
<data name="label_ConnectTo.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label_ConnectTo.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="label_ConnectTo.Location" type="System.Drawing.Point, System.Drawing">
<value>14, 93</value>
</data>
<data name="label_ConnectTo.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 0, 4, 0</value>
</data>
<data name="label_ConnectTo.Size" type="System.Drawing.Size, System.Drawing">
<value>71, 17</value>
</data>
<data name="label_ConnectTo.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label_ConnectTo.Text" xml:space="preserve">
<value>连接地址</value>
</data>
<data name="&gt;&gt;label_ConnectTo.Name" xml:space="preserve">
<value>label_ConnectTo</value>
</data>
<data name="&gt;&gt;label_ConnectTo.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label_ConnectTo.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label_ConnectTo.ZOrder" xml:space="preserve">
<value>12</value>
</data>
<data name="textBox_ConnectTo.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="textBox_ConnectTo.Location" type="System.Drawing.Point, System.Drawing">
<value>97, 90</value>
</data>
<data name="textBox_ConnectTo.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
</data>
<data name="textBox_ConnectTo.Size" type="System.Drawing.Size, System.Drawing">
<value>146, 23</value>
</data>
<data name="textBox_ConnectTo.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="textBox_ConnectTo.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="&gt;&gt;textBox_ConnectTo.Name" xml:space="preserve">
<value>textBox_ConnectTo</value>
</data>
<data name="&gt;&gt;textBox_ConnectTo.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_ConnectTo.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_ConnectTo.ZOrder" xml:space="preserve">
<value>11</value>
</data>
<data name="textBox_ConnectPort.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="textBox_ConnectPort.Location" type="System.Drawing.Point, System.Drawing">
<value>299, 90</value>
</data>
<data name="textBox_ConnectPort.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
</data>
<data name="textBox_ConnectPort.Size" type="System.Drawing.Size, System.Drawing">
<value>84, 23</value>
</data>
<data name="textBox_ConnectPort.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="textBox_ConnectPort.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="&gt;&gt;textBox_ConnectPort.Name" xml:space="preserve">
<value>textBox_ConnectPort</value>
</data>
<data name="&gt;&gt;textBox_ConnectPort.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_ConnectPort.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_ConnectPort.ZOrder" xml:space="preserve">
<data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
<value>10</value>
</data>
<data name="label_ConnectPort.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
<data name="textBox_listenOn.Location" type="System.Drawing.Point, System.Drawing">
<value>79, 8</value>
</data>
<data name="label_ConnectPort.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="textBox_listenOn.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="label_ConnectPort.Location" type="System.Drawing.Point, System.Drawing">
<value>251, 93</value>
<data name="textBox_listenOn.Size" type="System.Drawing.Size, System.Drawing">
<value>125, 21</value>
</data>
<data name="label_ConnectPort.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 0, 4, 0</value>
</data>
<data name="label_ConnectPort.Size" type="System.Drawing.Size, System.Drawing">
<value>32, 17</value>
</data>
<data name="label_ConnectPort.TabIndex" type="System.Int32, mscorlib">
<data name="textBox_listenOn.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label_ConnectPort.Text" xml:space="preserve">
<value>端口</value>
<data name="textBox_listenOn.Text" xml:space="preserve">
<value>*</value>
</data>
<data name="&gt;&gt;label_ConnectPort.Name" xml:space="preserve">
<value>label_ConnectPort</value>
<data name="textBox_listenOn.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="&gt;&gt;label_ConnectPort.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="&gt;&gt;textBox_listenOn.Name" xml:space="preserve">
<value>textBox_listenOn</value>
</data>
<data name="&gt;&gt;label_ConnectPort.Parent" xml:space="preserve">
<data name="&gt;&gt;textBox_listenOn.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_listenOn.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label_ConnectPort.ZOrder" xml:space="preserve">
<data name="&gt;&gt;textBox_listenOn.ZOrder" xml:space="preserve">
<value>9</value>
</data>
<data name="button_Set.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
<data name="label2.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="button_Set.Location" type="System.Drawing.Point, System.Drawing">
<value>260, 134</value>
<data name="label2.Location" type="System.Drawing.Point, System.Drawing">
<value>13, 35</value>
</data>
<data name="button_Set.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 5, 4, 5</value>
<data name="label2.Size" type="System.Drawing.Size, System.Drawing">
<value>65, 12</value>
</data>
<data name="button_Set.Size" type="System.Drawing.Size, System.Drawing">
<value>125, 31</value>
<data name="label2.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="button_Set.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
<data name="label2.Text" xml:space="preserve">
<value>Connect to</value>
</data>
<data name="button_Set.Text" xml:space="preserve">
<value>设置</value>
<data name="&gt;&gt;label2.Name" xml:space="preserve">
<value>label2</value>
</data>
<data name="&gt;&gt;button_Set.Name" xml:space="preserve">
<value>button_Set</value>
<data name="&gt;&gt;label2.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;button_Set.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;button_Set.Parent" xml:space="preserve">
<data name="&gt;&gt;label2.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;button_Set.ZOrder" xml:space="preserve">
<data name="&gt;&gt;label2.ZOrder" xml:space="preserve">
<value>8</value>
</data>
<data name="label_Type.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
<data name="textBox_connectTo.Location" type="System.Drawing.Point, System.Drawing">
<value>79, 32</value>
</data>
<data name="label_Type.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
<data name="textBox_connectTo.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="label_Type.Location" type="System.Drawing.Point, System.Drawing">
<value>14, 16</value>
<data name="textBox_connectTo.Size" type="System.Drawing.Size, System.Drawing">
<value>125, 21</value>
</data>
<data name="label_Type.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 0, 4, 0</value>
</data>
<data name="label_Type.Size" type="System.Drawing.Size, System.Drawing">
<value>36, 17</value>
</data>
<data name="label_Type.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label_Type.Text" xml:space="preserve">
<value>类型</value>
</data>
<data name="&gt;&gt;label_Type.Name" xml:space="preserve">
<value>label_Type</value>
</data>
<data name="&gt;&gt;label_Type.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label_Type.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label_Type.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="label_ListenPort.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label_ListenPort.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="label_ListenPort.Location" type="System.Drawing.Point, System.Drawing">
<value>251, 62</value>
</data>
<data name="label_ListenPort.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 0, 4, 0</value>
</data>
<data name="label_ListenPort.Size" type="System.Drawing.Size, System.Drawing">
<value>32, 17</value>
</data>
<data name="label_ListenPort.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label_ListenPort.Text" xml:space="preserve">
<value>端口</value>
</data>
<data name="&gt;&gt;label_ListenPort.Name" xml:space="preserve">
<value>label_ListenPort</value>
</data>
<data name="&gt;&gt;label_ListenPort.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label_ListenPort.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label_ListenPort.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="textBox_ListenPort.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="textBox_ListenPort.Location" type="System.Drawing.Point, System.Drawing">
<value>299, 58</value>
</data>
<data name="textBox_ListenPort.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
</data>
<data name="textBox_ListenPort.Size" type="System.Drawing.Size, System.Drawing">
<value>84, 23</value>
</data>
<data name="textBox_ListenPort.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="textBox_ListenPort.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="&gt;&gt;textBox_ListenPort.Name" xml:space="preserve">
<value>textBox_ListenPort</value>
</data>
<data name="&gt;&gt;textBox_ListenPort.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_ListenPort.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_ListenPort.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="comboBox_Type.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="comboBox_Type.Items" xml:space="preserve">
<value>(自动)</value>
</data>
<data name="comboBox_Type.Items1" xml:space="preserve">
<value>v4tov4</value>
</data>
<data name="comboBox_Type.Items2" xml:space="preserve">
<value>v4tov6</value>
</data>
<data name="comboBox_Type.Items3" xml:space="preserve">
<value>v6tov4</value>
</data>
<data name="comboBox_Type.Items4" xml:space="preserve">
<value>v6tov6</value>
</data>
<data name="comboBox_Type.Location" type="System.Drawing.Point, System.Drawing">
<value>97, 13</value>
</data>
<data name="comboBox_Type.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
</data>
<data name="comboBox_Type.Size" type="System.Drawing.Size, System.Drawing">
<value>146, 25</value>
</data>
<data name="comboBox_Type.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="&gt;&gt;comboBox_Type.Name" xml:space="preserve">
<value>comboBox_Type</value>
</data>
<data name="&gt;&gt;comboBox_Type.Type" xml:space="preserve">
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;comboBox_Type.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;comboBox_Type.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="label_Comment.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label_Comment.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="label_Comment.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="label_Comment.Location" type="System.Drawing.Point, System.Drawing">
<value>14, 141</value>
</data>
<data name="label_Comment.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 0, 4, 0</value>
</data>
<data name="label_Comment.Size" type="System.Drawing.Size, System.Drawing">
<value>64, 17</value>
</data>
<data name="label_Comment.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
</data>
<data name="label_Comment.Text" xml:space="preserve">
<value>备注</value>
</data>
<data name="&gt;&gt;label_Comment.Name" xml:space="preserve">
<value>label_Comment</value>
</data>
<data name="&gt;&gt;label_Comment.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label_Comment.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label_Comment.ZOrder" xml:space="preserve">
<data name="textBox_connectTo.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="textBox_Comment.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="textBox_Comment.Location" type="System.Drawing.Point, System.Drawing">
<value>97, 138</value>
</data>
<data name="textBox_Comment.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
</data>
<data name="textBox_Comment.Size" type="System.Drawing.Size, System.Drawing">
<value>146, 23</value>
</data>
<data name="textBox_Comment.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="textBox_Comment.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<data name="textBox_connectTo.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="&gt;&gt;textBox_Comment.Name" xml:space="preserve">
<value>textBox_Comment</value>
<data name="&gt;&gt;textBox_connectTo.Name" xml:space="preserve">
<value>textBox_connectTo</value>
</data>
<data name="&gt;&gt;textBox_Comment.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="&gt;&gt;textBox_connectTo.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_Comment.Parent" xml:space="preserve">
<data name="&gt;&gt;textBox_connectTo.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_Comment.ZOrder" xml:space="preserve">
<value>2</value>
<data name="&gt;&gt;textBox_connectTo.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="label_Group.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
<data name="textBox_connectPort.Location" type="System.Drawing.Point, System.Drawing">
<value>244, 32</value>
</data>
<data name="label_Group.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
<data name="textBox_connectPort.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="label_Group.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
<data name="textBox_connectPort.Size" type="System.Drawing.Size, System.Drawing">
<value>57, 21</value>
</data>
<data name="label_Group.Location" type="System.Drawing.Point, System.Drawing">
<value>251, 16</value>
<data name="textBox_connectPort.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="label_Group.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 0, 4, 0</value>
<data name="textBox_connectPort.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="label_Group.Size" type="System.Drawing.Size, System.Drawing">
<value>45, 17</value>
<data name="&gt;&gt;textBox_connectPort.Name" xml:space="preserve">
<value>textBox_connectPort</value>
</data>
<data name="label_Group.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
<data name="&gt;&gt;textBox_connectPort.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="label_Group.Text" xml:space="preserve">
<value>分组</value>
</data>
<data name="&gt;&gt;label_Group.Name" xml:space="preserve">
<value>label_Group</value>
</data>
<data name="&gt;&gt;label_Group.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label_Group.Parent" xml:space="preserve">
<data name="&gt;&gt;textBox_connectPort.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label_Group.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="comboBox_Group.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="comboBox_Group.Location" type="System.Drawing.Point, System.Drawing">
<value>299, 13</value>
</data>
<data name="comboBox_Group.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
</data>
<data name="comboBox_Group.Size" type="System.Drawing.Size, System.Drawing">
<value>84, 25</value>
</data>
<data name="comboBox_Group.TabIndex" type="System.Int32, mscorlib">
<data name="&gt;&gt;textBox_connectPort.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="&gt;&gt;comboBox_Group.Name" xml:space="preserve">
<value>comboBox_Group</value>
</data>
<data name="&gt;&gt;comboBox_Group.Type" xml:space="preserve">
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;comboBox_Group.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;comboBox_Group.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="$this.Localizable" type="System.Boolean, mscorlib">
<data name="label3.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label3.Location" type="System.Drawing.Point, System.Drawing">
<value>210, 35</value>
</data>
<data name="label3.Size" type="System.Drawing.Size, System.Drawing">
<value>29, 12</value>
</data>
<data name="label3.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label3.Text" xml:space="preserve">
<value>Port</value>
</data>
<data name="&gt;&gt;label3.Name" xml:space="preserve">
<value>label3</value>
</data>
<data name="&gt;&gt;label3.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label3.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label3.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="button_submit.Location" type="System.Drawing.Point, System.Drawing">
<value>227, 62</value>
</data>
<data name="button_submit.Size" type="System.Drawing.Size, System.Drawing">
<value>74, 22</value>
</data>
<data name="button_submit.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="button_submit.Text" xml:space="preserve">
<value>Set</value>
</data>
<data name="&gt;&gt;button_submit.Name" xml:space="preserve">
<value>button_submit</value>
</data>
<data name="&gt;&gt;button_submit.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;button_submit.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;button_submit.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="label4.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label4.Location" type="System.Drawing.Point, System.Drawing">
<value>14, 66</value>
</data>
<data name="label4.Size" type="System.Drawing.Size, System.Drawing">
<value>29, 12</value>
</data>
<data name="label4.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label4.Text" xml:space="preserve">
<value>Type</value>
</data>
<data name="&gt;&gt;label4.Name" xml:space="preserve">
<value>label4</value>
</data>
<data name="&gt;&gt;label4.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label4.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label4.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="label5.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label5.Location" type="System.Drawing.Point, System.Drawing">
<value>210, 11</value>
</data>
<data name="label5.Size" type="System.Drawing.Size, System.Drawing">
<value>29, 12</value>
</data>
<data name="label5.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label5.Text" xml:space="preserve">
<value>Port</value>
</data>
<data name="&gt;&gt;label5.Name" xml:space="preserve">
<value>label5</value>
</data>
<data name="&gt;&gt;label5.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label5.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label5.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="textBox_listenPort.Location" type="System.Drawing.Point, System.Drawing">
<value>244, 8</value>
</data>
<data name="textBox_listenPort.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="textBox_listenPort.Size" type="System.Drawing.Size, System.Drawing">
<value>57, 21</value>
</data>
<data name="textBox_listenPort.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="textBox_listenPort.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="&gt;&gt;textBox_listenPort.Name" xml:space="preserve">
<value>textBox_listenPort</value>
</data>
<data name="&gt;&gt;textBox_listenPort.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_listenPort.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_listenPort.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="comboBox_type.FlatStyle" type="System.Windows.Forms.FlatStyle, System.Windows.Forms">
<value>Popup</value>
</data>
<data name="comboBox_type.Items" xml:space="preserve">
<value>(Auto)</value>
</data>
<data name="comboBox_type.Items1" xml:space="preserve">
<value>v4tov4</value>
</data>
<data name="comboBox_type.Items2" xml:space="preserve">
<value>v4tov6</value>
</data>
<data name="comboBox_type.Items3" xml:space="preserve">
<value>v6tov4</value>
</data>
<data name="comboBox_type.Items4" xml:space="preserve">
<value>v6tov6</value>
</data>
<data name="comboBox_type.Location" type="System.Drawing.Point, System.Drawing">
<value>78, 64</value>
</data>
<data name="comboBox_type.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="comboBox_type.Size" type="System.Drawing.Size, System.Drawing">
<value>126, 20</value>
</data>
<data name="comboBox_type.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="&gt;&gt;comboBox_type.Name" xml:space="preserve">
<value>comboBox_type</value>
</data>
<data name="&gt;&gt;comboBox_type.Type" xml:space="preserve">
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;comboBox_type.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;comboBox_type.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>6, 13</value>
<value>6, 12</value>
</data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>398, 183</value>
<value>313, 95</value>
</data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
@ -2777,7 +2600,7 @@
</value>
</data>
<data name="$this.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
<value>3, 2, 3, 2</value>
</data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
<value>Manual</value>
@ -2786,9 +2609,9 @@
<value>Set Proxy</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>SetProxy</value>
<value>SetProxyForm</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.Form, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@ -0,0 +1,459 @@
<?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:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="label1.Text" xml:space="preserve">
<value>监听地址</value>
</data>
<data name="&gt;&gt;label1.Name" xml:space="preserve">
<value>label1</value>
</data>
<data name="&gt;&gt;label1.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
<value>10</value>
</data>
<data name="textBox_listenOn.Text" xml:space="preserve">
<value>*</value>
</data>
<data name="&gt;&gt;textBox_listenOn.Name" xml:space="preserve">
<value>textBox_listenOn</value>
</data>
<data name="&gt;&gt;textBox_listenOn.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_listenOn.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_listenOn.ZOrder" xml:space="preserve">
<value>9</value>
</data>
<data name="label2.Text" xml:space="preserve">
<value>连接地址</value>
</data>
<data name="&gt;&gt;label2.Name" xml:space="preserve">
<value>label2</value>
</data>
<data name="&gt;&gt;label2.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label2.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label2.ZOrder" xml:space="preserve">
<value>8</value>
</data>
<data name="&gt;&gt;textBox_connectTo.Name" xml:space="preserve">
<value>textBox_connectTo</value>
</data>
<data name="&gt;&gt;textBox_connectTo.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_connectTo.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_connectTo.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="&gt;&gt;textBox_connectPort.Name" xml:space="preserve">
<value>textBox_connectPort</value>
</data>
<data name="&gt;&gt;textBox_connectPort.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_connectPort.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_connectPort.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="label3.Text" xml:space="preserve">
<value>端口</value>
</data>
<data name="&gt;&gt;label3.Name" xml:space="preserve">
<value>label3</value>
</data>
<data name="&gt;&gt;label3.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label3.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label3.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="button_submit.Text" xml:space="preserve">
<value>设置</value>
</data>
<data name="&gt;&gt;button1.Name" xml:space="preserve">
<value>button1</value>
</data>
<data name="&gt;&gt;button1.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;button1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;button1.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="label4.Text" xml:space="preserve">
<value>类型</value>
</data>
<data name="&gt;&gt;label4.Name" xml:space="preserve">
<value>label4</value>
</data>
<data name="&gt;&gt;label4.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label4.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label4.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="label5.Text" xml:space="preserve">
<value>端口</value>
</data>
<data name="&gt;&gt;label5.Name" xml:space="preserve">
<value>label5</value>
</data>
<data name="&gt;&gt;label5.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label5.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label5.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="&gt;&gt;textBox_listenPort.Name" xml:space="preserve">
<value>textBox_listenPort</value>
</data>
<data name="&gt;&gt;textBox_listenPort.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_listenPort.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_listenPort.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="comboBox_type.Items1" xml:space="preserve">
<value>v4tov4</value>
</data>
<data name="comboBox_type.Items2" xml:space="preserve">
<value>v4tov6</value>
</data>
<data name="comboBox_type.Items3" xml:space="preserve">
<value>v6tov4</value>
</data>
<data name="comboBox_type.Items4" xml:space="preserve">
<value>v6tov6</value>
</data>
<data name="&gt;&gt;comboBox_type.Name" xml:space="preserve">
<value>comboBox_type</value>
</data>
<data name="&gt;&gt;comboBox_type.Type" xml:space="preserve">
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;comboBox_type.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;comboBox_type.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>设置映射</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>NewProxy</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>6, 12</value>
</data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>313, 95</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="$this.Localizable" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="$this.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
<value>CenterScreen</value>
</data>
<data name="button1.Location" type="System.Drawing.Point, System.Drawing">
<value>227, 62</value>
</data>
<data name="button1.Size" type="System.Drawing.Size, System.Drawing">
<value>74, 22</value>
</data>
<data name="button1.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="comboBox_type.FlatStyle" type="System.Windows.Forms.FlatStyle, System.Windows.Forms">
<value>Popup</value>
</data>
<data name="comboBox_type.Location" type="System.Drawing.Point, System.Drawing">
<value>78, 64</value>
</data>
<data name="comboBox_type.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="comboBox_type.Size" type="System.Drawing.Size, System.Drawing">
<value>126, 20</value>
</data>
<data name="comboBox_type.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="label1.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label1.Location" type="System.Drawing.Point, System.Drawing">
<value>13, 11</value>
</data>
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
<value>59, 12</value>
</data>
<data name="label1.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label2.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label2.Location" type="System.Drawing.Point, System.Drawing">
<value>13, 35</value>
</data>
<data name="label2.Size" type="System.Drawing.Size, System.Drawing">
<value>65, 12</value>
</data>
<data name="label2.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label3.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label3.Location" type="System.Drawing.Point, System.Drawing">
<value>210, 35</value>
</data>
<data name="label3.Size" type="System.Drawing.Size, System.Drawing">
<value>29, 12</value>
</data>
<data name="label3.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label4.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label4.Location" type="System.Drawing.Point, System.Drawing">
<value>14, 66</value>
</data>
<data name="label4.Size" type="System.Drawing.Size, System.Drawing">
<value>29, 12</value>
</data>
<data name="label4.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label5.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label5.Location" type="System.Drawing.Point, System.Drawing">
<value>210, 11</value>
</data>
<data name="label5.Size" type="System.Drawing.Size, System.Drawing">
<value>29, 12</value>
</data>
<data name="label5.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="textBox_connectPort.Location" type="System.Drawing.Point, System.Drawing">
<value>244, 32</value>
</data>
<data name="textBox_connectPort.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="textBox_connectPort.Size" type="System.Drawing.Size, System.Drawing">
<value>57, 21</value>
</data>
<data name="textBox_connectPort.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="textBox_connectPort.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="textBox_connectTo.Location" type="System.Drawing.Point, System.Drawing">
<value>79, 32</value>
</data>
<data name="textBox_connectTo.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="textBox_connectTo.Size" type="System.Drawing.Size, System.Drawing">
<value>125, 21</value>
</data>
<data name="textBox_connectTo.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="textBox_connectTo.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="textBox_listenOn.Location" type="System.Drawing.Point, System.Drawing">
<value>79, 8</value>
</data>
<data name="textBox_listenOn.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="textBox_listenOn.Size" type="System.Drawing.Size, System.Drawing">
<value>125, 21</value>
</data>
<data name="textBox_listenOn.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="textBox_listenOn.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="textBox_listenPort.Location" type="System.Drawing.Point, System.Drawing">
<value>244, 8</value>
</data>
<data name="textBox_listenPort.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="textBox_listenPort.Size" type="System.Drawing.Size, System.Drawing">
<value>57, 21</value>
</data>
<data name="textBox_listenPort.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="textBox_listenPort.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="comboBox_type.Items" xml:space="preserve">
<value>(自动)</value>
</data>
</root>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>

View File

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC Manifest Options
If you want to change the Windows User Account Control level replace the
requestedExecutionLevel node with one of the following.
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Specifying requestedExecutionLevel element will disable file and registry virtualization.
Remove this element if your application requires this virtualization for backwards
compatibility.
-->
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
<applicationRequestMinimum>
<PermissionSet Unrestricted="true" ID="Custom" SameSite="site" />
<defaultAssemblyRequest permissionSetReference="Custom" />
</applicationRequestMinimum>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- A list of the Windows versions that this application has been tested on
and is designed to work with. Uncomment the appropriate elements
and Windows will automatically select the most compatible environment. -->
<!-- Windows Vista -->
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
<!-- Windows 7 -->
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
<!-- Windows 8 -->
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
<!-- Windows 8.1 -->
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
<!-- Windows 10 -->
<!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->
</application>
</compatibility>
<!-- Indicates that the application is DPI-aware and will not be automatically scaled by Windows at higher
DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need
to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should
also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config. -->
<!--
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
-->
<!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->
<!--
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
-->
</assembly>

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="NStandard" version="0.6.7.1" targetFramework="net45" />
<package id="SQLib" version="0.8.6" targetFramework="net45" />
<package id="SQLib.Sqlite" version="0.8.6" targetFramework="net45" />
<package id="Stub.System.Data.SQLite.Core.NetFramework" version="1.0.113.3" targetFramework="net45" />
<package id="System.Data.SQLite.Core" version="1.0.113.7" targetFramework="net45" />
<package id="System.Runtime" version="4.3.1" targetFramework="net45" />
</packages>

View File

@ -0,0 +1,25 @@
using System.Diagnostics;
namespace PortProxyGUI
{
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;
}
}
}

View File

@ -0,0 +1,69 @@
using NStandard;
using PortProxyGUI.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace PortProxyGUI
{
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"),
};
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 proxies = types.SelectMany(type =>
{
var regex = RegexList[$"{type.From} to {type.To}"];
var typeProxies = output.ExtractFirst(regex)
?.Split(new[] { Environment.NewLine }, StringSplitOptions.None)
.Select(line =>
{
var parts = line.Resolve(new Regex(@"^([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)$"));
return new Rule
{
Type = type.Type,
ListenOn = parts[1].First(),
ListenPort = int.Parse(parts[2].First()),
ConnectTo = parts[3].First(),
ConnectPort = int.Parse(parts[4].First()),
};
});
return typeProxies ?? new Rule[0];
});
return proxies.ToArray();
}
public static void AddProxy(string action, string type, string listenOn, int listenPort, string connectTo, int connectPort)
{
CmdRunner.Execute($"netsh interface portproxy {action} {type} listenaddress={listenOn} listenport={listenPort} connectaddress={connectTo} connectport={connectPort}");
}
public static void DeleteProxy(string type, string listenOn, int listenPort)
{
CmdRunner.Execute($"netsh interface portproxy delete {type} listenaddress={listenOn} listenport={listenPort}");
}
}
}

View File

@ -0,0 +1,76 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace PortProxyGUI.Data
{
public class ApplicationDbMigrationUtil
{
public ApplicationDbScope DbScope { get; private set; }
public ApplicationDbMigrationUtil(ApplicationDbScope context)
{
DbScope = context;
EnsureHistoryTable();
EnsureUpdateVersion();
}
public void EnsureHistoryTable()
{
if (!DbScope.SqlQuery($"SELECT * FROM sqlite_master WHERE type = 'table' AND name = '__history';").Any())
{
DbScope.UnsafeSql(@"CREATE TABLE __history ( MigrationId text PRIMARY KEY, ProductVersion text);");
DbScope.UnsafeSql($"INSERT INTO __history (MigrationId, ProductVersion) VALUES ('000000000000', '0.0');");
}
}
public void EnsureUpdateVersion()
{
var migration = GetLastMigration();
var assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version;
if (new Version(migration.ProductVersion) > assemblyVersion)
throw new InvalidOperationException("The current software version cannot use the configuration. Please download the latest version (https://github.com/zmjack/PortProxyGUI).");
}
public Migration GetLastMigration()
{
return DbScope.SqlQuery<Migration>($"SELECT * FROM __history ORDER BY MigrationId DESC LIMIT 1;").First();
}
public void MigrateToLast()
{
var migration = GetLastMigration();
var migrationId = migration.MigrationId;
var pendingMigrations = migrationId != "000000000000"
? History.SkipWhile(pair => pair.Key.MigrationId != migrationId).Skip(1)
: History;
foreach (var pendingMigration in pendingMigrations)
{
foreach (var sql in pendingMigration.Value)
{
DbScope.UnsafeSql(sql);
}
DbScope.Sql($"INSERT INTO __history (MigrationId, ProductVersion) VALUES ({pendingMigration.Key.MigrationId}, {pendingMigration.Key.ProductVersion});");
}
}
public Dictionary<MigrationKey, string[]> History = new Dictionary<MigrationKey, string[]>
{
[new MigrationKey { MigrationId = "202103021542", ProductVersion = "1.1.0" }] = new[]
{
@"CREATE TABLE rules
(
Id text PRIMARY KEY,
Type text,
ListenOn text,
ListenPort integer,
ConnectTo text,
ConnectPort integer
);",
"CREATE UNIQUE INDEX IX_Rules_Type_ListenOn_ListenPort ON Rules(Type, ListenOn, ListenPort);",
},
};
}
}

View File

@ -0,0 +1,85 @@
using SQLib.Sqlite;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace PortProxyGUI.Data
{
public class ApplicationDbScope : SqliteScope<ApplicationDbScope>
{
public static readonly string DbDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "PortProxyGUI");
public static readonly string DbFile = Path.Combine(DbDirectory, "config.db");
private static readonly string ConnectionString = $"Data Source={DbFile}";
public static ApplicationDbScope UseDefault() => new ApplicationDbScope(ConnectionString);
public ApplicationDbScope(string connectionString) : base(connectionString)
{
}
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 IEnumerable<Rule> Rules => SqlQuery<Rule>($"SELECT * FROM Rules;");
public Rule GetRule(string type, string listenOn, int listenPort)
{
return SqlQuery<Rule>($"SELECT * FROM Rules WHERE Type={type} AND ListenOn={listenOn} AND ListenPort={listenPort} LIMIT 1;").FirstOrDefault();
}
public void Add<T>(T obj) where T : class
{
var newid = Guid.NewGuid().ToString();
switch (obj)
{
case Rule rule:
Sql($"INSERT INTO Rules (Id, Type, ListenOn, ListenPort, ConnectTo, ConnectPort) VALUES ({newid}, {rule.Type}, {rule.ListenOn}, {rule.ListenPort}, {rule.ConnectTo}, {rule.ConnectPort});");
break;
}
}
public void AddRange<T>(IEnumerable<T> objs) where T : class
{
foreach (var obj in objs) Add(obj);
}
public void Update<T>(T obj) where T : class
{
switch (obj)
{
case Rule rule:
Sql($"UPDATE Rules SET Type={rule.Type}, ListenOn={rule.ListenOn}, ListenPort={rule.ListenPort}, ConnectTo={rule.ConnectTo}, ConnectPort={rule.ConnectPort} WHERE Id={rule.Id};");
break;
}
}
public void UpdateRange<T>(IEnumerable<T> objs) where T : class
{
foreach (var obj in objs) Update(obj);
}
public void Remove<T>(T obj) where T : class
{
switch (obj)
{
case Rule rule:
Sql($"DELETE FROM Rules WHERE Id={rule.Id};");
break;
}
}
public void RemoveRange<T>(IEnumerable<T> objs) where T : class
{
foreach (var obj in objs) Remove(obj);
}
}
}

View File

@ -0,0 +1,8 @@
namespace PortProxyGUI.Data
{
public class Migration
{
public string MigrationId { get; set; }
public string ProductVersion { get; set; }
}
}

View File

@ -0,0 +1,8 @@
namespace PortProxyGUI.Data
{
public struct MigrationKey
{
public string MigrationId { get; set; }
public string ProductVersion { get; set; }
}
}

View File

@ -0,0 +1,33 @@
using System;
namespace PortProxyGUI.Data
{
public class Rule : IEquatable<Rule>
{
public string Id { get; set; }
public string Type { get; set; }
public string ListenOn { get; set; }
public int ListenPort { get; set; }
public string ConnectTo { get; set; }
public long ConnectPort { get; set; }
public bool Equals(Rule other)
{
return Id == other.Id
&& Type == other.Type
&& ListenOn == other.ListenOn
&& ListenPort == other.ListenPort
&& ConnectTo == other.ConnectTo
&& ConnectPort == other.ConnectPort;
}
public bool EqualsWithKeys(Rule other)
{
return Type == other.Type
&& ListenOn == other.ListenOn
&& ListenPort == other.ListenPort;
}
}
}

View File

@ -0,0 +1,105 @@
using System.Collections;
using System.Windows.Forms;
namespace PortProxyGUI
{
public class ListViewColumnSorter : IComparer
{
/// <summary>
/// Specifies the column to be sorted
/// </summary>
private int ColumnToSort;
/// <summary>
/// Specifies the order in which to sort (i.e. 'Ascending').
/// </summary>
private SortOrder OrderOfSort;
/// <summary>
/// Case insensitive comparer object
/// </summary>
private CaseInsensitiveComparer ObjectCompare;
/// <summary>
/// Class constructor. Initializes various elements
/// </summary>
public ListViewColumnSorter()
{
// Initialize the column to '0'
ColumnToSort = 0;
// Initialize the sort order to 'none'
OrderOfSort = SortOrder.None;
// Initialize the CaseInsensitiveComparer object
ObjectCompare = new CaseInsensitiveComparer();
}
/// <summary>
/// This method is inherited from the IComparer interface. It compares the two objects passed using a case insensitive comparison.
/// </summary>
/// <param name="x">First object to be compared</param>
/// <param name="y">Second object to be compared</param>
/// <returns>The result of the comparison. "0" if equal, negative if 'x' is less than 'y' and positive if 'x' is greater than 'y'</returns>
public int Compare(object x, object y)
{
int compareResult;
ListViewItem listviewX, listviewY;
// Cast the objects to be compared to ListViewItem objects
listviewX = (ListViewItem)x;
listviewY = (ListViewItem)y;
// Compare the two items
compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text);
// Calculate correct return value based on object comparison
if (OrderOfSort == SortOrder.Ascending)
{
// Ascending sort is selected, return normal result of compare operation
return compareResult;
}
else if (OrderOfSort == SortOrder.Descending)
{
// Descending sort is selected, return negative result of compare operation
return (-compareResult);
}
else
{
// Return '0' to indicate they are equal
return 0;
}
}
/// <summary>
/// Gets or sets the number of the column to which to apply the sorting operation (Defaults to '0').
/// </summary>
public int SortColumn
{
set
{
ColumnToSort = value;
}
get
{
return ColumnToSort;
}
}
/// <summary>
/// Gets or sets the order of sorting to apply (for example, 'Ascending' or 'Descending').
/// </summary>
public SortOrder Order
{
set
{
OrderOfSort = value;
}
get
{
return OrderOfSort;
}
}
}
}

View File

@ -0,0 +1,15 @@
namespace PortProxyGUI
{
public class PortProxy
{
public string Type { get; set; }
public string ListenOn { get; set; }
public string ListenPort { get; set; }
public string ConnectTo { get; set; }
public string ConnectPort { get; set; }
}
}

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
<HasSharedItems>true</HasSharedItems>
<SharedGUID>b38ef2b9-e38d-4d6d-bf0d-7c1934d6cfdc</SharedGUID>
</PropertyGroup>
<PropertyGroup Label="Configuration">
<Import_RootNamespace>PortProxyGUI</Import_RootNamespace>
</PropertyGroup>
<ItemGroup>
<Compile Include="$(MSBuildThisFileDirectory)CmdRunner.cs" />
<Compile Include="$(MSBuildThisFileDirectory)CmdUtil.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Data\ApplicationDbScope.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Data\ApplicationDbMigrationUtil.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Data\Migration.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Data\MigrationKey.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Data\Rule.cs" />
<Compile Include="$(MSBuildThisFileDirectory)ListViewColumnSorter.cs" />
<Compile Include="$(MSBuildThisFileDirectory)ProxyType.cs" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Globals">
<ProjectGuid>b38ef2b9-e38d-4d6d-bf0d-7c1934d6cfdc</ProjectGuid>
<MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.Default.props" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.props" />
<PropertyGroup />
<Import Project="PortProxyGUI.Shared.projitems" Label="Shared" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.CSharp.targets" />
</Project>

View File

@ -0,0 +1,28 @@
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();
}
}
}
}

View File

@ -1,21 +1,29 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.1.32210.238
# Visual Studio Version 16
VisualStudioVersion = 16.0.30114.105
MinimumVisualStudioVersion = 15.0.26124.0
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PortProxyGUI", "PortProxyGUI\PortProxyGUI.csproj", "{7459E9F4-8B98-42D6-92CF-E90961E05C90}"
EndProject
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "PortProxyGUI.Shared", "PortProxyGUI.Shared\PortProxyGUI.Shared.shproj", "{B38EF2B9-E38D-4D6D-BF0D-7C1934D6CFDC}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{E48EF63C-74A5-42B5-BFC5-20652E856B1F}"
ProjectSection(SolutionItems) = preProject
README.md = README.md
docs\ui.png = docs\ui.png
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{444021F3-829E-4682-ACD5-B57FA46CC534}"
ProjectSection(SolutionItems) = preProject
README.md = README.md
EndProjectSection
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PortProxyGUI - NET45", "PortProxyGUI - NET45\PortProxyGUI - NET45.csproj", "{1B166039-E98C-404A-89A5-C981364B5546}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PortProxyGUI - NET35", "PortProxyGUI - NET35\PortProxyGUI - NET35.csproj", "{56FB1CBC-BD89-47D7-A9D5-86F02EEF480F}"
EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
PortProxyGUI.Shared\PortProxyGUI.Shared.projitems*{1b166039-e98c-404a-89a5-c981364b5546}*SharedItemsImports = 4
PortProxyGUI.Shared\PortProxyGUI.Shared.projitems*{56fb1cbc-bd89-47d7-a9d5-86f02eef480f}*SharedItemsImports = 4
PortProxyGUI.Shared\PortProxyGUI.Shared.projitems*{7459e9f4-8b98-42d6-92cf-e90961e05c90}*SharedItemsImports = 5
PortProxyGUI.Shared\PortProxyGUI.Shared.projitems*{b38ef2b9-e38d-4d6d-bf0d-7c1934d6cfdc}*SharedItemsImports = 13
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
@ -37,6 +45,30 @@ Global
{7459E9F4-8B98-42D6-92CF-E90961E05C90}.Release|x64.Build.0 = Release|Any CPU
{7459E9F4-8B98-42D6-92CF-E90961E05C90}.Release|x86.ActiveCfg = Release|Any CPU
{7459E9F4-8B98-42D6-92CF-E90961E05C90}.Release|x86.Build.0 = Release|Any CPU
{1B166039-E98C-404A-89A5-C981364B5546}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1B166039-E98C-404A-89A5-C981364B5546}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1B166039-E98C-404A-89A5-C981364B5546}.Debug|x64.ActiveCfg = Debug|Any CPU
{1B166039-E98C-404A-89A5-C981364B5546}.Debug|x64.Build.0 = Debug|Any CPU
{1B166039-E98C-404A-89A5-C981364B5546}.Debug|x86.ActiveCfg = Debug|Any CPU
{1B166039-E98C-404A-89A5-C981364B5546}.Debug|x86.Build.0 = Debug|Any CPU
{1B166039-E98C-404A-89A5-C981364B5546}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1B166039-E98C-404A-89A5-C981364B5546}.Release|Any CPU.Build.0 = Release|Any CPU
{1B166039-E98C-404A-89A5-C981364B5546}.Release|x64.ActiveCfg = Release|Any CPU
{1B166039-E98C-404A-89A5-C981364B5546}.Release|x64.Build.0 = Release|Any CPU
{1B166039-E98C-404A-89A5-C981364B5546}.Release|x86.ActiveCfg = Release|Any CPU
{1B166039-E98C-404A-89A5-C981364B5546}.Release|x86.Build.0 = Release|Any CPU
{56FB1CBC-BD89-47D7-A9D5-86F02EEF480F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{56FB1CBC-BD89-47D7-A9D5-86F02EEF480F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{56FB1CBC-BD89-47D7-A9D5-86F02EEF480F}.Debug|x64.ActiveCfg = Debug|Any CPU
{56FB1CBC-BD89-47D7-A9D5-86F02EEF480F}.Debug|x64.Build.0 = Debug|Any CPU
{56FB1CBC-BD89-47D7-A9D5-86F02EEF480F}.Debug|x86.ActiveCfg = Debug|Any CPU
{56FB1CBC-BD89-47D7-A9D5-86F02EEF480F}.Debug|x86.Build.0 = Debug|Any CPU
{56FB1CBC-BD89-47D7-A9D5-86F02EEF480F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{56FB1CBC-BD89-47D7-A9D5-86F02EEF480F}.Release|Any CPU.Build.0 = Release|Any CPU
{56FB1CBC-BD89-47D7-A9D5-86F02EEF480F}.Release|x64.ActiveCfg = Release|Any CPU
{56FB1CBC-BD89-47D7-A9D5-86F02EEF480F}.Release|x64.Build.0 = Release|Any CPU
{56FB1CBC-BD89-47D7-A9D5-86F02EEF480F}.Release|x86.ActiveCfg = Release|Any CPU
{56FB1CBC-BD89-47D7-A9D5-86F02EEF480F}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -1,84 +1,85 @@
namespace PortProxyGUI;
partial class About
namespace PortProxyGUI
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
partial class About
{
if (disposing && (components != null))
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
components.Dispose();
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
base.Dispose(disposing);
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(About));
this.linkLabel1 = new System.Windows.Forms.LinkLabel();
this.label1 = new System.Windows.Forms.Label();
this.label_version = new System.Windows.Forms.Label();
this.label_Star = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// linkLabel1
//
resources.ApplyResources(this.linkLabel1, "linkLabel1");
this.linkLabel1.Name = "linkLabel1";
this.linkLabel1.TabStop = true;
this.linkLabel1.Click += new System.EventHandler(this.linkLabel1_Click);
//
// label1
//
resources.ApplyResources(this.label1, "label1");
this.label1.Name = "label1";
//
// label_version
//
resources.ApplyResources(this.label_version, "label_version");
this.label_version.Name = "label_version";
//
// label_Star
//
resources.ApplyResources(this.label_Star, "label_Star");
this.label_Star.Name = "label_Star";
//
// About
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.label_Star);
this.Controls.Add(this.label_version);
this.Controls.Add(this.label1);
this.Controls.Add(this.linkLabel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "About";
this.TopMost = true;
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.About_FormClosing);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.LinkLabel linkLabel1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label_version;
private System.Windows.Forms.Label label_Star;
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(About));
this.linkLabel1 = new System.Windows.Forms.LinkLabel();
this.label1 = new System.Windows.Forms.Label();
this.label_version = new System.Windows.Forms.Label();
this.label_Star = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// linkLabel1
//
resources.ApplyResources(this.linkLabel1, "linkLabel1");
this.linkLabel1.Name = "linkLabel1";
this.linkLabel1.TabStop = true;
this.linkLabel1.Click += new System.EventHandler(this.linkLabel1_Click);
//
// label1
//
resources.ApplyResources(this.label1, "label1");
this.label1.Name = "label1";
//
// label_version
//
resources.ApplyResources(this.label_version, "label_version");
this.label_version.Name = "label_version";
//
// label_Star
//
resources.ApplyResources(this.label_Star, "label_Star");
this.label_Star.Name = "label_Star";
//
// About
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.label_Star);
this.Controls.Add(this.label_version);
this.Controls.Add(this.label1);
this.Controls.Add(this.linkLabel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "About";
this.TopMost = true;
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.About_FormClosing);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.LinkLabel linkLabel1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label_version;
private System.Windows.Forms.Label label_Star;
}

View File

@ -2,30 +2,30 @@
using System.Diagnostics;
using System.Windows.Forms;
namespace PortProxyGUI;
public partial class About : Form
namespace PortProxyGUI
{
public readonly PortProxyGUI PortProxyGUI;
public About(PortProxyGUI portProxyGUI)
public partial class About : Form
{
PortProxyGUI = portProxyGUI;
public readonly PortProxyGUI PortProxyGUI;
InitializeComponent();
label_version.Text = label_version.Text + " v" + Application.ProductVersion;
}
private void linkLabel1_Click(object sender, EventArgs e)
{
if (sender is LinkLabel _sender)
public About(PortProxyGUI portProxyGUI)
{
Process.Start("explorer", _sender.Text);
PortProxyGUI = portProxyGUI;
InitializeComponent();
label_version.Text = label_version.Text + " v" + Application.ProductVersion;
}
private void linkLabel1_Click(object sender, EventArgs e)
{
if (sender is LinkLabel _sender)
{
Process.Start("explorer", _sender.Text);
}
}
private void About_FormClosing(object sender, FormClosingEventArgs e)
{
PortProxyGUI.AboutForm = null;
}
}
private void About_FormClosing(object sender, FormClosingEventArgs e)
{
PortProxyGUI.AboutForm = null;
}
}

View File

@ -112,22 +112,19 @@
<value>2.0</value>
</resheader>
<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 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>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="linkLabel1.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="linkLabel1.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 101</value>
</data>
<data name="linkLabel1.Size" type="System.Drawing.Size, System.Drawing">
<value>320, 25</value>
</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="linkLabel1.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
@ -141,7 +138,7 @@
<value>linkLabel1</value>
</data>
<data name="&gt;&gt;linkLabel1.Type" xml:space="preserve">
<value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;linkLabel1.Parent" xml:space="preserve">
<value>$this</value>
@ -149,9 +146,6 @@
<data name="&gt;&gt;linkLabel1.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="label1.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="label1.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 31</value>
</data>
@ -162,8 +156,8 @@
<value>1</value>
</data>
<data name="label1.Text" xml:space="preserve">
<value>It's open source software,
and you don't have to pay anything.</value>
<value>This is a free software.
You can browse the source code on GitHub.</value>
</data>
<data name="label1.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleCenter</value>
@ -172,7 +166,7 @@ and you don't have to pay anything.</value>
<value>label1</value>
</data>
<data name="&gt;&gt;label1.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label1.Parent" xml:space="preserve">
<value>$this</value>
@ -180,9 +174,6 @@ and you don't have to pay anything.</value>
<data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="label_version.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="label_version.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 6</value>
</data>
@ -202,7 +193,7 @@ and you don't have to pay anything.</value>
<value>label_version</value>
</data>
<data name="&gt;&gt;label_version.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label_version.Parent" xml:space="preserve">
<value>$this</value>
@ -210,9 +201,6 @@ and you don't have to pay anything.</value>
<data name="&gt;&gt;label_version.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="label_Star.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="label_Star.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 78</value>
</data>
@ -223,7 +211,7 @@ and you don't have to pay anything.</value>
<value>2</value>
</data>
<data name="label_Star.Text" xml:space="preserve">
<value>Get software updates from GitHub, or star me:</value>
<value>Star me at:</value>
</data>
<data name="label_Star.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleCenter</value>
@ -232,7 +220,7 @@ and you don't have to pay anything.</value>
<value>label_Star</value>
</data>
<data name="&gt;&gt;label_Star.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label_Star.Parent" xml:space="preserve">
<value>$this</value>
@ -240,7 +228,7 @@ and you don't have to pay anything.</value>
<data name="&gt;&gt;label_Star.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
@ -2407,7 +2395,7 @@ and you don't have to pay anything.</value>
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
</value>
</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="$this.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
@ -2421,6 +2409,6 @@ and you don't have to pay anything.</value>
<value>About</value>
</data>
<data name="&gt;&gt;$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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@ -112,22 +112,19 @@
<value>2.0</value>
</resheader>
<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 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>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="linkLabel1.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="linkLabel1.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 101</value>
</data>
<data name="linkLabel1.Size" type="System.Drawing.Size, System.Drawing">
<value>320, 25</value>
</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="linkLabel1.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
@ -141,7 +138,7 @@
<value>linkLabel1</value>
</data>
<data name="&gt;&gt;linkLabel1.Type" xml:space="preserve">
<value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;linkLabel1.Parent" xml:space="preserve">
<value>$this</value>
@ -149,9 +146,6 @@
<data name="&gt;&gt;linkLabel1.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="label1.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="label1.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 31</value>
</data>
@ -162,8 +156,8 @@
<value>1</value>
</data>
<data name="label1.Text" xml:space="preserve">
<value>这是款开源软件,
并且您无需为此支付任何费用。</value>
<value>这是款免费软件,
您可以在 GitHub 上浏览项目源代码。</value>
</data>
<data name="label1.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleCenter</value>
@ -172,7 +166,7 @@
<value>label1</value>
</data>
<data name="&gt;&gt;label1.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label1.Parent" xml:space="preserve">
<value>$this</value>
@ -180,9 +174,6 @@
<data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="label_version.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="label_version.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 6</value>
</data>
@ -202,7 +193,7 @@
<value>label_version</value>
</data>
<data name="&gt;&gt;label_version.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label_version.Parent" xml:space="preserve">
<value>$this</value>
@ -210,9 +201,6 @@
<data name="&gt;&gt;label_version.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="label_Star.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="label_Star.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 78</value>
</data>
@ -223,7 +211,7 @@
<value>2</value>
</data>
<data name="label_Star.Text" xml:space="preserve">
<value>从 GitHub 获取软件更新,或给予星星鼓励</value>
<value>为我点星</value>
</data>
<data name="label_Star.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleCenter</value>
@ -232,7 +220,7 @@
<value>label_Star</value>
</data>
<data name="&gt;&gt;label_Star.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label_Star.Parent" xml:space="preserve">
<value>$this</value>
@ -2407,7 +2395,7 @@
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
</value>
</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="$this.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
@ -2415,12 +2403,12 @@
<value>CenterScreen</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>About</value>
<value>关于</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>About</value>
</data>
<data name="&gt;&gt;$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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@ -1,52 +0,0 @@
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 = [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 = [];
#endif
}
}
}
}

View File

@ -1,112 +0,0 @@
using NStandard;
using SQLib.Sqlite;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace PortProxyGUI.Data;
public class ApplicationDbScope : SqliteScope<ApplicationDbScope>
{
public static readonly string AppDbDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "PortProxyGUI");
public static readonly string AppDbFile = Path.Combine(AppDbDirectory, "config.db");
public static ApplicationDbScope FromFile(string file)
{
var dir = Path.GetDirectoryName(file);
if (!Directory.Exists(dir)) Directory.CreateDirectory(dir);
if (!File.Exists(file))
{
#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 override void Initialize()
{
}
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 Rule GetRule(string type, string listenOn, int listenPort)
{
return SqlQuery<Rule>($"SELECT * FROM Rules WHERE Type={type} AND ListenOn={listenOn} AND ListenPort={listenPort} LIMIT 1;").FirstOrDefault();
}
public void Add<T>(T obj) where T : class
{
var newid = Guid.NewGuid().ToString();
if (obj is Rule rule)
{
Sql($"INSERT INTO Rules (Id, Type, ListenOn, ListenPort, ConnectTo, ConnectPort, Comment, `Group`) VALUES ({newid}, {rule.Type}, {rule.ListenOn}, {rule.ListenPort}, {rule.ConnectTo}, {rule.ConnectPort}, {rule.Comment ?? ""}, {rule.Group ?? ""});");
rule.Id = newid;
}
else throw new NotSupportedException($"Adding {obj.GetType().FullName} is not supported.");
}
public void AddRange<T>(IEnumerable<T> objs) where T : class
{
foreach (var obj in objs) Add(obj);
}
public void Update<T>(T obj) where T : class
{
if (obj is Rule rule)
{
Sql($"UPDATE Rules SET Type={rule.Type}, ListenOn={rule.ListenOn}, ListenPort={rule.ListenPort}, ConnectTo={rule.ConnectTo}, ConnectPort={rule.ConnectPort} WHERE Id={rule.Id};");
}
else throw new NotSupportedException($"Updating {obj.GetType().FullName} is not supported.");
}
public void UpdateRange<T>(IEnumerable<T> objs) where T : class
{
foreach (var obj in objs) Update(obj);
}
public void Remove<T>(T obj) where T : class
{
if (obj is Rule rule)
{
Sql($"DELETE FROM Rules WHERE Id={rule.Id};");
}
else throw new NotSupportedException($"Removing {obj.GetType().FullName} is not supported.");
}
public void RemoveRange<T>(IEnumerable<T> objs) where T : class
{
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';");
}
}

View File

@ -1,8 +0,0 @@
namespace PortProxyGUI.Data;
public class Config
{
public string Item { get; set; }
public string Key { get; set; }
public string Value { get; set; }
}

View File

@ -1,7 +0,0 @@
namespace PortProxyGUI.Data;
public class Migration
{
public string MigrationId { get; set; }
public string ProductVersion { get; set; }
}

View File

@ -1,7 +0,0 @@
namespace PortProxyGUI.Data;
public struct MigrationKey
{
public string MigrationId { get; set; }
public string ProductVersion { get; set; }
}

View File

@ -1,126 +0,0 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;
namespace PortProxyGUI.Data;
public class MigrationUtil
{
public ApplicationDbScope DbScope { get; private set; }
public MigrationUtil(ApplicationDbScope context)
{
DbScope = context;
EnsureHistoryTable();
EnsureUpdateVersion();
}
public void EnsureHistoryTable()
{
if (!DbScope.SqlQuery($"SELECT * FROM sqlite_master WHERE type = 'table' AND name = '__history';").Any())
{
DbScope.UnsafeSql(@"CREATE TABLE __history ( MigrationId text PRIMARY KEY, ProductVersion text);");
DbScope.UnsafeSql($"INSERT INTO __history (MigrationId, ProductVersion) VALUES ('000000000000', '0.0');");
}
}
public void EnsureUpdateVersion()
{
var migration = DbScope.GetLastMigration();
var assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version;
if (new Version(migration.ProductVersion) > assemblyVersion)
{
if (MessageBox.Show(@"The current software version cannot use the configuration.
You need to use a newer version of PortProxyGUI.
Would you like to download it now?", "Upgrade", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
{
Process.Start("explorer.exe", "https://github.com/zmjack/PortProxyGUI/releases");
}
Environment.Exit(0);
}
}
public void MigrateToLast()
{
var migration = DbScope.GetLastMigration();
var migrationId = migration.MigrationId;
var pendingMigrations = migrationId != "000000000000"
? History.SkipWhile(pair => pair.Key.MigrationId != migrationId).Skip(1)
: History;
foreach (var pendingMigration in pendingMigrations)
{
foreach (var sql in pendingMigration.Value)
{
DbScope.UnsafeSql(sql);
}
DbScope.Sql($"INSERT INTO __history (MigrationId, ProductVersion) VALUES ({pendingMigration.Key.MigrationId}, {pendingMigration.Key.ProductVersion});");
}
}
public Dictionary<MigrationKey, string[]> History = new Dictionary<MigrationKey, string[]>
{
[new MigrationKey { MigrationId = "202103021542", ProductVersion = "1.1.0" }] =
[
@"CREATE TABLE rules
(
Id text PRIMARY KEY,
Type text,
ListenOn text,
ListenPort integer,
ConnectTo text,
ConnectPort integer
);",
"CREATE UNIQUE INDEX IX_Rules_Type_ListenOn_ListenPort ON Rules(Type, ListenOn, ListenPort);",
],
[new MigrationKey { MigrationId = "202201172103", ProductVersion = "1.2.0" }] =
[
"ALTER TABLE rules ADD Note text;",
"ALTER TABLE rules ADD `Group` text;",
],
[new MigrationKey { MigrationId = "202202221635", ProductVersion = "1.3.0" }] =
[
"ALTER TABLE rules RENAME TO rulesOld;",
"DROP INDEX IX_Rules_Type_ListenOn_ListenPort;",
@"CREATE TABLE rules (
Id text PRIMARY KEY,
Type text,
ListenOn text,
ListenPort integer,
ConnectTo text,
ConnectPort integer,
Comment text,
`Group` text
);",
"CREATE UNIQUE INDEX IX_Rules_Type_ListenOn_ListenPort ON Rules ( Type, ListenOn, ListenPort );",
"INSERT INTO rules SELECT Id, Type, ListenOn, ListenPort, ConnectTo, ConnectPort, Note, `Group` FROM rulesOld;",
"DROP TABLE rulesOld;",
],
[new MigrationKey { MigrationId = "202303092024", ProductVersion = "1.4.0" }] =
[
@"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]' );",
],
};
}

View File

@ -1,73 +0,0 @@
using System;
namespace PortProxyGUI.Data;
public class Rule : IEquatable<Rule>
{
public string Id { get; set; }
public string Type { get; set; }
public string ListenOn { get; set; }
public int ListenPort { get; set; }
public string ConnectTo { get; set; }
public int ConnectPort { get; set; }
public string Comment { get; set; }
public string Group { get; set; }
public bool Valid => ListenPort > 0 && ConnectPort > 0;
private string _realListenPort;
/// <summary>
/// Not mapped
/// </summary>
public string RealListenPort
{
get => ListenPort > 0 ? ListenPort.ToString() : _realListenPort;
set => _realListenPort = value;
}
private string _realConnectPort;
/// <summary>
/// Not mapped
/// </summary>
public string RealConnectPort
{
get => ConnectPort > 0 ? ConnectPort.ToString() : _realConnectPort;
set => _realConnectPort = value;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public bool Equals(Rule other)
{
return Id == other.Id
&& Type == other.Type
&& ListenOn == other.ListenOn
&& ListenPort == other.ListenPort
&& ConnectTo == other.ConnectTo
&& ConnectPort == other.ConnectPort
&& Comment == other.Comment
&& Group == other.Group;
}
public bool EqualsWithKeys(Rule other)
{
return Type == other.Type
&& ListenOn == other.ListenOn
&& ListenPort == other.ListenPort;
}
public static int ParsePort(string portString)
{
if (int.TryParse(portString, out var port) && 0 < port && port < 65536) return port;
else throw new NotSupportedException($"Invalid port string. ({portString})");
}
public override bool Equals(object obj)
{
return Equals(obj as Rule);
}
}

View File

@ -1,12 +0,0 @@
using System;
namespace PortProxyGUI.Native;
[Flags]
internal enum GenericRights : uint
{
GENERIC_READ = 0x80000000,
GENERIC_WRITE = 0x40000000,
GENERIC_EXECUTE = 0x20000000,
GENERIC_ALL = 0x10000000,
}

View File

@ -1,32 +0,0 @@
using System;
using System.Runtime.InteropServices;
namespace PortProxyGUI.Native;
internal class NativeMethods
{
[DllImport("advapi32.dll", EntryPoint = "OpenSCManagerW", ExactSpelling = true, CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern IntPtr OpenSCManager(string machineName, string databaseName, uint dwAccess);
[DllImport("advapi32.dll", EntryPoint = "OpenServiceW", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern IntPtr OpenService(IntPtr hSCManager, string lpServiceName, ServiceRights dwDesiredAccess);
[DllImport("advapi32.dll", EntryPoint = "QueryServiceStatus", CharSet = CharSet.Auto)]
internal static extern bool QueryServiceStatus(IntPtr hService, ref ServiceStatus dwServiceStatus);
[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool ControlService(IntPtr hService, ServiceControls dwControl, ref ServiceStatus lpServiceStatus);
[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool CloseServiceHandle(IntPtr hSCObject);
[DllImport("dnsapi.dll", EntryPoint = "DnsFlushResolverCache")]
internal static extern uint DnsFlushResolverCache();
[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool StartService(IntPtr hService, int dwNumServiceArgs, string[] lpServiceArgVectors);
}

View File

@ -1,20 +0,0 @@
namespace PortProxyGUI.Native;
internal enum ScmRights : uint
{
SC_MANAGER_CONNECT = 0x0001,
SC_MANAGER_CREATE_SERVICE = 0x0002,
SC_MANAGER_ENUMERATE_SERVICE = 0x0004,
SC_MANAGER_LOCK = 0x0008,
SC_MANAGER_QUERY_LOCK_STATUS = 0x0010,
SC_MANAGER_MODIFY_BOOT_CONFIG = 0x0020,
SC_MANAGER_ALL_ACCESS =
StandardRights.STANDARD_RIGHTS_REQUIRED
| SC_MANAGER_CONNECT
| SC_MANAGER_CREATE_SERVICE
| SC_MANAGER_ENUMERATE_SERVICE
| SC_MANAGER_LOCK
| SC_MANAGER_QUERY_LOCK_STATUS
| SC_MANAGER_MODIFY_BOOT_CONFIG
}

View File

@ -1,9 +0,0 @@
using System;
namespace PortProxyGUI.Native;
[Flags]
internal enum ServiceControls : uint
{
SERVICE_CONTROL_PARAMCHANGE = 0x00000006,
}

View File

@ -1,28 +0,0 @@
using System;
namespace PortProxyGUI.Native;
[Flags]
internal enum ServiceRights : uint
{
SERVICE_QUERY_CONFIG = 0x0001,
SERVICE_CHANGE_CONFIG = 0x0002,
SERVICE_QUERY_STATUS = 0x0004,
SERVICE_ENUMERATE_DEPENDENTS = 0x0008,
SERVICE_START = 0x0010,
SERVICE_STOP = 0x0020,
SERVICE_PAUSE_CONTINUE = 0x0040,
SERVICE_INTERROGATE = 0x0080,
SERVICE_USER_DEFINED_CONTROL = 0x0100,
SERVICE_ALL_ACCESS =
SERVICE_QUERY_CONFIG
| SERVICE_CHANGE_CONFIG
| SERVICE_QUERY_STATUS
| SERVICE_ENUMERATE_DEPENDENTS
| SERVICE_START
| SERVICE_STOP
| SERVICE_PAUSE_CONTINUE
| SERVICE_INTERROGATE
| SERVICE_USER_DEFINED_CONTROL
}

View File

@ -1,12 +0,0 @@
namespace PortProxyGUI.Native;
internal enum ServiceState : int
{
SERVICE_STOPPED = 0x00000001,
SERVICE_START_PENDING = 0x00000002,
SERVICE_STOP_PENDING = 0x00000003,
SERVICE_RUNNING = 0x00000004,
SERVICE_CONTINUE_PENDING = 0x00000005,
SERVICE_PAUSE_PENDING = 0x00000006,
SERVICE_PAUSED = 0x00000007,
}

View File

@ -1,15 +0,0 @@
using System.Runtime.InteropServices;
namespace PortProxyGUI.Native;
[StructLayout(LayoutKind.Sequential)]
internal struct ServiceStatus
{
public uint dwServiceType;
public ServiceState dwCurrentState;
public uint dwControlsAccepted;
public uint dwWin32ExitCode;
public uint dwServiceSpecificExitCode;
public uint dwCheckPoint;
public uint dwWaitHint;
}

View File

@ -1,6 +0,0 @@
namespace PortProxyGUI.Native;
internal enum StandardRights : uint
{
STANDARD_RIGHTS_REQUIRED = 0x000F0000,
}

View File

@ -1,300 +1,211 @@
namespace PortProxyGUI;
partial class PortProxyGUI
namespace PortProxyGUI
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
partial class PortProxyGUI
{
if (disposing && (components != null))
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
components.Dispose();
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
base.Dispose(disposing);
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PortProxyGUI));
this.listViewProxies = new System.Windows.Forms.ListView();
this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
this.toolStripMenuItem_Enable = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem_Disable = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripMenuItem_New = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem_Modify = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem_Delete = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripMenuItem_Refresh = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripMenuItem_About = new System.Windows.Forms.ToolStripMenuItem();
this.imageListProxies = new System.Windows.Forms.ImageList(this.components);
this.contextMenuStrip1.SuspendLayout();
this.SuspendLayout();
//
// listViewProxies
//
this.listViewProxies.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.listViewProxies.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeader1,
this.columnHeader2,
this.columnHeader3,
this.columnHeader4,
this.columnHeader5,
this.columnHeader6});
this.listViewProxies.ContextMenuStrip = this.contextMenuStrip1;
resources.ApplyResources(this.listViewProxies, "listViewProxies");
this.listViewProxies.FullRowSelect = true;
this.listViewProxies.HideSelection = false;
this.listViewProxies.Name = "listViewProxies";
this.listViewProxies.SmallImageList = this.imageListProxies;
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.MouseUp += new System.Windows.Forms.MouseEventHandler(this.listView1_MouseUp);
//
// columnHeader1
//
resources.ApplyResources(this.columnHeader1, "columnHeader1");
//
// columnHeader2
//
resources.ApplyResources(this.columnHeader2, "columnHeader2");
//
// columnHeader3
//
resources.ApplyResources(this.columnHeader3, "columnHeader3");
//
// columnHeader4
//
resources.ApplyResources(this.columnHeader4, "columnHeader4");
//
// columnHeader5
//
resources.ApplyResources(this.columnHeader5, "columnHeader5");
//
// columnHeader6
//
resources.ApplyResources(this.columnHeader6, "columnHeader6");
//
// contextMenuStrip1
//
this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripMenuItem_Enable,
this.toolStripMenuItem_Disable,
this.toolStripSeparator3,
this.toolStripMenuItem_Refresh,
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
//
this.toolStripMenuItem_Enable.Name = "toolStripMenuItem_Enable";
resources.ApplyResources(this.toolStripMenuItem_Enable, "toolStripMenuItem_Enable");
//
// toolStripMenuItem_Disable
//
this.toolStripMenuItem_Disable.Name = "toolStripMenuItem_Disable";
resources.ApplyResources(this.toolStripMenuItem_Disable, "toolStripMenuItem_Disable");
//
// toolStripSeparator3
//
this.toolStripSeparator3.Name = "toolStripSeparator3";
resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3");
//
// toolStripMenuItem_New
//
this.toolStripMenuItem_New.Name = "toolStripMenuItem_New";
resources.ApplyResources(this.toolStripMenuItem_New, "toolStripMenuItem_New");
//
// toolStripMenuItem_Modify
//
this.toolStripMenuItem_Modify.Name = "toolStripMenuItem_Modify";
resources.ApplyResources(this.toolStripMenuItem_Modify, "toolStripMenuItem_Modify");
//
// toolStripMenuItem_Delete
//
this.toolStripMenuItem_Delete.Name = "toolStripMenuItem_Delete";
resources.ApplyResources(this.toolStripMenuItem_Delete, "toolStripMenuItem_Delete");
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1");
//
// toolStripMenuItem_Refresh
//
this.toolStripMenuItem_Refresh.Name = "toolStripMenuItem_Refresh";
resources.ApplyResources(this.toolStripMenuItem_Refresh, "toolStripMenuItem_Refresh");
//
// toolStripSeparator2
//
this.toolStripSeparator2.Name = "toolStripSeparator2";
resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2");
//
// toolStripMenuItem_About
//
this.toolStripMenuItem_About.Name = "toolStripMenuItem_About";
resources.ApplyResources(this.toolStripMenuItem_About, "toolStripMenuItem_About");
//
// imageListProxies
//
this.imageListProxies.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListProxies.ImageStream")));
this.imageListProxies.TransparentColor = System.Drawing.Color.Transparent;
this.imageListProxies.Images.SetKeyName(0, "disable.png");
this.imageListProxies.Images.SetKeyName(1, "enable.png");
//
// PortProxyGUI
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.listViewProxies);
this.Name = "PortProxyGUI";
this.Load += new System.EventHandler(this.PortProxyGUI_Load);
this.Shown += new System.EventHandler(this.PortProxyGUI_Shown);
this.contextMenuStrip1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.ListView listViewProxies;
private System.Windows.Forms.ColumnHeader columnHeader2;
private System.Windows.Forms.ColumnHeader columnHeader3;
private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_New;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Delete;
private System.Windows.Forms.ColumnHeader columnHeader4;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Refresh;
private System.Windows.Forms.ColumnHeader columnHeader5;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_About;
private System.Windows.Forms.ColumnHeader columnHeader6;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Modify;
private System.Windows.Forms.ColumnHeader columnHeader1;
private System.Windows.Forms.ImageList imageListProxies;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Enable;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Disable;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PortProxyGUI));
listViewProxies = new System.Windows.Forms.ListView();
columnHeader1 = new System.Windows.Forms.ColumnHeader();
columnHeader2 = new System.Windows.Forms.ColumnHeader();
columnHeader3 = new System.Windows.Forms.ColumnHeader();
columnHeader4 = new System.Windows.Forms.ColumnHeader();
columnHeader5 = new System.Windows.Forms.ColumnHeader();
columnHeader6 = new System.Windows.Forms.ColumnHeader();
columnHeader7 = new System.Windows.Forms.ColumnHeader();
contextMenuStrip_RightClick = new System.Windows.Forms.ContextMenuStrip(components);
toolStripMenuItem_Enable = new System.Windows.Forms.ToolStripMenuItem();
toolStripMenuItem_Disable = new System.Windows.Forms.ToolStripMenuItem();
toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
toolStripMenuItem_Refresh = new System.Windows.Forms.ToolStripMenuItem();
toolStripMenuItem_FlushDnsCache = new System.Windows.Forms.ToolStripMenuItem();
toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
toolStripMenuItem_New = new System.Windows.Forms.ToolStripMenuItem();
toolStripMenuItem_Modify = new System.Windows.Forms.ToolStripMenuItem();
toolStripMenuItem_Delete = new System.Windows.Forms.ToolStripMenuItem();
toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
toolStripMenuItem_More = new System.Windows.Forms.ToolStripMenuItem();
toolStripMenuItem_Import = new System.Windows.Forms.ToolStripMenuItem();
toolStripMenuItem_Export = new System.Windows.Forms.ToolStripMenuItem();
toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
toolStripMenuItem_ResetWindowSize = new System.Windows.Forms.ToolStripMenuItem();
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();
statusStrip_Footer = new System.Windows.Forms.StatusStrip();
toolStripStatusLabel_Status = new System.Windows.Forms.ToolStripStatusLabel();
toolStripStatusLabel_ServiceNotRunning = new System.Windows.Forms.ToolStripStatusLabel();
contextMenuStrip_RightClick.SuspendLayout();
statusStrip_Footer.SuspendLayout();
SuspendLayout();
//
// listViewProxies
//
listViewProxies.BorderStyle = System.Windows.Forms.BorderStyle.None;
listViewProxies.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { columnHeader1, columnHeader2, columnHeader3, columnHeader4, columnHeader5, columnHeader6, columnHeader7 });
listViewProxies.ContextMenuStrip = contextMenuStrip_RightClick;
resources.ApplyResources(listViewProxies, "listViewProxies");
listViewProxies.FullRowSelect = true;
listViewProxies.Name = "listViewProxies";
listViewProxies.SmallImageList = imageListProxies;
listViewProxies.UseCompatibleStateImageBehavior = false;
listViewProxies.View = System.Windows.Forms.View.Details;
listViewProxies.ColumnClick += listView1_ColumnClick;
listViewProxies.ColumnWidthChanged += listViewProxies_ColumnWidthChanged;
listViewProxies.DoubleClick += listView1_DoubleClick;
listViewProxies.KeyUp += listViewProxies_KeyUp;
listViewProxies.MouseUp += listView1_MouseUp;
//
// columnHeader1
//
resources.ApplyResources(columnHeader1, "columnHeader1");
//
// columnHeader2
//
resources.ApplyResources(columnHeader2, "columnHeader2");
//
// columnHeader3
//
resources.ApplyResources(columnHeader3, "columnHeader3");
//
// columnHeader4
//
columnHeader4.Tag = "";
resources.ApplyResources(columnHeader4, "columnHeader4");
//
// columnHeader5
//
resources.ApplyResources(columnHeader5, "columnHeader5");
//
// columnHeader6
//
columnHeader6.Tag = "";
resources.ApplyResources(columnHeader6, "columnHeader6");
//
// columnHeader7
//
resources.ApplyResources(columnHeader7, "columnHeader7");
//
// contextMenuStrip_RightClick
//
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 });
contextMenuStrip_RightClick.Name = "contextMenuStrip1";
resources.ApplyResources(contextMenuStrip_RightClick, "contextMenuStrip_RightClick");
contextMenuStrip_RightClick.MouseClick += contextMenuStrip_RightClick_MouseClick;
//
// toolStripMenuItem_Enable
//
toolStripMenuItem_Enable.Name = "toolStripMenuItem_Enable";
resources.ApplyResources(toolStripMenuItem_Enable, "toolStripMenuItem_Enable");
//
// toolStripMenuItem_Disable
//
toolStripMenuItem_Disable.Name = "toolStripMenuItem_Disable";
resources.ApplyResources(toolStripMenuItem_Disable, "toolStripMenuItem_Disable");
//
// toolStripSeparator3
//
toolStripSeparator3.Name = "toolStripSeparator3";
resources.ApplyResources(toolStripSeparator3, "toolStripSeparator3");
//
// toolStripMenuItem_Refresh
//
toolStripMenuItem_Refresh.Name = "toolStripMenuItem_Refresh";
resources.ApplyResources(toolStripMenuItem_Refresh, "toolStripMenuItem_Refresh");
//
// toolStripMenuItem_FlushDnsCache
//
toolStripMenuItem_FlushDnsCache.Name = "toolStripMenuItem_FlushDnsCache";
resources.ApplyResources(toolStripMenuItem_FlushDnsCache, "toolStripMenuItem_FlushDnsCache");
//
// toolStripSeparator2
//
toolStripSeparator2.Name = "toolStripSeparator2";
resources.ApplyResources(toolStripSeparator2, "toolStripSeparator2");
//
// toolStripMenuItem_New
//
toolStripMenuItem_New.Name = "toolStripMenuItem_New";
resources.ApplyResources(toolStripMenuItem_New, "toolStripMenuItem_New");
//
// toolStripMenuItem_Modify
//
toolStripMenuItem_Modify.Name = "toolStripMenuItem_Modify";
resources.ApplyResources(toolStripMenuItem_Modify, "toolStripMenuItem_Modify");
//
// toolStripMenuItem_Delete
//
toolStripMenuItem_Delete.Name = "toolStripMenuItem_Delete";
resources.ApplyResources(toolStripMenuItem_Delete, "toolStripMenuItem_Delete");
//
// toolStripSeparator1
//
toolStripSeparator1.Name = "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;
//
// toolStripSeparator5
//
toolStripSeparator5.Name = "toolStripSeparator5";
resources.ApplyResources(toolStripSeparator5, "toolStripSeparator5");
//
// toolStripMenuItem_ResetWindowSize
//
toolStripMenuItem_ResetWindowSize.Name = "toolStripMenuItem_ResetWindowSize";
resources.ApplyResources(toolStripMenuItem_ResetWindowSize, "toolStripMenuItem_ResetWindowSize");
toolStripMenuItem_ResetWindowSize.Click += toolStripMenuItem_ResetWindowSize_Click;
//
// toolStripSeparator4
//
toolStripSeparator4.Name = "toolStripSeparator4";
resources.ApplyResources(toolStripSeparator4, "toolStripSeparator4");
//
// toolStripMenuItem_About
//
toolStripMenuItem_About.Name = "toolStripMenuItem_About";
resources.ApplyResources(toolStripMenuItem_About, "toolStripMenuItem_About");
//
// imageListProxies
//
imageListProxies.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
imageListProxies.ImageStream = (System.Windows.Forms.ImageListStreamer)resources.GetObject("imageListProxies.ImageStream");
imageListProxies.TransparentColor = System.Drawing.Color.Transparent;
imageListProxies.Images.SetKeyName(0, "disable.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");
//
// statusStrip_Footer
//
statusStrip_Footer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { toolStripStatusLabel_Status, toolStripStatusLabel_ServiceNotRunning });
resources.ApplyResources(statusStrip_Footer, "statusStrip_Footer");
statusStrip_Footer.Name = "statusStrip_Footer";
//
// toolStripStatusLabel_Status
//
toolStripStatusLabel_Status.Name = "toolStripStatusLabel_Status";
resources.ApplyResources(toolStripStatusLabel_Status, "toolStripStatusLabel_Status");
//
// toolStripStatusLabel_ServiceNotRunning
//
toolStripStatusLabel_ServiceNotRunning.IsLink = true;
toolStripStatusLabel_ServiceNotRunning.LinkColor = System.Drawing.Color.Red;
toolStripStatusLabel_ServiceNotRunning.Name = "toolStripStatusLabel_ServiceNotRunning";
resources.ApplyResources(toolStripStatusLabel_ServiceNotRunning, "toolStripStatusLabel_ServiceNotRunning");
toolStripStatusLabel_ServiceNotRunning.Click += toolStripStatusLabel_ServiceNotRunning_Click;
//
// PortProxyGUI
//
resources.ApplyResources(this, "$this");
AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
Controls.Add(statusStrip_Footer);
Controls.Add(listViewProxies);
Name = "PortProxyGUI";
FormClosing += PortProxyGUI_FormClosing;
Load += PortProxyGUI_Load;
Shown += PortProxyGUI_Shown;
Resize += PortProxyGUI_Resize;
contextMenuStrip_RightClick.ResumeLayout(false);
statusStrip_Footer.ResumeLayout(false);
statusStrip_Footer.PerformLayout();
ResumeLayout(false);
PerformLayout();
}
#endregion
private System.Windows.Forms.ColumnHeader columnHeader2;
private System.Windows.Forms.ColumnHeader columnHeader3;
private System.Windows.Forms.ContextMenuStrip contextMenuStrip_RightClick;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_New;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Delete;
private System.Windows.Forms.ColumnHeader columnHeader4;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Refresh;
private System.Windows.Forms.ColumnHeader columnHeader5;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_About;
private System.Windows.Forms.ColumnHeader columnHeader6;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Modify;
private System.Windows.Forms.ColumnHeader columnHeader1;
private System.Windows.Forms.ImageList imageListProxies;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Enable;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_Disable;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
private System.Windows.Forms.ColumnHeader columnHeader7;
internal System.Windows.Forms.ListView listViewProxies;
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;
private System.Windows.Forms.StatusStrip statusStrip_Footer;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel_Status;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel_ServiceNotRunning;
}

View File

@ -1,408 +1,198 @@
using NStandard;
using PortProxyGUI.Data;
using PortProxyGUI.UI;
using PortProxyGUI.Utils;
using System;
using System.Data;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using static System.Windows.Forms.ListViewItem;
namespace PortProxyGUI;
public partial class PortProxyGUI : Form
namespace PortProxyGUI
{
private readonly ListViewColumnSorter lvwColumnSorter = new ListViewColumnSorter();
public SetProxy SetProxyForm;
public About AboutForm;
private AppConfig AppConfig;
public PortProxyGUI()
public partial class PortProxyGUI : Form
{
InitializeComponent();
listViewProxies.ListViewItemSorter = lvwColumnSorter;
}
public SetProxyForm SetProxyForm;
public About AboutForm;
private ListViewColumnSorter lvwColumnSorter;
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)
{
RefreshProxyList();
}
private void ResetWindowSize()
{
Size = AppConfig.MainWindowSize;
if (AppConfig.PortProxyColumnWidths.Length != listViewProxies.Columns.Count)
public PortProxyGUI()
{
Any.ReDim(ref AppConfig.PortProxyColumnWidths, listViewProxies.Columns.Count);
InitializeComponent();
lvwColumnSorter = new ListViewColumnSorter();
listViewProxies.ListViewItemSorter = lvwColumnSorter;
}
foreach (var (column, configWidth) in Any.Zip(listViewProxies.Columns.OfType<ColumnHeader>(), AppConfig.PortProxyColumnWidths))
private void PortProxyGUI_Load(object sender, EventArgs e)
{
column.Width = configWidth;
}
}
private Data.Rule ParseRule(ListViewItem item)
{
var subItems = item.SubItems.OfType<ListViewSubItem>().ToArray();
int listenPort, connectPort;
listenPort = Data.Rule.ParsePort(subItems[3].Text);
connectPort = Data.Rule.ParsePort(subItems[5].Text);
var rule = new Data.Rule
private void PortProxyGUI_Shown(object sender, EventArgs e)
{
Type = subItems[1].Text.Trim(),
ListenOn = subItems[2].Text.Trim(),
ListenPort = listenPort,
ConnectTo = subItems[4].Text.Trim(),
ConnectPort = connectPort,
Comment = subItems[6].Text.Trim(),
Group = item.Group?.Header.Trim(),
};
return rule;
}
RefreshProxyList();
}
private void EnableSelectedProxies()
{
var items = listViewProxies.SelectedItems.OfType<ListViewItem>();
foreach (var item in items)
private void EnableSelectedProxies()
{
item.ImageIndex = 1;
try
var items = listViewProxies.SelectedItems.OfType<ListViewItem>();
foreach (var item in items)
{
var rule = ParseRule(item);
Util.AddOrUpdateProxy(rule);
}
catch (NotSupportedException ex)
{
MessageBox.Show(ex.Message, "Exclamation", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
item.ImageIndex = 1;
var subItems = item.SubItems.OfType<ListViewSubItem>().ToArray();
CmdUtil.AddProxy("add", subItems[1].Text, subItems[2].Text, int.Parse(subItems[3].Text), subItems[4].Text, int.Parse(subItems[5].Text));
}
}
Util.ParamChange();
}
private void DisableSelectedProxies()
{
var items = listViewProxies.SelectedItems.OfType<ListViewItem>();
foreach (var item in items)
private void DisableSelectedProxies()
{
item.ImageIndex = 0;
try
var items = listViewProxies.SelectedItems.OfType<ListViewItem>();
foreach (var item in items)
{
var rule = ParseRule(item);
Util.DeleteProxy(rule);
}
catch (NotSupportedException ex)
{
MessageBox.Show(ex.Message, "Exclamation", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
item.ImageIndex = 0;
var subItems = item.SubItems.OfType<ListViewSubItem>().ToArray();
CmdUtil.DeleteProxy(subItems[1].Text, subItems[2].Text, int.Parse(subItems[3].Text));
}
}
Util.ParamChange();
}
private void DeleteSelectedProxies()
{
var items = listViewProxies.SelectedItems.OfType<ListViewItem>();
DisableSelectedProxies();
Program.Database.RemoveRange(items.Select(x => new Data.Rule { Id = x.Tag.ToString() }));
foreach (var item in items) listViewProxies.Items.Remove(item);
}
private void SetProxyForUpdate(SetProxy form)
{
var item = listViewProxies.SelectedItems.OfType<ListViewItem>().FirstOrDefault();
try
private void DeleteSelectedProxies()
{
var rule = ParseRule(item);
form.UseUpdateMode(item, rule);
var items = listViewProxies.SelectedItems.OfType<ListViewItem>();
DisableSelectedProxies();
Program.SqliteDbScope.RemoveRange(items.Select(x => new Data.Rule { Id = x.Tag.ToString() }));
foreach (var item in items) listViewProxies.Items.Remove(item);
}
catch (NotSupportedException ex)
private void SetProxyForUpdate(SetProxyForm form)
{
MessageBox.Show(ex.Message, "Exclamation", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
}
var item = listViewProxies.SelectedItems.OfType<ListViewItem>().FirstOrDefault();
var subItems = item.SubItems.OfType<ListViewSubItem>().ToArray();
private void InitProxyGroups(Data.Rule[] rules)
{
listViewProxies.Groups.Clear();
var groups = (
from g in rules.GroupBy(x => x.Group)
let name = g.Key
where !name.IsNullOrWhiteSpace()
orderby name
select new ListViewGroup(name)
).ToArray();
listViewProxies.Groups.AddRange(groups);
}
private void InitProxyItems(Data.Rule[] rules, Data.Rule[] proxies)
{
listViewProxies.Items.Clear();
foreach (var rule in rules)
{
var imageIndex = proxies.Any(p => p.EqualsWithKeys(rule)) ? 1 : 0;
var group = listViewProxies.Groups.OfType<ListViewGroup>().FirstOrDefault(x => x.Header == rule.Group);
var item = new ListViewItem();
UpdateListViewItem(item, rule, imageIndex);
listViewProxies.Items.Add(item);
}
}
public void UpdateListViewItem(ListViewItem item, Data.Rule rule, int imageIndex)
{
item.ImageIndex = imageIndex;
item.Tag = rule.Id;
item.SubItems.Clear();
item.SubItems.AddRange(new[]
{
new ListViewSubItem(item, rule.Type),
new ListViewSubItem(item, rule.ListenOn),
new ListViewSubItem(item, rule.ListenPort.ToString()) { Tag = "Number" },
new ListViewSubItem(item, rule.ConnectTo),
new ListViewSubItem(item, rule.ConnectPort.ToString ()) { Tag = "Number" },
new ListViewSubItem(item, rule.Comment ?? ""),
});
if (rule.Group.IsNullOrWhiteSpace()) item.Group = null;
else
{
var group = listViewProxies.Groups.OfType<ListViewGroup>().FirstOrDefault(x => x.Header == rule.Group);
if (group == null)
if (int.TryParse(subItems[3].Text, out var listenPort) && 0 < listenPort && listenPort < 65536)
{
group = new ListViewGroup(rule.Group);
listViewProxies.Groups.Add(group);
form.UseUpdateMode(item, subItems[1].Text, subItems[2].Text, listenPort, subItems[4].Text, subItems[5].Text);
}
item.Group = group;
}
}
public void RefreshProxyList()
{
var proxies = Util.GetProxies();
var rules = Program.Database.Rules.ToArray();
foreach (var proxy in proxies)
{
var matchedRule = rules.FirstOrDefault(r => r.EqualsWithKeys(proxy));
proxy.Id = matchedRule?.Id;
else MessageBox.Show("无效端口号。", "无效端口号", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
var pendingAdds = proxies.Where(x => x.Valid && x.Id == null);
var pendingUpdates =
from proxy in proxies
let exsist = rules.FirstOrDefault(r => r.Id == proxy.Id)
where exsist is not null
where proxy.Valid && proxy.Id is not null
select proxy;
Program.Database.AddRange(pendingAdds);
Program.Database.UpdateRange(pendingUpdates);
rules = Program.Database.Rules.ToArray();
InitProxyGroups(rules);
InitProxyItems(rules, proxies);
// CheckServiceStatus
toolStripStatusLabel_ServiceNotRunning.Visible = !Util.IsServiceRunning();
}
private void contextMenuStrip_RightClick_MouseClick(object sender, MouseEventArgs e)
{
if (sender is ContextMenuStrip strip)
public void RefreshProxyList()
{
var selected = strip.Items.OfType<ToolStripMenuItem>().Where(x => x.Selected).FirstOrDefault();
if (selected is null || !selected.Enabled) return;
switch (selected)
var proxies = CmdUtil.GetProxies();
var rules = Program.SqliteDbScope.Rules;
foreach (var proxy in proxies)
{
case ToolStripMenuItem item when item == toolStripMenuItem_Enable: EnableSelectedProxies(); break;
case ToolStripMenuItem item when item == toolStripMenuItem_Disable: DisableSelectedProxies(); break;
var matchedRule = rules.FirstOrDefault(r => r.EqualsWithKeys(proxy));
proxy.Id = matchedRule?.Id;
}
case ToolStripMenuItem item when item == toolStripMenuItem_New:
SetProxyForm ??= new SetProxy(this);
SetProxyForm.UseNormalMode();
SetProxyForm.ShowDialog();
break;
var pendingAdds = proxies.Where(x => x.Id == null);
var pendingUpdates = proxies.Where(x => x.Id != null && !x.Equals(rules.First(r => r.Id == x.Id)));
case ToolStripMenuItem item when item == toolStripMenuItem_Modify:
SetProxyForm ??= new SetProxy(this);
Program.SqliteDbScope.AddRange(pendingAdds);
Program.SqliteDbScope.UpdateRange(pendingUpdates);
listViewProxies.Items.Clear();
rules = Program.SqliteDbScope.Rules;
foreach (var rule in rules)
{
var imageIndex = proxies.Any(p => p.EqualsWithKeys(rule)) ? 1 : 0;
var item = new ListViewItem { ImageIndex = imageIndex, Tag = rule.Id }.Then(vitem =>
{
vitem.SubItems.AddRange(new[] { rule.Type, rule.ListenOn, rule.ListenPort.ToString(), rule.ConnectTo, rule.ConnectPort.ToString() });
});
listViewProxies.Items.Add(item);
}
}
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;
switch (selected)
{
case ToolStripMenuItem item when item == toolStripMenuItem_Enable: EnableSelectedProxies(); break;
case ToolStripMenuItem item when item == toolStripMenuItem_Disable: DisableSelectedProxies(); break;
case ToolStripMenuItem item when item == toolStripMenuItem_New:
if (SetProxyForm == null) SetProxyForm = new SetProxyForm(this);
SetProxyForm.UseNormalMode();
SetProxyForm.ShowDialog();
break;
case ToolStripMenuItem item when item == toolStripMenuItem_Modify:
if (SetProxyForm == null) SetProxyForm = new SetProxyForm(this);
SetProxyForUpdate(SetProxyForm);
SetProxyForm.ShowDialog();
break;
case ToolStripMenuItem item when item == toolStripMenuItem_Refresh:
RefreshProxyList();
break;
case ToolStripMenuItem item when item == toolStripMenuItem_Delete: DeleteSelectedProxies(); break;
case ToolStripMenuItem item when item == toolStripMenuItem_About:
if (AboutForm == null)
{
AboutForm = new About(this);
AboutForm.Show();
}
else AboutForm.Show();
break;
}
}
}
private void listView1_MouseUp(object sender, MouseEventArgs e)
{
if (sender is ListView _sender)
{
toolStripMenuItem_Enable.Enabled = e.Button == MouseButtons.Right && _sender.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_Delete.Enabled = e.Button == MouseButtons.Right && _sender.SelectedItems.OfType<ListViewItem>().Any();
toolStripMenuItem_Modify.Enabled = e.Button == MouseButtons.Right && _sender.SelectedItems.OfType<ListViewItem>().Count() == 1;
}
}
private void listView1_DoubleClick(object sender, EventArgs e)
{
if (sender is ListView _sender)
{
var selectAny = _sender.SelectedItems.OfType<ListViewItem>().Any();
if (selectAny)
{
if (SetProxyForm == null) SetProxyForm = new SetProxyForm(this);
SetProxyForUpdate(SetProxyForm);
SetProxyForm.ShowDialog();
break;
case ToolStripMenuItem item when item == toolStripMenuItem_Refresh:
RefreshProxyList();
toolStripStatusLabel_Status.Text = $"{DateTime.Now} : Refreshed.";
break;
case ToolStripMenuItem item when item == toolStripMenuItem_FlushDnsCache:
DnsUtil.FlushCache();
toolStripStatusLabel_Status.Text = $"{DateTime.Now} : DNS cache cleared.";
break;
case ToolStripMenuItem item when item == toolStripMenuItem_Delete:
DeleteSelectedProxies();
break;
case ToolStripMenuItem item when item == toolStripMenuItem_About:
if (AboutForm == null)
{
AboutForm = new About(this);
AboutForm.Show();
}
else AboutForm.Show();
break;
}
}
}
}
private void listView1_MouseUp(object sender, MouseEventArgs e)
{
if (sender is ListView listView)
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
toolStripMenuItem_Enable.Enabled = e.Button == MouseButtons.Right && listView.SelectedItems.OfType<ListViewItem>().Any(x => x.ImageIndex == 0);
toolStripMenuItem_Disable.Enabled = e.Button == MouseButtons.Right && listView.SelectedItems.OfType<ListViewItem>().Any(x => x.ImageIndex == 1);
toolStripMenuItem_Delete.Enabled = e.Button == MouseButtons.Right && listView.SelectedItems.OfType<ListViewItem>().Any();
toolStripMenuItem_Modify.Enabled = e.Button == MouseButtons.Right && listView.SelectedItems.OfType<ListViewItem>().Count() == 1;
}
}
private void listView1_DoubleClick(object sender, EventArgs e)
{
if (sender is ListView listView)
{
var selectAny = listView.SelectedItems.OfType<ListViewItem>().Any();
if (selectAny)
// Determine if clicked column is already the column that is being sorted.
if (e.Column == lvwColumnSorter.SortColumn)
{
SetProxyForm ??= new SetProxy(this);
SetProxyForUpdate(SetProxyForm);
SetProxyForm.ShowDialog();
}
}
}
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
// Determine if clicked column is already the column that is being sorted.
if (e.Column == lvwColumnSorter.SortColumn)
{
// Reverse the current sort direction for this column.
if (lvwColumnSorter.Order == SortOrder.Ascending)
{
lvwColumnSorter.Order = SortOrder.Descending;
// Reverse the current sort direction for this column.
if (lvwColumnSorter.Order == SortOrder.Ascending)
{
lvwColumnSorter.Order = SortOrder.Descending;
}
else
{
lvwColumnSorter.Order = SortOrder.Ascending;
}
}
else
{
// Set the column number that is to be sorted; default to ascending.
lvwColumnSorter.SortColumn = e.Column;
lvwColumnSorter.Order = SortOrder.Ascending;
}
}
else
{
// Set the column number that is to be sorted; default to ascending.
lvwColumnSorter.SortColumn = e.Column;
lvwColumnSorter.Order = SortOrder.Ascending;
// Perform the sort with these new sort options.
listViewProxies.Sort();
}
// Perform the sort with these new sort options.
listViewProxies.Sort();
}
private void listViewProxies_KeyUp(object sender, KeyEventArgs e)
{
if (sender is ListView)
{
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();
}
private void toolStripStatusLabel_ServiceNotRunning_Click(object sender, EventArgs e)
{
Util.StartService();
toolStripStatusLabel_ServiceNotRunning.Visible = false;
}
}

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFrameworks>net8.0-windows;net6.0-windows;net35;net451</TargetFrameworks>
<TargetFrameworks>netcoreapp3.1</TargetFrameworks>
<UseWindowsForms>true</UseWindowsForms>
<ApplicationManifest>app.manifest</ApplicationManifest>
<Authors>zmjack</Authors>
@ -14,11 +14,8 @@
<PackageTags>portproxy TCP/IP redirector</PackageTags>
<PackageLicenseFile>LICENSE.md</PackageLicenseFile>
<Copyright>Copyright © nstandard.net 2020</Copyright>
<Version>1.4.2</Version>
<Version>1.1.2</Version>
<ApplicationIcon>icon.ico</ApplicationIcon>
<ApplicationDefaultFont>Arial, 8.25pt</ApplicationDefaultFont>
<AssemblyName>PPGUI</AssemblyName>
<LangVersion>preview</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
@ -39,7 +36,52 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="SQLib.Sqlite" Version="0.11.0" />
<PackageReference Include="SQLib.Sqlite" Version="0.8.6" />
</ItemGroup>
</Project>
<ItemGroup>
<Compile Update="About.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="About.Designer.cs">
<DependentUpon>About.cs</DependentUpon>
</Compile>
<Compile Update="PortProxyGUI.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="PortProxyGUI.Designer.cs">
<DependentUpon>PortProxyGUI.cs</DependentUpon>
</Compile>
<Compile Update="SetProxyForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="SetProxyForm.Designer.cs">
<DependentUpon>SetProxyForm.cs</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="About.resx">
<DependentUpon>About.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Update="About.zh-CN.resx">
<DependentUpon>About.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Update="PortProxyGUI.resx">
<DependentUpon>PortProxyGUI.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Update="PortProxyGUI.zh-CN.resx">
<DependentUpon>PortProxyGUI.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Update="SetProxyForm.resx">
<DependentUpon>SetProxyForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Update="SetProxyForm.zh-CN.resx">
<DependentUpon>SetProxyForm.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<Import Project="..\PortProxyGUI.Shared\PortProxyGUI.Shared.projitems" Label="Shared" />
</Project>

View File

@ -154,50 +154,41 @@
<data name="columnHeader6.Width" type="System.Int32, mscorlib">
<value>100</value>
</data>
<data name="columnHeader7.Text" xml:space="preserve">
<value>Comment</value>
</data>
<data name="columnHeader7.Width" type="System.Int32, mscorlib">
<value>100</value>
</data>
<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">
<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" />
<data name="contextMenuStrip1.Size" type="System.Drawing.Size, System.Drawing">
<value>155, 176</value>
</data>
<data name="contextMenuStrip_RightClick.Size" type="System.Drawing.Size, System.Drawing">
<value>175, 226</value>
<data name="&gt;&gt;contextMenuStrip1.Name" xml:space="preserve">
<value>contextMenuStrip1</value>
</data>
<data name="&gt;&gt;contextMenuStrip_RightClick.Name" xml:space="preserve">
<value>contextMenuStrip_RightClick</value>
</data>
<data name="&gt;&gt;contextMenuStrip_RightClick.Type" xml:space="preserve">
<value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="&gt;&gt;contextMenuStrip1.Type" xml:space="preserve">
<value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<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">
<value>Fill</value>
</data>
<data name="listViewProxies.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="listViewProxies.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="listViewProxies.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
<value>3, 2, 3, 2</value>
</data>
<data name="listViewProxies.Size" type="System.Drawing.Size, System.Drawing">
<value>704, 461</value>
</data>
<data name="imageListProxies.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>239, 17</value>
<value>624, 361</value>
</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">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADc
CAAAAk1TRnQBSQFMAgEBAgEAAdABAQHYAQEBEAEAARABAAT/AQkBEAj/AUIBTQE2AQQGAAE2AQQCAAEo
CAAAAk1TRnQBSQFMAgEBAgEAAUABAAFAAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
@ -234,7 +225,7 @@
AgABugyVAboiAAH/AZQKFwGUAf8CAAH/AboKlQG6Af80AAH/CPQkAAFCAU0BPgcAAT4DAAEoAwABQAMA
ARADAAEBAQABAQUAAYAXAAP/AQAB4AEHAv8EAAGAAQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAGA
AQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAGAAQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAGA
AQEBgAEBBAABgAEAAYAFAAGAAQABgAUAAYABAQGAAQEEAAGAAQEBgAEBBAAC/wHgAQ8aAAs=
AQEBgAEBBAABgAEAAYAFAAGAAQABgAUAAYABAQGAAQEEAAGAAQEBgAEBBAAC/wHgAQ8EAAs=
</value>
</data>
<data name="listViewProxies.TabIndex" type="System.Int32, mscorlib">
@ -244,166 +235,73 @@
<value>listViewProxies</value>
</data>
<data name="&gt;&gt;listViewProxies.Type" xml:space="preserve">
<value>System.Windows.Forms.ListView, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;listViewProxies.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;listViewProxies.ZOrder" xml:space="preserve">
<value>2</value>
<value>1</value>
</data>
<data name="toolStripMenuItem_Enable.Size" type="System.Drawing.Size, System.Drawing">
<value>174, 22</value>
<value>154, 22</value>
</data>
<data name="toolStripMenuItem_Enable.Text" xml:space="preserve">
<value>Enable (&amp;E)</value>
</data>
<data name="toolStripMenuItem_Disable.Size" type="System.Drawing.Size, System.Drawing">
<value>174, 22</value>
<value>154, 22</value>
</data>
<data name="toolStripMenuItem_Disable.Text" xml:space="preserve">
<value>Disable (&amp;I)</value>
</data>
<data name="toolStripSeparator3.Size" type="System.Drawing.Size, System.Drawing">
<value>171, 6</value>
</data>
<data name="toolStripMenuItem_Refresh.Size" type="System.Drawing.Size, System.Drawing">
<value>174, 22</value>
</data>
<data name="toolStripMenuItem_Refresh.Text" xml:space="preserve">
<value>Refresh (&amp;F)</value>
</data>
<data name="toolStripMenuItem_FlushDnsCache.Size" type="System.Drawing.Size, System.Drawing">
<value>174, 22</value>
</data>
<data name="toolStripMenuItem_FlushDnsCache.Text" xml:space="preserve">
<value>Flush DNS Cache</value>
</data>
<data name="toolStripMenuItem_FlushDnsCache.ToolTipText" xml:space="preserve">
<value>Perform ipconfig /flushDNS</value>
</data>
<data name="toolStripSeparator2.Size" type="System.Drawing.Size, System.Drawing">
<value>171, 6</value>
<value>151, 6</value>
</data>
<data name="toolStripMenuItem_New.Size" type="System.Drawing.Size, System.Drawing">
<value>174, 22</value>
<value>154, 22</value>
</data>
<data name="toolStripMenuItem_New.Text" xml:space="preserve">
<value>New (&amp;N) ...</value>
</data>
<data name="toolStripMenuItem_Modify.Size" type="System.Drawing.Size, System.Drawing">
<value>174, 22</value>
<value>154, 22</value>
</data>
<data name="toolStripMenuItem_Modify.Text" xml:space="preserve">
<value>Modify (&amp;M) ...</value>
</data>
<data name="toolStripMenuItem_Delete.Size" type="System.Drawing.Size, System.Drawing">
<value>174, 22</value>
<value>154, 22</value>
</data>
<data name="toolStripMenuItem_Delete.Text" xml:space="preserve">
<value>Delete (&amp;D)</value>
</data>
<data name="toolStripSeparator1.Size" type="System.Drawing.Size, System.Drawing">
<value>171, 6</value>
<value>151, 6</value>
</data>
<data name="toolStripMenuItem_More.Size" type="System.Drawing.Size, System.Drawing">
<value>174, 22</value>
<data name="toolStripMenuItem_Refresh.Size" type="System.Drawing.Size, System.Drawing">
<value>154, 22</value>
</data>
<data name="toolStripMenuItem_More.Text" xml:space="preserve">
<value>More</value>
<data name="toolStripMenuItem_Refresh.Text" xml:space="preserve">
<value>Refresh (&amp;F)</value>
</data>
<data name="toolStripMenuItem_Import.Size" type="System.Drawing.Size, System.Drawing">
<value>159, 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>159, 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>156, 6</value>
</data>
<data name="toolStripMenuItem_ResetWindowSize.Size" type="System.Drawing.Size, System.Drawing">
<value>159, 22</value>
</data>
<data name="toolStripMenuItem_ResetWindowSize.Text" xml:space="preserve">
<value>Reset Window</value>
</data>
<data name="toolStripSeparator4.Size" type="System.Drawing.Size, System.Drawing">
<value>171, 6</value>
<data name="toolStripSeparator2.Size" type="System.Drawing.Size, System.Drawing">
<value>151, 6</value>
</data>
<data name="toolStripMenuItem_About.Size" type="System.Drawing.Size, System.Drawing">
<value>174, 22</value>
<value>154, 22</value>
</data>
<data name="toolStripMenuItem_About.Text" xml:space="preserve">
<value>About</value>
</data>
<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="statusStrip_Footer.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>755, 17</value>
</data>
<data name="statusStrip_Footer.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 439</value>
</data>
<data name="statusStrip_Footer.Size" type="System.Drawing.Size, System.Drawing">
<value>704, 22</value>
</data>
<data name="statusStrip_Footer.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="statusStrip_Footer.Text" xml:space="preserve">
<value>FooterStrip</value>
</data>
<data name="&gt;&gt;statusStrip_Footer.Name" xml:space="preserve">
<value>statusStrip_Footer</value>
</data>
<data name="&gt;&gt;statusStrip_Footer.Type" xml:space="preserve">
<value>System.Windows.Forms.StatusStrip, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;statusStrip_Footer.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;statusStrip_Footer.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="toolStripStatusLabel_Status.Size" type="System.Drawing.Size, System.Drawing">
<value>171, 17</value>
</data>
<data name="toolStripStatusLabel_Status.Text" xml:space="preserve">
<value>Welcome to Port Proxy GUI !</value>
</data>
<data name="toolStripStatusLabel_ServiceNotRunning.Size" type="System.Drawing.Size, System.Drawing">
<value>278, 17</value>
</data>
<data name="toolStripStatusLabel_ServiceNotRunning.Text" xml:space="preserve">
<value>IP Helper service is not running (Click to start)</value>
</data>
<data name="toolStripStatusLabel_ServiceNotRunning.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="$this.Localizable" type="System.Boolean, mscorlib">
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</data>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>6, 13</value>
<value>6, 12</value>
</data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>704, 461</value>
<value>624, 361</value>
</data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
@ -2564,7 +2462,7 @@
</value>
</data>
<data name="$this.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
<value>3, 2, 3, 2</value>
</data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
<value>CenterScreen</value>
@ -2576,180 +2474,108 @@
<value>columnHeader1</value>
</data>
<data name="&gt;&gt;columnHeader1.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;columnHeader2.Name" xml:space="preserve">
<value>columnHeader2</value>
</data>
<data name="&gt;&gt;columnHeader2.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;columnHeader3.Name" xml:space="preserve">
<value>columnHeader3</value>
</data>
<data name="&gt;&gt;columnHeader3.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;columnHeader4.Name" xml:space="preserve">
<value>columnHeader4</value>
</data>
<data name="&gt;&gt;columnHeader4.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;columnHeader5.Name" xml:space="preserve">
<value>columnHeader5</value>
</data>
<data name="&gt;&gt;columnHeader5.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;columnHeader6.Name" xml:space="preserve">
<value>columnHeader6</value>
</data>
<data name="&gt;&gt;columnHeader6.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;columnHeader7.Name" xml:space="preserve">
<value>columnHeader7</value>
</data>
<data name="&gt;&gt;columnHeader7.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Enable.Name" xml:space="preserve">
<value>toolStripMenuItem_Enable</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Enable.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Disable.Name" xml:space="preserve">
<value>toolStripMenuItem_Disable</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Disable.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripSeparator3.Name" xml:space="preserve">
<value>toolStripSeparator3</value>
</data>
<data name="&gt;&gt;toolStripSeparator3.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Refresh.Name" xml:space="preserve">
<value>toolStripMenuItem_Refresh</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Refresh.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_FlushDnsCache.Name" xml:space="preserve">
<value>toolStripMenuItem_FlushDnsCache</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_FlushDnsCache.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripSeparator2.Name" xml:space="preserve">
<value>toolStripSeparator2</value>
</data>
<data name="&gt;&gt;toolStripSeparator2.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, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_New.Name" xml:space="preserve">
<value>toolStripMenuItem_New</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_New.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Modify.Name" xml:space="preserve">
<value>toolStripMenuItem_Modify</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Modify.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Delete.Name" xml:space="preserve">
<value>toolStripMenuItem_Delete</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Delete.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripSeparator1.Name" xml:space="preserve">
<value>toolStripSeparator1</value>
</data>
<data name="&gt;&gt;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, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_More.Name" xml:space="preserve">
<value>toolStripMenuItem_More</value>
<data name="&gt;&gt;toolStripMenuItem_Refresh.Name" xml:space="preserve">
<value>toolStripMenuItem_Refresh</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_More.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="&gt;&gt;toolStripMenuItem_Refresh.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Import.Name" xml:space="preserve">
<value>toolStripMenuItem_Import</value>
<data name="&gt;&gt;toolStripSeparator2.Name" xml:space="preserve">
<value>toolStripSeparator2</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Import.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Export.Name" xml:space="preserve">
<value>toolStripMenuItem_Export</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Export.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripSeparator5.Name" xml:space="preserve">
<value>toolStripSeparator5</value>
</data>
<data name="&gt;&gt;toolStripSeparator5.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_ResetWindowSize.Name" xml:space="preserve">
<value>toolStripMenuItem_ResetWindowSize</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_ResetWindowSize.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripSeparator4.Name" xml:space="preserve">
<value>toolStripSeparator4</value>
</data>
<data name="&gt;&gt;toolStripSeparator4.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="&gt;&gt;toolStripSeparator2.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_About.Name" xml:space="preserve">
<value>toolStripMenuItem_About</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_About.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;imageListProxies.Name" xml:space="preserve">
<value>imageListProxies</value>
</data>
<data name="&gt;&gt;imageListProxies.Type" xml:space="preserve">
<value>System.Windows.Forms.ImageList, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;saveFileDialog_Export.Name" xml:space="preserve">
<value>saveFileDialog_Export</value>
</data>
<data name="&gt;&gt;saveFileDialog_Export.Type" xml:space="preserve">
<value>System.Windows.Forms.SaveFileDialog, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;openFileDialog_Import.Name" xml:space="preserve">
<value>openFileDialog_Import</value>
</data>
<data name="&gt;&gt;openFileDialog_Import.Type" xml:space="preserve">
<value>System.Windows.Forms.OpenFileDialog, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripStatusLabel_Status.Name" xml:space="preserve">
<value>toolStripStatusLabel_Status</value>
</data>
<data name="&gt;&gt;toolStripStatusLabel_Status.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripStatusLabel_ServiceNotRunning.Name" xml:space="preserve">
<value>toolStripStatusLabel_ServiceNotRunning</value>
</data>
<data name="&gt;&gt;toolStripStatusLabel_ServiceNotRunning.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ImageList, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>PortProxyGUI</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.Form, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@ -143,23 +143,17 @@
<value>100</value>
</data>
<data name="columnHeader5.Text" xml:space="preserve">
<value>转发地址</value>
<value>连接地址</value>
</data>
<data name="columnHeader5.Width" type="System.Int32, mscorlib">
<value>140</value>
</data>
<data name="columnHeader6.Text" xml:space="preserve">
<value>转发端口</value>
<value>连接端口</value>
</data>
<data name="columnHeader6.Width" type="System.Int32, mscorlib">
<value>100</value>
</data>
<data name="columnHeader7.Text" xml:space="preserve">
<value>备注</value>
</data>
<data name="columnHeader7.Width" type="System.Int32, mscorlib">
<value>104</value>
</data>
<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">
<value>17, 17</value>
@ -171,23 +165,20 @@
<value>contextMenuStrip1</value>
</data>
<data name="&gt;&gt;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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<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">
<value>Fill</value>
</data>
<data name="listViewProxies.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft YaHei UI, 9pt</value>
</data>
<data name="listViewProxies.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="listViewProxies.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
<value>3, 2, 3, 2</value>
</data>
<data name="listViewProxies.Size" type="System.Drawing.Size, System.Drawing">
<value>704, 421</value>
<value>624, 361</value>
</data>
<data name="imageListProxies.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>182, 17</value>
@ -197,7 +188,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADc
CAAAAk1TRnQBSQFMAgEBAgEAASABAQE4AQEBEAEAARABAAT/AQkBEAj/AUIBTQE2AQQGAAE2AQQCAAEo
CAAAAk1TRnQBSQFMAgEBAgEAAUABAAFEAQABEAEAARABAAT/AQkBEAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
@ -244,7 +235,7 @@
<value>listViewProxies</value>
</data>
<data name="&gt;&gt;listViewProxies.Type" xml:space="preserve">
<value>System.Windows.Forms.ListView, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;listViewProxies.Parent" xml:space="preserve">
<value>$this</value>
@ -267,15 +258,6 @@
<data name="toolStripSeparator3.Size" type="System.Drawing.Size, System.Drawing">
<value>151, 6</value>
</data>
<data name="toolStripMenuItem_Refresh.Size" type="System.Drawing.Size, System.Drawing">
<value>154, 22</value>
</data>
<data name="toolStripMenuItem_Refresh.Text" xml:space="preserve">
<value>刷新 (&amp;F)</value>
</data>
<data name="toolStripSeparator2.Size" type="System.Drawing.Size, System.Drawing">
<value>151, 6</value>
</data>
<data name="toolStripMenuItem_New.Size" type="System.Drawing.Size, System.Drawing">
<value>154, 22</value>
</data>
@ -297,6 +279,15 @@
<data name="toolStripSeparator1.Size" type="System.Drawing.Size, System.Drawing">
<value>151, 6</value>
</data>
<data name="toolStripMenuItem_Refresh.Size" type="System.Drawing.Size, System.Drawing">
<value>154, 22</value>
</data>
<data name="toolStripMenuItem_Refresh.Text" xml:space="preserve">
<value>刷新 (&amp;F)</value>
</data>
<data name="toolStripSeparator2.Size" type="System.Drawing.Size, System.Drawing">
<value>151, 6</value>
</data>
<data name="toolStripMenuItem_About.Size" type="System.Drawing.Size, System.Drawing">
<value>154, 22</value>
</data>
@ -310,7 +301,7 @@
<value>6, 12</value>
</data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>704, 421</value>
<value>624, 361</value>
</data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
@ -2471,7 +2462,7 @@
</value>
</data>
<data name="$this.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value>
<value>3, 2, 3, 2</value>
</data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
<value>CenterScreen</value>
@ -2483,141 +2474,108 @@
<value>columnHeader1</value>
</data>
<data name="&gt;&gt;columnHeader1.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;columnHeader2.Name" xml:space="preserve">
<value>columnHeader2</value>
</data>
<data name="&gt;&gt;columnHeader2.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;columnHeader3.Name" xml:space="preserve">
<value>columnHeader3</value>
</data>
<data name="&gt;&gt;columnHeader3.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;columnHeader4.Name" xml:space="preserve">
<value>columnHeader4</value>
</data>
<data name="&gt;&gt;columnHeader4.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;columnHeader5.Name" xml:space="preserve">
<value>columnHeader5</value>
</data>
<data name="&gt;&gt;columnHeader5.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;columnHeader6.Name" xml:space="preserve">
<value>columnHeader6</value>
</data>
<data name="&gt;&gt;columnHeader6.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;columnHeader7.Name" xml:space="preserve">
<value>columnHeader7</value>
</data>
<data name="&gt;&gt;columnHeader7.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Enable.Name" xml:space="preserve">
<value>toolStripMenuItem_Enable</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Enable.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Disable.Name" xml:space="preserve">
<value>toolStripMenuItem_Disable</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Disable.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripSeparator3.Name" xml:space="preserve">
<value>toolStripSeparator3</value>
</data>
<data name="&gt;&gt;toolStripSeparator3.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Refresh.Name" xml:space="preserve">
<value>toolStripMenuItem_Refresh</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Refresh.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripSeparator2.Name" xml:space="preserve">
<value>toolStripSeparator2</value>
</data>
<data name="&gt;&gt;toolStripSeparator2.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_New.Name" xml:space="preserve">
<value>toolStripMenuItem_New</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_New.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Modify.Name" xml:space="preserve">
<value>toolStripMenuItem_Modify</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Modify.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Delete.Name" xml:space="preserve">
<value>toolStripMenuItem_Delete</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Delete.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripSeparator1.Name" xml:space="preserve">
<value>toolStripSeparator1</value>
</data>
<data name="&gt;&gt;toolStripSeparator1.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Refresh.Name" xml:space="preserve">
<value>toolStripMenuItem_Refresh</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_Refresh.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripSeparator2.Name" xml:space="preserve">
<value>toolStripSeparator2</value>
</data>
<data name="&gt;&gt;toolStripSeparator2.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_About.Name" xml:space="preserve">
<value>toolStripMenuItem_About</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_About.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;imageListProxies.Name" xml:space="preserve">
<value>imageListProxies</value>
</data>
<data name="&gt;&gt;imageListProxies.Type" xml:space="preserve">
<value>System.Windows.Forms.ImageList, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.ImageList, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>PortProxyGUI</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</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>
<data name="statusStrip_Footer.Text" xml:space="preserve">
<value>FooterStrip</value>
</data>
<data name="toolStripStatusLabel_ServiceNotRunning.Text" xml:space="preserve">
<value>IP Helper 服务未启动(点击启动)</value>
</data>
<data name="toolStripStatusLabel_Status.Text" xml:space="preserve">
<value>欢迎使用 Port Proxy GUI </value>
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@ -1,50 +1,24 @@
using PortProxyGUI.Data;
using System;
using System.IO;
using System.Linq;
using System.Windows.Forms;
namespace PortProxyGUI;
static class Program
namespace PortProxyGUI
{
private static string GetPath(params string[] pathes)
static class Program
{
if (!pathes.Any()) return string.Empty;
public static readonly ApplicationDbScope SqliteDbScope = ApplicationDbScope.UseDefault();
#if NET6_0_OR_GREATER || NET451_OR_GREATER
return Path.Combine(pathes);
#else
return pathes.Aggregate(Path.Combine);
#endif
}
public static ApplicationDbScope Database { get; } = ApplicationDbScope.FromFile(GetPath(
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
"PortProxyGUI",
"config.db"
));
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
#if NET6_0_OR_GREATER
ApplicationConfiguration.Initialize();
#elif NETCOREAPP3_1_OR_GREATER
Application.SetHighDpiMode(HighDpiMode.SystemAware);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
#else
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
#endif
Application.Run(new PortProxyGUI());
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
SqliteDbScope.Migrate();
Application.SetHighDpiMode(HighDpiMode.SystemAware);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new PortProxyGUI());
}
}
}

View File

@ -1,183 +0,0 @@
namespace PortProxyGUI;
partial class SetProxy
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SetProxy));
this.label_ListenOn = new System.Windows.Forms.Label();
this.textBox_ListenOn = new System.Windows.Forms.TextBox();
this.label_ConnectTo = new System.Windows.Forms.Label();
this.textBox_ConnectTo = new System.Windows.Forms.TextBox();
this.textBox_ConnectPort = new System.Windows.Forms.TextBox();
this.label_ConnectPort = new System.Windows.Forms.Label();
this.button_Set = new System.Windows.Forms.Button();
this.label_Type = new System.Windows.Forms.Label();
this.label_ListenPort = new System.Windows.Forms.Label();
this.textBox_ListenPort = new System.Windows.Forms.TextBox();
this.comboBox_Type = new System.Windows.Forms.ComboBox();
this.label_Comment = new System.Windows.Forms.Label();
this.textBox_Comment = new System.Windows.Forms.TextBox();
this.label_Group = new System.Windows.Forms.Label();
this.comboBox_Group = new System.Windows.Forms.ComboBox();
this.SuspendLayout();
//
// label_ListenOn
//
resources.ApplyResources(this.label_ListenOn, "label_ListenOn");
this.label_ListenOn.Name = "label_ListenOn";
//
// textBox_ListenOn
//
resources.ApplyResources(this.textBox_ListenOn, "textBox_ListenOn");
this.textBox_ListenOn.Name = "textBox_ListenOn";
//
// label_ConnectTo
//
resources.ApplyResources(this.label_ConnectTo, "label_ConnectTo");
this.label_ConnectTo.Name = "label_ConnectTo";
//
// textBox_ConnectTo
//
resources.ApplyResources(this.textBox_ConnectTo, "textBox_ConnectTo");
this.textBox_ConnectTo.Name = "textBox_ConnectTo";
//
// textBox_ConnectPort
//
resources.ApplyResources(this.textBox_ConnectPort, "textBox_ConnectPort");
this.textBox_ConnectPort.Name = "textBox_ConnectPort";
//
// label_ConnectPort
//
resources.ApplyResources(this.label_ConnectPort, "label_ConnectPort");
this.label_ConnectPort.Name = "label_ConnectPort";
//
// button_Set
//
resources.ApplyResources(this.button_Set, "button_Set");
this.button_Set.Name = "button_Set";
this.button_Set.UseVisualStyleBackColor = true;
this.button_Set.Click += new System.EventHandler(this.button_Set_Click);
//
// label_Type
//
resources.ApplyResources(this.label_Type, "label_Type");
this.label_Type.Name = "label_Type";
//
// label_ListenPort
//
resources.ApplyResources(this.label_ListenPort, "label_ListenPort");
this.label_ListenPort.Name = "label_ListenPort";
//
// textBox_ListenPort
//
resources.ApplyResources(this.textBox_ListenPort, "textBox_ListenPort");
this.textBox_ListenPort.Name = "textBox_ListenPort";
//
// comboBox_Type
//
resources.ApplyResources(this.comboBox_Type, "comboBox_Type");
this.comboBox_Type.FormattingEnabled = true;
this.comboBox_Type.Items.AddRange(new object[] {
resources.GetString("comboBox_Type.Items"),
resources.GetString("comboBox_Type.Items1"),
resources.GetString("comboBox_Type.Items2"),
resources.GetString("comboBox_Type.Items3"),
resources.GetString("comboBox_Type.Items4")});
this.comboBox_Type.Name = "comboBox_Type";
//
// label_Comment
//
resources.ApplyResources(this.label_Comment, "label_Comment");
this.label_Comment.Name = "label_Comment";
//
// textBox_Comment
//
resources.ApplyResources(this.textBox_Comment, "textBox_Comment");
this.textBox_Comment.Name = "textBox_Comment";
//
// label_Group
//
resources.ApplyResources(this.label_Group, "label_Group");
this.label_Group.Name = "label_Group";
//
// comboBox_Group
//
resources.ApplyResources(this.comboBox_Group, "comboBox_Group");
this.comboBox_Group.FormattingEnabled = true;
this.comboBox_Group.Name = "comboBox_Group";
//
// SetProxy
//
this.AcceptButton = this.button_Set;
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.comboBox_Group);
this.Controls.Add(this.label_Group);
this.Controls.Add(this.textBox_Comment);
this.Controls.Add(this.label_Comment);
this.Controls.Add(this.comboBox_Type);
this.Controls.Add(this.textBox_ListenPort);
this.Controls.Add(this.label_ListenPort);
this.Controls.Add(this.label_Type);
this.Controls.Add(this.button_Set);
this.Controls.Add(this.label_ConnectPort);
this.Controls.Add(this.textBox_ConnectPort);
this.Controls.Add(this.textBox_ConnectTo);
this.Controls.Add(this.label_ConnectTo);
this.Controls.Add(this.textBox_ListenOn);
this.Controls.Add(this.label_ListenOn);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "SetProxy";
this.TopMost = true;
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.SetProxyForm_FormClosing);
this.Load += new System.EventHandler(this.SetProxyForm_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label_ListenOn;
private System.Windows.Forms.TextBox textBox_ListenOn;
private System.Windows.Forms.Label label_ConnectTo;
private System.Windows.Forms.TextBox textBox_ConnectTo;
private System.Windows.Forms.TextBox textBox_ConnectPort;
private System.Windows.Forms.Label label_ConnectPort;
private System.Windows.Forms.Button button_Set;
private System.Windows.Forms.Label label_Type;
private System.Windows.Forms.Label label_ListenPort;
private System.Windows.Forms.TextBox textBox_ListenPort;
private System.Windows.Forms.ComboBox comboBox_Type;
private System.Windows.Forms.Label label_Comment;
private System.Windows.Forms.TextBox textBox_Comment;
private System.Windows.Forms.Label label_Group;
private System.Windows.Forms.ComboBox comboBox_Group;
}

View File

@ -1,149 +0,0 @@
using NStandard;
using PortProxyGUI.Data;
using PortProxyGUI.Utils;
using System;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace PortProxyGUI;
public partial class SetProxy : Form
{
public readonly PortProxyGUI ParentWindow;
private string AutoTypeString { get; }
private bool _updateMode;
private ListViewItem _listViewItem;
private Rule _itemRule;
public SetProxy(PortProxyGUI parent)
{
ParentWindow = parent;
InitializeComponent();
AutoTypeString = comboBox_Type.Text = comboBox_Type.Items.OfType<string>().First();
var groupNames = (
from g in parent.listViewProxies.Groups.OfType<ListViewGroup>()
let header = g.Header
where !header.IsNullOrWhiteSpace()
select header
).ToArray();
comboBox_Group.Items.AddRange(groupNames);
}
public void UseNormalMode()
{
_updateMode = false;
_listViewItem = null;
_itemRule = null;
comboBox_Type.Text = AutoTypeString;
comboBox_Group.Text = "";
textBox_ListenOn.Text = "*";
textBox_ListenPort.Text = "";
textBox_ConnectTo.Text = "";
textBox_ConnectPort.Text = "";
textBox_Comment.Text = "";
}
public void UseUpdateMode(ListViewItem item, Rule rule)
{
_updateMode = true;
_listViewItem = item;
_itemRule = rule;
comboBox_Type.Text = rule.Type;
comboBox_Group.Text = rule.Group;
textBox_ListenOn.Text = rule.ListenOn;
textBox_ListenPort.Text = rule.ListenPort.ToString();
textBox_ConnectTo.Text = rule.ConnectTo;
textBox_ConnectPort.Text = rule.ConnectPort.ToString();
textBox_Comment.Text = rule.Comment;
}
private bool IsIPv6(string ip)
{
return ip.IsMatch(new Regex(@"^[\dABCDEF]{2}(?::(?:[\dABCDEF]{2})){5}$"));
}
private string GetPassType(string listenOn, string connectTo)
{
var from = IsIPv6(listenOn) ? "v6" : "v4";
var to = IsIPv6(connectTo) ? "v6" : "v4";
return $"{from}to{to}";
}
private void button_Set_Click(object sender, EventArgs e)
{
int listenPort, connectPort;
try
{
listenPort = Rule.ParsePort(textBox_ListenPort.Text);
connectPort = Rule.ParsePort(textBox_ConnectPort.Text);
}
catch (NotSupportedException ex)
{
MessageBox.Show(ex.Message, "Invalid port", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
var rule = new Rule
{
Type = comboBox_Type.Text.Trim(),
ListenOn = textBox_ListenOn.Text.Trim(),
ListenPort = listenPort,
ConnectTo = textBox_ConnectTo.Text.Trim(),
ConnectPort = connectPort,
Comment = textBox_Comment.Text.Trim(),
Group = comboBox_Group.Text.Trim(),
};
if (rule.Type == AutoTypeString) rule.Type = GetPassType(rule.ListenOn, rule.ConnectTo);
if (!new[] { "v4tov4", "v4tov6", "v6tov4", "v6tov6" }.Contains(rule.Type))
{
MessageBox.Show($"Unknow type for ({rule.ListenOn} -> {rule.ConnectTo}).", "Exclamation", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (_updateMode)
{
var oldRule = Program.Database.GetRule(_itemRule.Type, _itemRule.ListenOn, _itemRule.ListenPort);
Util.DeleteProxy(oldRule);
Program.Database.Remove(oldRule);
Util.AddOrUpdateProxy(rule);
Program.Database.Add(rule);
ParentWindow.UpdateListViewItem(_listViewItem, rule, 1);
}
else
{
Util.AddOrUpdateProxy(rule);
Program.Database.Add(rule);
ParentWindow.RefreshProxyList();
}
Util.ParamChange();
Close();
}
private void SetProxyForm_Load(object sender, EventArgs e)
{
Top = ParentWindow.Top + (ParentWindow.Height - Height) / 2;
Left = ParentWindow.Left + (ParentWindow.Width - Width) / 2;
}
private void SetProxyForm_FormClosing(object sender, FormClosingEventArgs e)
{
ParentWindow.SetProxyForm = null;
}
}

151
PortProxyGUI/SetProxyForm.Designer.cs generated Normal file
View File

@ -0,0 +1,151 @@
namespace PortProxyGUI
{
partial class SetProxyForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SetProxyForm));
this.label1 = new System.Windows.Forms.Label();
this.textBox_listenOn = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.textBox_connectTo = new System.Windows.Forms.TextBox();
this.textBox_connectPort = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.button_submit = new System.Windows.Forms.Button();
this.label4 = new System.Windows.Forms.Label();
this.label5 = new System.Windows.Forms.Label();
this.textBox_listenPort = new System.Windows.Forms.TextBox();
this.comboBox_type = new System.Windows.Forms.ComboBox();
this.SuspendLayout();
//
// label1
//
resources.ApplyResources(this.label1, "label1");
this.label1.Name = "label1";
//
// textBox_listenOn
//
resources.ApplyResources(this.textBox_listenOn, "textBox_listenOn");
this.textBox_listenOn.Name = "textBox_listenOn";
//
// label2
//
resources.ApplyResources(this.label2, "label2");
this.label2.Name = "label2";
//
// textBox_connectTo
//
resources.ApplyResources(this.textBox_connectTo, "textBox_connectTo");
this.textBox_connectTo.Name = "textBox_connectTo";
//
// textBox_connectPort
//
resources.ApplyResources(this.textBox_connectPort, "textBox_connectPort");
this.textBox_connectPort.Name = "textBox_connectPort";
//
// label3
//
resources.ApplyResources(this.label3, "label3");
this.label3.Name = "label3";
//
// button_submit
//
resources.ApplyResources(this.button_submit, "button_submit");
this.button_submit.Name = "button_submit";
this.button_submit.UseVisualStyleBackColor = true;
this.button_submit.Click += new System.EventHandler(this.button_submit_Click);
//
// label4
//
resources.ApplyResources(this.label4, "label4");
this.label4.Name = "label4";
//
// label5
//
resources.ApplyResources(this.label5, "label5");
this.label5.Name = "label5";
//
// textBox_listenPort
//
resources.ApplyResources(this.textBox_listenPort, "textBox_listenPort");
this.textBox_listenPort.Name = "textBox_listenPort";
//
// comboBox_type
//
resources.ApplyResources(this.comboBox_type, "comboBox_type");
this.comboBox_type.FormattingEnabled = true;
this.comboBox_type.Items.AddRange(new object[] {
resources.GetString("comboBox_type.Items"),
resources.GetString("comboBox_type.Items1"),
resources.GetString("comboBox_type.Items2"),
resources.GetString("comboBox_type.Items3"),
resources.GetString("comboBox_type.Items4")});
this.comboBox_type.Name = "comboBox_type";
//
// SetProxyForm
//
this.AcceptButton = this.button_submit;
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.comboBox_type);
this.Controls.Add(this.textBox_listenPort);
this.Controls.Add(this.label5);
this.Controls.Add(this.label4);
this.Controls.Add(this.button_submit);
this.Controls.Add(this.label3);
this.Controls.Add(this.textBox_connectPort);
this.Controls.Add(this.textBox_connectTo);
this.Controls.Add(this.label2);
this.Controls.Add(this.textBox_listenOn);
this.Controls.Add(this.label1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "SetProxyForm";
this.TopMost = true;
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.SetProxyForm_FormClosing);
this.Load += new System.EventHandler(this.SetProxyForm_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox textBox_listenOn;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox textBox_connectTo;
private System.Windows.Forms.TextBox textBox_connectPort;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Button button_submit;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.TextBox textBox_listenPort;
private System.Windows.Forms.ComboBox comboBox_type;
}
}

View File

@ -0,0 +1,141 @@
using NStandard;
using System;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace PortProxyGUI
{
public partial class SetProxyForm : Form
{
public readonly PortProxyGUI ParentWindow;
private string AutoTypeString { get; }
private bool _updateMode;
private ListViewItem _updateLiveViewItem;
private string _oldType;
private string _oldListenOn;
private int _oldListenPort;
public SetProxyForm(PortProxyGUI parent)
{
ParentWindow = parent;
InitializeComponent();
AutoTypeString = comboBox_type.Text = comboBox_type.Items.OfType<string>().First();
}
public void UseNormalMode()
{
_updateMode = false;
_updateLiveViewItem = null;
_oldType = null;
_oldListenOn = null;
_oldListenPort = 0;
comboBox_type.Text = AutoTypeString;
textBox_listenOn.Text = "*";
textBox_listenPort.Text = "";
textBox_connectTo.Text = "";
textBox_connectPort.Text = "";
}
public void UseUpdateMode(ListViewItem item, string type, string listenOn, int listenPort, string connectTo, string connectPort)
{
_updateMode = true;
_updateLiveViewItem = item;
_oldType = type;
_oldListenOn = listenOn.Trim().ToLower();
_oldListenPort = listenPort;
comboBox_type.Text = type;
textBox_listenOn.Text = listenOn.ToString();
textBox_listenPort.Text = listenPort.ToString();
textBox_connectTo.Text = connectTo;
textBox_connectPort.Text = connectPort;
}
private bool IsIPv6(string ip)
{
return ip.IsMatch(new Regex(@"^[\dABCDEF]{2}(?::(?:[\dABCDEF]{2})){5}$"));
}
private string GetPassType(string listenOn, string connectTo)
{
var from = IsIPv6(listenOn) ? "v6" : "v4";
var to = IsIPv6(connectTo) ? "v6" : "v4";
return $"{from}to{to}";
}
private void button_submit_Click(object sender, EventArgs e)
{
var type = comboBox_type.Text.Trim();
var listenOn = textBox_listenOn.Text.Trim().ToLower();
var connectTo = textBox_connectTo.Text.Trim().ToLower();
var listenPort = textBox_listenPort.Text.Trim();
var connectPort = textBox_connectPort.Text.Trim();
if (!int.TryParse(listenPort, out var _listenPort) || _listenPort < 0 || _listenPort > 65535)
{
MessageBox.Show($"The listen port is invalid.", "Fail", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (!int.TryParse(connectPort, out var _connectPort) || _connectPort < 0 || _connectPort > 65535)
{
MessageBox.Show($"The connect port is invalid.", "Fail", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (type == AutoTypeString) type = GetPassType(listenOn, connectTo);
if (!new[] { "v4tov4", "v4tov6", "v6tov4", "v6tov6" }.Contains(type))
{
MessageBox.Show($"Unknow type for ({listenOn} -> {connectTo}).", "Fail", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
if (_updateMode)
{
var rule = Program.SqliteDbScope.GetRule(_oldType, _oldListenOn, _oldListenPort);
CmdUtil.DeleteProxy(_oldType, _oldListenOn, _oldListenPort);
Program.SqliteDbScope.Remove(rule);
rule.Type = type;
rule.ListenOn = listenOn;
rule.ListenPort = _listenPort;
rule.ConnectTo = connectTo;
rule.ConnectPort = _connectPort;
CmdUtil.AddProxy("add", type, listenOn, _listenPort, connectTo, _connectPort);
Program.SqliteDbScope.Add(rule);
_updateLiveViewItem.ImageIndex = 1;
var subItems = _updateLiveViewItem.SubItems;
subItems[1].Text = type;
subItems[2].Text = listenOn;
subItems[3].Text = _listenPort.ToString();
subItems[4].Text = connectTo;
subItems[5].Text = _connectPort.ToString();
}
else
{
CmdUtil.AddProxy("add", type, listenOn, _listenPort, connectTo, _connectPort);
ParentWindow.RefreshProxyList();
}
Close();
}
private void SetProxyForm_Load(object sender, EventArgs e)
{
Top = ParentWindow.Top + (ParentWindow.Height - Height) / 2;
Left = ParentWindow.Left + (ParentWindow.Width - Width) / 2;
}
private void SetProxyForm_FormClosing(object sender, FormClosingEventArgs e)
{
ParentWindow.SetProxyForm = null;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,459 @@
<?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:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="label1.Text" xml:space="preserve">
<value>监听地址</value>
</data>
<data name="&gt;&gt;label1.Name" xml:space="preserve">
<value>label1</value>
</data>
<data name="&gt;&gt;label1.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
<value>10</value>
</data>
<data name="textBox_listenOn.Text" xml:space="preserve">
<value>*</value>
</data>
<data name="&gt;&gt;textBox_listenOn.Name" xml:space="preserve">
<value>textBox_listenOn</value>
</data>
<data name="&gt;&gt;textBox_listenOn.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_listenOn.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_listenOn.ZOrder" xml:space="preserve">
<value>9</value>
</data>
<data name="label2.Text" xml:space="preserve">
<value>连接地址</value>
</data>
<data name="&gt;&gt;label2.Name" xml:space="preserve">
<value>label2</value>
</data>
<data name="&gt;&gt;label2.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label2.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label2.ZOrder" xml:space="preserve">
<value>8</value>
</data>
<data name="&gt;&gt;textBox_connectTo.Name" xml:space="preserve">
<value>textBox_connectTo</value>
</data>
<data name="&gt;&gt;textBox_connectTo.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_connectTo.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_connectTo.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="&gt;&gt;textBox_connectPort.Name" xml:space="preserve">
<value>textBox_connectPort</value>
</data>
<data name="&gt;&gt;textBox_connectPort.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_connectPort.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_connectPort.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="label3.Text" xml:space="preserve">
<value>端口</value>
</data>
<data name="&gt;&gt;label3.Name" xml:space="preserve">
<value>label3</value>
</data>
<data name="&gt;&gt;label3.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label3.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label3.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="button_submit.Text" xml:space="preserve">
<value>设置</value>
</data>
<data name="&gt;&gt;button1.Name" xml:space="preserve">
<value>button1</value>
</data>
<data name="&gt;&gt;button1.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;button1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;button1.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="label4.Text" xml:space="preserve">
<value>类型</value>
</data>
<data name="&gt;&gt;label4.Name" xml:space="preserve">
<value>label4</value>
</data>
<data name="&gt;&gt;label4.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label4.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label4.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="label5.Text" xml:space="preserve">
<value>端口</value>
</data>
<data name="&gt;&gt;label5.Name" xml:space="preserve">
<value>label5</value>
</data>
<data name="&gt;&gt;label5.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label5.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;label5.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="&gt;&gt;textBox_listenPort.Name" xml:space="preserve">
<value>textBox_listenPort</value>
</data>
<data name="&gt;&gt;textBox_listenPort.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBox_listenPort.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBox_listenPort.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="comboBox_type.Items1" xml:space="preserve">
<value>v4tov4</value>
</data>
<data name="comboBox_type.Items2" xml:space="preserve">
<value>v4tov6</value>
</data>
<data name="comboBox_type.Items3" xml:space="preserve">
<value>v6tov4</value>
</data>
<data name="comboBox_type.Items4" xml:space="preserve">
<value>v6tov6</value>
</data>
<data name="&gt;&gt;comboBox_type.Name" xml:space="preserve">
<value>comboBox_type</value>
</data>
<data name="&gt;&gt;comboBox_type.Type" xml:space="preserve">
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;comboBox_type.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;comboBox_type.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>设置映射</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>NewProxy</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>6, 12</value>
</data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>313, 95</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="$this.Localizable" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="$this.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
<value>CenterScreen</value>
</data>
<data name="button1.Location" type="System.Drawing.Point, System.Drawing">
<value>227, 62</value>
</data>
<data name="button1.Size" type="System.Drawing.Size, System.Drawing">
<value>74, 22</value>
</data>
<data name="button1.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="comboBox_type.FlatStyle" type="System.Windows.Forms.FlatStyle, System.Windows.Forms">
<value>Popup</value>
</data>
<data name="comboBox_type.Location" type="System.Drawing.Point, System.Drawing">
<value>78, 64</value>
</data>
<data name="comboBox_type.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="comboBox_type.Size" type="System.Drawing.Size, System.Drawing">
<value>126, 20</value>
</data>
<data name="comboBox_type.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="label1.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label1.Location" type="System.Drawing.Point, System.Drawing">
<value>13, 11</value>
</data>
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
<value>59, 12</value>
</data>
<data name="label1.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label2.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label2.Location" type="System.Drawing.Point, System.Drawing">
<value>13, 35</value>
</data>
<data name="label2.Size" type="System.Drawing.Size, System.Drawing">
<value>65, 12</value>
</data>
<data name="label2.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label3.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label3.Location" type="System.Drawing.Point, System.Drawing">
<value>210, 35</value>
</data>
<data name="label3.Size" type="System.Drawing.Size, System.Drawing">
<value>29, 12</value>
</data>
<data name="label3.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label4.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label4.Location" type="System.Drawing.Point, System.Drawing">
<value>14, 66</value>
</data>
<data name="label4.Size" type="System.Drawing.Size, System.Drawing">
<value>29, 12</value>
</data>
<data name="label4.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label5.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label5.Location" type="System.Drawing.Point, System.Drawing">
<value>210, 11</value>
</data>
<data name="label5.Size" type="System.Drawing.Size, System.Drawing">
<value>29, 12</value>
</data>
<data name="label5.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="textBox_connectPort.Location" type="System.Drawing.Point, System.Drawing">
<value>244, 32</value>
</data>
<data name="textBox_connectPort.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="textBox_connectPort.Size" type="System.Drawing.Size, System.Drawing">
<value>57, 21</value>
</data>
<data name="textBox_connectPort.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="textBox_connectPort.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="textBox_connectTo.Location" type="System.Drawing.Point, System.Drawing">
<value>79, 32</value>
</data>
<data name="textBox_connectTo.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="textBox_connectTo.Size" type="System.Drawing.Size, System.Drawing">
<value>125, 21</value>
</data>
<data name="textBox_connectTo.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="textBox_connectTo.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="textBox_listenOn.Location" type="System.Drawing.Point, System.Drawing">
<value>79, 8</value>
</data>
<data name="textBox_listenOn.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="textBox_listenOn.Size" type="System.Drawing.Size, System.Drawing">
<value>125, 21</value>
</data>
<data name="textBox_listenOn.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="textBox_listenOn.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="textBox_listenPort.Location" type="System.Drawing.Point, System.Drawing">
<value>244, 8</value>
</data>
<data name="textBox_listenPort.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 2, 3, 2</value>
</data>
<data name="textBox_listenPort.Size" type="System.Drawing.Size, System.Drawing">
<value>57, 21</value>
</data>
<data name="textBox_listenPort.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="textBox_listenPort.TextAlign" type="System.Windows.Forms.HorizontalAlignment, System.Windows.Forms">
<value>Center</value>
</data>
<data name="comboBox_type.Items" xml:space="preserve">
<value>(自动)</value>
</data>
</root>

View File

@ -1,110 +0,0 @@
using System.Collections;
using System.Windows.Forms;
namespace PortProxyGUI.UI;
public class ListViewColumnSorter : IComparer
{
/// <summary>
/// Specifies the column to be sorted
/// </summary>
private int ColumnToSort;
/// <summary>
/// Specifies the order in which to sort (i.e. 'Ascending').
/// </summary>
private SortOrder OrderOfSort;
/// <summary>
/// Case insensitive comparer object
/// </summary>
private CaseInsensitiveComparer ObjectCompare;
/// <summary>
/// Class constructor. Initializes various elements
/// </summary>
public ListViewColumnSorter()
{
// Initialize the column to '0'
ColumnToSort = 0;
// Initialize the sort order to 'none'
OrderOfSort = SortOrder.None;
// Initialize the CaseInsensitiveComparer object
ObjectCompare = new CaseInsensitiveComparer();
}
/// <summary>
/// This method is inherited from the IComparer interface. It compares the two objects passed using a case insensitive comparison.
/// </summary>
/// <param name="x">First object to be compared</param>
/// <param name="y">Second object to be compared</param>
/// <returns>The result of the comparison. "0" if equal, negative if 'x' is less than 'y' and positive if 'x' is greater than 'y'</returns>
public int Compare(object x, object y)
{
int compareResult;
ListViewItem listviewX, listviewY;
// Cast the objects to be compared to ListViewItem objects
listviewX = (ListViewItem)x;
listviewY = (ListViewItem)y;
// Compare the two items
if (listviewX.SubItems[ColumnToSort].Tag?.ToString() == "Number" && listviewY.SubItems[ColumnToSort].Tag?.ToString() == "Number")
{
int.TryParse(listviewX.SubItems[ColumnToSort].Text, out var xint);
int.TryParse(listviewY.SubItems[ColumnToSort].Text, out var yint);
compareResult = ObjectCompare.Compare(xint, yint);
}
else compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text);
// Calculate correct return value based on object comparison
if (OrderOfSort == SortOrder.Ascending)
{
// Ascending sort is selected, return normal result of compare operation
return compareResult;
}
else if (OrderOfSort == SortOrder.Descending)
{
// Descending sort is selected, return negative result of compare operation
return -compareResult;
}
else
{
// Return '0' to indicate they are equal
return 0;
}
}
/// <summary>
/// Gets or sets the number of the column to which to apply the sorting operation (Defaults to '0').
/// </summary>
public int SortColumn
{
set
{
ColumnToSort = value;
}
get
{
return ColumnToSort;
}
}
/// <summary>
/// Gets or sets the order of sorting to apply (for example, 'Ascending' or 'Descending').
/// </summary>
public SortOrder Order
{
set
{
OrderOfSort = value;
}
get
{
return OrderOfSort;
}
}
}

View File

@ -1,14 +0,0 @@
using PortProxyGUI.Native;
using System;
namespace PortProxyGUI.Utils;
internal class DnsUtil
{
public static void FlushCache()
{
var status = NativeMethods.DnsFlushResolverCache();
if (status == 0) throw new InvalidOperationException("Flush DNS Cache failed.");
}
}

View File

@ -1,148 +0,0 @@
using Microsoft.Win32;
using PortProxyGUI.Data;
using PortProxyGUI.Native;
using System;
using System.Collections.Generic;
using System.Linq;
namespace PortProxyGUI.Utils;
public static class Util
{
internal static readonly string ServiceName = "iphlpsvc";
internal static readonly string ServiceFriendlyName = "IP Helper";
private static InvalidOperationException InvalidPortProxyType(string type) => new($"Invalid port proxy type ({type}).");
private static readonly string[] ProxyTypes = ["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];
}
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 bool IsServiceRunning()
{
var hManager = NativeMethods.OpenSCManager(null, null, (uint)GenericRights.GENERIC_READ);
if (hManager == IntPtr.Zero) throw new InvalidOperationException("Open SC Manager failed.");
var hService = NativeMethods.OpenService(hManager, ServiceName, ServiceRights.SERVICE_QUERY_STATUS);
if (hService == IntPtr.Zero)
{
NativeMethods.CloseServiceHandle(hManager);
throw new InvalidOperationException($"Open Service ({ServiceName}) failed.");
}
var status = new ServiceStatus();
NativeMethods.QueryServiceStatus(hService, ref status);
NativeMethods.CloseServiceHandle(hService);
NativeMethods.CloseServiceHandle(hManager);
return status.dwCurrentState == ServiceState.SERVICE_RUNNING;
}
public static void StartService()
{
var hManager = NativeMethods.OpenSCManager(null, null, (uint)GenericRights.GENERIC_READ | (uint)ScmRights.SC_MANAGER_CONNECT);
if (hManager == IntPtr.Zero) throw new InvalidOperationException("Open SC Manager failed.");
var hService = NativeMethods.OpenService(hManager, ServiceName, ServiceRights.SERVICE_START);
if (hService == IntPtr.Zero)
{
NativeMethods.CloseServiceHandle(hManager);
throw new InvalidOperationException($"Open Service ({ServiceName}) failed.");
}
NativeMethods.StartService(hService, 0, null);
NativeMethods.CloseServiceHandle(hService);
NativeMethods.CloseServiceHandle(hManager);
}
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 hService = NativeMethods.OpenService(hManager, ServiceName, ServiceRights.SERVICE_PAUSE_CONTINUE);
if (hService == IntPtr.Zero)
{
NativeMethods.CloseServiceHandle(hManager);
throw new InvalidOperationException($"Open Service ({ServiceName}) failed.");
}
var status = new ServiceStatus();
NativeMethods.ControlService(hService, ServiceControls.SERVICE_CONTROL_PARAMCHANGE, ref status);
NativeMethods.CloseServiceHandle(hService);
NativeMethods.CloseServiceHandle(hManager);
}
}

View File

@ -1,21 +0,0 @@
Remove-Item -Path ".\bin\publish" -Recurse
dotnet publish -c Release -f "net8.0-windows" /p:PublishProfile="net8-x64"
dotnet publish -c Release -f "net8.0-windows" /p:PublishProfile="net8-x86"
dotnet publish -c Release -f "net6.0-windows" /p:PublishProfile="net6-x64"
dotnet publish -c Release -f "net6.0-windows" /p:PublishProfile="net6-x86"
Copy-Item -Path ".\bin\Release\net451\" ".\bin\Publish\" -Recurse -Force
Copy-Item -Path ".\bin\Release\net35\" ".\bin\Publish\" -Recurse -Force
$ver = "1.4.2"
Compress-Archive -Path ".\bin\publish\net8-x64\*" -DestinationPath ".\bin\publish\ppgui-net8-x64-$ver.zip" -Force
Compress-Archive -Path ".\bin\publish\net8-x86\*" -DestinationPath ".\bin\publish\ppgui-net8-x86-$ver.zip" -Force
Compress-Archive -Path ".\bin\publish\net6-x64\*" -DestinationPath ".\bin\publish\ppgui-net6-x64-$ver.zip" -Force
Compress-Archive -Path ".\bin\publish\net6-x86\*" -DestinationPath ".\bin\publish\ppgui-net6-x86-$ver.zip" -Force
Compress-Archive -Path ".\bin\publish\net451\*" -DestinationPath ".\bin\publish\ppgui-net451-$ver.zip" -Force
Compress-Archive -Path ".\bin\publish\net35\*" -DestinationPath ".\bin\publish\ppgui-net35-$ver.zip" -Force

View File

@ -6,64 +6,6 @@ A manager for netsh interface portproxy, which is to evaluate TCP/IP port redire
<br/>
> [!NOTE]
>
> The software does not configure the firewall.
>
> If necessary, manually configure the firewall.
<br/>
## Runtimes
### .NET
| Target framework | Link |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| ![Static Badge](https://img.shields.io/badge/.NET-8.0-8A2BE2) | [Download .NET 8.0](https://dotnet.microsoft.com/download/dotnet/8.0) |
| ![Static Badge](https://img.shields.io/badge/.NET-6.0-8A2BE2) | [Download .NET 6.0](https://dotnet.microsoft.com/download/dotnet/6.0) |
### .NET Framework
| Icon | Denote |
| ---- | ------------------------------------------------------------ |
| ✔️ | OS versions on which is **installed by default**. |
| | OS versions on which doesn't come installed but **can be installed**. |
| Target framework | Windows | Windows Server | Link |
| ------------------------------------------------------------ | -------------------------- | --------------------------------- | ------------------------------------------------------------ |
| ![Static Badge](https://img.shields.io/badge/.NET_Framework-4.5.1-blue) | ✔️ **8.1 +**<br /> Vista + | ✔️ **2012 R2 +**<br /> 2008 SP2 + | [Download](https://dotnet.microsoft.com/download/dotnet-framework/net451) |
| ![Static Badge](https://img.shields.io/badge/.NET_Framework-3.5-blue) | ✔️ **7 +**<br /> Vista | ✔️ **2008 R2 SP1 +**<br /> 2003 + | [Download](https://dotnet.microsoft.com/download/dotnet-framework/net35-sp1) |
> [!NOTE]
>
> If you're using Windows 8, Windows Server 2008 R2 SP1, or greater.
>
> we recommend [installing .NET Framework 3.5 through the control panel](https://learn.microsoft.com/dotnet/framework/install/dotnet-35-windows-10?WT.mc_id=dotnet-35129-website).
<br/>
## Upgrade
- **v1.4.2**
- Change the default font from ~~`Microsoft Sans Serif`~~ to **`Arial`**.
- This setting provides better compatibility on operating systems with fewer fonts.
- **v1.4.1**
- Add a status strip at the bottom of the window.
- Add a check of the IP Helper service status, if the service is not running, a prompt will be displayed on the bottom status bar.
- **v1.4.0**
- Command line calls have been removed to provide better performance.
- New Feature Added: **Remember Window/Column Size**.
- New Feature Added: **Flush DNS Cache**.
- New Feature Added: **Support import and export configuration database**.
- **v1.3.1 - v1.3.2**
- Fix program crash caused by wrong rules.
- **v1.3.0**
- Update display, provide comments and grouping.
- Fix the problem that the window size is not the same in different runtimes.
<br/>
## Information
The configuration file will be generated at:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 14 KiB