1
0
mirror of https://github.com/Ylianst/MeshCentralRouter synced 2025-12-06 00:13:33 +00:00

Updated UI syle to handle many more devices.

This commit is contained in:
Ylian Saint-Hilaire
2020-07-30 14:23:31 -07:00
parent 0806a06608
commit e574e5007f
8 changed files with 876 additions and 179 deletions

View File

@@ -13,6 +13,7 @@ namespace MeshCentralRouter
public partial class AddPortMapForm : Form
{
private MeshCentralServer meshcentral;
private NodeClass selectedNode = null;
public AddPortMapForm(MeshCentralServer meshcentral)
{
@@ -25,34 +26,48 @@ namespace MeshCentralRouter
public int getRemotePort() { return (int)remoteNumericUpDown.Value; }
public int getAppId() { return (int)appComboBox.SelectedIndex; }
public NodeClass getNode() { return (NodeClass)nodeComboBox.SelectedItem; }
public void setNode(NodeClass node) { selectedNode = node; }
private void AddPortMapForm_Load(object sender, EventArgs e)
{
// Fill the groups
groupComboBox.Items.Clear();
foreach (string meshid in meshcentral.meshes.Keys)
if (selectedNode == null)
{
MeshClass mesh = meshcentral.meshes[meshid];
if (mesh.type == 2)
// Fill the groups
groupComboBox.Items.Clear();
foreach (string meshid in meshcentral.meshes.Keys)
{
int nodeCount = 0;
foreach (string nodeid in meshcentral.nodes.Keys)
MeshClass mesh = meshcentral.meshes[meshid];
if (mesh.type == 2)
{
NodeClass node = meshcentral.nodes[nodeid];
if ((node.meshid == mesh.meshid) && ((node.conn & 1) != 0)) { nodeCount++; }
int nodeCount = 0;
foreach (string nodeid in meshcentral.nodes.Keys)
{
NodeClass node = meshcentral.nodes[nodeid];
if ((node.meshid == mesh.meshid) && ((node.conn & 1) != 0)) { nodeCount++; }
}
if (nodeCount > 0) { groupComboBox.Items.Add(mesh); }
}
if (nodeCount > 0) { groupComboBox.Items.Add(mesh); }
}
}
// Set default selection
if (groupComboBox.Items.Count > 0) { groupComboBox.SelectedIndex = 0; }
appComboBox.SelectedIndex = 1;
fillNodesInDropDown();
// Set default selection
if (groupComboBox.Items.Count > 0) { groupComboBox.SelectedIndex = 0; }
appComboBox.SelectedIndex = 1;
fillNodesInDropDown();
} else {
groupComboBox.Items.Add(selectedNode.mesh);
groupComboBox.SelectedIndex = 0;
groupComboBox.Enabled = false;
nodeComboBox.Items.Add(selectedNode);
nodeComboBox.SelectedIndex = 0;
nodeComboBox.Enabled = false;
appComboBox.SelectedIndex = 1;
}
}
private void fillNodesInDropDown()
{
if (selectedNode != null) return;
MeshClass mesh = (MeshClass)groupComboBox.SelectedItem;
// Fill the nodes dropdown

View File

@@ -14,6 +14,7 @@ namespace MeshCentralRouter
public partial class AddRelayMapForm : Form
{
private MeshCentralServer meshcentral;
private NodeClass selectedNode = null;
public AddRelayMapForm(MeshCentralServer meshcentral)
{
@@ -28,32 +29,47 @@ namespace MeshCentralRouter
public string getRemoteIP() { return remoteIpTextBox.Text; }
public int getAppId() { return (int)appComboBox.SelectedIndex; }
public NodeClass getNode() { return (NodeClass)nodeComboBox.SelectedItem; }
public void setNode(NodeClass node) { selectedNode = node; }
private void AddRelayMapForm_Load(object sender, EventArgs e)
{
// Fill the groups
groupComboBox.Items.Clear();
foreach (string meshid in meshcentral.meshes.Keys)
if (selectedNode == null)
{
MeshClass mesh = meshcentral.meshes[meshid];
if (mesh.type == 2) {
int nodeCount = 0;
foreach (string nodeid in meshcentral.nodes.Keys) {
NodeClass node = meshcentral.nodes[nodeid];
if ((node.meshid == mesh.meshid) && ((node.conn & 1) != 0)) { nodeCount++; }
// Fill the groups
groupComboBox.Items.Clear();
foreach (string meshid in meshcentral.meshes.Keys)
{
MeshClass mesh = meshcentral.meshes[meshid];
if (mesh.type == 2)
{
int nodeCount = 0;
foreach (string nodeid in meshcentral.nodes.Keys)
{
NodeClass node = meshcentral.nodes[nodeid];
if ((node.meshid == mesh.meshid) && ((node.conn & 1) != 0)) { nodeCount++; }
}
if (nodeCount > 0) { groupComboBox.Items.Add(mesh); }
}
if (nodeCount > 0) { groupComboBox.Items.Add(mesh); }
}
}
// Set default selection
if (groupComboBox.Items.Count > 0) { groupComboBox.SelectedIndex = 0; }
appComboBox.SelectedIndex = 1;
fillNodesInDropDown();
// Set default selection
if (groupComboBox.Items.Count > 0) { groupComboBox.SelectedIndex = 0; }
appComboBox.SelectedIndex = 1;
fillNodesInDropDown();
} else {
groupComboBox.Items.Add(selectedNode.mesh);
groupComboBox.SelectedIndex = 0;
groupComboBox.Enabled = false;
nodeComboBox.Items.Add(selectedNode);
nodeComboBox.SelectedIndex = 0;
nodeComboBox.Enabled = false;
appComboBox.SelectedIndex = 1;
}
}
private void fillNodesInDropDown()
{
if (selectedNode != null) return;
MeshClass mesh = (MeshClass)groupComboBox.SelectedItem;
// Fill the nodes dropdown

View File

@@ -322,6 +322,12 @@
<metadata name="rdpContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>313, 17</value>
</metadata>
<data name="setRDPPortToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>149, 22</value>
</data>
<data name="setRDPPortToolStripMenuItem.Text" xml:space="preserve">
<value>Set RDP port...</value>
</data>
<data name="rdpContextMenuStrip.Size" type="System.Drawing.Size, System.Drawing">
<value>150, 26</value>
</data>
@@ -355,12 +361,6 @@
<data name="&gt;&gt;rdpButton.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="setRDPPortToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>149, 22</value>
</data>
<data name="setRDPPortToolStripMenuItem.Text" xml:space="preserve">
<value>Set RDP port...</value>
</data>
<metadata name="deviceImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
@@ -369,7 +369,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAy
mgAAAk1TRnQBSQFMAgEBCAEAAWgBAAFoAQABMgEAATIBAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAHI
mgAAAk1TRnQBSQFMAgEBCAEAAXABAAFwAQABMgEAATIBAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAHI
AwABlgMAAQEBAAEQBQABYAHq/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A
/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A
/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A
@@ -1037,7 +1037,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC4
mgAAAk1TRnQBSQFMAgEBCAEAAXABAAFwAQABMgEAATIBAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAHI
mgAAAk1TRnQBSQFMAgEBCAEAAXgBAAF4AQABMgEAATIBAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAHI
AwABlgMAAQEBAAEQBQABYAHq/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A
/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A
/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A
@@ -1706,6 +1706,12 @@
<metadata name="altPortContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>468, 17</value>
</metadata>
<data name="toolStripMenuItem1.Size" type="System.Drawing.Size, System.Drawing">
<value>178, 22</value>
</data>
<data name="toolStripMenuItem1.Text" xml:space="preserve">
<value>Use Alternate Port...</value>
</data>
<data name="altPortContextMenuStrip.Size" type="System.Drawing.Size, System.Drawing">
<value>179, 26</value>
</data>
@@ -1739,12 +1745,6 @@
<data name="&gt;&gt;httpsButton.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="toolStripMenuItem1.Size" type="System.Drawing.Size, System.Drawing">
<value>178, 22</value>
</data>
<data name="toolStripMenuItem1.Text" xml:space="preserve">
<value>Use Alternate Port...</value>
</data>
<data name="httpButton.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Right</value>
</data>
@@ -1833,7 +1833,7 @@
<value>6, 13</value>
</data>
<data name="$this.Size" type="System.Drawing.Size, System.Drawing">
<value>433, 60</value>
<value>429, 56</value>
</data>
<data name="&gt;&gt;setRDPPortToolStripMenuItem.Name" xml:space="preserve">
<value>setRDPPortToolStripMenuItem</value>

140
MainForm.Designer.cs generated
View File

@@ -110,6 +110,19 @@
this.saveMappingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.openMapFileDialog = new System.Windows.Forms.OpenFileDialog();
this.saveMapFileDialog = new System.Windows.Forms.SaveFileDialog();
this.devicesListView = new System.Windows.Forms.ListView();
this.devicesImageList = new System.Windows.Forms.ImageList(this.components);
this.nameColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.stateColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.devicesContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
this.httpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.httpsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.rdpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.sshToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.scpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripSeparator();
this.addMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.addRelayMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.panel5.SuspendLayout();
this.mainPanel.SuspendLayout();
this.mainTabControl.SuspendLayout();
@@ -138,6 +151,7 @@
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.trayIconContextMenuStrip.SuspendLayout();
this.mappingsContextMenuStrip.SuspendLayout();
this.devicesContextMenuStrip.SuspendLayout();
this.SuspendLayout();
//
// panel5
@@ -535,6 +549,7 @@
resources.ApplyResources(this.devicesPanel, "devicesPanel");
this.devicesPanel.BackColor = System.Drawing.SystemColors.ControlLightLight;
this.devicesPanel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.devicesPanel.Controls.Add(this.devicesListView);
this.devicesPanel.Controls.Add(this.noSearchResultsLabel);
this.devicesPanel.Controls.Add(this.noDevicesLabel);
this.devicesPanel.Name = "devicesPanel";
@@ -719,6 +734,117 @@
this.saveMapFileDialog.DefaultExt = "mcrouter";
resources.ApplyResources(this.saveMapFileDialog, "saveMapFileDialog");
//
// devicesListView
//
this.devicesListView.BackColor = System.Drawing.SystemColors.Window;
this.devicesListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.nameColumnHeader,
this.stateColumnHeader});
this.devicesListView.ContextMenuStrip = this.devicesContextMenuStrip;
this.devicesListView.FullRowSelect = true;
this.devicesListView.GridLines = true;
this.devicesListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
this.devicesListView.LargeImageList = this.devicesImageList;
resources.ApplyResources(this.devicesListView, "devicesListView");
this.devicesListView.MultiSelect = false;
this.devicesListView.Name = "devicesListView";
this.devicesListView.SmallImageList = this.devicesImageList;
this.devicesListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
this.devicesListView.UseCompatibleStateImageBehavior = false;
this.devicesListView.View = System.Windows.Forms.View.Details;
this.devicesListView.DoubleClick += new System.EventHandler(this.devicesListView_DoubleClick);
//
// devicesImageList
//
this.devicesImageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("devicesImageList.ImageStream")));
this.devicesImageList.TransparentColor = System.Drawing.Color.Transparent;
this.devicesImageList.Images.SetKeyName(0, "icons01.png");
this.devicesImageList.Images.SetKeyName(1, "icons01t.png");
this.devicesImageList.Images.SetKeyName(2, "icons02.png");
this.devicesImageList.Images.SetKeyName(3, "icons02t.png");
this.devicesImageList.Images.SetKeyName(4, "icons03.png");
this.devicesImageList.Images.SetKeyName(5, "icons03t.png");
this.devicesImageList.Images.SetKeyName(6, "icons04.png");
this.devicesImageList.Images.SetKeyName(7, "icons04t.png");
this.devicesImageList.Images.SetKeyName(8, "icons05.png");
this.devicesImageList.Images.SetKeyName(9, "icons05t.png");
this.devicesImageList.Images.SetKeyName(10, "icons06.png");
this.devicesImageList.Images.SetKeyName(11, "icons06t.png");
this.devicesImageList.Images.SetKeyName(12, "icons07.png");
this.devicesImageList.Images.SetKeyName(13, "icons07t.png");
this.devicesImageList.Images.SetKeyName(14, "icons08.png");
this.devicesImageList.Images.SetKeyName(15, "icons08t.png");
//
// nameColumnHeader
//
resources.ApplyResources(this.nameColumnHeader, "nameColumnHeader");
//
// stateColumnHeader
//
resources.ApplyResources(this.stateColumnHeader, "stateColumnHeader");
//
// devicesContextMenuStrip
//
this.devicesContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.addMapToolStripMenuItem,
this.addRelayMapToolStripMenuItem,
this.toolStripMenuItem3,
this.httpToolStripMenuItem,
this.httpsToolStripMenuItem,
this.rdpToolStripMenuItem,
this.sshToolStripMenuItem,
this.scpToolStripMenuItem});
this.devicesContextMenuStrip.Name = "devicesContextMenuStrip";
resources.ApplyResources(this.devicesContextMenuStrip, "devicesContextMenuStrip");
this.devicesContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.devicesContextMenuStrip_Opening);
//
// httpToolStripMenuItem
//
this.httpToolStripMenuItem.Name = "httpToolStripMenuItem";
resources.ApplyResources(this.httpToolStripMenuItem, "httpToolStripMenuItem");
this.httpToolStripMenuItem.Click += new System.EventHandler(this.httpToolStripMenuItem_Click);
//
// httpsToolStripMenuItem
//
this.httpsToolStripMenuItem.Name = "httpsToolStripMenuItem";
resources.ApplyResources(this.httpsToolStripMenuItem, "httpsToolStripMenuItem");
this.httpsToolStripMenuItem.Click += new System.EventHandler(this.httpsToolStripMenuItem_Click);
//
// rdpToolStripMenuItem
//
this.rdpToolStripMenuItem.Name = "rdpToolStripMenuItem";
resources.ApplyResources(this.rdpToolStripMenuItem, "rdpToolStripMenuItem");
this.rdpToolStripMenuItem.Click += new System.EventHandler(this.rdpToolStripMenuItem_Click);
//
// sshToolStripMenuItem
//
this.sshToolStripMenuItem.Name = "sshToolStripMenuItem";
resources.ApplyResources(this.sshToolStripMenuItem, "sshToolStripMenuItem");
this.sshToolStripMenuItem.Click += new System.EventHandler(this.sshToolStripMenuItem_Click);
//
// scpToolStripMenuItem
//
this.scpToolStripMenuItem.Name = "scpToolStripMenuItem";
resources.ApplyResources(this.scpToolStripMenuItem, "scpToolStripMenuItem");
this.scpToolStripMenuItem.Click += new System.EventHandler(this.scpToolStripMenuItem_Click);
//
// toolStripMenuItem3
//
this.toolStripMenuItem3.Name = "toolStripMenuItem3";
resources.ApplyResources(this.toolStripMenuItem3, "toolStripMenuItem3");
//
// addMapToolStripMenuItem
//
resources.ApplyResources(this.addMapToolStripMenuItem, "addMapToolStripMenuItem");
this.addMapToolStripMenuItem.Name = "addMapToolStripMenuItem";
this.addMapToolStripMenuItem.Click += new System.EventHandler(this.addMapToolStripMenuItem_Click);
//
// addRelayMapToolStripMenuItem
//
this.addRelayMapToolStripMenuItem.Name = "addRelayMapToolStripMenuItem";
resources.ApplyResources(this.addRelayMapToolStripMenuItem, "addRelayMapToolStripMenuItem");
this.addRelayMapToolStripMenuItem.Click += new System.EventHandler(this.addRelayMapToolStripMenuItem_Click);
//
// MainForm
//
resources.ApplyResources(this, "$this");
@@ -762,6 +888,7 @@
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.trayIconContextMenuStrip.ResumeLayout(false);
this.mappingsContextMenuStrip.ResumeLayout(false);
this.devicesContextMenuStrip.ResumeLayout(false);
this.ResumeLayout(false);
}
@@ -847,6 +974,19 @@
private System.Windows.Forms.ToolStripMenuItem saveMappingsToolStripMenuItem;
private System.Windows.Forms.OpenFileDialog openMapFileDialog;
private System.Windows.Forms.SaveFileDialog saveMapFileDialog;
private System.Windows.Forms.ListView devicesListView;
private System.Windows.Forms.ImageList devicesImageList;
private System.Windows.Forms.ColumnHeader nameColumnHeader;
private System.Windows.Forms.ColumnHeader stateColumnHeader;
private System.Windows.Forms.ContextMenuStrip devicesContextMenuStrip;
private System.Windows.Forms.ToolStripMenuItem httpToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem httpsToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem rdpToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem sshToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem scpToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem addMapToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem addRelayMapToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem3;
}
}

