PortProxyGUI/PortProxyGUI - NET/PortProxyGUI.cs

185 lines
7.1 KiB
C#
Raw Normal View History

2020-05-29 03:32:44 +08:00
using PortProxyGUI._extern.NStandard;
using System;
using System.Data;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using static System.Windows.Forms.ListViewItem;
namespace PortProxyGUI
{
public partial class PortProxyGUI : Form
{
2020-12-09 21:19:58 +08:00
public SetProxyForm SetProxyForm;
2020-05-29 03:32:44 +08:00
public About AboutForm;
2020-12-09 21:19:58 +08:00
private ListViewColumnSorter lvwColumnSorter;
2020-05-29 03:32:44 +08:00
public PortProxyGUI()
{
InitializeComponent();
2020-12-09 21:19:58 +08:00
lvwColumnSorter = new ListViewColumnSorter();
listView1.ListViewItemSorter = lvwColumnSorter;
2020-05-29 03:32:44 +08:00
}
private void PortProxyGUI_Load(object sender, EventArgs e)
{
RefreshProxyList();
}
private void DeleteSelectedProxies()
{
var items = listView1.SelectedItems.OfType<ListViewItem>();
foreach (var item in items)
{
var subItems = item.SubItems.OfType<ListViewSubItem>().ToArray();
var type = subItems[0].Text;
2020-05-29 12:37:04 +08:00
var listenOn = subItems[1].Text;
2020-05-29 03:32:44 +08:00
var listenPort = subItems[2].Text;
var output = CmdRunner.Execute($"netsh interface portproxy delete {type} listenaddress={listenOn} listenport={listenPort}");
}
RefreshProxyList();
}
2020-12-09 21:19:58 +08:00
private void SetProxyForUpdate(SetProxyForm form)
{
var item = listView1.SelectedItems.OfType<ListViewItem>().FirstOrDefault();
{
var subItems = item.SubItems.OfType<ListViewSubItem>().ToArray();
var type = subItems[0].Text;
var listenOn = subItems[1].Text;
var listenPort = subItems[2].Text;
var connectTo = subItems[3].Text;
var connectPort = subItems[4].Text;
form.UseUpdateMode(type, listenOn, listenPort, connectTo, connectPort);
}
}
2020-05-29 03:32:44 +08:00
public void RefreshProxyList()
{
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 typeProxies = output
.Project(new Regex($@"{type.From}:[^\n]+?{type.To}:\r\n\r\n.+?\r\n--------------- ---------- --------------- ----------\r\n(.+?)\r\n\r\n", RegexOptions.Singleline))
?.Split(new[] { Environment.NewLine }, StringSplitOptions.None)
.Select(line =>
{
var parts = line.Resolve(new Regex(@"^([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)$"));
return new PortProxy
{
Type = type.Type,
ListenOn = parts[1].FirstOrDefault(),
ListenPort = parts[2].FirstOrDefault(),
ConnectTo = parts[3].FirstOrDefault(),
ConnectPort = parts[4].FirstOrDefault(),
};
});
return typeProxies ?? new PortProxy[0];
});
listView1.Items.Clear();
foreach (var proxy in proxies)
{
listView1.Items.Add(new ListViewItem(proxy.Type).Then(vitem =>
{
vitem.SubItems.AddRange(new[] { proxy.ListenOn, proxy.ListenPort, proxy.ConnectTo, proxy.ConnectPort });
}));
}
}
private void contextMenuStrip1_MouseClick(object sender, MouseEventArgs e)
{
if (sender is ContextMenuStrip _sender)
{
var selected = _sender.Items.OfType<ToolStripItem>().Where(x => x.Selected).FirstOrDefault();
if (selected is null || !selected.Enabled) return;
switch (selected.Text)
{
2020-12-09 21:19:58 +08:00
case string s when s == toolStripMenuItem_New.Text:
if (SetProxyForm == null) SetProxyForm = new SetProxyForm(this);
SetProxyForm.UseNormalMode();
SetProxyForm.Show();
break;
case string s when s == toolStripMenuItem_Modify.Text:
if (SetProxyForm == null) SetProxyForm = new SetProxyForm(this);
SetProxyForUpdate(SetProxyForm);
SetProxyForm.Show();
2020-05-29 03:32:44 +08:00
break;
2020-12-09 21:19:58 +08:00
case string s when s == toolStripMenuItem_Refresh.Text: RefreshProxyList(); break;
case string s when s == toolStripMenuItem_Delete.Text: DeleteSelectedProxies(); break;
2020-05-29 03:32:44 +08:00
2020-12-09 21:19:58 +08:00
case string s when s == toolStripMenuItem_About.Text:
2020-05-29 03:32:44 +08:00
if (AboutForm == null)
{
2020-05-29 12:37:04 +08:00
AboutForm = new About(this);
2020-05-29 03:32:44 +08:00
AboutForm.Show();
}
else AboutForm.Show();
break;
}
}
}
private void listView1_MouseUp(object sender, MouseEventArgs e)
{
if (sender is ListView _sender)
{
2020-12-09 21:19:58 +08:00
var selectAny = e.Button == MouseButtons.Right && _sender.SelectedItems.OfType<ListViewItem>().Any();
toolStripMenuItem_Delete.Enabled = selectAny;
toolStripMenuItem_Modify.Enabled = selectAny;
}
}
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.Show();
}
2020-05-29 03:32:44 +08:00
}
}
2020-12-09 21:19:58 +08:00
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.
listView1.Sort();
}
2020-05-29 03:32:44 +08:00
}
}