diff --git a/Forwarder/Forwarder/DBPanel.Designer.cs b/Forwarder/Forwarder/DBPanel.Designer.cs
new file mode 100644
index 0000000..5546ff2
--- /dev/null
+++ b/Forwarder/Forwarder/DBPanel.Designer.cs
@@ -0,0 +1,36 @@
+namespace Forwarder
+{
+ partial class DBPanel
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ components = new System.ComponentModel.Container();
+ }
+
+ #endregion
+ }
+}
diff --git a/Forwarder/Forwarder/DBPanel.cs b/Forwarder/Forwarder/DBPanel.cs
new file mode 100644
index 0000000..e25f0e7
--- /dev/null
+++ b/Forwarder/Forwarder/DBPanel.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Forwarder
+{
+ public partial class DBPanel : Panel
+ {
+ public DBPanel()
+ {
+ InitializeComponent();
+ DoubleBuffered = true;
+ }
+ }
+}
diff --git a/Forwarder/Forwarder/Extension.cs b/Forwarder/Forwarder/Extension.cs
index 1fcec9f..2f3b2bb 100644
--- a/Forwarder/Forwarder/Extension.cs
+++ b/Forwarder/Forwarder/Extension.cs
@@ -25,8 +25,9 @@
namespace Forwarder
{
- static class SocketExtensions
+ static class Utils
{
+ private const int MAX_DIALOG_PREVIEW = 256;
public static bool IsConnected(this Socket socket)
{
try
@@ -35,5 +36,75 @@
}
catch (SocketException) { return false; }
}
+
+ public static string FBytes(int bytes)
+ {
+ if (bytes < 1024)
+ return bytes.ToString()+"b";
+ string tail = null;
+ double b = bytes;
+ if (b > 1024)
+ {
+ tail = "Kb";
+ b /= 1024;
+ }
+ if (b > 1024)
+ {
+ tail = "Mb";
+ b /= 1024;
+ }
+ if (b > 1024)
+ {
+ tail = "Gb";
+ b /= 1024;
+ }
+ return b.ToString("#0.00") + tail;
+ }
+
+ public static string FTime(TimeSpan ts)
+ {
+ StringBuilder result = new StringBuilder();
+ if (ts.Days > 0)
+ {
+ result.Append(ts.Days);
+ result.Append("d ");
+ }
+ if (ts.Hours > 0)
+ {
+ result.Append(ts.Hours);
+ result.Append("h ");
+ }
+ if (ts.Minutes > 0)
+ {
+ result.Append(ts.Minutes);
+ result.Append("m ");
+ }
+ if (ts.Seconds > 0)
+ {
+ result.Append(ts.Seconds);
+ result.Append("s ");
+ }
+ if (ts.Milliseconds > 0 || result.Length == 0)
+ {
+ result.Append(ts.Milliseconds);
+ result.Append("ms ");
+ }
+ return result.ToString();
+ }
+
+ public static string BinToTextSample(byte[] data)
+ {
+ if (data == null || data.Length == 0)
+ return "";
+ string result = Encoding.ASCII.GetString(data, 0, Math.Min(MAX_DIALOG_PREVIEW, data.Length));
+ StringBuilder sb = new StringBuilder(result.Trim());
+ for (int i = 0; i < sb.Length; i++)
+ if (Char.IsControl(sb[i]) && sb[i] != '\n' && sb[i] != '\r')
+ sb[i] = '□';
+ result = sb.ToString();
+ if (data.Length > MAX_DIALOG_PREVIEW)
+ result += "\r\n...";
+ return result;
+ }
}
}
diff --git a/Forwarder/Forwarder/FAbout.Designer.cs b/Forwarder/Forwarder/FAbout.Designer.cs
index 140b363..804023a 100644
--- a/Forwarder/Forwarder/FAbout.Designer.cs
+++ b/Forwarder/Forwarder/FAbout.Designer.cs
@@ -35,6 +35,7 @@
this.llbAuthor = new System.Windows.Forms.LinkLabel();
this.btOk = new System.Windows.Forms.Button();
this.lbVer = new System.Windows.Forms.Label();
+ this.lbIp = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
@@ -65,7 +66,7 @@
| System.Windows.Forms.AnchorStyles.Right)));
this.lbText.Location = new System.Drawing.Point(12, 74);
this.lbText.Name = "lbText";
- this.lbText.Size = new System.Drawing.Size(270, 207);
+ this.lbText.Size = new System.Drawing.Size(270, 188);
this.lbText.TabIndex = 2;
this.lbText.Text = resources.GetString("lbText.Text");
//
@@ -88,7 +89,7 @@
| System.Windows.Forms.AnchorStyles.Right)));
this.btOk.Location = new System.Drawing.Point(288, 12);
this.btOk.Name = "btOk";
- this.btOk.Size = new System.Drawing.Size(33, 269);
+ this.btOk.Size = new System.Drawing.Size(33, 250);
this.btOk.TabIndex = 4;
this.btOk.Text = "Ok";
this.btOk.UseVisualStyleBackColor = true;
@@ -103,11 +104,23 @@
this.lbVer.TabIndex = 5;
this.lbVer.Text = "1.0";
//
+ // lbIp
+ //
+ this.lbIp.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.lbIp.AutoSize = true;
+ this.lbIp.ForeColor = System.Drawing.SystemColors.GrayText;
+ this.lbIp.Location = new System.Drawing.Point(12, 249);
+ this.lbIp.Name = "lbIp";
+ this.lbIp.Size = new System.Drawing.Size(35, 13);
+ this.lbIp.TabIndex = 6;
+ this.lbIp.Text = "label1";
+ //
// FAbout
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(330, 293);
+ this.ClientSize = new System.Drawing.Size(330, 274);
+ this.Controls.Add(this.lbIp);
this.Controls.Add(this.lbVer);
this.Controls.Add(this.btOk);
this.Controls.Add(this.llbAuthor);
@@ -133,5 +146,6 @@
private System.Windows.Forms.LinkLabel llbAuthor;
private System.Windows.Forms.Button btOk;
private System.Windows.Forms.Label lbVer;
+ private System.Windows.Forms.Label lbIp;
}
}
\ No newline at end of file
diff --git a/Forwarder/Forwarder/FAbout.cs b/Forwarder/Forwarder/FAbout.cs
index 3abae8e..167ae9b 100644
--- a/Forwarder/Forwarder/FAbout.cs
+++ b/Forwarder/Forwarder/FAbout.cs
@@ -5,6 +5,9 @@
using System.Diagnostics;
using System.Drawing;
using System.Linq;
+using System.Net;
+using System.Net.NetworkInformation;
+using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
@@ -34,6 +37,8 @@
private FAbout()
{
InitializeComponent();
+ lbVer.Text = Program.VERSION;
+ GetIp();
}
public static void Execute()
@@ -44,6 +49,28 @@
}
}
+ private void GetIp()
+ {
+ string output = "";
+ foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces())
+ if (item.NetworkInterfaceType != NetworkInterfaceType.Loopback && item.OperationalStatus == OperationalStatus.Up)
+ foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses)
+ if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
+ output += ip.Address.ToString() + "\r\n";
+ output = output.Trim();
+ if (output.Length == 0)
+
+ lbIp.Visible = false;
+ else
+ {
+ lbIp.Text = output;
+ Height += lbIp.Height;
+ lbText.Height -= lbIp.Height;
+ lbIp.Top = ClientSize.Height - (lbIp.Height + 12);
+ }
+ lbIp.Text = output;
+ }
+
private void llbAuthor_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
Process.Start("https://xwolf.es/2018/02/171/");
diff --git a/Forwarder/Forwarder/FTransmission.Designer.cs b/Forwarder/Forwarder/FTransmission.Designer.cs
new file mode 100644
index 0000000..e87a61e
--- /dev/null
+++ b/Forwarder/Forwarder/FTransmission.Designer.cs
@@ -0,0 +1,118 @@
+namespace Forwarder
+{
+ partial class FTransmission
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ this.lbInfo = new System.Windows.Forms.Label();
+ this.lbAt = new System.Windows.Forms.Label();
+ this.lbCtt = new System.Windows.Forms.Label();
+ this.pTimeline = new DBPanel();
+ this.tUpdate = new System.Windows.Forms.Timer(this.components);
+ this.SuspendLayout();
+ //
+ // lbInfo
+ //
+ this.lbInfo.AutoSize = true;
+ this.lbInfo.Location = new System.Drawing.Point(12, 9);
+ this.lbInfo.Name = "lbInfo";
+ this.lbInfo.Size = new System.Drawing.Size(112, 13);
+ this.lbInfo.TabIndex = 0;
+ this.lbInfo.Text = "Transmission between";
+ //
+ // lbAt
+ //
+ this.lbAt.AutoSize = true;
+ this.lbAt.ForeColor = System.Drawing.SystemColors.GrayText;
+ this.lbAt.Location = new System.Drawing.Point(19, 22);
+ this.lbAt.Name = "lbAt";
+ this.lbAt.Size = new System.Drawing.Size(16, 13);
+ this.lbAt.TabIndex = 1;
+ this.lbAt.Text = "at";
+ //
+ // lbCtt
+ //
+ this.lbCtt.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.lbCtt.Location = new System.Drawing.Point(12, 35);
+ this.lbCtt.Name = "lbCtt";
+ this.lbCtt.Size = new System.Drawing.Size(360, 13);
+ this.lbCtt.TabIndex = 2;
+ this.lbCtt.TextAlign = System.Drawing.ContentAlignment.TopRight;
+ //
+ // pTimeline
+ //
+ this.pTimeline.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.pTimeline.AutoScroll = true;
+ this.pTimeline.BackColor = System.Drawing.SystemColors.Window;
+ this.pTimeline.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.pTimeline.Location = new System.Drawing.Point(12, 51);
+ this.pTimeline.Name = "pTimeline";
+ this.pTimeline.Size = new System.Drawing.Size(360, 355);
+ this.pTimeline.TabIndex = 3;
+ this.pTimeline.Resize += new System.EventHandler(this.pTimeline_Resize);
+ //
+ // tUpdate
+ //
+ this.tUpdate.Interval = 1000;
+ this.tUpdate.Tick += new System.EventHandler(this.tUpdate_Tick);
+ //
+ // FTransmission
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(384, 418);
+ this.Controls.Add(this.pTimeline);
+ this.Controls.Add(this.lbCtt);
+ this.Controls.Add(this.lbAt);
+ this.Controls.Add(this.lbInfo);
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.MinimumSize = new System.Drawing.Size(300, 200);
+ this.Name = "FTransmission";
+ this.ShowIcon = false;
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "Transmission";
+ this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FTransmission_FormClosed);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label lbInfo;
+ private System.Windows.Forms.Label lbAt;
+ private System.Windows.Forms.Label lbCtt;
+ private DBPanel pTimeline;
+ private System.Windows.Forms.Timer tUpdate;
+ }
+}
\ No newline at end of file
diff --git a/Forwarder/Forwarder/FTransmission.cs b/Forwarder/Forwarder/FTransmission.cs
new file mode 100644
index 0000000..d71a163
--- /dev/null
+++ b/Forwarder/Forwarder/FTransmission.cs
@@ -0,0 +1,140 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Forwarder
+{
+ public partial class FTransmission : Form
+ {
+ private static Dictionary fmap = new Dictionary();
+ private static Font fontMonospace = new Font("Lucida Console", 7.5f);
+ private static Font fontSmall = new Font(FontFamily.GenericSansSerif, 6f);
+
+ private Transmission trans;
+
+ private FTransmission(Transmission trans)
+ {
+ InitializeComponent();
+ this.trans = trans;
+ LoadTransmission();
+ pTimeline.AutoScroll = false;
+ pTimeline.HorizontalScroll.Enabled = false;
+ pTimeline.HorizontalScroll.Visible = false;
+ pTimeline.HorizontalScroll.Maximum = 0;
+ pTimeline.AutoScroll = true;
+ }
+
+ public static void Execute(Transmission trans)
+ {
+ FTransmission f;
+ if (!fmap.TryGetValue(trans, out f))
+ fmap[trans] = f = new FTransmission(trans);
+ f.Show();
+ f.Focus();
+ }
+
+ public static FTransmission Get(Transmission trans)
+ {
+ FTransmission f;
+ if (!fmap.TryGetValue(trans, out f))
+ return null;
+ return f;
+ }
+
+ public void NotifyUpdate()
+ {
+ tUpdate.Enabled = true;
+ }
+
+ private void LoadTransmission()
+ {
+ lbInfo.Text = "Transmission between " + trans.SourceIP + " and " + trans.DestinationIP;
+ lbAt.Text = trans.Date.ToLongDateString() + " " + trans.Date.ToLongTimeString();
+ lbCtt.Text = "Uploaded: " + Utils.FBytes(trans.Uploaded) + " Downloaded: " + Utils.FBytes(trans.Downloaded);
+ int cscroll = pTimeline.VerticalScroll.Value;
+ pTimeline.VerticalScroll.Value = 0;
+ pTimeline.Controls.Clear();
+ pTimeline.SuspendLayout();
+ int y = 5, w2 = (int)(pTimeline.ClientSize.Width * 0.7);
+ DateTime tstart = trans.Date;
+ DateTime tlast = tstart;
+ foreach (Sentence s in trans.Conversation)
+ {
+ if ((s.Time - tlast).TotalSeconds > 30)
+ {
+ Label lbx = new Label();
+ lbx.Parent = pTimeline;
+ lbx.Font = fontSmall;
+ lbx.Text = "On hold by " + Utils.FTime(s.Time - tlast);
+ lbx.TextAlign = ContentAlignment.MiddleCenter;
+ lbx.BackColor = Color.LightYellow;
+ lbx.Top = y;
+ lbx.Left = 5;
+ lbx.Width = pTimeline.ClientSize.Width - 10;
+ y += lbx.Height + 4;
+ }
+ Label lbs = new Label();
+ lbs.AutoSize = true;
+ lbs.MinimumSize = lbs.MaximumSize = new Size(w2, 0);
+ lbs.Padding = new Padding(3);
+ lbs.Top = y;
+ lbs.Width = pTimeline.ClientSize.Width / 2;
+ lbs.Left = s.FromMe ? 5 : pTimeline.ClientSize.Width - 5 - w2;
+ lbs.BackColor = s.FromMe ? Color.LightGreen : Color.LightBlue;
+ lbs.TextAlign = s.FromMe ? ContentAlignment.TopLeft : ContentAlignment.TopRight;
+ lbs.Text = Utils.BinToTextSample(s.Data);
+ lbs.Font = fontMonospace;
+ lbs.Parent = pTimeline;
+ Label lbt = new Label();
+ lbt.Parent = pTimeline;
+ lbt.Font = fontSmall;
+ lbt.Text = Utils.FTime(s.Time - tstart);
+ lbt.AutoSize = true;
+ lbt.Top = lbs.Top - 2;
+ lbt.Left = s.FromMe ? w2 + 10 : lbs.Left - lbt.Width - 5;
+ Label lbd = new Label();
+ lbd.Parent = pTimeline;
+ lbd.Font = fontSmall;
+ lbd.Text = Utils.FTime(s.Time - tlast);
+ lbd.ForeColor = SystemColors.GrayText;
+ lbd.AutoSize = true;
+ lbd.Top = lbt.Top + lbt.Height - 1;
+ lbd.Left = s.FromMe ? w2 + 10 : lbs.Left - lbd.Width - 5;
+ Label lbz = new Label();
+ lbz.Parent = pTimeline;
+ lbz.Font = fontSmall;
+ lbz.Text = Utils.FBytes(s.Data.Length);
+ lbz.AutoSize = true;
+ lbz.Top = lbd.Top + lbd.Height - 1;
+ lbz.Left = s.FromMe ? w2 + 10 : lbs.Left - lbz.Width - 5;
+ y += lbs.Height + 4;
+ tlast = s.Time;
+ }
+ pTimeline.ResumeLayout();
+ pTimeline.VerticalScroll.Value = cscroll;
+ }
+
+ private void FTransmission_FormClosed(object sender, FormClosedEventArgs e)
+ {
+ fmap.Remove(trans);
+ Dispose();
+ }
+
+ private void pTimeline_Resize(object sender, EventArgs e)
+ {
+ LoadTransmission();
+ }
+
+ private void tUpdate_Tick(object sender, EventArgs e)
+ {
+ tUpdate.Enabled = false;
+ LoadTransmission();
+ }
+ }
+}
diff --git a/Forwarder/Forwarder/FTransmission.resx b/Forwarder/Forwarder/FTransmission.resx
new file mode 100644
index 0000000..fbe92e5
--- /dev/null
+++ b/Forwarder/Forwarder/FTransmission.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
\ No newline at end of file
diff --git a/Forwarder/Forwarder/Form1.Designer.cs b/Forwarder/Forwarder/Form1.Designer.cs
index 77c62e5..a365604 100644
--- a/Forwarder/Forwarder/Form1.Designer.cs
+++ b/Forwarder/Forwarder/Form1.Designer.cs
@@ -33,12 +33,12 @@
this.panel1 = new System.Windows.Forms.Panel();
this.lbForwarders = new System.Windows.Forms.ListBox();
this.panel2 = new System.Windows.Forms.Panel();
- this.splitter1 = new System.Windows.Forms.Splitter();
- this.pFord = new System.Windows.Forms.Panel();
- this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
this.btAbout = new System.Windows.Forms.Button();
this.btDel = new System.Windows.Forms.Button();
this.btAdd = new System.Windows.Forms.Button();
+ this.splitter1 = new System.Windows.Forms.Splitter();
+ this.pFord = new System.Windows.Forms.Panel();
+ this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
this.panel1.SuspendLayout();
this.panel2.SuspendLayout();
this.SuspendLayout();
@@ -51,7 +51,7 @@
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Margin = new System.Windows.Forms.Padding(5);
this.panel1.Name = "panel1";
- this.panel1.Size = new System.Drawing.Size(200, 372);
+ this.panel1.Size = new System.Drawing.Size(210, 372);
this.panel1.TabIndex = 2;
//
// lbForwarders
@@ -63,10 +63,11 @@
this.lbForwarders.ItemHeight = 40;
this.lbForwarders.Location = new System.Drawing.Point(0, 0);
this.lbForwarders.Name = "lbForwarders";
- this.lbForwarders.Size = new System.Drawing.Size(200, 335);
+ this.lbForwarders.Size = new System.Drawing.Size(210, 335);
this.lbForwarders.TabIndex = 1;
this.lbForwarders.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.lbForwarders_DrawItem);
this.lbForwarders.SelectedIndexChanged += new System.EventHandler(this.lbForwarders_SelectedIndexChanged);
+ this.lbForwarders.DoubleClick += new System.EventHandler(this.lbForwarders_DoubleClick);
//
// panel2
//
@@ -76,26 +77,9 @@
this.panel2.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panel2.Location = new System.Drawing.Point(0, 335);
this.panel2.Name = "panel2";
- this.panel2.Size = new System.Drawing.Size(200, 37);
+ this.panel2.Size = new System.Drawing.Size(210, 37);
this.panel2.TabIndex = 2;
//
- // splitter1
- //
- this.splitter1.Location = new System.Drawing.Point(200, 0);
- this.splitter1.Name = "splitter1";
- this.splitter1.Size = new System.Drawing.Size(3, 372);
- this.splitter1.TabIndex = 3;
- this.splitter1.TabStop = false;
- //
- // pFord
- //
- this.pFord.Dock = System.Windows.Forms.DockStyle.Fill;
- this.pFord.Location = new System.Drawing.Point(203, 0);
- this.pFord.MinimumSize = new System.Drawing.Size(300, 0);
- this.pFord.Name = "pFord";
- this.pFord.Size = new System.Drawing.Size(501, 372);
- this.pFord.TabIndex = 4;
- //
// btAbout
//
this.btAbout.Image = global::Forwarder.Properties.Resources.help;
@@ -111,7 +95,7 @@
//
this.btDel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btDel.Image = global::Forwarder.Properties.Resources.world_delete;
- this.btDel.Location = new System.Drawing.Point(132, 6);
+ this.btDel.Location = new System.Drawing.Point(142, 6);
this.btDel.Name = "btDel";
this.btDel.Size = new System.Drawing.Size(68, 26);
this.btDel.TabIndex = 1;
@@ -125,7 +109,7 @@
//
this.btAdd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btAdd.Image = global::Forwarder.Properties.Resources.world_add;
- this.btAdd.Location = new System.Drawing.Point(61, 6);
+ this.btAdd.Location = new System.Drawing.Point(71, 6);
this.btAdd.Name = "btAdd";
this.btAdd.Size = new System.Drawing.Size(65, 26);
this.btAdd.TabIndex = 0;
@@ -135,16 +119,33 @@
this.btAdd.UseVisualStyleBackColor = true;
this.btAdd.Click += new System.EventHandler(this.btAdd_Click);
//
+ // splitter1
+ //
+ this.splitter1.Location = new System.Drawing.Point(210, 0);
+ this.splitter1.Name = "splitter1";
+ this.splitter1.Size = new System.Drawing.Size(3, 372);
+ this.splitter1.TabIndex = 3;
+ this.splitter1.TabStop = false;
+ //
+ // pFord
+ //
+ this.pFord.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.pFord.Location = new System.Drawing.Point(213, 0);
+ this.pFord.MinimumSize = new System.Drawing.Size(300, 0);
+ this.pFord.Name = "pFord";
+ this.pFord.Size = new System.Drawing.Size(381, 372);
+ this.pFord.TabIndex = 4;
+ //
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(704, 372);
+ this.ClientSize = new System.Drawing.Size(594, 372);
this.Controls.Add(this.pFord);
this.Controls.Add(this.splitter1);
this.Controls.Add(this.panel1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
- this.MinimumSize = new System.Drawing.Size(650, 200);
+ this.MinimumSize = new System.Drawing.Size(600, 200);
this.Name = "Form1";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "TCP Forwarder";
diff --git a/Forwarder/Forwarder/Form1.cs b/Forwarder/Forwarder/Form1.cs
index 4db6379..3c4a0dd 100644
--- a/Forwarder/Forwarder/Form1.cs
+++ b/Forwarder/Forwarder/Form1.cs
@@ -3,8 +3,10 @@
using System.ComponentModel;
using System.Data;
using System.Drawing;
+using System.IO;
using System.Linq;
using System.Net;
+using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
@@ -31,10 +33,16 @@
{
public partial class Form1 : Form
{
+ private const string CFG_FILENAME = "Forwarder.conf";
+ private string cfgPath;
+
public Form1()
{
InitializeComponent();
- btAdd_Click(null, null);
+ Text += " " + Program.VERSION;
+ cfgPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), CFG_FILENAME);
+ if (!LoadForwarders())
+ AddForwarder();
LookupUI();
}
@@ -48,11 +56,54 @@
lbForwarders.Invalidate();
}
- private void btAdd_Click(object sender, EventArgs e)
+ private bool LoadForwarders()
+ {
+ if (!File.Exists(cfgPath))
+ return false;
+ try
+ {
+ foreach(string line in File.ReadAllLines(cfgPath))
+ {
+ string[] lp = line.Split(':');
+ if (lp.Length != 3 || lp[0].Length<1)
+ continue;
+ ForwarderControl fc = AddForwarder();
+ fc.SourceLocal = lp[0][0] == '-';
+ fc.SourcePort = lp[0].Substring(1);
+ fc.DestinationHost = lp[1];
+ fc.DestinationPort = lp[2];
+ }
+ return true;
+ }
+ catch
+ {
+ return false;
+ }
+ }
+
+ private void SaveForwarders()
+ {
+ try
+ {
+ List fws = new List();
+ foreach(ForwarderControl fc in lbForwarders.Items)
+ fws.Add( (fc.SourceLocal ? "-" : "*") + fc.SourcePort + ":" + fc.DestinationHost + ":" + fc.DestinationPort);
+ File.WriteAllLines(cfgPath, fws.ToArray());
+ }
+ catch { };
+ }
+
+ private ForwarderControl AddForwarder()
{
ForwarderControl fc = new ForwarderControl();
fc.WhenChanged = ForwarderChagned;
lbForwarders.SelectedIndex = lbForwarders.Items.Add(fc);
+ return fc;
+ }
+
+ private void btAdd_Click(object sender, EventArgs e)
+ {
+ AddForwarder();
}
private void lbForwarders_SelectedIndexChanged(object sender, EventArgs e)
@@ -90,7 +141,7 @@
if (fc.SourceLocal)
e.Graphics.DrawImage(Properties.Resources.computer, e.Bounds.Right - 18, e.Bounds.Top + 2);
Brush br = new SolidBrush(e.ForeColor);
- e.Graphics.DrawString(fc.SourcePort, lbForwarders.Font, br, 36, e.Bounds.Top + 2);
+ e.Graphics.DrawString(fc.SourcePort, lbForwarders.Font, br, 38, e.Bounds.Top + 2);
e.Graphics.DrawString(fc.DestinationHost, lbForwarders.Font, br, 40, e.Bounds.Top + 20);
e.Graphics.DrawString(fc.DestinationPort, lbForwarders.Font, br, e.Bounds.Right - (2 + e.Graphics.MeasureString(fc.DestinationPort, lbForwarders.Font).Width), e.Bounds.Top + 20);
}
@@ -100,7 +151,8 @@
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
- while (lbForwarders.Items.Count>0)
+ SaveForwarders();
+ while (lbForwarders.Items.Count > 0)
{
lbForwarders.SelectedIndex = 0;
btDel_Click(sender, e);
@@ -111,5 +163,16 @@
{
FAbout.Execute();
}
+
+ private void lbForwarders_DoubleClick(object sender, EventArgs e)
+ {
+ ForwarderControl fc = lbForwarders.SelectedItem as ForwarderControl;
+ if (fc == null)
+ return;
+ if (fc.Active)
+ fc.StopForwarder();
+ else
+ fc.StartForwarder();
+ }
}
}
diff --git a/Forwarder/Forwarder/Forwarder.cs b/Forwarder/Forwarder/Forwarder.cs
index 8512e4c..d496396 100644
--- a/Forwarder/Forwarder/Forwarder.cs
+++ b/Forwarder/Forwarder/Forwarder.cs
@@ -356,9 +356,8 @@
private IPEndPoint dst;
private int uploaded;
private int downloaded;
+ private DateTime date = DateTime.Now;
private List conversation = new List();
- private Sentence lastSay;
- private Sentence lastListen;
public Transmission(IPEndPoint src, IPEndPoint dst)
{
@@ -387,34 +386,24 @@
public object Tag { get; set; }
public int Uploaded => uploaded;
public int Downloaded => downloaded;
+ public DateTime Date => date;
public Sentence[] Conversation => conversation.ToArray();
}
public class Sentence
{
- private DateTime begin= DateTime.Now;
- private DateTime end;
+ private DateTime time= DateTime.Now;
private byte[] data;
private bool me;
public Sentence(byte[] data,bool me)
{
this.me = me;
- Append(data);
+ this.data = data;
}
- internal void Append(byte[] data)
- {
- if (this.data == null)
- this.data = data;
- else
- {
- byte[] ndata = new byte[this.data.Length + data.Length];
- this.data.CopyTo(ndata, 0);
- data.CopyTo(ndata, this.data.Length);
- this.data = ndata;
- }
- end = DateTime.Now;
- }
+ public bool FromMe => me;
+ public byte[] Data => data;
+ public DateTime Time => time;
}
}
diff --git a/Forwarder/Forwarder/Forwarder.csproj b/Forwarder/Forwarder/Forwarder.csproj
index 601e82c..3781de2 100644
--- a/Forwarder/Forwarder/Forwarder.csproj
+++ b/Forwarder/Forwarder/Forwarder.csproj
@@ -49,6 +49,12 @@
+
+ Component
+
+
+ DBPanel.cs
+
Form
@@ -69,6 +75,12 @@
ForwarderControl.cs
+
+ Form
+
+
+ FTransmission.cs
+
@@ -80,6 +92,9 @@
ForwarderControl.cs
+
+ FTransmission.cs
+
ResXFileCodeGenerator
Resources.Designer.cs
diff --git a/Forwarder/Forwarder/ForwarderControl.Designer.cs b/Forwarder/Forwarder/ForwarderControl.Designer.cs
index 667fb9b..b94c698 100644
--- a/Forwarder/Forwarder/ForwarderControl.Designer.cs
+++ b/Forwarder/Forwarder/ForwarderControl.Designer.cs
@@ -31,6 +31,9 @@
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ForwarderControl));
this.pConf = new System.Windows.Forms.Panel();
+ this.rbFollow = new System.Windows.Forms.RadioButton();
+ this.lbInfo = new System.Windows.Forms.Label();
+ this.btClear = new System.Windows.Forms.Button();
this.btStart = new System.Windows.Forms.Button();
this.tbDestPort = new System.Windows.Forms.TextBox();
this.lbDestPort = new System.Windows.Forms.Label();
@@ -41,20 +44,15 @@
this.lbSrc = new System.Windows.Forms.Label();
this.lvHistory = new System.Windows.Forms.ListView();
this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
- this.ilMsg = new System.Windows.Forms.ImageList(this.components);
- this.lbInfo = new System.Windows.Forms.Label();
- this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
- this.btClear = new System.Windows.Forms.Button();
- this.rbFollow = new System.Windows.Forms.RadioButton();
- this.cbCapture = new System.Windows.Forms.CheckBox();
this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+ this.ilMsg = new System.Windows.Forms.ImageList(this.components);
+ this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
this.pConf.SuspendLayout();
this.SuspendLayout();
//
// pConf
//
- this.pConf.Controls.Add(this.cbCapture);
this.pConf.Controls.Add(this.rbFollow);
this.pConf.Controls.Add(this.lbInfo);
this.pConf.Controls.Add(this.btClear);
@@ -72,6 +70,40 @@
this.pConf.Size = new System.Drawing.Size(424, 80);
this.pConf.TabIndex = 0;
//
+ // rbFollow
+ //
+ this.rbFollow.Appearance = System.Windows.Forms.Appearance.Button;
+ this.rbFollow.Checked = true;
+ this.rbFollow.Image = global::Forwarder.Properties.Resources.list_follow;
+ this.rbFollow.Location = new System.Drawing.Point(28, 52);
+ this.rbFollow.Name = "rbFollow";
+ this.rbFollow.Size = new System.Drawing.Size(25, 25);
+ this.rbFollow.TabIndex = 21;
+ this.rbFollow.TabStop = true;
+ this.toolTip1.SetToolTip(this.rbFollow, "Follow events");
+ this.rbFollow.UseVisualStyleBackColor = true;
+ //
+ // lbInfo
+ //
+ this.lbInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.lbInfo.Location = new System.Drawing.Point(274, 59);
+ this.lbInfo.Name = "lbInfo";
+ this.lbInfo.Size = new System.Drawing.Size(147, 16);
+ this.lbInfo.TabIndex = 19;
+ this.lbInfo.TextAlign = System.Drawing.ContentAlignment.TopRight;
+ //
+ // btClear
+ //
+ this.btClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.btClear.Image = global::Forwarder.Properties.Resources.list_clear;
+ this.btClear.Location = new System.Drawing.Point(1, 52);
+ this.btClear.Name = "btClear";
+ this.btClear.Size = new System.Drawing.Size(25, 25);
+ this.btClear.TabIndex = 18;
+ this.toolTip1.SetToolTip(this.btClear, "Clear event list");
+ this.btClear.UseVisualStyleBackColor = true;
+ this.btClear.Click += new System.EventHandler(this.btClear_Click);
+ //
// btStart
//
this.btStart.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
@@ -85,9 +117,9 @@
//
// tbDestPort
//
- this.tbDestPort.Location = new System.Drawing.Point(306, 28);
+ this.tbDestPort.Location = new System.Drawing.Point(274, 27);
this.tbDestPort.Name = "tbDestPort";
- this.tbDestPort.Size = new System.Drawing.Size(48, 20);
+ this.tbDestPort.Size = new System.Drawing.Size(41, 20);
this.tbDestPort.TabIndex = 16;
this.tbDestPort.Text = "8088";
this.tbDestPort.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
@@ -96,7 +128,7 @@
// lbDestPort
//
this.lbDestPort.AutoSize = true;
- this.lbDestPort.Location = new System.Drawing.Point(271, 31);
+ this.lbDestPort.Location = new System.Drawing.Point(243, 31);
this.lbDestPort.Name = "lbDestPort";
this.lbDestPort.Size = new System.Drawing.Size(29, 13);
this.lbDestPort.TabIndex = 15;
@@ -106,7 +138,7 @@
//
this.tbDestHost.Location = new System.Drawing.Point(76, 29);
this.tbDestHost.Name = "tbDestHost";
- this.tbDestHost.Size = new System.Drawing.Size(185, 20);
+ this.tbDestHost.Size = new System.Drawing.Size(161, 20);
this.tbDestHost.TabIndex = 14;
this.tbDestHost.TextChanged += new System.EventHandler(this.ConfChanged);
//
@@ -122,7 +154,7 @@
// cbLocal
//
this.cbLocal.AutoSize = true;
- this.cbLocal.Location = new System.Drawing.Point(130, 5);
+ this.cbLocal.Location = new System.Drawing.Point(123, 6);
this.cbLocal.Name = "cbLocal";
this.cbLocal.Size = new System.Drawing.Size(131, 17);
this.cbLocal.TabIndex = 12;
@@ -134,7 +166,7 @@
//
this.tbSrcPort.Location = new System.Drawing.Point(76, 3);
this.tbSrcPort.Name = "tbSrcPort";
- this.tbSrcPort.Size = new System.Drawing.Size(48, 20);
+ this.tbSrcPort.Size = new System.Drawing.Size(41, 20);
this.tbSrcPort.TabIndex = 11;
this.tbSrcPort.Text = "8088";
this.tbSrcPort.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
@@ -167,6 +199,7 @@
this.lvHistory.TabIndex = 1;
this.lvHistory.UseCompatibleStateImageBehavior = false;
this.lvHistory.View = System.Windows.Forms.View.Details;
+ this.lvHistory.DoubleClick += new System.EventHandler(this.lvHistory_DoubleClick);
this.lvHistory.Resize += new System.EventHandler(this.lvHistory_Resize);
//
// columnHeader1
@@ -174,63 +207,6 @@
this.columnHeader1.Text = "Events";
this.columnHeader1.Width = 300;
//
- // ilMsg
- //
- this.ilMsg.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("ilMsg.ImageStream")));
- this.ilMsg.TransparentColor = System.Drawing.Color.Transparent;
- this.ilMsg.Images.SetKeyName(0, "msg_info.png");
- this.ilMsg.Images.SetKeyName(1, "msg_error.png");
- this.ilMsg.Images.SetKeyName(2, "msg_connect.png");
- this.ilMsg.Images.SetKeyName(3, "msg_go.png");
- this.ilMsg.Images.SetKeyName(4, "msg_come.png");
- this.ilMsg.Images.SetKeyName(5, "msg_finish.png");
- //
- // lbInfo
- //
- this.lbInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
- this.lbInfo.Location = new System.Drawing.Point(274, 59);
- this.lbInfo.Name = "lbInfo";
- this.lbInfo.Size = new System.Drawing.Size(147, 16);
- this.lbInfo.TabIndex = 19;
- this.lbInfo.TextAlign = System.Drawing.ContentAlignment.TopRight;
- //
- // btClear
- //
- this.btClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
- this.btClear.Image = global::Forwarder.Properties.Resources.list_clear;
- this.btClear.Location = new System.Drawing.Point(1, 52);
- this.btClear.Name = "btClear";
- this.btClear.Size = new System.Drawing.Size(25, 25);
- this.btClear.TabIndex = 18;
- this.toolTip1.SetToolTip(this.btClear, "Clear event list");
- this.btClear.UseVisualStyleBackColor = true;
- this.btClear.Click += new System.EventHandler(this.btClear_Click);
- //
- // rbFollow
- //
- this.rbFollow.Appearance = System.Windows.Forms.Appearance.Button;
- this.rbFollow.Checked = true;
- this.rbFollow.Image = global::Forwarder.Properties.Resources.list_follow;
- this.rbFollow.Location = new System.Drawing.Point(28, 52);
- this.rbFollow.Name = "rbFollow";
- this.rbFollow.Size = new System.Drawing.Size(25, 25);
- this.rbFollow.TabIndex = 21;
- this.rbFollow.TabStop = true;
- this.toolTip1.SetToolTip(this.rbFollow, "Follow events");
- this.rbFollow.UseVisualStyleBackColor = true;
- //
- // cbCapture
- //
- this.cbCapture.AutoSize = true;
- this.cbCapture.Enabled = false;
- this.cbCapture.Location = new System.Drawing.Point(59, 57);
- this.cbCapture.Name = "cbCapture";
- this.cbCapture.Size = new System.Drawing.Size(87, 17);
- this.cbCapture.TabIndex = 22;
- this.cbCapture.Text = "Capture data";
- this.toolTip1.SetToolTip(this.cbCapture, "Capture traffic data for later analysis");
- this.cbCapture.UseVisualStyleBackColor = true;
- //
// columnHeader2
//
this.columnHeader2.Text = "Send";
@@ -243,6 +219,17 @@
this.columnHeader3.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
this.columnHeader3.Width = 70;
//
+ // ilMsg
+ //
+ this.ilMsg.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("ilMsg.ImageStream")));
+ this.ilMsg.TransparentColor = System.Drawing.Color.Transparent;
+ this.ilMsg.Images.SetKeyName(0, "msg_info.png");
+ this.ilMsg.Images.SetKeyName(1, "msg_error.png");
+ this.ilMsg.Images.SetKeyName(2, "msg_connect.png");
+ this.ilMsg.Images.SetKeyName(3, "msg_go.png");
+ this.ilMsg.Images.SetKeyName(4, "msg_come.png");
+ this.ilMsg.Images.SetKeyName(5, "msg_finish.png");
+ //
// ForwarderControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -275,7 +262,6 @@
private System.Windows.Forms.Label lbInfo;
private System.Windows.Forms.ToolTip toolTip1;
private System.Windows.Forms.RadioButton rbFollow;
- private System.Windows.Forms.CheckBox cbCapture;
private System.Windows.Forms.ColumnHeader columnHeader2;
private System.Windows.Forms.ColumnHeader columnHeader3;
}
diff --git a/Forwarder/Forwarder/ForwarderControl.cs b/Forwarder/Forwarder/ForwarderControl.cs
index 7d8d00e..3cd1d2c 100644
--- a/Forwarder/Forwarder/ForwarderControl.cs
+++ b/Forwarder/Forwarder/ForwarderControl.cs
@@ -84,10 +84,12 @@
case ForwarderMessageType.DEACTIVATED:
lvi = lvHistory.Items.Add(msg.Message);
lvi.ImageIndex = 0;
+ lvi.Tag = msg;
break;
case ForwarderMessageType.ERROR:
lvi = lvHistory.Items.Add(msg.Message);
lvi.ImageIndex = 1;
+ lvi.Tag = msg;
break;
case ForwarderMessageType.TSTART:
lvi = lvHistory.Items.Add(msg.Message);
@@ -95,6 +97,7 @@
msg.Transmission.Tag = lvi;
lvi.SubItems.Add("0");
lvi.SubItems.Add("0");
+ lvi.Tag = msg;
break;
case ForwarderMessageType.TEND:
case ForwarderMessageType.TRECV:
@@ -105,13 +108,14 @@
lvi = lvHistory.Items.Add("<<< Lost transmission >>>");
lvi.ImageIndex = 1;
msg.Transmission.Tag = lvi;
+ lvi.SubItems.Add("");
+ lvi.SubItems.Add("");
+ lvi.Tag = msg;
}
- else
- {
- lvi.ImageIndex = FMessageIcon(msg.Type);
- lvi.SubItems[1].Text = FBytes(msg.Transmission.Uploaded);
- lvi.SubItems[2].Text = FBytes(msg.Transmission.Downloaded);
- }
+ lvi.ImageIndex = FMessageIcon(msg.Type);
+ lvi.SubItems[1].Text = Utils.FBytes(msg.Transmission.Uploaded);
+ lvi.SubItems[2].Text = Utils.FBytes(msg.Transmission.Downloaded);
+ FTransmission.Get(msg.Transmission)?.NotifyUpdate();
break;
default:
lvi = lvHistory.Items.Add("[??] " + msg.Message);
@@ -120,6 +124,7 @@
}
if (lvi != null)
{
+ lvi.Tag = msg.Transmission;
if (rbFollow.Checked)
lvi.Selected = true;
//lvHistory_Resize(null, null);
@@ -127,30 +132,6 @@
lbInfo.Text = "Hints: " + sender.TotalConnections + " Alive: " + sender.CurrentConnections;
}
- private string FBytes(int bytes)
- {
- if (bytes < 1024)
- return bytes.ToString();
- string tail = null;
- double b = bytes;
- if (b > 1024)
- {
- tail = "Kb";
- b /= 1024;
- }
- if (b > 1024)
- {
- tail = "Mb";
- b /= 1024;
- }
- if (b > 1024)
- {
- tail = "Gb";
- b /= 1024;
- }
- return b.ToString("#0.00") + tail;
- }
-
private bool RefreshForwarder()
{
try
@@ -182,9 +163,48 @@
return true;
}
+ public void StartForwarder()
+ {
+ try
+ {
+ pConf.Enabled = false;
+ if (!RefreshForwarder())
+ {
+ pConf.Enabled = true;
+ return;
+ }
+ pConf.Enabled = true;
+
+ fw.Activate();
+ tbDestHost.Enabled = false;
+ tbDestPort.Enabled = false;
+ tbSrcPort.Enabled = false;
+ cbLocal.Enabled = false;
+ btStart.Text = "Stop";
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, ex.GetType().Name, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ WhenChanged?.Invoke();
+ }
+
public void StopForwarder()
{
- fw.Deactivate();
+ try
+ {
+ fw.Deactivate();
+ tbDestHost.Enabled = true;
+ tbDestPort.Enabled = true;
+ tbSrcPort.Enabled = true;
+ cbLocal.Enabled = true;
+ btStart.Text = "Start";
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, ex.GetType().Name, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ WhenChanged?.Invoke();
}
public override string ToString()
@@ -192,48 +212,18 @@
return fw.ToString();
}
- public string SourcePort => tbSrcPort.Text;
- public bool SourceLocal => cbLocal.Checked;
- public string DestinationPort => tbDestPort.Text;
- public string DestinationHost => tbDestHost.Text;
+ public string SourcePort { get => tbSrcPort.Text; set => tbSrcPort.Text = value; }
+ public bool SourceLocal { get => cbLocal.Checked; set => cbLocal.Checked = value; }
+ public string DestinationPort { get => tbDestPort.Text; set => tbDestPort.Text = value; }
+ public string DestinationHost { get => tbDestHost.Text; set => tbDestHost.Text = value; }
public bool Active => fw.Active;
private void btStart_Click(object sender, EventArgs e)
{
- try
- {
- if (fw.Active)
- {
- fw.Deactivate();
- tbDestHost.Enabled = true;
- tbDestPort.Enabled = true;
- tbSrcPort.Enabled = true;
- cbLocal.Enabled = true;
- btStart.Text = "Start";
- }
- else
- {
- pConf.Enabled = false;
- if (!RefreshForwarder())
- {
- pConf.Enabled = true;
- return;
- }
- pConf.Enabled = true;
-
- fw.Activate();
- tbDestHost.Enabled = false;
- tbDestPort.Enabled = false;
- tbSrcPort.Enabled = false;
- cbLocal.Enabled = false;
- btStart.Text = "Stop";
- }
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.Message, ex.GetType().Name, MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- WhenChanged?.Invoke();
+ if (fw.Active)
+ StopForwarder();
+ else
+ StartForwarder();
}
private void ConfChanged(object sender, EventArgs e)
@@ -243,19 +233,30 @@
private void lvHistory_Resize(object sender, EventArgs e)
{
- //lvHistory.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
int acw = 0;
for (int i = 1; i < lvHistory.Columns.Count; i++)
acw += lvHistory.Columns[i].Width;
- //if (lvHistory.Columns[0].Width + acw < lvHistory.ClientRectangle.Width)
lvHistory.Columns[0].Width = lvHistory.ClientRectangle.Width - acw;
}
private void btClear_Click(object sender, EventArgs e)
{
+ // Bread cycling references (Make life easy for c#)
+ foreach (ListViewItem lvi in lvHistory.Items)
+ lvi.Tag = null;
lvHistory.Items.Clear();
fw.ResetCounter();
}
+
+ private void lvHistory_DoubleClick(object sender, EventArgs e)
+ {
+ if (lvHistory.SelectedItems.Count < 0)
+ return;
+ Transmission t = lvHistory.SelectedItems[0].Tag as Transmission;
+ if (t == null)
+ return;
+ FTransmission.Execute(t);
+ }
}
public delegate void ForwarderChanged();
diff --git a/Forwarder/Forwarder/ForwarderControl.resx b/Forwarder/Forwarder/ForwarderControl.resx
index 9f9c906..9cb1725 100644
--- a/Forwarder/Forwarder/ForwarderControl.resx
+++ b/Forwarder/Forwarder/ForwarderControl.resx
@@ -124,128 +124,125 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
- ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADU
- GgAAAk1TRnQBSQFMAgEBBgEAARgBAAEYAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADI
+ GgAAAk1TRnQBSQFMAgEBBgEAASgBAAEoAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABIAMAAQEBAAEgBgABICYAAwQBBQMMARADDAEQAwQBBhwAAyMBMwMjATMDIwEzxAADBAEFAxMBGgMk
- ATUDIQExAw0BERwAATcBgQGsAf8BNgGAAasB/wE3AYEBrAH/wAADAwEEAxIBGAMmATkBHAGAAVIB8QEA
- AY4BSwH/AxABFhwAATUBfAGrAf8BaAGyAdQB/wE1AYABqwH/vAADAgEDAxABFQMkATUBIwF5AU8B7AEA
- AccBhgH/AQABiwFIAf8DHAEnAxABFgMQARYDEAEWAxABFgMQARYDDAEQAwQBBQE1AXwBqgH/AWYBsAHT
- Af8BNQF8AasB/7gAAwIBAwMPARQDIgEyAUIBZgFVAc8BAAHAAYAB/wEAAeUBpgH/AQABiAFFAf8DLgFI
- AysBQwMrAUMDKwFDAysBQwMrAUIDIQExAwwBEAE1AXwBqgH/AWYBsAHTAf8BNAGBAa8B/xQAAwsBDwMi
- ATIDIwEzAyMBMwMjATMDGAEhAwcBCoQAAwMBBAMPARQDIgEyAUgBXwFTAcEBAAG8AYEB/wEAAdsBoAH/
- AQAB3AGhAf8BAAGDAT8B/wEAAYcBQwH/AQABiAFEAf8BAAGIAUQB/wEAAYgBRAH/AQABiAFEAf8BAAGK
- AUYB/wEZAX8BTwHyAxABFgE1AXwBqwH/AWUBsgHWAf8BMgGFAbYB/wMXASADCgENDAADPwFtA04B+wNH
- Af8DQAH/A0AB/wNTAbkDOAFdAxYBH4AAAwoBDQMgAS4BSAFfAVMBwQEAAboBgAH/AQAB1gGgAf8BAAHT
+ ATUDIQExAw0BERwAATUBgQGsAf8BNAGAAasB/wE1AYEBrAH/wAADAwEEAxIBGAMmATkBKQF7AVMB8QEA
+ AY4BSQH/AxABFhwAATMBegGrAf8BZgGyAdQB/wEzAYABqwH/vAADAgEDAxABFQMkATUBMwFyAVMB7AEA
+ AccBhgH/AQABiwFGAf8DHAEnAxABFgMQARYDEAEWAxABFgMQARYDDAEQAwQBBQEzAXoBqgH/AWQBsAHT
+ Af8BMwF6AasB/7gAAwIBAwMPARQDIgEyAVIBYQFZAc8BAAHAAYAB/wEAAeUBpgH/AQABiAFDAf8DLgFI
+ AysBQwMrAUMDKwFDAysBQwMrAUIDIQExAwwBEAEzAXoBqgH/AWQBsAHTAf8BMgGBAa8B/xQAAwsBDwMi
+ ATIDIwEzAyMBMwMjATMDGAEhAwcBCoQAAwMBBAMPARQDIgEyAVMBWwFWAcEBAAG8AYEB/wEAAdsBoAH/
+ AQAB3AGhAf8BAAGDAT0B/wEAAYcBQQH/AQABiAFCAf8BAAGIAUIB/wEAAYgBQgH/AQABiAFCAf8BAAGK
+ AUQB/wEmAXsBUwHyAxABFgEzAXoBqwH/AWMBsgHWAf8BMAGFAbYB/wMXASADCgENDAADPwFtA04B+wNF
+ Af8DPgH/Az4B/wNVAbkDOAFdAxYBH4AAAwoBDQMgAS4BUwFbAVYBwQEAAboBgAH/AQAB1gGgAf8BAAHT
AZwB/wEAAdMBnAH/AQAB2AGgAf8BAAHZAaIB/wEAAdoBogH/AQAB2gGiAf8BAAHaAaIB/wEAAdoBoQH/
- ATYB6AG+Af8BAAGJAUUB/wMQARYBNQF8AasB/wFjAawBzwH/AUoBRQFDAf8DUwGxAz0BaQMjATMDIwEz
- AyMBMwNKAf8DSQH/A0oF/wH8AfsB+QH/AW8BbgFtAf8BQgJDAf8DUwGtgAADDwEUAUgBXwFUAcABAAG4
+ ATQB6AG+Af8BAAGJAUMB/wMQARYBMwF6AasB/wFhAawBzwH/AUgBQwFBAf8DVQGxAz0BaQMjATMDIwEz
+ AyMBMwNIAf8DRwH/A0gF/wH8AfsB+QH/AW0BbAFrAf8BQAJBAf8DUwGtgAADDwEUAVMBWgFXAcABAAG4
AYEB/wEAAdIBnwH/AQABzgGbAf8BAAHNAZoB/wEAAc0BmgH/AQABzwGbAf8BAAHPAZsB/wEAAc8BmwH/
- AQABzwGbAf8BAAHPAZsB/wEAAc8BmgH/AU8B5QHDAf8BAAGHAUIB/wMQARYBNAF8AawB/wFkAbUB3AH/
- AUoBQgE+Af8BQQE/AT4B/wNIAf8DRwH/A0AB/wM9Af8DPwH/A0AB/wM8Bf8B9gH1AfMB/wFmAWUBZAH/
- AXkBeAF3Af8DRwH/gAADDAEQAQABigFFAf8BKQHcAbcB/wEEAc0BoQH/AQAByQGZAf8BAAHJAZoB/wEA
- AckBmQH/AQAByQGZAf8BAAHIAZkB/wEAAcgBmQH/AQAByAGZAf8BAAHIAZgB/wEAAcgBlwH/AWoB5gHN
- Af8BAAGHAUEB/wMQARYBNAF8AawB/wFjAbUB3AH/AUYBPgE7Af8BdwF0AXIB/wE7AjoB/wFBAUABPwH/
- AfIB8QHwCf8BcwFxAXAB/wE8Aj0B/wGOAYsBigH/AXgBdgF1Af8B2gHZAdgB/wG4ArcB/wNBAf+AAAME
- AQUBJwF9AVMB6wEAAbMBgQH/AV8B4AHHAf8BAAHGAZoB/wEAAcUBmQH/AQABxAGYAf8BAAHDAZgB/wEA
- AcMBmQH/AQABwwGZAf8BAAHDAZkB/wEAAcMBmAH/AQABwwGXAf8BhwHpAdgB/wEAAYcBQQH/AxABFQE0
- AXwBrAH/AWIBtAHbAf8BQAE5ATUB/wHiAeAB3QH/AawBqwGqAf8BkAGPAY4B/wHqAekB6AX/Af4C/QH/
- AccBxgHFAf8DOgH/AV0BWwFYAf8BTgFMAUsB/wH7AfoB+QX/Az0B/4QAAwQBBQEuAXYBUwHlAQABrwF8
- Af8BXQHcAcYB/wEAAcABlwH/AZQB5gHYAf8BSgHnAdEB/wFOAekB1AH/AU8B6QHVAf8BTwHpAdUB/wFO
- AekB1AH/AUsB6QHUAf8BnQHwAeYB/wEAAYkBQwH/AwoBDQE0AXwBrAH/AWIBswHaAf8BPgE3ATMB/wHq
- AegB5QH/Ae8B7gHtAf8B/gH/Af0B/wFoAWUBZgH/AXcBdAF1Af8BaAFnAWYB/wH0AfMB8gH/AzQB/wHn
- AuYB/wHJAcgBxgH/AdIB0QHQBf8DPQH/iAADBAEFASwBdwFRAeYBAAGrAXwB/wFXAdkBxAH/AYIB4wHW
- Af8BAAGCATgB/wEAAYYBPwH/AQABhwFAAf8BAAGHAUAB/wEAAYcBQAH/AQABhwFBAf8BAAGJAUMB/wFK
- AV0BVAG0AwMBBAE0AXwBrAH/AWIBswHbAf8BPwE4ATQB/wHHAcUBwwH/AbYBtQG0Af8C6QHoAf8BaQJn
- Af8BdwJ1Af8BaAFnAWYB/wHiAeEB4AH/AzEF/wHwAe4B7AH/AVoBWQFYAf8BxQHDAcQB/wM/Af+MAAMD
- AQQBSAFiAVUBwAEAAaoBfAH/AXcB4wHYAf8BAAGJAUEB/wMQARYcAAE0AXwBrAH/AWIBtAHbAf8BQQE5
- ATUB/wG8ArsB/wEvAS4BLwH/ATcBNgE0Af8B6wHqAegF/wH7AvoB/wG1ArQB/wM0Af8D8QH/AegB5wHm
- Af8C2wHaAf8D3QH/A0EB/5AAAwIBAwFLAVsBUgGuAQABqwGHAf8BAAGMAUcB/wMNAREcAAE0AXwBrAH/
- AWMBtAHbAf8BQgE6ATYB/wHtAewB6wH/ApwBnQH/AYMCggH/AegB5wHmBf8B+QL4Af8D2AH/AzwB/wNI
- Af8DZwH/A28B/wPTAf8DRAH/lAADAwEEAUwBXAFUAbMBAAGOAUoB/wMEAQYcAAE1AYABrAH/AWUBtgHc
- Af8BRwE+ATgB/wFqAWgBZgH/A5AB/wG1ArQB/wHNAswB/wHMAssB/wLKAcgB/wOoAf8DQwH/BAADIgEx
- AzUBVwNUAbwDSQH/wAABUgFbAWABsQE1AYMBsQH/AVABVQFXAaQDPAFmAlcBVgHNA0MB/wNBAf8BPwJA
- Af8DQQH/A0gB+ANJAYiwAAMdASoDIwEzAx0BKhgAAwMBBAMKAQ0DEAEVAxABFgMQARYDEAEWAxABFgMQ
- ARYDEAEWAxABFgMQARYDEAEWAxABFgMQARUDCgENAwMBBAQAAxoBJAMjATNQAAMEAQYDDAEQAwwBEAME
- AQUsAAMfAS0BewFnAVIB3QGnAXQBQgH/AXsBZwFSAd0DHwEtFAADCgENAx4BKwMqAUADKwFDAysBQwMr
- AUMDKwFDAysBQwMrAUMDKwFDAysBQwMrAUMDKwFDAyoBQAMeASsDCgENBAABbwJtAcMBbQFvAXAB/wMj
- ATMDIwEzAyMBMwMjATMDIwEzPAADDQERAyEBMQMkATUDEwEaAwQBBSQAAx8BLQGHAWoBTgHpAcUBowF7
- Af8B+wH0AecB/wHFAaMBewH/AYcBagFOAekDHwEtEAADDgETAVEBYAFvAcQBNgF8AcgB/wE1AXoBxwH/
- ATYBeQHHAf8BNgF5AccB/wE1AXoBxwH/ATUBegHIAf8BNQF6AcgB/wE1AXoBxwH/ATYBeQHHAf8BNgF5
- AccB/wE1AXoBxwH/ATYBfAHIAf8BUQFgAW8BxAMOARMEAAGfAaABogH/AswBzgH/AWgBcAF6Af8BuwGD
- ATwB/wG3AYIBQAH/AbYBgwFBAf8BuAGEAUIB/wMjATM4AAMQARYBAAGOAUsB/wEcAYABUgHxAyYBOQMS
- ARgDAwEEHAADHwEtAYUBagFOAegBxAGkAXwB/wH2Ae0B3wH/AcEBngF2Af8B9gHtAd8B/wHEAaQBfAH/
- AYUBagFOAegDHwEtDAADCgENATgBhgHNAf8BUAHiAv8BUgHjAv8BUwHhAv8BUwHiAv8BUgHkAv8BUAHn
- Av8BUAHnAv8BUgHkAv8BUwHiAv8BUwHhAv8BUgHjAv8BUAHiAv8BOAGGAc0B/wMKAQ0IAAGcAaQBrgH/
- AbkBewE0Af8B+QHBAXAB/wHyAboBagH/Ae8BtgFiAf8B5QG1AWoB/wG3AYMBQQH/AyMBMxgAAwQBBQMM
- BBABFgMQARYDEAEWAxABFgMQARYDHAEnAQABiwFIAf8BAAHHAYYB/wEjAXkBTwHsAyQBNQMQARUDAgED
- FAADHwEtAYUBagFOAegBxQGlAYEB/wH4AfEB5gH/AbQBiQFaAf8BowFvATsB/wG0AYkBWgH/AfgB8QHm
- Af8BxQGlAYEB/wGFAWoBTgHoAx8BLQgAAwMBBAFSAVsBYgGyAXgBvAHnAf8BTgHaAv8BRwHUAv8BSQHU
- Av8BRwHYAv8BigFiAVQB/wGKAWIBVAH/AUcB2AL/AUkB1AL/AUcB1AL/AU4B2gL/AXgBvAHnAf8BUgFb
- AWIBsgMDAQQIAAG5AYABNwH/AfQByQGPAf8B9gHAAXUB/wHyAbsBbQH/AesBvwGBAf8BsQF6ATwB/wHv
- AbMBWgH/AbgBhAFBAf8YAAMMARADIQExAysBQgMrAUMDKwFDAysBQwMrAUMDLgFIAQABiAFFAf8BAAHl
- AaYB/wEAAcABgAH/AUIBZgFVAc8DIgEyAw8BFAMCAQMMAAMfAS0BhQFqAU4B6AHHAaYBhAH/AfoB9AHq
- Af8BswGJAVkB/wGiAW0BOQH/AaMBbgE6Af8BogFtATkB/wGzAYkBWQH/AfoB9AHqAf8BxwGmAYQB/wGF
- AWoBTgHoAx8BLQgAAwcBCgE8AYIByQH/AaMB5QL/AToBzAL/AT8BzAL/AT8B0QL/AT0B2QL/AT0B2QL/
- AT8B0QL/AT8BzAL/AToBzAL/AaMB5QL/ATwBggHJAf8DBwEKDAABtgGAATsB/wH4AdEBngH/AfgBwgF6
- Af8B8gHLAZQB/wGuAXcBOAH/AfQBugFoAf8BlgGAAWEB3QG4AYIBPQH/AyMBMwMjATMQAAMQARYBGQF/
- AU8B8gEAAYoBRgH/AQABiAFEAf8BAAGIAUQB/wEAAYgBRAH/AQABiAFEAf8BAAGHAUMB/wEAAYMBPwH/
- AQAB3AGhAf8BAAHbAaAB/wEAAbwBgQH/AUgBXwFTAcEDIgEyAw8BFAMDAQQEAAMbASYBhwFqAU4B6QHG
- AacBhAH/AfwB9wHvAf8BswGKAVwB/wG4AZEBZQH/AfoB8gHkAf8B+AHvAeAB/wH7AfMB5gH/AbkBkgFm
- Af8BswGLAVwB/wH8AfcB7wH/AcYBpwGEAf8BhwFqAU4B6QMdASoEAAMBAQIBQwJEAXgBYwGhAdgB/wGS
- AeQC/wEyAccC/wE1Ac8C/wFhAUUBOwH/AWEBRQE7Af8BNQHPAv8BMgHHAv8BkgHkAv8BYwGhAdgB/wFD
- AkQBeAMBAQIMAAG1AYABPAL/AdwBrwH/AfsB1wGnAf8BrQF1ATQB/wH5AcIBeAH/AZoBiAFsAd4BtQF8
- ATsB/wG5AcUB2AH/AbgBgQE8Af8BuAGEAUEB/wMjATMMAAMQARYBAAGJAUUB/wE2AegBvgH/AQAB2gGh
- Af8BAAHaAaIB/wEAAdoBogH/AQAB2gGiAf8BAAHZAaIB/wEAAdgBoAH/AQAB0wGcAf8BAAHTAZwB/wEA
- AdYBoAH/AQABugGAAf8BSAFfAVMBwQMgAS4DCgENBAABbQFhAVUBzAHIAagBhwH/Af0B+QHyAf8BtQGM
- AV0B/wGmAXMBQAH/AaUBcgE/Af8BuAGQAWMB/wH9AfgB7wH/AaIBbAE3Af8BpwF0AUIB/wGmAXMBQQH/
- AbUBjAFdAf8B/QH5AfIB/wHIAagBhwH/AXsBZwFSAd0IAAMEAQYBTgFnAX4B0wGjAdEB8AH/AWcB1QL/
- AScByQL/AWYBUwFJAf8BZgFTAUkB/wEnAckC/wFnAdUC/wGjAdEB8AH/AU4BZwF+AdMDBAEGEAABtgGB
- AT0C/wHrAcUB/wGtAXQBMgL/AcsBiAH/AZwBjQF2Ad4BtQF8ATwB/wMjATMBtQF8ATkB/wHpAcUBkQH/
- Ae0BrwFTAf8BtwGEAUIB/wMjATMIAAMQARYBAAGHAUIB/wFPAeUBwwH/AQABzwGaAf8BAAHPAZsB/wEA
- Ac8BmwH/AQABzwGbAf8BAAHPAZsB/wEAAc8BmwH/AQABzQGaAf8BAAHNAZoB/wEAAc4BmwH/AQAB0gGf
- Af8BAAG4AYEB/wFIAV8BVAHAAw8BFAQAAaYBcgFABf8BxAGkAYEB/wGjAW8BOwH/AagBdQFEAf8BpgFy
- AT8B/wG5AZEBZAP/Af4B/wGkAW8BOwH/AakBdwFHAf8BqQF3AUYB/wGkAW8BOwH/AcQBpAGBBf8BpgFy
- AUAB/wsAAQEDHQEpAUIBiAHMAf8BvQHtAv8BOwHMAv8BaQFYAVAB/wFpAVgBUAH/ATsBzAL/Ab0B7QL/
- AUIBiAHMAf8DHQEpAwABARQAAbUBfAE7Av8B2gGfAf8BnQGRAX4B3QG0AXoBNgH/AyMBMwG1AXwBPAH/
- AZsBiQFwAd4B8QG3AWMB/wGyAXsBPAH/AeEBrAFcAf8BuAGEAUIB/wgAAxABFgEAAYcBQQH/AWoB5gHN
- Af8BAAHIAZcB/wEAAcgBmAH/AQAByAGZAf8BAAHIAZkB/wEAAcgBmQH/AQAByQGZAf8BAAHJAZkB/wEA
- AckBmgH/AQAByQGZAf8BBAHNAaEB/wEpAdwBtwH/AQABigFFAf8DDAEQBAABXQFYAVMBrAHJAakBiQP/
- AfwB/wG0AY0BXwH/AaUBcQE/Af8BvgGaAXEJ/wGlAXEBPgH/AakBdwFGAf8BpwF0AUEB/wG1AY0BYAP/
- AfwB/wHJAakBiQH/AWgBXwFUAcEMAAMCAQMBTgFRAVUBnAFyAa8B4gH/AbMB8AL/AWoBWAFPAf8BagFY
- AU8B/wGzAfAC/wFyAa8B4gH/AU4BUQFVAZwDAgEDHAABtwGCAT4B/wG2AXwBOQH/AbgBxAHVAf8BtQF7
- ATcB/wGcAYkBcgHeAfkBwQF2Af8BrwF3ATgB/wHmAbkBcgH/AeYBtQFtAf8BtwGDAUAB/wgAAxABFQEA
- AYcBQQH/AYcB6QHYAf8BAAHDAZcB/wEAAcMBmAH/AQABwwGZAf8BAAHDAZkB/wEAAcMBmQH/AQABwwGY
- Af8BAAHEAZgB/wEAAcUBmQH/AQABxgGaAf8BXwHgAccB/wEAAbMBgQH/AScBfQFTAesDBAEFCAABWgFW
- AVABpwHJAaoBiwX/AbYBjAFfAf8BowFvAToB/wGiAW0BOAH/AaIBbQE4Af8BpgFzAUAB/wGmAXMBQAH/
- AbcBjQFgBf8ByQGqAYsB/wFaAVYBUAGnFAADBgEIAS0BegHIAf8BoAHWAfkB/wGRAeIC/wGRAeIC/wGg
- AdYB+QH/AS0BegHIAf8DBgEIKAABtwGAAToB/wHvAcsBnwL/Ac0BjAH/Aa0BdQE0Af8B7gHGAYsB/wHw
- AbcBZwH/AewBwAGBAf8BtwGCAT4B/wgAAwoBDQEAAYkBQwH/AZ0B8AHmAf8BSwHpAdQB/wFOAekB1AH/
- AU8B6QHVAf8BTwHpAdUB/wFOAekB1AH/AUoB5wHRAf8BlAHmAdgB/wEAAcABlwH/AV0B3AHGAf8BAAGv
- AXwB/wEuAXYBUwHlAwQBBRAAAVoBVgFQAacBygGrAYwF/wG1AYwBXgH/AboBlAFoA/8B/gH/AaMBbgE6
- Af8BtgGOAWAF/wHKAasBjAH/AVoBVgFQAacbAAEBAzIBUAFHAZAB0wH/AcQB8AL/AcQB8AL/AUcBkAHT
- Af8DMgFQAwABASgAAbcBggE+Av8B3AGiAf8BrgF0ATIB/wH6AdQBowH/AfYBwAF2Af8B9AG7AW0B/wH3
- Ac0BkwH/AbwBgwE7Af8IAAMDAQQBSgFdAVQBtAEAAYkBQwH/AQABhwFBAf8BAAGHAUAB/wEAAYcBQAH/
- AQABhwFAAf8BAAGGAT8B/wEAAYIBOAH/AYIB4wHWAf8BVwHZAcQB/wEAAasBfAH/ASwBdwFRAeYDBAEF
- GAABWgFWAVABpwHKAawBjgX/AbMBigFcAf8BoAFpATMB/wG0AYsBXQX/AcoBrAGOAf8BWgFWAVABpyAA
- AwQBBQFPAWkBgAHVAXcBvAHsAf8BdwG8AewB/wFPAWkBgAHVAwQBBTAAAbUBfAE7Av8B6gHDAv8B4QG4
- Av8B3QGwAv8B2wGrAf8BuQF7ATIB/wFoAXABegH/AyMBMyAAAxABFgEAAYkBQQH/AXcB4wHYAf8BAAGq
- AXwB/wFIAWIBVQHAAwMBBCAAAVoBVgFQAacBywGtAY4F/wHGAagBhgX/AcsBrQGPAf8BWgFWAVABpygA
- Aw4BEwExAYUBzQH/ATEBhQHNAf8DDgETOAABtgGBAT0B/wG1AXwBOwH/AbUBfAE6Af8BuAF8ATYB/wGc
- AaQBrQH/AswBzgH/AW0BbgFwAf8gAAMNAREBAAGMAUcB/wEAAasBhwH/AUsBWwFSAa4DAgEDKAABWgFW
- AVABpwHLAa4BkQX/AcsBrgGRAf8BWgFWAVABp4gAAZ8BoAGiAf8BZQJkAbQgAAMEAQYBAAGOAUoB/wFM
- AVwBVAGzAwMBBDAAAV0BWAFTAawBpgFyAT4B/wFdAVgBUwGs2AABQgFNAT4HAAE+AwABKAMAAUADAAEg
- AwABAQEAAQEGAAEBFgAD/wEAAfgBfwEfAf8EAAHwAX8BHwH/BAAB4AF/AR8B/wQAAcABAAEfAf8EAAGA
- AQABHwEBBgABByUAAYAHAAHABwAB4AF/BgAB8AF/BgAB+AF/AQABEAQAAv8BAAEfBAAB/gE/AgABnwH/
- Af4BHwH8AR8CAAGAAf8B/gEPAfgBDwIAAYABfwH+AQcB8AEHAgABwAE/AQABAwHgAQMCAAHAAT8BAAEB
- AcABAQGAAQEBwAEPAgABgAEAAYABAQHAAQcCAAGAAQABwAEDAcABAwIAAYABAAHAAQMB4AEDAgABgAEA
- AeABBwHwAQMCAAHAAQEB8AEPAfwBAwEAAQEB4AEDAfABDwH8AQMBAAEDAfABBwH4AR8B/gEBAf4BBwH4
- AQ8B/AE/Af8BAQH+AQ8B/AEfA/8B+QH+AR8B/gE/Bv8L
+ AQABzwGbAf8BAAHPAZsB/wEAAc8BmgH/AU0B5QHDAf8BAAGHAUAB/wMQARYBMgF6AawB/wFiAbUB3AH/
+ AUgBQAE8Af8BPwE9ATwB/wNGAf8DRQH/Az4B/wM7Af8DPQH/Az4B/wM6Bf8B9gH1AfMB/wFkAWMBYgH/
+ AXcBdgF1Af8DRQH/gAADDAEQAQABigFDAf8BJwHcAbcB/wECAc0BoQH/AQAByQGZAf8BAAHJAZoB/wEA
+ AckBmQH/AQAByQGZAf8BAAHIAZkB/wEAAcgBmQH/AQAByAGZAf8BAAHIAZgB/wEAAcgBlwH/AWgB5gHN
+ Af8BAAGHAT8B/wMQARYBMgF6AawB/wFhAbUB3AH/AUQBPAE5Af8BdQFyAXAB/wE5AjgB/wE/AT4BPQH/
+ AfIB8QHwCf8BcQFvAW4B/wE6AjsB/wGOAYsBigH/AXYBdAFzAf8B2gHZAdgB/wG4ArcB/wM/Af+AAAME
+ AQUBNwF3AVYB6wEAAbMBgQH/AV0B4AHHAf8BAAHGAZoB/wEAAcUBmQH/AQABxAGYAf8BAAHDAZgB/wEA
+ AcMBmQH/AQABwwGZAf8BAAHDAZkB/wEAAcMBmAH/AQABwwGXAf8BhwHpAdgB/wEAAYcBPwH/AxABFQEy
+ AXoBrAH/AWABtAHbAf8BPgE3ATMB/wHiAeAB3QH/AawBqwGqAf8BkAGPAY4B/wHqAekB6AX/Af4C/QH/
+ AccBxgHFAf8DOAH/AVsBWQFWAf8BTAFKAUkB/wH7AfoB+QX/AzsB/4QAAwQBBQE+AW4BVwHlAQABrwF6
+ Af8BWwHcAcYB/wEAAcABlwH/AZQB5gHYAf8BSAHnAdEB/wFMAekB1AH/AU0B6QHVAf8BTQHpAdUB/wFM
+ AekB1AH/AUkB6QHUAf8BnQHwAeYB/wEAAYkBQQH/AwoBDQEyAXoBrAH/AWABswHaAf8BPAE1ATEB/wHq
+ AegB5QH/Ae8B7gHtAf8B/gH/Af0B/wFmAWMBZAH/AXUBcgFzAf8BZgFlAWQB/wH0AfMB8gH/AzIB/wHn
+ AuYB/wHJAcgBxgH/AdIB0QHQBf8DOwH/iAADBAEFAT4BbwFWAeYBAAGrAXoB/wFVAdkBxAH/AYIB4wHW
+ Af8BAAGCATYB/wEAAYYBPQH/AQABhwE+Af8BAAGHAT4B/wEAAYcBPgH/AQABhwE/Af8BAAGJAUEB/wFS
+ AVgBVQG0AwMBBAEyAXoBrAH/AWABswHbAf8BPQE2ATIB/wHHAcUBwwH/AbYBtQG0Af8C6QHoAf8BZwJl
+ Af8BdQJzAf8BZgFlAWQB/wHiAeEB4AH/Ay8F/wHwAe4B7AH/AVgBVwFWAf8BxQHDAcQB/wM9Af+MAAMD
+ AQQBUwFcAVgBwAEAAaoBegH/AXUB4wHYAf8BAAGJAT8B/wMQARYcAAEyAXoBrAH/AWABtAHbAf8BPwE3
+ ATMB/wG8ArsB/wEtASwBLQH/ATUBNAEyAf8B6wHqAegF/wH7AvoB/wG1ArQB/wMyAf8D8QH/AegB5wHm
+ Af8C2wHaAf8D3QH/Az8B/5AAAwIBAwFSAVUBVAGuAQABqwGHAf8BAAGMAUUB/wMNAREcAAEyAXoBrAH/
+ AWEBtAHbAf8BQAE4ATQB/wHtAewB6wH/ApwBnQH/AYMCggH/AegB5wHmBf8B+QL4Af8D2AH/AzoB/wNG
+ Af8DZQH/A20B/wPTAf8DQgH/lAADAwEEAVMBVwFWAbMBAAGOAUgB/wMEAQYcAAEzAYABrAH/AWMBtgHc
+ Af8BRQE8ATYB/wFoAWYBZAH/A5AB/wG1ArQB/wHNAswB/wHMAssB/wLKAcgB/wOoAf8DQQH/BAADIgEx
+ AzUBVwNWAbwDRwH/wAABVQFWAVcBsQEzAYMBsQH/AVACUgGkAzwBZgJZAVgBzQNBAf8DPwH/AT0CPgH/
+ Az8B/wNIAfgDSQGIsAADHQEqAyMBMwMdASoYAAMDAQQDCgENAxABFQMQARYDEAEWAxABFgMQARYDEAEW
+ AxABFgMQARYDEAEWAxABFgMQARYDEAEVAwoBDQMDAQQEAAMaASQDIwEzUAADBAEGAwwBEAMMARADBAEF
+ LAADHwEtAXABYwFXAd0BpwFyAUAB/wFwAWMBVwHdAx8BLRQAAwoBDQMeASsDKgFAAysBQwMrAUMDKwFD
+ AysBQwMrAUMDKwFDAysBQwMrAUMDKwFDAysBQwMqAUADHgErAwoBDQQAAWMCYAHDAWsBbQFuAf8DIwEz
+ AyMBMwMjATMDIwEzAyMBMzwAAw0BEQMhATEDJAE1AxMBGgMEAQUkAAMfAS0BewFlAVEB6QHFAaMBeQH/
+ AfsB9AHnAf8BxQGjAXkB/wF7AWUBUQHpAx8BLRAAAw4BEwFXAVsBYQHEATQBegHIAf8BMwF4AccB/wE0
+ AXcBxwH/ATQBdwHHAf8BMwF4AccB/wEzAXgByAH/ATMBeAHIAf8BMwF4AccB/wE0AXcBxwH/ATQBdwHH
+ Af8BMwF4AccB/wE0AXoByAH/AVcBWwFhAcQDDgETBAABnwGgAaIB/wLMAc4B/wFmAW4BeAH/AbsBgwE6
+ Af8BtwGCAT4B/wG2AYMBPwH/AbgBhAFAAf8DIwEzOAADEAEWAQABjgFJAf8BKQF7AVMB8QMmATkDEgEY
+ AwMBBBwAAx8BLQF6AWcBVAHoAcQBpAF6Af8B9gHtAd8B/wHBAZ4BdAH/AfYB7QHfAf8BxAGkAXoB/wF6
+ AWcBVAHoAx8BLQwAAwoBDQE2AYYBzQH/AU4B4gL/AVAB4wL/AVEB4QL/AVEB4gL/AVAB5AL/AU4B5wL/
+ AU4B5wL/AVAB5AL/AVEB4gL/AVEB4QL/AVAB4wL/AU4B4gL/ATYBhgHNAf8DCgENCAABnAGkAa4B/wG5
+ AXkBMgH/AfkBwQFuAf8B8gG6AWgB/wHvAbYBYAH/AeUBtQFoAf8BtwGDAT8B/wMjATMYAAMEAQUDDAQQ
+ ARYDEAEWAxABFgMQARYDEAEWAxwBJwEAAYsBRgH/AQABxwGGAf8BMwFyAVMB7AMkATUDEAEVAwIBAxQA
+ Ax8BLQF6AWcBVAHoAcUBpQGBAf8B+AHxAeYB/wG0AYkBWAH/AaMBbQE5Af8BtAGJAVgB/wH4AfEB5gH/
+ AcUBpQGBAf8BegFnAVQB6AMfAS0IAAMDAQQBVQFWAVkBsgF2AbwB5wH/AUwB2gL/AUUB1AL/AUcB1AL/
+ AUUB2AL/AYoBYAFSAf8BigFgAVIB/wFFAdgC/wFHAdQC/wFFAdQC/wFMAdoC/wF2AbwB5wH/AVUBVgFZ
+ AbIDAwEECAABuQGAATUB/wH0AckBjwH/AfYBwAFzAf8B8gG7AWsB/wHrAb8BgQH/AbEBeAE6Af8B7wGz
+ AVgB/wG4AYQBPwH/GAADDAEQAyEBMQMrAUIDKwFDAysBQwMrAUMDKwFDAy4BSAEAAYgBQwH/AQAB5QGm
+ Af8BAAHAAYAB/wFSAWEBWQHPAyIBMgMPARQDAgEDDAADHwEtAXoBZwFUAegBxwGmAYQB/wH6AfQB6gH/
+ AbMBiQFXAf8BogFrATcB/wGjAWwBOAH/AaIBawE3Af8BswGJAVcB/wH6AfQB6gH/AccBpgGEAf8BegFn
+ AVQB6AMfAS0IAAMHAQoBOgGCAckB/wGjAeUC/wE4AcwC/wE9AcwC/wE9AdEC/wE7AdkC/wE7AdkC/wE9
+ AdEC/wE9AcwC/wE4AcwC/wGjAeUC/wE6AYIByQH/AwcBCgwAAbYBgAE5Af8B+AHRAZ4B/wH4AcIBeAH/
+ AfIBywGUAf8BrgF1ATYB/wH0AboBZgH/AX4BcQFeAd0BuAGCATsB/wMjATMDIwEzEAADEAEWASYBewFT
+ AfIBAAGKAUQB/wEAAYgBQgH/AQABiAFCAf8BAAGIAUIB/wEAAYgBQgH/AQABhwFBAf8BAAGDAT0B/wEA
+ AdwBoQH/AQAB2wGgAf8BAAG8AYEB/wFTAVsBVgHBAyIBMgMPARQDAwEEBAADGwEmAXsBZQFRAekBxgGn
+ AYQB/wH8AfcB7wH/AbMBigFaAf8BuAGRAWMB/wH6AfIB5AH/AfgB7wHgAf8B+wHzAeYB/wG5AZIBZAH/
+ AbMBiwFaAf8B/AH3Ae8B/wHGAacBhAH/AXsBZQFRAekDHQEqBAADAQECA0MBeAFhAaEB2AH/AZIB5AL/
+ ATABxwL/ATMBzwL/AV8BQwE5Af8BXwFDATkB/wEzAc8C/wEwAccC/wGSAeQC/wFhAaEB2AH/A0MBeAMB
+ AQIMAAG1AYABOgL/AdwBrwH/AfsB1wGnAf8BrQFzATIB/wH5AcIBdgH/AYABdwFmAd4BtQF6ATkB/wG5
+ AcUB2AH/AbgBgQE6Af8BuAGEAT8B/wMjATMMAAMQARYBAAGJAUMB/wE0AegBvgH/AQAB2gGhAf8BAAHa
+ AaIB/wEAAdoBogH/AQAB2gGiAf8BAAHZAaIB/wEAAdgBoAH/AQAB0wGcAf8BAAHTAZwB/wEAAdYBoAH/
+ AQABugGAAf8BUwFbAVYBwQMgAS4DCgENBAABYgFeAVkBzAHIAagBhwH/Af0B+QHyAf8BtQGMAVsB/wGm
+ AXEBPgH/AaUBcAE9Af8BuAGQAWEB/wH9AfgB7wH/AaIBagE1Af8BpwFyAUAB/wGmAXEBPwH/AbUBjAFb
+ Af8B/QH5AfIB/wHIAagBhwH/AXABYwFXAd0IAAMEAQYBVgFfAWsB0wGjAdEB8AH/AWUB1QL/ASUByQL/
+ AWQBUQFHAf8BZAFRAUcB/wElAckC/wFlAdUC/wGjAdEB8AH/AVYBXwFrAdMDBAEGEAABtgGBATsC/wHr
+ AcUB/wGtAXIBMAL/AcsBiAH/AYMBeQFsAd4BtQF6AToB/wMjATMBtQF6ATcB/wHpAcUBkQH/Ae0BrwFR
+ Af8BtwGEAUAB/wMjATMIAAMQARYBAAGHAUAB/wFNAeUBwwH/AQABzwGaAf8BAAHPAZsB/wEAAc8BmwH/
+ AQABzwGbAf8BAAHPAZsB/wEAAc8BmwH/AQABzQGaAf8BAAHNAZoB/wEAAc4BmwH/AQAB0gGfAf8BAAG4
+ AYEB/wFTAVoBVwHAAw8BFAQAAaYBcAE+Bf8BxAGkAYEB/wGjAW0BOQH/AagBcwFCAf8BpgFwAT0B/wG5
+ AZEBYgP/Af4B/wGkAW0BOQH/AakBdQFFAf8BqQF1AUQB/wGkAW0BOQH/AcQBpAGBBf8BpgFwAT4B/wsA
+ AQEDHQEpAUABiAHMAf8BvQHtAv8BOQHMAv8BZwFWAU4B/wFnAVYBTgH/ATkBzAL/Ab0B7QL/AUABiAHM
+ Af8DHQEpAwABARQAAbUBegE5Av8B2gGfAf8BgQF7AXAB3QG0AXgBNAH/AyMBMwG1AXoBOgH/AYIBdwFo
+ Ad4B8QG3AWEB/wGyAXkBOgH/AeEBrAFaAf8BuAGEAUAB/wgAAxABFgEAAYcBPwH/AWgB5gHNAf8BAAHI
+ AZcB/wEAAcgBmAH/AQAByAGZAf8BAAHIAZkB/wEAAcgBmQH/AQAByQGZAf8BAAHJAZkB/wEAAckBmgH/
+ AQAByQGZAf8BAgHNAaEB/wEnAdwBtwH/AQABigFDAf8DDAEQBAABVgFUAVMBrAHJAakBiQP/AfwB/wG0
+ AY0BXQH/AaUBbwE9Af8BvgGaAW8J/wGlAW8BPAH/AakBdQFEAf8BpwFyAT8B/wG1AY0BXgP/AfwB/wHJ
+ AakBiQH/AV0BWwFWAcEMAAMCAQMBTwJRAZwBcAGvAeIB/wGzAfAC/wFoAVYBTQH/AWgBVgFNAf8BswHw
+ Av8BcAGvAeIB/wFPAlEBnAMCAQMcAAG3AYIBPAH/AbYBegE3Af8BuAHEAdUB/wG1AXkBNQH/AYMBdwFo
+ Ad4B+QHBAXQB/wGvAXUBNgH/AeYBuQFwAf8B5gG1AWsB/wG3AYMBPgH/CAADEAEVAQABhwE/Af8BhwHp
+ AdgB/wEAAcMBlwH/AQABwwGYAf8BAAHDAZkB/wEAAcMBmQH/AQABwwGZAf8BAAHDAZgB/wEAAcQBmAH/
+ AQABxQGZAf8BAAHGAZoB/wFdAeABxwH/AQABswGBAf8BNwF3AVYB6wMEAQUIAAFUAVIBUQGnAckBqgGL
+ Bf8BtgGMAV0B/wGjAW0BOAH/AaIBawE2Af8BogFrATYB/wGmAXEBPgH/AaYBcQE+Af8BtwGNAV4F/wHJ
+ AaoBiwH/AVQBUgFRAacUAAMGAQgBKwF4AcgB/wGgAdYB+QH/AZEB4gL/AZEB4gL/AaAB1gH5Af8BKwF4
+ AcgB/wMGAQgoAAG3AYABOAH/Ae8BywGfAv8BzQGMAf8BrQFzATIB/wHuAcYBiwH/AfABtwFlAf8B7AHA
+ AYEB/wG3AYIBPAH/CAADCgENAQABiQFBAf8BnQHwAeYB/wFJAekB1AH/AUwB6QHUAf8BTQHpAdUB/wFN
+ AekB1QH/AUwB6QHUAf8BSAHnAdEB/wGUAeYB2AH/AQABwAGXAf8BWwHcAcYB/wEAAa8BegH/AT4BbgFX
+ AeUDBAEFEAABVAFSAVEBpwHKAasBjAX/AbUBjAFcAf8BugGUAWYD/wH+Af8BowFsATgB/wG2AY4BXgX/
+ AcoBqwGMAf8BVAFSAVEBpxsAAQEDMgFQAUUBkAHTAf8BxAHwAv8BxAHwAv8BRQGQAdMB/wMyAVADAAEB
+ KAABtwGCATwC/wHcAaIB/wGuAXIBMAH/AfoB1AGjAf8B9gHAAXQB/wH0AbsBawH/AfcBzQGTAf8BvAGD
+ ATkB/wgAAwMBBAFSAVgBVQG0AQABiQFBAf8BAAGHAT8B/wEAAYcBPgH/AQABhwE+Af8BAAGHAT4B/wEA
+ AYYBPQH/AQABggE2Af8BggHjAdYB/wFVAdkBxAH/AQABqwF6Af8BPgFvAVYB5gMEAQUYAAFUAVIBUQGn
+ AcoBrAGOBf8BswGKAVoB/wGgAWcBMQH/AbQBiwFbBf8BygGsAY4B/wFUAVIBUQGnIAADBAEFAVYBYwFw
+ AdUBdQG8AewB/wF1AbwB7AH/AVYBYwFwAdUDBAEFMAABtQF6ATkC/wHqAcMC/wHhAbgC/wHdAbAC/wHb
+ AasB/wG5AXkBMAH/AWYBbgF4Af8DIwEzIAADEAEWAQABiQE/Af8BdQHjAdgB/wEAAaoBegH/AVMBXAFY
+ AcADAwEEIAABVAFSAVEBpwHLAa0BjgX/AcYBqAGGBf8BywGtAY8B/wFUAVIBUQGnKAADDgETAS8BhQHN
+ Af8BLwGFAc0B/wMOARM4AAG2AYEBOwH/AbUBegE5Af8BtQF6ATgB/wG4AXoBNAH/AZwBpAGtAf8CzAHO
+ Af8BawFsAW4B/yAAAw0BEQEAAYwBRQH/AQABqwGHAf8BUgFVAVQBrgMCAQMoAAFUAVIBUQGnAcsBrgGR
+ Bf8BywGuAZEB/wFUAVIBUQGniAABnwGgAaIB/wNaAbQgAAMEAQYBAAGOAUgB/wFTAVcBVgGzAwMBBDAA
+ AVYBVAFTAawBpgFwATwB/wFWAVQBUwGs2AABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEB
+ FgAD/wEAAfgBfwEfAf8EAAHwAX8BHwH/BAAB4AF/AR8B/wQAAcABAAEfAf8EAAGAAQABHwEBBgABByUA
+ AYAHAAHABwAB4AF/BgAB8AF/BgAB+AF/AQABEAQAAv8BAAEfBAAB/gE/AgABnwH/Af4BHwH8AR8CAAGA
+ Af8B/gEPAfgBDwIAAYABfwH+AQcB8AEHAgABwAE/AQABAwHgAQMCAAHAAT8BAAEBAcABAQGAAQEBwAEP
+ AgABgAEAAYABAQHAAQcCAAGAAQABwAEDAcABAwIAAYABAAHAAQMB4AEDAgABgAEAAeABBwHwAQMCAAHA
+ AQEB8AEPAfwBAwEAAQEB4AEDAfABDwH8AQMBAAEDAfABBwH4AR8B/gEBAf4BBwH4AQ8B/AE/Af8BAQH+
+ AQ8B/AEfA/8B+QH+AR8B/gE/Bv8L
98, 17
-
- 98, 17
-
\ No newline at end of file
diff --git a/Forwarder/Forwarder/Program.cs b/Forwarder/Forwarder/Program.cs
index 1ebd7da..dc7ed0b 100644
--- a/Forwarder/Forwarder/Program.cs
+++ b/Forwarder/Forwarder/Program.cs
@@ -26,6 +26,7 @@
{
static class Program
{
+ public const string VERSION = "1.1";
///
/// The main entry point for the application.
///
@@ -42,7 +43,7 @@
{
Exception ex = e.ExceptionObject as Exception;
if (ex != null)
- MessageBox.Show(ex.Message,"Critical "+ex.GetType().Name, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ MessageBox.Show(ex.Message, "Critical " + ex.GetType().Name, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}