diff --git a/AddPortMapForm.cs b/AddPortMapForm.cs
index 66ecf50..9895a74 100644
--- a/AddPortMapForm.cs
+++ b/AddPortMapForm.cs
@@ -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
diff --git a/AddRelayMapForm.cs b/AddRelayMapForm.cs
index 6ddfc97..9f562ce 100644
--- a/AddRelayMapForm.cs
+++ b/AddRelayMapForm.cs
@@ -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
diff --git a/DeviceUserControl.resx b/DeviceUserControl.resx
index 5fb69c2..188e742 100644
--- a/DeviceUserControl.resx
+++ b/DeviceUserControl.resx
@@ -322,6 +322,12 @@
313, 17
+
+ 149, 22
+
+
+ Set RDP port...
+
150, 26
@@ -355,12 +361,6 @@
6
-
- 149, 22
-
-
- Set RDP port...
-
17, 17
@@ -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 @@
468, 17
+
+ 178, 22
+
+
+ Use Alternate Port...
+
179, 26
@@ -1739,12 +1745,6 @@
5
-
- 178, 22
-
-
- Use Alternate Port...
-
Top, Right
@@ -1833,7 +1833,7 @@
6, 13
- 433, 60
+ 429, 56
setRDPPortToolStripMenuItem
diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs
index 812051f..b5d41ba 100644
--- a/MainForm.Designer.cs
+++ b/MainForm.Designer.cs
@@ -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;
}
}
diff --git a/MainForm.cs b/MainForm.cs
index 9546016..6a7ef66 100644
--- a/MainForm.cs
+++ b/MainForm.cs
@@ -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)
diff --git a/MainForm.resx b/MainForm.resx
index 0e5c25b..aec4c1f 100644
--- a/MainForm.resx
+++ b/MainForm.resx
@@ -1323,6 +1323,240 @@
True
+
+ Name
+
+
+ 250
+
+
+ State
+
+
+ 198
+
+
+ 161, 56
+
+
+ Segoe UI, 9pt, style=Bold
+
+
+ 163, 22
+
+
+ Add &Map...
+
+
+ 163, 22
+
+
+ Add &Relay Map...
+
+
+ 160, 6
+
+
+ 163, 22
+
+
+ HTTP
+
+
+ 163, 22
+
+
+ HTTPS
+
+
+ 163, 22
+
+
+ RDP
+
+
+ 163, 22
+
+
+ SSH
+
+
+ 163, 22
+
+
+ SCP
+
+
+ 164, 164
+
+
+ devicesContextMenuStrip
+
+
+ System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 56
+
+
+
+ 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
+
+
+
+ 10, 4
+
+
+ 446, 210
+
+
+ 6
+
+
+ False
+
+
+ devicesListView
+
+
+ System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ devicesPanel
+
+
+ 0
+
Top, Left, Right
@@ -1336,7 +1570,7 @@
2, 88
- 458, 52
+ 454, 52
5
@@ -1360,7 +1594,7 @@
devicesPanel
- 0
+ 1
Top, Left, Right
@@ -1375,7 +1609,7 @@
2, 88
- 458, 52
+ 454, 52
4
@@ -1396,7 +1630,7 @@
devicesPanel
- 1
+ 2
0, 0
@@ -1465,7 +1699,7 @@
2, 79
- 458, 52
+ 454, 52
4
@@ -1953,7 +2187,7 @@ Click "Add" to get started.
$this
- 3
+ 4
17, 17
@@ -5535,6 +5769,72 @@ Click "Add" to get started.
System.Windows.Forms.SaveFileDialog, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ devicesImageList
+
+
+ System.Windows.Forms.ImageList, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ nameColumnHeader
+
+
+ System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ stateColumnHeader
+
+
+ System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ httpToolStripMenuItem
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ httpsToolStripMenuItem
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ rdpToolStripMenuItem
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ sshToolStripMenuItem
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ scpToolStripMenuItem
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ toolStripMenuItem3
+
+
+ System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ addMapToolStripMenuItem
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ addRelayMapToolStripMenuItem
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
MainForm
diff --git a/MeshMapper.cs b/MeshMapper.cs
index b0cb910..9e4065c 100644
--- a/MeshMapper.cs
+++ b/MeshMapper.cs
@@ -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) { }
diff --git a/NodeClass.cs b/NodeClass.cs
index dd0d497..c2b32c6 100644
--- a/NodeClass.cs
+++ b/NodeClass.cs
@@ -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 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