View File

@@ -49,6 +49,7 @@ namespace MeshCentralRouter
public Process installProcess = null;
public string acceptableCertHash = null;
public ArrayList mappingsToSetup = null;
public bool deviceListViewMode = true;
public void setRegValue(string name, string value) {
try { Registry.SetValue(@"HKEY_CURRENT_USER\SOFTWARE\Open Source\MeshCentral Router", name, value); } catch (Exception) { }
@@ -170,6 +171,7 @@ namespace MeshCentralRouter
int argflags = 0;
foreach (string arg in this.args) {
if (arg.ToLower() == "-oldstyle") { deviceListViewMode = false; }
if (arg.ToLower() == "-install") { hookRouter(); forceExit = true; return; }
if (arg.ToLower() == "-uninstall") { unHookRouter(); forceExit = true; return; }
if (arg.ToLower() == "-debug") { debug = true; }
@@ -231,6 +233,20 @@ namespace MeshCentralRouter
//scanner.MulticastPing();
if (autoLogin || (authLoginUrl != null)) { nextButton1_Click(null, null); }
// Setup the device list view panel
if (deviceListViewMode)
{
devicesListView.Top = 0;
devicesListView.Left = 0;
devicesListView.Width = devicesPanel.Width;
devicesListView.Height = devicesPanel.Height;
devicesListView.Visible = true;
devicesPanel.AutoScroll = false;
toolStripMenuItem2.Visible = false;
sortByNameToolStripMenuItem.Visible = false;
sortByGroupToolStripMenuItem.Visible = false;
}
}
private void updatePanel1(object sender, EventArgs e)
@@ -369,133 +385,193 @@ namespace MeshCentralRouter
private void updateDeviceList()
{
string search = searchTextBox.Text.ToLower();
devicesPanel.SuspendLayout();
// Untag all devices
foreach (Control c in devicesPanel.Controls)
if (deviceListViewMode)
{
if (c.GetType() == typeof(DeviceUserControl)) { ((DeviceUserControl)c).present = false; }
}
devicesListView.SuspendLayout();
devicesListView.Items.Clear();
/*
lock (meshcentral.nodes)
{
// Add any missing devices
ArrayList controlsToAdd = new ArrayList();
foreach (MeshClass mesh in meshcentral.meshes.Values)
if (meshcentral.nodes != null)
{
if (mesh.type == 2)
foreach (NodeClass node in meshcentral.nodes.Values)
{
foreach (NodeClass node in meshcentral.nodes.Values)
if (node.agentid == -1) { continue; }
ListViewItem device;
if (node.listitem == null)
{
if ((node.control == null) && (node.meshid == mesh.meshid))
device = new ListViewItem(node.name);
device.SubItems.Add(node.getStateString());
device.Tag = node;
node.listitem = device;
} else {
device = node.listitem;
device.SubItems[0].Text = node.name;
device.SubItems[1].Text = node.getStateString();
}
if ((node.meshid != null) && meshcentral.meshes.ContainsKey(node.meshid)) { node.mesh = (MeshClass)meshcentral.meshes[node.meshid]; }
if ((showGroupNamesToolStripMenuItem.Checked) && (node.mesh != null)) {
device.SubItems[0].Text = node.mesh.name + " - " + node.name;
} else {
device.SubItems[0].Text = node.name;
}
bool connVisible = ((showOfflineDevicesToolStripMenuItem.Checked) || ((node.conn & 1) != 0));
int imageIndex = (node.icon - 1) * 2;
if ((node.conn & 1) == 0) { imageIndex++; }
device.ImageIndex = imageIndex;
if (connVisible && ((search == "") || (device.SubItems[0].Text.ToLower().IndexOf(search) >= 0))) { controlsToAdd.Add(device); }
}
// Add all controls at once to make it fast.
if (controlsToAdd.Count > 0) {
devicesListView.Items.AddRange((ListViewItem[])controlsToAdd.ToArray(typeof(ListViewItem)));
}
}
devicesListView.ResumeLayout();
}
else
{
devicesPanel.SuspendLayout();
// Untag all devices
foreach (Control c in devicesPanel.Controls)
{
if (c.GetType() == typeof(DeviceUserControl)) { ((DeviceUserControl)c).present = false; }
}
/*
lock (meshcentral.nodes)
{
// Add any missing devices
ArrayList controlsToAdd = new ArrayList();
foreach (MeshClass mesh in meshcentral.meshes.Values)
{
if (mesh.type == 2)
{
foreach (NodeClass node in meshcentral.nodes.Values)
{
// Add a new device
DeviceUserControl device = new DeviceUserControl();
device.mesh = mesh;
device.node = node;
device.parent = this;
device.Dock = DockStyle.Top;
device.present = true;
node.control = device;
device.UpdateInfo();
device.Visible = (search == "") || (node.name.ToLower().IndexOf(search) >= 0);
controlsToAdd.Add(device);
}
else
{
// Tag the device as present
if (node.control != null)
if ((node.control == null) && (node.meshid == mesh.meshid))
{
node.control.present = true;
node.control.UpdateInfo();
// Add a new device
DeviceUserControl device = new DeviceUserControl();
device.mesh = mesh;
device.node = node;
device.parent = this;
device.Dock = DockStyle.Top;
device.present = true;
node.control = device;
device.UpdateInfo();
device.Visible = (search == "") || (node.name.ToLower().IndexOf(search) >= 0);
controlsToAdd.Add(device);
}
else
{
// Tag the device as present
if (node.control != null)
{
node.control.present = true;
node.control.UpdateInfo();
}
}
}
}
}
// Add all controls at once to make it fast.
if (controlsToAdd.Count > 0) { devicesPanel.Controls.AddRange((DeviceUserControl[])controlsToAdd.ToArray(typeof(DeviceUserControl))); }
}
*/
// Add all controls at once to make it fast.
if (controlsToAdd.Count > 0) { devicesPanel.Controls.AddRange((DeviceUserControl[])controlsToAdd.ToArray(typeof(DeviceUserControl))); }
}
*/
ArrayList controlsToAdd = new ArrayList();
if (meshcentral.nodes != null)
{
foreach (NodeClass node in meshcentral.nodes.Values)
ArrayList controlsToAdd = new ArrayList();
if (meshcentral.nodes != null)
{
if (node.agentid == -1) { continue; }
if (node.control == null)
foreach (NodeClass node in meshcentral.nodes.Values)
{
// Add a new device
DeviceUserControl device = new DeviceUserControl();
if ((node.meshid != null) && meshcentral.meshes.ContainsKey(node.meshid)) { device.mesh = (MeshClass)meshcentral.meshes[node.meshid]; }
device.node = node;
device.parent = this;
device.Dock = DockStyle.Top;
device.present = true;
node.control = device;
device.UpdateInfo();
device.Visible = (search == "") || (node.name.ToLower().IndexOf(search) >= 0);
controlsToAdd.Add(device);
}
else
{
// Tag the device as present
if (node.control != null)
if (node.agentid == -1) { continue; }
if (node.control == null)
{
node.control.present = true;
node.control.UpdateInfo();
// Add a new device
DeviceUserControl device = new DeviceUserControl();
if ((node.meshid != null) && meshcentral.meshes.ContainsKey(node.meshid)) { device.mesh = (MeshClass)meshcentral.meshes[node.meshid]; }
device.node = node;
device.parent = this;
device.Dock = DockStyle.Top;
device.present = true;
node.control = device;
device.UpdateInfo();
device.Visible = (search == "") || (node.name.ToLower().IndexOf(search) >= 0);
controlsToAdd.Add(device);
}
else
{
// Tag the device as present
if (node.control != null)
{
node.control.present = true;
node.control.UpdateInfo();
}
}
}
}
}
// Add all controls at once to make it fast.
if (controlsToAdd.Count > 0) { devicesPanel.Controls.AddRange((DeviceUserControl[])controlsToAdd.ToArray(typeof(DeviceUserControl))); }
// Add all controls at once to make it fast.
if (controlsToAdd.Count > 0) { devicesPanel.Controls.AddRange((DeviceUserControl[])controlsToAdd.ToArray(typeof(DeviceUserControl))); }
// Clear all untagged devices
bool removed;
do {
removed = false;
foreach (Control c in devicesPanel.Controls) {
if ((c.GetType() == typeof(DeviceUserControl)) && ((DeviceUserControl)c).present == false) {
devicesPanel.Controls.Remove(c); c.Dispose(); removed = true;
// Clear all untagged devices
bool removed;
do
{
removed = false;
foreach (Control c in devicesPanel.Controls)
{
if ((c.GetType() == typeof(DeviceUserControl)) && ((DeviceUserControl)c).present == false)
{
devicesPanel.Controls.Remove(c); c.Dispose(); removed = true;
}
}
} while (removed == true);
// Filter devices
int visibleDevices = 0;
foreach (Control c in devicesPanel.Controls)
{
if (c.GetType() == typeof(DeviceUserControl))
{
NodeClass n = ((DeviceUserControl)c).node;
bool connVisible = ((showOfflineDevicesToolStripMenuItem.Checked) || ((n.conn & 1) != 0));
if ((search == "") || (n.name.ToLower().IndexOf(search) >= 0) || (showGroupNamesToolStripMenuItem.Checked && (((DeviceUserControl)c).mesh.name.ToLower().IndexOf(search) >= 0)))
{
c.Visible = connVisible;
visibleDevices++;
}
else
{
c.Visible = false;
}
}
}
} while (removed == true);
// Filter devices
int visibleDevices = 0;
foreach (Control c in devicesPanel.Controls) {
if (c.GetType() == typeof(DeviceUserControl)) {
NodeClass n = ((DeviceUserControl)c).node;
bool connVisible = ((showOfflineDevicesToolStripMenuItem.Checked) || ((n.conn & 1) != 0));
if ((search == "") || (n.name.ToLower().IndexOf(search) >= 0) || (showGroupNamesToolStripMenuItem.Checked && (((DeviceUserControl)c).mesh.name.ToLower().IndexOf(search) >= 0))) {
c.Visible = connVisible;
visibleDevices++;
} else {
c.Visible = false;
}
// Sort devices
ArrayList sortlist = new ArrayList();
foreach (Control c in devicesPanel.Controls) { if (c.GetType() == typeof(DeviceUserControl)) { sortlist.Add(c); } }
if (sortByNameToolStripMenuItem.Checked)
{
DeviceComparer comp = new DeviceComparer();
sortlist.Sort(comp);
}
}
else
{
DeviceGroupComparer comp = new DeviceGroupComparer();
sortlist.Sort(comp);
}
remoteAllDeviceControls();
devicesPanel.Controls.AddRange((DeviceUserControl[])sortlist.ToArray(typeof(DeviceUserControl)));
// Sort devices
ArrayList sortlist = new ArrayList();
foreach (Control c in devicesPanel.Controls) { if (c.GetType() == typeof(DeviceUserControl)) { sortlist.Add(c); } }
if (sortByNameToolStripMenuItem.Checked) {
DeviceComparer comp = new DeviceComparer();
sortlist.Sort(comp);
} else {
DeviceGroupComparer comp = new DeviceGroupComparer();
sortlist.Sort(comp);
devicesPanel.ResumeLayout();
noDevicesLabel.Visible = (sortlist.Count == 0);
noSearchResultsLabel.Visible = ((sortlist.Count > 0) && (visibleDevices == 0));
}
remoteAllDeviceControls();
devicesPanel.Controls.AddRange((DeviceUserControl[])sortlist.ToArray(typeof(DeviceUserControl)));
devicesPanel.ResumeLayout();
noDevicesLabel.Visible = (sortlist.Count == 0);
noSearchResultsLabel.Visible = ((sortlist.Count > 0) && (visibleDevices == 0));
}
private void remoteAllDeviceControls()
@@ -758,6 +834,16 @@ namespace MeshCentralRouter
private void addButton_Click(object sender, EventArgs e)
{
AddPortMapForm form = new AddPortMapForm(meshcentral);
if (sender == null)
{
if (devicesListView.SelectedItems.Count != 1) { return; }
ListViewItem selecteditem = devicesListView.SelectedItems[0];
NodeClass node = (NodeClass)selecteditem.Tag;
if ((node.conn & 1) == 0) { return; } // Agent not connected on this device
form.setNode(node);
}
if (form.ShowDialog(this) == DialogResult.OK)
{
// Add a new port map
@@ -875,6 +961,16 @@ namespace MeshCentralRouter
private void addRelayMapButton_Click(object sender, EventArgs e)
{
AddRelayMapForm form = new AddRelayMapForm(meshcentral);
if (sender == null)
{
if (devicesListView.SelectedItems.Count != 1) { return; }
ListViewItem selecteditem = devicesListView.SelectedItems[0];
NodeClass node = (NodeClass)selecteditem.Tag;
if ((node.conn & 1) == 0) { return; } // Agent not connected on this device
form.setNode(node);
}
if (form.ShowDialog(this) == DialogResult.OK)
{
// Add a new port map
@@ -962,30 +1058,37 @@ namespace MeshCentralRouter
private void searchTextBox_TextChanged(object sender, EventArgs e)
{
// Filter devices
int visibleDevices = 0;
int deviceCount = 0;
string search = searchTextBox.Text.ToLower();
foreach (Control c in devicesPanel.Controls)
{
if (c.GetType() == typeof(DeviceUserControl))
if (deviceListViewMode) {
// Filter devices
updateDeviceList();
} else {
// Filter devices
int visibleDevices = 0;
int deviceCount = 0;
string search = searchTextBox.Text.ToLower();
foreach (Control c in devicesPanel.Controls)
{
deviceCount++;
NodeClass n = ((DeviceUserControl)c).node;
bool connVisible = ((showOfflineDevicesToolStripMenuItem.Checked) || ((n.conn & 1) != 0));
if ((search == "") || (n.name.ToLower().IndexOf(search) >= 0) || (showGroupNamesToolStripMenuItem.Checked && (((DeviceUserControl)c).mesh.name.ToLower().IndexOf(search) >= 0)))
if (c.GetType() == typeof(DeviceUserControl))
{
//if ((search == "") || (n.name.ToLower().IndexOf(search) >= 0)) {
c.Visible = connVisible;
visibleDevices++;
} else {
c.Visible = false;
deviceCount++;
NodeClass n = ((DeviceUserControl)c).node;
bool connVisible = ((showOfflineDevicesToolStripMenuItem.Checked) || ((n.conn & 1) != 0));
if ((search == "") || (n.name.ToLower().IndexOf(search) >= 0) || (showGroupNamesToolStripMenuItem.Checked && (((DeviceUserControl)c).mesh.name.ToLower().IndexOf(search) >= 0)))
{
//if ((search == "") || (n.name.ToLower().IndexOf(search) >= 0)) {
c.Visible = connVisible;
visibleDevices++;
}
else
{
c.Visible = false;
}
}
}
}
noDevicesLabel.Visible = (deviceCount == 0);
noSearchResultsLabel.Visible = ((deviceCount > 0) && (visibleDevices == 0));
noDevicesLabel.Visible = (deviceCount == 0);
noSearchResultsLabel.Visible = ((deviceCount > 0) && (visibleDevices == 0));
}
}
private void devicesTabControl_SelectedIndexChanged(object sender, EventArgs e)
@@ -1166,7 +1269,8 @@ namespace MeshCentralRouter
{
// Find the node
string nodeId = (string)x["nodeId"];
NodeClass node = meshcentral.nodes[nodeId];
NodeClass node = null;
try { node = meshcentral.nodes[nodeId]; } catch (Exception) { }
if (node == null) continue;
// Add a new port map
@@ -1245,6 +1349,102 @@ namespace MeshCentralRouter
try { loadMappingFile(File.ReadAllText(s[0]), 2); } catch (Exception) { }
}
private void devicesContextMenuStrip_Opening(object sender, System.ComponentModel.CancelEventArgs e)
{
if (devicesListView.SelectedItems.Count != 1) { e.Cancel = true; return; } // Device not selected
ListViewItem selecteditem = devicesListView.SelectedItems[0];
NodeClass node = (NodeClass)selecteditem.Tag;
if ((node.conn & 1) == 0) { e.Cancel = true; return; } // Agent not connected on this device
if (node.agentid < 6)
{
// Windows OS
sshToolStripMenuItem.Visible = false;
scpToolStripMenuItem.Visible = false;
rdpToolStripMenuItem.Visible = true;
}
else
{
// Other OS
sshToolStripMenuItem.Visible = true;
scpToolStripMenuItem.Visible = true;
rdpToolStripMenuItem.Visible = false;
}
}
private void httpToolStripMenuItem_Click(object sender, EventArgs e)
{
if (devicesListView.SelectedItems.Count != 1) { return; }
ListViewItem selecteditem = devicesListView.SelectedItems[0];
NodeClass node = (NodeClass)selecteditem.Tag;
if ((node.conn & 1) == 0) { return; } // Agent not connected on this device
QuickMap(1, 80, 1, node); // HTTP
}
private void httpsToolStripMenuItem_Click(object sender, EventArgs e)
{
if (devicesListView.SelectedItems.Count != 1) { return; }
ListViewItem selecteditem = devicesListView.SelectedItems[0];
NodeClass node = (NodeClass)selecteditem.Tag;
if ((node.conn & 1) == 0) { return; } // Agent not connected on this device
QuickMap(1, 443, 2, node); // HTTPS
}
private void rdpToolStripMenuItem_Click(object sender, EventArgs e)
{
if (devicesListView.SelectedItems.Count != 1) { return; }
ListViewItem selecteditem = devicesListView.SelectedItems[0];
NodeClass node = (NodeClass)selecteditem.Tag;
if ((node.conn & 1) == 0) { return; } // Agent not connected on this device
int rdpport = 3389;
if (node.rdpport != 0) { rdpport = node.rdpport; }
QuickMap(1, rdpport, 3, node); // RDP
}
private void sshToolStripMenuItem_Click(object sender, EventArgs e)
{
if (devicesListView.SelectedItems.Count != 1) { return; }
ListViewItem selecteditem = devicesListView.SelectedItems[0];
NodeClass node = (NodeClass)selecteditem.Tag;
if ((node.conn & 1) == 0) { return; } // Agent not connected on this device
QuickMap(1, 22, 4, node); // Putty
}
private void scpToolStripMenuItem_Click(object sender, EventArgs e)
{
if (devicesListView.SelectedItems.Count != 1) { return; }
ListViewItem selecteditem = devicesListView.SelectedItems[0];
NodeClass node = (NodeClass)selecteditem.Tag;
if ((node.conn & 1) == 0) { return; } // Agent not connected on this device
QuickMap(1, 22, 5, node); // WinSCP
}
private void addMapToolStripMenuItem_Click(object sender, EventArgs e)
{
if (devicesListView.SelectedItems.Count != 1) { return; }
ListViewItem selecteditem = devicesListView.SelectedItems[0];
NodeClass node = (NodeClass)selecteditem.Tag;
if ((node.conn & 1) == 0) { return; } // Agent not connected on this device
addButton_Click(null, null);
}
private void addRelayMapToolStripMenuItem_Click(object sender, EventArgs e)
{
if (devicesListView.SelectedItems.Count != 1) { return; }
ListViewItem selecteditem = devicesListView.SelectedItems[0];
NodeClass node = (NodeClass)selecteditem.Tag;
if ((node.conn & 1) == 0) { return; } // Agent not connected on this device
addRelayMapButton_Click(null, null);
}
private void devicesListView_DoubleClick(object sender, EventArgs e)
{
if (devicesListView.SelectedItems.Count != 1) { return; }
ListViewItem selecteditem = devicesListView.SelectedItems[0];
NodeClass node = (NodeClass)selecteditem.Tag;
if ((node.conn & 1) == 0) { return; } // Agent not connected on this device
addButton_Click(null, null);
}
/*
private delegate void displayMessageHandler(string msg, int buttons, string extra, int progress);
private void displayMessage(string msg, int buttons = 0, string extra = "", int progress = 0)

View File

@@ -1323,6 +1323,240 @@
<data name="devicesPanel.AutoScroll" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="nameColumnHeader.Text" xml:space="preserve">
<value>Name</value>
</data>
<data name="nameColumnHeader.Width" type="System.Int32, mscorlib">
<value>250</value>
</data>
<data name="stateColumnHeader.Text" xml:space="preserve">
<value>State</value>
</data>
<data name="stateColumnHeader.Width" type="System.Int32, mscorlib">
<value>198</value>
</data>
<metadata name="devicesContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>161, 56</value>
</metadata>
<data name="addMapToolStripMenuItem.Font" type="System.Drawing.Font, System.Drawing">
<value>Segoe UI, 9pt, style=Bold</value>
</data>
<data name="addMapToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>163, 22</value>
</data>
<data name="addMapToolStripMenuItem.Text" xml:space="preserve">
<value>Add &amp;Map...</value>
</data>
<data name="addRelayMapToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>163, 22</value>
</data>
<data name="addRelayMapToolStripMenuItem.Text" xml:space="preserve">
<value>Add &amp;Relay Map...</value>
</data>
<data name="toolStripMenuItem3.Size" type="System.Drawing.Size, System.Drawing">
<value>160, 6</value>
</data>
<data name="httpToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>163, 22</value>
</data>
<data name="httpToolStripMenuItem.Text" xml:space="preserve">
<value>HTTP</value>
</data>
<data name="httpsToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>163, 22</value>
</data>
<data name="httpsToolStripMenuItem.Text" xml:space="preserve">
<value>HTTPS</value>
</data>
<data name="rdpToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>163, 22</value>
</data>
<data name="rdpToolStripMenuItem.Text" xml:space="preserve">
<value>RDP</value>
</data>
<data name="sshToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>163, 22</value>
</data>
<data name="sshToolStripMenuItem.Text" xml:space="preserve">
<value>SSH</value>
</data>
<data name="scpToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>163, 22</value>
</data>
<data name="scpToolStripMenuItem.Text" xml:space="preserve">
<value>SCP</value>
</data>
<data name="devicesContextMenuStrip.Size" type="System.Drawing.Size, System.Drawing">
<value>164, 164</value>
</data>
<data name="&gt;&gt;devicesContextMenuStrip.Name" xml:space="preserve">
<value>devicesContextMenuStrip</value>
</data>
<data name="&gt;&gt;devicesContextMenuStrip.Type" xml:space="preserve">
<value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<metadata name="devicesImageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 56</value>
</metadata>
<data name="devicesImageList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADg
HQAAAk1TRnQBSQFMAgEBEAEAARgBAAEIAQABEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABUAMAAQEBAAEYBgABPP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AJYAA/0D+AP3A/sD/yEAA/0D+gP5
A/wD/xgAAfoB+wH6A/4qAAP9A/8tAAP7A88D1QPbA88D1AO+A9QYAAP8A90D4APjA90D4APUA+MSAAP8
AZEBjwF9AU4BaAEhAfQB9QH0JAAD/gPRA8YD+ioAAcYCxwHPAtAB2ALZA90DywPBA68DmgP3FQAD2APd
A+ID4wPaA9UDzAPAA/kMAAP/AVgBbwEyAWMBcwE/ASwBMwEgAU8BYQEvAbABugGhHgAD/wPIA8kDvAPF
A+IhAAP/A/ABugK7ArYBtwPAAdIC0wOrA4YDgQOiA94D/wwAA/8D9APTA9AD1APfA8oDtgOyA8QD6QP/
CQABaAF9AUMBTwFnASMBUgFpASkBowGmAZ0DLgFKAVYBNgFbAXABPgP5GAADzQbGA9gDvAPDA8kD/A8A
A/YC0wHUArYBtwKbAZ0BpwGWAYQBtAGPAWcBwAGOAVYBtgGAAUUByQG6AagBxgHJAcoCqgGsAqcBqQKv
AbABwQGxAa0BvwK6A/oD+QPjA9EDwgO9A7YDtAOtA9AD2QPKA8gDzAPNA9MD/AYAAXoBjAFfAUMBWwE0
AUIBTgErASkBLgEXAUcBYQEaAVMBcwFYATYBbwF8AUcBVQEqAWIBZwFVAa4BrQGsEgAD0wPEA8EDuwPE
BsoDwgPHA+AMAAK5AbwBrQGBAU4BtQGAAUQBwgGGAUUBxQGKAUkBxwGLAUoBxgGLAUkBxQGJAUkBxwGj
AXoBxwK8AbcBfQF2AbMBRQE3AaYBGQEIAaYBGgEJAcIBqQGmA/ED1AOuA60DrwmyA7ADwAPTA7IDmAaC
A8gD9gMAAZkBpQGIAVMBaAEqAT8BUAEhAR8BIQETAUoBYgEfAUYBXwEZAUcBYgEmAUUBXgEZAVsBaQFB
AVMBYAF4ASwBRAFpAYoBjwF5A/0JAAPdA8YDwQO6BsQDxQPEA8YDyAPCA9ID/gYAA+kBsgF/AUYBswGB
AUcBugGCAUQBvwGGAUcByQGOAUoB1QGTAUkB3QGVAUcBygGRAVIBtwGpAagBuAF6AXMBsgFTAUcBsgEz
ASEBtAEqARcByAGaAZMD1wPwCa0DrwOyA7UDtgO1A8gDsgOfA40DiwPCA+UB0QHWAc0BQAFUASUBQQFb
AS4BKQEvARcBRQFeARkBRAFdARkBRAFcARkBRAFFATsBQAE+ATsBQwFbARgBQgFSASIBeQF4AW0BFQIS
AUYBVQEoAdIB1gHMAwAD7gPCA8MDuwnDA8ADvwPDA8EDzAO3A8ID7AMAA/0BuQGEAUgBrwF+AUcBsAF/
AUYBtgGCAUgB5gGYAUMB8wGfAUMB+QGkAUcB7QGfAUcBqQKlAcABigGCAboBYgFXAbwBSAE3Ab0BOwEo
AcoBegFtAasCrAP9A68GrAOuA7YDugO8A7oDxgO6A6YDmQOTA7IDyQP/AW8BfgGBAScBKQEoAUgBWAEs
ATwBSQErAUMBWwEYAUIBWgEYAR8CHAEeARoBHAFGAVwBHwE6AU0BPAEPAQ4BDQFCAUQBMQFXAU8BSQGx
AakBowFfAW8BPwP/A9ADuwPDA8AGwwa5A8MDwQO2A8ADwgPZA8gDAAG5AYQBSQGoAXkBQwGrAXwBRgG4
AYMBSAH9Aa0BUQH+AbABWAH/AbYBZQH+AbkBaQGxAa4BrwHIAZkBkwG/AXEBZgHDAVsBTAHEAUsBOgHH
AVYBQwOlAwADrwOpA6oDrgPAA8MDxgPIA8sDwgOtA6IDmwOfA8YGAAHbAd8B4AFWAWABZgEnAS8BJwFL
AVwBRgFBAVgBIgFFAVsBJAFCAVgBIQFCAVkBOAFTAV0BQAFEAVgBIQFWAU8BSAGUAYoBhAGhAZcBkAGs
AaQBngYAA/IDyAO8A8UMwwPEBsMD0QPUA9gDAAGzAYIBSgGpAXgBQAGoAXoBRQHCAYkBSAH+AcABewH9
AcIBgAH2AcMBiwHqAcUBmgHKAskBywGiAZ0BwgF8AXMBxwFqAVwByQFZAUgBxwFKATYDuQMAA64DqAOq
A7ADzQPOA9ED0gPaA8YDsgOqA6IDmgPRCQAD/gHAAcYByAF4AZMBewEGAZ4B1AEZAV0BZQFBAVgBOQE/
AVIBHgEfARwBHgE+AVEBHQFuAWcBXwGhAZcBkAGhAZcBkAGhAZgBkQkAA/4D6QPXA9kDxgPDA8EDuQPB
A8gG1APVAwABwAGeAXcBqwF3ATwBqgF7AUQBzgGYAVoB5gG2AYAB2QGzAYgB1wG8AaEB4gHTAcwB4AHJ
AcUB1AGqAaQBxwGDAXkByQF3AWkBygFnAVYByAFeAUoDzQMAA74DpwOqA7gGygPQA98D2gPLA7gDsAOo
A6UD3A8AAdEB0wHZAUMB6gH8AS0BzQHtAYYBXwE6AVUBWwEnAVkBcgFbAVUBTgFIAW8BaAFiAagBoQGb
Ab8BuwG3A/8PAAPuA+0D5QPFA8MDygPCA8kD1wPiA/8DAAPkAeMC3gHqAeMB4QHgAtoB1AGbAZMB0QGR
AYkB0wGIAX4B1QGAAXQB1wF8AW4B2AGYAY8B1AGRAYgBzgGCAXYBygFwAWIByQFsAVwD5AMAA+wD6APq
A+QDwwO+A7oDtgO0A8IDvgO2A60DqgPoDwABagFmAXEB8QLzAdIBwAGtAcEBjgFhAbgBhQFZAU0BYAFL
AWsBZQFfAbcBrwGoAakBogGbAe0C7BIAA8wD+QPmA9EDzwPFA8kD2wPXA/YPAAHjAeIB4wGoASsBGwG0
ATUBJAG9AToBJwHBAS4BFwHLAVEBPwHLAXUBaQHLAXMBZgHKAXIBZAHKAW4BYAHJAWgBVwHtAeoB6QwA
A+sDigOPA5IDjAOeA7ADrwOuA60DqgPrFQAD/AHzAfAB7QP+A/sD/wHfAd0B2wHCAcABvhsAA/4D+AP/
A/0DAAPvA+YSAAPtAZoBFgEGAagBEwEAAbMBFgEBAb0BHAEEAb8BWgFIAc0BkgGHAdEBtAGuAdcByAHE
Ad0C2gPsA/IMAAPyCX8DgwOiA74D0APZA+QD8AP1bAAD+AHFAcQBxQPkA/UD+wP9A/8bAAP6A9kD7QP4
A/wD/gP//wD/AP8AIQAD9QPrA88DuAOsA98eAAP5A/QD5QPeA9oD6yQAA+8D6QPjA+okAAP1A/MD6gP0
FQAD7gPRAawCrQG2ArQBzAHHAcYBxwLBAUkBkQFlAZUClAOJA6sD9A8AA/MD5QPbA90D4gPgA9AD0wPR
A9oD+RIAA/UBqgGrAaoBUgFRAVMBOAE7ATcBGwEhARoDoQOkAZ0BngGfAbMCtAPkEgAD+gPeA8QDvgO6
A9cD2APWA90D8AwAA+sByALFAegC3wH0AuoB8ALmAeEB2AHZAcwCxgFtAZoBeAGYApcDoAOOA4QD4AkA
A/AD4QPqA+0D7APnA+ID0wPVA9cD0gPPA+wJAAPgAYoBiwGKASYBLgEgAwMBCwEPAQkBKQEgARoBUgFB
ATUDswPBAYgCiQGEAYUBhgGbApwDrgkAA+0D0gO8A7QDtgO5A8AD3QPhA9ED0APWA9sJAAPNAdQC0AHl
At4B8gLoAfYC7AHgAtkBoQKfAqoBqwPJA+YDxgOWA5IDrQP7AwAD5APlA+kD7QPuA+cD1wPaA+MD7APi
A9QD0wPaA/0DAAOCAWABXgFdAWIBTAFCAYkBgQF6AcUBwwHCAdIC0AHPAc4BzQHKAsgBxALDAb4CvQO8
AasCrAOFAqsBrAP6AwADzwPHA8IDzwPhA+UD5APjA+EG3wPaA88D2gP9AwADzwGuAqwBpQKmAsoBywHn
AegB6gHWAdcC2QHWAdQB4gHeAdoBzAHIAcQBvAG5AbgBxQLEA+MDugOhA9UDAAPlA9oD2QPjA+wG5wPp
A+ID3gPhA+oD3gPXA+YDAALjAeIB2QHXAdYB4gHfAd4B4gHfAd4B4QHeAt0B2wHaAdgC1QHUAdIB0QHP
As0CswGyAZwBmwGcA7MDxAKEAYUDuwMAA+oD5wnpA+gD5gPlA+QD3APWA9wD4QPQA94GAAP3AuwB7QHw
AfIB9AT1AvYD7QPlA90B1QLWAdAC0QKuAa0B1AHTAdQD2wP5BgAD+wPuA+8G8APuA+wD6QPnA+UD2wPm
A+kD/AkAAe0C6wHpAuUB5wHkAeMBtAKzAbYBtAG1Aa8CrgGiAaABoQGfAqACmwGcA5sDoQO1A+8JAAPv
BusD3APdA9sG1wbVA9cD3QPwDwAD8gHrAewB7QHzAfUB9gHSAdMB1AHRAtIB4gHkAeUB2ALZAdMC1APb
A+0SAAP2A+8D8APnA+YD6wPoA+YD7QPyFQAB6wLpAeAC3QGzArIBnQGcAZ0DrAPXA+sbAAPwA+kD3APW
A9sD6gPx/wD/AP8A/wCfAAP5AdsC2gG6ArcBngKZAa0BqAGqAb8BvgG/A+8bAAP8A+gD3gPVA9kD4AP1
eAABrQGqAasBnAGXAZUBoQGbAZoBogGcApsBkgGRAbUBrQGuAaQBnwGgA8QD5hUAA9oD1AbWA9MD2wPX
A+ED7BsAA/EBqgGpAacCaQFnA+8kAAP4A9kDyAP4GwAD1AG9AbwBvQHPAc0BzAHXAdYB1QHfAd4B3QGl
AZ8BoAG0Aa4BsQG1AbABsQK3AbYD3wPuDwAD5gPfA+QD5gPpA9cG2wPeA+kD7g8AAtQB0wGGAYUBgwJv
AW0CSgFLA1gDkwNeAYgBhwGGGAAD6wPPA8oDwQPGA9QDxgPRGAADzQPOAbkBuAG3A+AB3gLdAc4BzAHN
AcgBxgHIAb8CvQOnA+wD9AP6DAAG5APeA+oD6QPkA+ID3wPaA+4D8AP8DAAD6AOWA9ID4wPkA8wD+QOV
An4BfQP4EgAD8wPVA+YG6wPjA/ID1QPPA/sSAALAAcEBwwK/AbwBpwGfAakBewFrAZgBWAFEAYIBNAEc
AXsBKQEQAawBhQF6A7UVAAbgA9kDzgPFA74DvAPRA94VAAPpA+cD6gboA88D6gPcA64D4QPvDwAD8wPs
A+0G7APkA+0D6QPbA+oD9A8AAcYBtAGvAcMBZgFJAbMBWQE9AaQBTAEyAZ4BSwEyAYwBOQEgAYYBNAEa
Aa0BhgF6ArQBsxUAA90DyQPGBsMDvwO+A9ED3hUAA+kB6wLqA+4D7APrA9AD1QPGA7gD9gP8DwAD8wPt
A+4G7QPlA+YD4QPeA/oD/g8AAb0BqgGkAckBbAFOAbsBYAFDAa0BVAE4AaQBTwE0AZoBRgEsAZMBPwEl
Aa8BiAF7AbYBtQGzFQAD2QPKA8cGxAPCA8AD0QPdFQAD6QPuA/IG8APRA78DsgO7FQAD8wPuCe8D5QPg
A9wD3xUAAbgBoAGYAdEBcAFTAcQBZwFKAbsBYwFHAa4BVQE5AakBUwE5AaMBSwEwAa4BhAF3AbUBtAGx
FQAD1wPLA8kDyAPFA8QDwwPQA90VAAPpA/ED9gb0A9IDrQOqA7wVAAPzA+8D8QbwA+YD2wPaA98VAAG3
AZkBkQHYAXkBWwHPAXEBUwHLAXUBWwG9AWEBRQG4AV4BQwGzAVkBPQGtAYEBcwK0AbEVAAPVA80DywPM
BscDxQPPA90VAAPpA/QD+gb4A88DqQOqA70VAAPzA/AD8gbxA+UD2QPaA+AVAAG9AZ8BlgHlAY8BdQHe
AYcBbAHXAYEBZgHNAXUBWgHHAW8BUwHFAWwBUAGxAYcBeQG4AbcBthUAA9cD0wPRA88DzAPLA8oD0APe
FQAD6QL1AfQD/QP8A/0DzgOpA6oDvhUAA/MD8AnzA+QD2QPaA+ASAAP5AcoBqQGfAe0BnQGFAesBogGL
AeIBkgF5AeABkQF4AdgBgQFmAdUBfgFjAbkBjwGCAboBuQG4EgAD/APaA9YD2AbTA88DzgPSA98VAAPp
A+8BdwGcAXkBrQG6Aa4DzgPTA6kDqgO+FQAD8wPuA9QD3QPkA+YD2QPaA+ASAAPzAdgBtgGrAfIBsgGf
AfIBtQGiAewBpQGOAesBngGIAeMBjAFyAeIBiAFuAcABlQGIArwBuxIAA/gD3QPcA90D2APXA9ID0QPU
A98VAAPqA/IC7gHvBugD5wO2A6sDwBUAA/QD7wPuCewD3QPaA+ESAAPyAdoBuQGuAfUBxAG0AfQBwwGy
AfIBtwGlAfABpQGPAe4BlQF6Ae0BkQF1AcEBlgGHAr0BvBIAA/cD3gbhA90D2QPUA9MD1APgFQAD8APo
AdcC1gG5AbgBtwGtAawBqgGsAasBqQG5AbgBtwK1AbQDzRUAA/YD7APnA94G2gPeA90D5BIAA/EBswGk
AaEBrAGgAZsBowGbAZkBoAGcAZsBpQGkAaIBqwGsAasBrgKvAa0BrgGtA7QSAAP3A9gD1wbWA9gD2gPb
A9oD3R4AA/cD9SoAA/sD+h4AA/0B1AHMAccByAHDAb8BwwHAAb0BcQJuAdIBzgHJAcQBvQG5AckBwQG9
AeUC4wP8EgAD/gPkA+ED4APKA+QD3wPgA+sD/v8A/wAD9APTA9cDzAPBA+gD9QP2GAAD+QPmA+cD5APg
A/IG+hgAA/EBqwGlAaQBzAG/AbgBqAKmJAAD+APYA+AD2RUAA/AD8gP4AwAD9QO9A88D3APNA78GpgPH
A+kGAAb3A/sDAAP5A+AD5APpA+QD4AbYA+ID7AkAA/IB2QLYAbcCsgHSAswB/AH5AfUB7AHiAdgB5QHW
AcQB3gHKAbEBhgGAAXsD9RIAA/cD7APcA+MD8gPqA+YD4gPOA/oMAAHQAs8BhAKDA3gDlQO9A+4DswO5
A7sDogN6A5sDxAPaA+0DAAPlA88DzQPUA98D9QPcA94D3wPYA80D1QPhA+gD9AMAAcoDyQLDAegC4wHY
AtcDhgN1AYUCgwGHAX4BeAFNAT4BOgE8ASkBJQFEATYBNQE6AjYDtAkAA+MD4QPrA+cD0APMBs8DvwO7
Br4D4wkAAcICwQGbApYDigOdA54DrgO3ArABsQKQAZIBlAGYAZwBswKwAcMBkgGLAcEBnwGbA/MGAAPh
A9QD0QbWA9sD3QPbA9ID1QPbA9QD2AP5BgAB5wLiAd0C1gHTAc8B0AGWApQBYAJcAUgCQAFJAT4BPAFH
AToBNgFEATMBLwFKATwBOQFUAksBYgFMATcBjgKNA9QGAAPqA+cD5QPVA8YDwAO/A74DvQO/BsID0gPm
BgABvwK+AZwClwOeAp0BngGGAZYBkAKgAaIBnwF3AXUBkgEyASoBlgEYAREBpQEfARABrgEoARUBtgEt
ARoBwAF2AWwD4QYAA98D1QbWA9MD1wPNA8EGvQO+A78DzgPqCQAD/AHIAsMBZgFhAWIBTQFIAUcBWAFR
AVABaQFjAWIBXgJaAUECPwFEAkEBVQJWAUkBUAFRAWgBWQFUAc0CzAkAA/4D4QPHA8EDwwPHA8UGwAPE
A8MDxQPkBgABuAK3AZsClwOvAbEBsgGzAYYBDwEHAYcBEgELAYQBDAEBAZMBDwEAAaMBEwEAAcMBSgE4
AdEBVQFAAdgBWQFEAdUBbAFZAcoCywYAA90D1APbA9wDugO7A7oDuwO8A8QDxgPHA8sD4w8AA/wD+QPC
AVsBXwFgA2QBnAFoAVEBxAFMARwBzQFBAQYBxgE6AQUBzwFIAQ0B1QHMAccPAAP+A/wD4QPGA8cDyAPE
A8IDwQPDA+QGAAO2AZ0CmgO4A70BlQE3ATABlwEwASkBkAEPAQIBpAETAQABtQEVAQAB4AF8AWsB6AGA
AW4B7gGFAXIB7AGAAWwBtwK4BgAD3QPVA90D3wPAA74DuwO8A70DzgPQA9ED0APeEgAB5gHhAeABrwEp
AQYBrAEvAQ8BtAE6ARgBvgFDAR8BxwFJASIB0AFaATEB0QFTASsB1wFVASkBzQG5AbASAAPwA74DvwPB
A8IDwwPHA8UDxgPeBgABtAK1AZgBlgGXA70DxgGcAVUBUQGsAVIBSQGfAREBAAGyARQBAAHIARsBAwHx
AaYBmQH3AacBmQH8AasBnQH+AaMBkQG1AbYBtwYAA90D1APfA+IDxwPFA7wDvQO/BtoD2wPZA90SAAHv
AfIB8wG2AUcBKgG3AUsBLwG4AUABIgHBAUQBJAHMAUoBKQHeAXYBVgHjAXsBWAHlAXgBUQHQAaIBjxIA
A/QGwwPBA8IDxAPNA84DzQPYBgAD3QHRAdIB0wHLAcwBzQHMAs0BqAF8AXkBoQEpARwBswEWAQAB0QEd
AQAB7AEwAQ4B/wHHAboB/wHMAbwB/wHRAb8B/wHPAbkBwALBBgAD7QPoBuQDzwO/A70DvwPDA+ID4wPl
A+QD4BUAAb0BXwFHAcEBXQFFAcMBTgEzAc0BUgE1AdkBYgFDAekBlgF8Ae0BnAF/Ae4BmAF3AeABlQF1
A/oSAAbHA8UDxgPJA9QD1gPVA9QD/A8AAb0BrQGrAaMBEwEBAb4BGQEAAdwBIAEAAfkBawFOAf8B3gHV
Af8B4QHXAf8B5gHbAf8B5wHdAdwC2wP9DwAD2wO8A74DwAPMA+kD6gPrA+wD6AP+EgABwgF1AWEBwQFa
AUIBzwFeAUMB3wFmAUgB7QGEAWkB9AG3AaMB8gG0AZwB8QGzAZcB6wGkAX4D+RIAA80DxgPIA8oD0QPd
BtwD2AP8DwACzgHPAaYBEgEAAcQBGwEAAeMBHwEAAf8BsAGgAfsBzgG/Ae8BxgG1AeoBxQG1AegBzwHF
Ae8B7gHvA/oPAAPkA7wDvgPAA9wD5APiA+ED5APzA/wSAAHCAYsBfQHKAWMBTQHaAW0BVQHpAXQBWQH3
AbYBpAH2AcwBvAH1AcUBsgHzAcMBrwH0AbwBoAHiAuESAAPSA8kDywPNA94D5AbhA94D6g8AAeAC4QG0
AZ0BnAHKAcMBwgHjAeQB5QHvAvAD8h4AA+8D2APiA+sG9yEAAcYBrAGmAc4BbgFaAd8BfAFnAfABgQFq
AfcBzgHCAekBxQG4AdoBvgGzAdUBxQG+AdoB1QHSA98SAAPbA8sDzgPQA+QD4QPfA+ED5gPpcgAC5AHj
Ad8B1QHUAe0B7AHrA/UD9iEAA+8D5wPuBvr/AJAAAUIBTQE+BwABPgMAASgDAAFAAwABUAMAAQEBAAEB
BQABgAECFgAD/4EABf8BBwH/AQcB+QH/AfkB/wH8AQMB/AEDAfAB/wHwAf8B/AEBAfwBAQHgAX8B4AF/
AfABAAHwAQAB4AEfAeABHwQAAcABDwHAAQ8EAAGAAQMBgAEDBQABAQEAAQEIAAGAAQABgAEAAcABAAHA
AQABgAEAAYABAAHgAQAB4AEAAYABAAGAAQAB+AEAAfgBAAGAAQABgAEAAfgBAQH4AQEB8AEAAfABAAH+
AQMB/gETAfABAAHwAQAE/wHwAR8B8AEfIP8B+AEfAfgBHwH+AR8B/gEfAcABBwHAAQcB4AEHAeABBwGA
AQMBgAEDAYABAwGAAQMBgAEAAYABAAGAAQABgAEAAYABAAGAAQABgAEAAYABAAHAAQABwAEAAeABAAHg
AQAB+AEBAfgBAQH8AQcB/AEHMP8B/AEHAfwBBwT/AfgBAwH4AQMB/gEfAf4BHwHwAQEB8AEBAfABDwHw
AQ8B8AEAAfABAAHwAQMB8AEDAfABBwHwAQcB8AEBAfABAQHwAQcB8AEHAfABAQHwAQEB8AEHAfABBwHw
AQcB8AEHAfABBwHwAQcB8AEHAfABBwHwAQcB8AEHAfABBwHwAQcB8AEHAfABBwHwAQcB8AEHAeABBwHg
AQcB8AEHAfABBwHgAQcB4AEHAfABBwHwAQcB4AEHAeABBwHwAQcB8AEHAeABBwHgAQcB/gF/Af4BfwHg
AQcB4AEHFP8B/gEBAf4BAQH+AR8B/gEfAcQBAAHEAQAB4AEHAeABBwGAAQABgAEAAYABAwGAAQMBgAEB
AYABAQGAAQEBgAEBAYABAQGAAQEBwAEBAcABAQGAAQEBgAEBAfABAQHwAQEBgAEBAYABAQH4AQEB+AEB
AYABAQGAAQEB+AEBAfgBAQGAAQEBgAEBAfwBAAH8AQAB+AEAAfgBAAH8AQAB/AEAAfgBAAH4AQAB/AEA
AfwBAAH4AR8B+AEfAfwBAAH8AQAE/wH8AR8B/AEfEP8L
</value>
</data>
<data name="devicesListView.Location" type="System.Drawing.Point, System.Drawing">
<value>10, 4</value>
</data>
<data name="devicesListView.Size" type="System.Drawing.Size, System.Drawing">
<value>446, 210</value>
</data>
<data name="devicesListView.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="devicesListView.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;devicesListView.Name" xml:space="preserve">
<value>devicesListView</value>
</data>
<data name="&gt;&gt;devicesListView.Type" xml:space="preserve">
<value>System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;devicesListView.Parent" xml:space="preserve">
<value>devicesPanel</value>
</data>
<data name="&gt;&gt;devicesListView.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="noSearchResultsLabel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
@@ -1336,7 +1570,7 @@
<value>2, 88</value>
</data>
<data name="noSearchResultsLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>458, 52</value>
<value>454, 52</value>
</data>
<data name="noSearchResultsLabel.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
@@ -1360,7 +1594,7 @@
<value>devicesPanel</value>
</data>
<data name="&gt;&gt;noSearchResultsLabel.ZOrder" xml:space="preserve">
<value>0</value>
<value>1</value>
</data>
<data name="noDevicesLabel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
@@ -1375,7 +1609,7 @@
<value>2, 88</value>
</data>
<data name="noDevicesLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>458, 52</value>
<value>454, 52</value>
</data>
<data name="noDevicesLabel.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
@@ -1396,7 +1630,7 @@
<value>devicesPanel</value>
</data>
<data name="&gt;&gt;noDevicesLabel.ZOrder" xml:space="preserve">
<value>1</value>
<value>2</value>
</data>
<data name="devicesPanel.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
@@ -1465,7 +1699,7 @@
<value>2, 79</value>
</data>
<data name="noMapLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>458, 52</value>
<value>454, 52</value>
</data>
<data name="noMapLabel.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
@@ -1953,7 +2187,7 @@ Click "Add" to get started.</value>
<value>$this</value>
</data>
<data name="&gt;&gt;panel5.ZOrder" xml:space="preserve">
<value>3</value>
<value>4</value>
</data>
<metadata name="stateClearTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
@@ -5535,6 +5769,72 @@ Click "Add" to get started.</value>
<data name="&gt;&gt;saveMapFileDialog.Type" xml:space="preserve">
<value>System.Windows.Forms.SaveFileDialog, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;devicesImageList.Name" xml:space="preserve">
<value>devicesImageList</value>
</data>
<data name="&gt;&gt;devicesImageList.Type" xml:space="preserve">
<value>System.Windows.Forms.ImageList, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;nameColumnHeader.Name" xml:space="preserve">
<value>nameColumnHeader</value>
</data>
<data name="&gt;&gt;nameColumnHeader.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;stateColumnHeader.Name" xml:space="preserve">
<value>stateColumnHeader</value>
</data>
<data name="&gt;&gt;stateColumnHeader.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;httpToolStripMenuItem.Name" xml:space="preserve">
<value>httpToolStripMenuItem</value>
</data>
<data name="&gt;&gt;httpToolStripMenuItem.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;httpsToolStripMenuItem.Name" xml:space="preserve">
<value>httpsToolStripMenuItem</value>
</data>
<data name="&gt;&gt;httpsToolStripMenuItem.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;rdpToolStripMenuItem.Name" xml:space="preserve">
<value>rdpToolStripMenuItem</value>
</data>
<data name="&gt;&gt;rdpToolStripMenuItem.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;sshToolStripMenuItem.Name" xml:space="preserve">
<value>sshToolStripMenuItem</value>
</data>
<data name="&gt;&gt;sshToolStripMenuItem.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;scpToolStripMenuItem.Name" xml:space="preserve">
<value>scpToolStripMenuItem</value>
</data>
<data name="&gt;&gt;scpToolStripMenuItem.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;toolStripMenuItem3.Name" xml:space="preserve">
<value>toolStripMenuItem3</value>
</data>
<data name="&gt;&gt;toolStripMenuItem3.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;addMapToolStripMenuItem.Name" xml:space="preserve">
<value>addMapToolStripMenuItem</value>
</data>
<data name="&gt;&gt;addMapToolStripMenuItem.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;addRelayMapToolStripMenuItem.Name" xml:space="preserve">
<value>addRelayMapToolStripMenuItem</value>
</data>
<data name="&gt;&gt;addRelayMapToolStripMenuItem.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;$this.Name" xml:space="preserve">
<value>MainForm</value>
</data>

View File

@@ -521,10 +521,12 @@ namespace MeshCentralRouter
private void ProcessWsBuffer(byte[] data, int offset, int len, int op)
{
//parent.Debug("#" + counter + ": Websocket frag data: " + acclen);
if ((tunneling == false) && (data[offset] == 'c'))
int opcode = op & 0x0F; // 1 == String, 2 == Binary
parent.Debug("#" + counter + ": Websocket frag data: " + acclen + ", opcode: " + opcode);
if ((tunneling == false) && (opcode == 1) && (data[offset] == 'c'))
{
parent.Debug("#" + counter + ": Websocket get server 'c' confirmation.");
parent.Debug("#" + counter + ": Websocket got server 'c' confirmation.");
// Server confirmed connection, start reading the TCP stream
//Console.Write("WS-Relay Connect\r\n");
@@ -541,7 +543,12 @@ namespace MeshCentralRouter
tunneling = true;
}
}
else
else if ((tunneling == true) && (opcode == 1))
{
string text = UTF8Encoding.UTF8.GetString(data, offset, len);
parent.Debug("#" + counter + ": Websocket got text frame: " + text);
}
else if ((tunneling == true) && (opcode == 2))
{
if (client != null)
{
@@ -552,10 +559,14 @@ namespace MeshCentralRouter
else if (uclient != null)
{
// Write: WS --> UDP
if (uendpoint != null) {
if (offset == 0) {
if (uendpoint != null)
{
if (offset == 0)
{
try { uclient.Send(data, len, uendpoint); } catch (Exception) { }
} else {
}
else
{
byte[] data2 = new byte[len];
Array.Copy(data, offset, data2, 0, len);
try { uclient.Send(data2, len, uendpoint); } catch (Exception) { }

View File

@@ -1,8 +1,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading.Tasks;
using System.Collections.Generic;
namespace MeshCentralRouter
{
@@ -16,10 +17,24 @@ namespace MeshCentralRouter
public int conn;
public int rdpport;
public ulong rights;
public MeshClass mesh;
public ListViewItem listitem;
public DeviceUserControl control;
public Dictionary<string, ulong> links;
public override string ToString() { return name; }
public string getStateString()
{
string status = "";
if ((conn & 1) != 0) { if (status.Length > 0) { status += ", "; } status += Properties.Resources.Agent; }
if ((conn & 2) != 0) { if (status.Length > 0) { status += ", "; } status += Properties.Resources.CIRA; }
if ((conn & 4) != 0) { if (status.Length > 0) { status += ", "; } status += Properties.Resources.AMT; }
if ((conn & 8) != 0) { if (status.Length > 0) { status += ", "; } status += Properties.Resources.Relay; }
if ((conn & 16) != 0) { if (status.Length > 0) { status += ", "; } status += Properties.Resources.MQTT; }
if (status == "") { status = Properties.Resources.Offline; }
return status;
}
}
public class MeshClass