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

Added websocket deflate support to remote desktop.

This commit is contained in:
Ylian Saint-Hilaire
2020-08-16 17:09:57 -07:00
parent 869c4ebd78
commit bce90a454a
5 changed files with 249 additions and 475 deletions

View File

@@ -30,8 +30,8 @@ namespace MeshCentralRouter
private bool remotepause = true; private bool remotepause = true;
private Bitmap desktop = null; private Bitmap desktop = null;
private Graphics desktopGraphics = null; private Graphics desktopGraphics = null;
private uint screenWidth = 0; public uint screenWidth = 0;
private uint screenHeight = 0; public uint screenHeight = 0;
private Pen RedPen = new Pen(System.Drawing.Color.Red); private Pen RedPen = new Pen(System.Drawing.Color.Red);
private Font DebugFont = new Font(FontFamily.GenericSansSerif, 14); private Font DebugFont = new Font(FontFamily.GenericSansSerif, 14);
private int compressionlevel = 60; // 60% compression private int compressionlevel = 60; // 60% compression
@@ -502,12 +502,15 @@ namespace MeshCentralRouter
public void Send(BinaryWriter bw) public void Send(BinaryWriter bw)
{ {
//if (state == ConnectState.Disconnected) { RecycleBinaryWriter(bw); return; } //if (state == ConnectState.Disconnected) { RecycleBinaryWriter(bw); return; }
try //try
//{
if ((parent != null) && (parent.wc != null))
{ {
parent.wc.SendBinary(((MemoryStream)bw.BaseStream).GetBuffer(), 0, (int)((MemoryStream)bw.BaseStream).Length); parent.wc.SendBinary(((MemoryStream)bw.BaseStream).GetBuffer(), 0, (int)((MemoryStream)bw.BaseStream).Length);
bytesent += (int)((MemoryStream)bw.BaseStream).Length; bytesent += (int)((MemoryStream)bw.BaseStream).Length;
} }
catch (Exception) { } //}
//catch (Exception) { }
RecycleBinaryWriter(bw); RecycleBinaryWriter(bw);
} }

184
KVMViewer.Designer.cs generated
View File

@@ -46,23 +46,6 @@ namespace MeshCentralRouter
{ {
this.components = new System.ComponentModel.Container(); this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(KVMViewer)); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(KVMViewer));
this.mainMenu = new System.Windows.Forms.MenuStrip();
this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem();
this.MenuItemConnect = new System.Windows.Forms.ToolStripMenuItem();
this.MenuItemDisconnect = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripSeparator();
this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
this.MenuItemExit = new System.Windows.Forms.ToolStripMenuItem();
this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.zoomtofitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.statusToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.debugToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem6 = new System.Windows.Forms.ToolStripSeparator();
this.refreshToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.pauseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.actionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.sendCtrlAltDelToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.mainStatusStrip = new System.Windows.Forms.StatusStrip(); this.mainStatusStrip = new System.Windows.Forms.StatusStrip();
this.mainToolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); this.mainToolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel(); this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
@@ -73,133 +56,13 @@ namespace MeshCentralRouter
this.zoomButton = new System.Windows.Forms.Button(); this.zoomButton = new System.Windows.Forms.Button();
this.cadButton = new System.Windows.Forms.Button(); this.cadButton = new System.Windows.Forms.Button();
this.connectButton = new System.Windows.Forms.Button(); this.connectButton = new System.Windows.Forms.Button();
this.consoleMessage = new System.Windows.Forms.Label();
this.resizeKvmControl = new MeshCentralRouter.KVMResizeControl(); this.resizeKvmControl = new MeshCentralRouter.KVMResizeControl();
this.mainMenu.SuspendLayout(); this.consoleTimer = new System.Windows.Forms.Timer(this.components);
this.mainStatusStrip.SuspendLayout(); this.mainStatusStrip.SuspendLayout();
this.topPanel.SuspendLayout(); this.topPanel.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
// mainMenu
//
this.mainMenu.BackColor = System.Drawing.SystemColors.Menu;
this.mainMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripMenuItem2,
this.viewToolStripMenuItem,
this.actionsToolStripMenuItem});
resources.ApplyResources(this.mainMenu, "mainMenu");
this.mainMenu.Name = "mainMenu";
//
// toolStripMenuItem2
//
this.toolStripMenuItem2.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.MenuItemConnect,
this.MenuItemDisconnect,
this.toolStripMenuItem5,
this.settingsToolStripMenuItem,
this.toolStripMenuItem1,
this.MenuItemExit});
this.toolStripMenuItem2.Name = "toolStripMenuItem2";
resources.ApplyResources(this.toolStripMenuItem2, "toolStripMenuItem2");
this.toolStripMenuItem2.DropDownOpening += new System.EventHandler(this.toolStripMenuItem2_DropDownOpening);
//
// MenuItemConnect
//
this.MenuItemConnect.Name = "MenuItemConnect";
resources.ApplyResources(this.MenuItemConnect, "MenuItemConnect");
this.MenuItemConnect.Click += new System.EventHandler(this.MenuItemConnect_Click);
//
// MenuItemDisconnect
//
this.MenuItemDisconnect.Name = "MenuItemDisconnect";
resources.ApplyResources(this.MenuItemDisconnect, "MenuItemDisconnect");
this.MenuItemDisconnect.Click += new System.EventHandler(this.MenuItemDisconnect_Click);
//
// toolStripMenuItem5
//
this.toolStripMenuItem5.Name = "toolStripMenuItem5";
resources.ApplyResources(this.toolStripMenuItem5, "toolStripMenuItem5");
//
// settingsToolStripMenuItem
//
this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem";
resources.ApplyResources(this.settingsToolStripMenuItem, "settingsToolStripMenuItem");
this.settingsToolStripMenuItem.Click += new System.EventHandler(this.settingsToolStripMenuItem_Click);
//
// toolStripMenuItem1
//
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
resources.ApplyResources(this.toolStripMenuItem1, "toolStripMenuItem1");
//
// MenuItemExit
//
this.MenuItemExit.Name = "MenuItemExit";
resources.ApplyResources(this.MenuItemExit, "MenuItemExit");
this.MenuItemExit.Click += new System.EventHandler(this.MenuItemExit_Click);
//
// viewToolStripMenuItem
//
this.viewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.zoomtofitToolStripMenuItem,
this.statusToolStripMenuItem,
this.debugToolStripMenuItem,
this.toolStripMenuItem6,
this.refreshToolStripMenuItem,
this.pauseToolStripMenuItem});
this.viewToolStripMenuItem.Name = "viewToolStripMenuItem";
resources.ApplyResources(this.viewToolStripMenuItem, "viewToolStripMenuItem");
this.viewToolStripMenuItem.DropDownOpening += new System.EventHandler(this.viewToolStripMenuItem_DropDownOpening);
//
// zoomtofitToolStripMenuItem
//
this.zoomtofitToolStripMenuItem.CheckOnClick = true;
this.zoomtofitToolStripMenuItem.Name = "zoomtofitToolStripMenuItem";
resources.ApplyResources(this.zoomtofitToolStripMenuItem, "zoomtofitToolStripMenuItem");
this.zoomtofitToolStripMenuItem.CheckStateChanged += new System.EventHandler(this.zoomtofitToolStripMenuItem_CheckStateChanged);
//
// statusToolStripMenuItem
//
this.statusToolStripMenuItem.Checked = true;
this.statusToolStripMenuItem.CheckOnClick = true;
this.statusToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked;
this.statusToolStripMenuItem.Name = "statusToolStripMenuItem";
resources.ApplyResources(this.statusToolStripMenuItem, "statusToolStripMenuItem");
this.statusToolStripMenuItem.CheckedChanged += new System.EventHandler(this.statusToolStripMenuItem_CheckedChanged);
//
// debugToolStripMenuItem
//
this.debugToolStripMenuItem.CheckOnClick = true;
this.debugToolStripMenuItem.Name = "debugToolStripMenuItem";
resources.ApplyResources(this.debugToolStripMenuItem, "debugToolStripMenuItem");
this.debugToolStripMenuItem.Click += new System.EventHandler(this.debugToolStripMenuItem_Click);
//
// toolStripMenuItem6
//
this.toolStripMenuItem6.Name = "toolStripMenuItem6";
resources.ApplyResources(this.toolStripMenuItem6, "toolStripMenuItem6");
//
// refreshToolStripMenuItem
//
this.refreshToolStripMenuItem.Name = "refreshToolStripMenuItem";
resources.ApplyResources(this.refreshToolStripMenuItem, "refreshToolStripMenuItem");
//
// pauseToolStripMenuItem
//
this.pauseToolStripMenuItem.Name = "pauseToolStripMenuItem";
resources.ApplyResources(this.pauseToolStripMenuItem, "pauseToolStripMenuItem");
//
// actionsToolStripMenuItem
//
this.actionsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.sendCtrlAltDelToolStripMenuItem});
this.actionsToolStripMenuItem.Name = "actionsToolStripMenuItem";
resources.ApplyResources(this.actionsToolStripMenuItem, "actionsToolStripMenuItem");
//
// sendCtrlAltDelToolStripMenuItem
//
this.sendCtrlAltDelToolStripMenuItem.Name = "sendCtrlAltDelToolStripMenuItem";
resources.ApplyResources(this.sendCtrlAltDelToolStripMenuItem, "sendCtrlAltDelToolStripMenuItem");
this.sendCtrlAltDelToolStripMenuItem.Click += new System.EventHandler(this.sendCtrlAltDelToolStripMenuItem_Click);
//
// mainStatusStrip // mainStatusStrip
// //
this.mainStatusStrip.BackColor = System.Drawing.SystemColors.Menu; this.mainStatusStrip.BackColor = System.Drawing.SystemColors.Menu;
@@ -277,6 +140,12 @@ namespace MeshCentralRouter
this.connectButton.UseVisualStyleBackColor = true; this.connectButton.UseVisualStyleBackColor = true;
this.connectButton.Click += new System.EventHandler(this.MenuItemDisconnect_Click); this.connectButton.Click += new System.EventHandler(this.MenuItemDisconnect_Click);
// //
// consoleMessage
//
resources.ApplyResources(this.consoleMessage, "consoleMessage");
this.consoleMessage.ForeColor = System.Drawing.Color.Black;
this.consoleMessage.Name = "consoleMessage";
//
// resizeKvmControl // resizeKvmControl
// //
this.resizeKvmControl.BackColor = System.Drawing.Color.Gray; this.resizeKvmControl.BackColor = System.Drawing.Color.Gray;
@@ -286,21 +155,24 @@ namespace MeshCentralRouter
this.resizeKvmControl.StateChanged += new System.EventHandler(this.kvmControl_StateChanged); this.resizeKvmControl.StateChanged += new System.EventHandler(this.kvmControl_StateChanged);
this.resizeKvmControl.DisplaysReceived += new System.EventHandler(this.resizeKvmControl_DisplaysReceived); this.resizeKvmControl.DisplaysReceived += new System.EventHandler(this.resizeKvmControl_DisplaysReceived);
// //
// consoleTimer
//
this.consoleTimer.Interval = 5000;
this.consoleTimer.Tick += new System.EventHandler(this.consoleTimer_Tick);
//
// KVMViewer // KVMViewer
// //
resources.ApplyResources(this, "$this"); resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.Gray; this.BackColor = System.Drawing.Color.Gray;
this.Controls.Add(this.consoleMessage);
this.Controls.Add(this.resizeKvmControl); this.Controls.Add(this.resizeKvmControl);
this.Controls.Add(this.topPanel); this.Controls.Add(this.topPanel);
this.Controls.Add(this.mainStatusStrip); this.Controls.Add(this.mainStatusStrip);
this.Controls.Add(this.mainMenu);
this.Name = "KVMViewer"; this.Name = "KVMViewer";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Main_FormClosing); this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Main_FormClosing);
this.Load += new System.EventHandler(this.MainForm_Load); this.Load += new System.EventHandler(this.MainForm_Load);
this.Resize += new System.EventHandler(this.MainForm_Resize); this.Resize += new System.EventHandler(this.MainForm_Resize);
this.mainMenu.ResumeLayout(false);
this.mainMenu.PerformLayout();
this.mainStatusStrip.ResumeLayout(false); this.mainStatusStrip.ResumeLayout(false);
this.mainStatusStrip.PerformLayout(); this.mainStatusStrip.PerformLayout();
this.topPanel.ResumeLayout(false); this.topPanel.ResumeLayout(false);
@@ -310,43 +182,19 @@ namespace MeshCentralRouter
} }
#endregion #endregion
private MenuStrip mainMenu;
private ToolStripMenuItem toolStripMenuItem2;
private ToolStripMenuItem MenuItemConnect;
private ToolStripMenuItem MenuItemExit;
private ToolStripMenuItem MenuItemDisconnect;
private StatusStrip mainStatusStrip; private StatusStrip mainStatusStrip;
private ToolStripStatusLabel mainToolStripStatusLabel; private ToolStripStatusLabel mainToolStripStatusLabel;
private Timer updateTimer; private Timer updateTimer;
private ToolStripSeparator toolStripMenuItem1;
private ToolStripMenuItem viewToolStripMenuItem;
private ToolStripMenuItem statusToolStripMenuItem;
private ToolStripMenuItem debugToolStripMenuItem;
private ToolStripMenuItem settingsToolStripMenuItem;
private ToolStripMenuItem refreshToolStripMenuItem;
private ToolStripMenuItem pauseToolStripMenuItem;
private ToolStripSeparator toolStripMenuItem5;
private KVMResizeControl resizeKvmControl; private KVMResizeControl resizeKvmControl;
private ToolStripStatusLabel toolStripStatusLabel1; private ToolStripStatusLabel toolStripStatusLabel1;
private ToolStripMenuItem zoomtofitToolStripMenuItem;
private ToolStripMenuItem actionsToolStripMenuItem;
private ToolStripMenuItem sendCtrlAltDelToolStripMenuItem;
private Panel topPanel; private Panel topPanel;
private Button connectButton; private Button connectButton;
private Button cadButton; private Button cadButton;
private Button zoomButton; private Button zoomButton;
private Button settingsButton; private Button settingsButton;
private ComboBox displaySelectComboBox; private ComboBox displaySelectComboBox;
private ToolStripSeparator toolStripMenuItem6; private Label consoleMessage;
private Timer consoleTimer;
} }
} }

View File

@@ -15,15 +15,11 @@ limitations under the License.
*/ */
using System; using System;
using System.IO;
using System.Text;
using System.Drawing; using System.Drawing;
using System.Net.Sockets;
using System.Net.Security;
using System.Windows.Forms; using System.Windows.Forms;
using System.Collections.Generic; using System.Collections.Generic;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates; using System.Web.Script.Serialization;
using Microsoft.Win32; using Microsoft.Win32;
namespace MeshCentralRouter namespace MeshCentralRouter
@@ -36,7 +32,9 @@ namespace MeshCentralRouter
private int state = 0; private int state = 0;
private RandomNumberGenerator rand = RandomNumberGenerator.Create(); private RandomNumberGenerator rand = RandomNumberGenerator.Create();
private string randomIdHex = null; private string randomIdHex = null;
private bool sessionIsRecorded = false;
public webSocketClient wc = null; public webSocketClient wc = null;
public Dictionary<string, int> userSessions = null;
public KVMViewer(MeshCentralServer server, NodeClass node) public KVMViewer(MeshCentralServer server, NodeClass node)
{ {
@@ -46,11 +44,17 @@ namespace MeshCentralRouter
this.server = server; this.server = server;
kvmControl = resizeKvmControl.KVM; kvmControl = resizeKvmControl.KVM;
kvmControl.parent = this; kvmControl.parent = this;
kvmControl.DesktopSizeChanged += KvmControl_DesktopSizeChanged;
resizeKvmControl.ZoomToFit = true; resizeKvmControl.ZoomToFit = true;
UpdateStatus(); UpdateStatus();
this.MouseWheel += MainForm_MouseWheel; this.MouseWheel += MainForm_MouseWheel;
} }
private void KvmControl_DesktopSizeChanged(object sender, EventArgs e)
{
kvmControl.Visible = true;
}
private void Server_onStateChanged(int state) private void Server_onStateChanged(int state)
{ {
UpdateStatus(); UpdateStatus();
@@ -65,7 +69,6 @@ namespace MeshCentralRouter
private void MainForm_Load(object sender, EventArgs e) private void MainForm_Load(object sender, EventArgs e)
{ {
this.Controls.Remove(mainMenu);
this.Size = new Size(820, 480); this.Size = new Size(820, 480);
resizeKvmControl.CenterKvmControl(false); resizeKvmControl.CenterKvmControl(false);
topPanel.Visible = true; topPanel.Visible = true;
@@ -113,6 +116,7 @@ namespace MeshCentralRouter
case webSocketClient.ConnectionStates.Connecting: case webSocketClient.ConnectionStates.Connecting:
{ {
state = 1; state = 1;
displayMessage(null);
break; break;
} }
case webSocketClient.ConnectionStates.Connected: case webSocketClient.ConnectionStates.Connected:
@@ -120,6 +124,7 @@ namespace MeshCentralRouter
state = 2; state = 2;
string u = "*/meshrelay.ashx?p=2&nodeid=" + node.nodeid + "&id=" + randomIdHex + "&rauth=" + server.rauthCookie; string u = "*/meshrelay.ashx?p=2&nodeid=" + node.nodeid + "&id=" + randomIdHex + "&rauth=" + server.rauthCookie;
server.sendCommand("{ \"action\": \"msg\", \"type\": \"tunnel\", \"nodeid\": \"" + node.nodeid + "\", \"value\": \"" + u.ToString() + "\", \"usage\": 2 }"); server.sendCommand("{ \"action\": \"msg\", \"type\": \"tunnel\", \"nodeid\": \"" + node.nodeid + "\", \"value\": \"" + u.ToString() + "\", \"usage\": 2 }");
displayMessage(null);
break; break;
} }
} }
@@ -130,15 +135,50 @@ namespace MeshCentralRouter
{ {
if ((state == 2) && ((data == "c") || (data == "cr"))) if ((state == 2) && ((data == "c") || (data == "cr")))
{ {
if (data == "cr") { sessionIsRecorded = true; }
state = 3; state = 3;
kvmControl.Send("2"); kvmControl.Send("2");
kvmControl.SendCompressionLevel(); kvmControl.SendCompressionLevel();
kvmControl.SendPause(false); kvmControl.SendPause(false);
kvmControl.SendRefresh(); kvmControl.SendRefresh();
UpdateStatus(); UpdateStatus();
displayMessage(null);
return; return;
} }
if (state != 3) return; if (state != 3) return;
// Parse the received JSON
Dictionary<string, object> jsonAction = new Dictionary<string, object>();
jsonAction = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(data);
if ((jsonAction == null) || (jsonAction.ContainsKey("type") == false) || (jsonAction["type"].GetType() != typeof(string))) return;
string action = jsonAction["type"].ToString();
switch (action)
{
case "metadata":
{
if ((jsonAction.ContainsKey("users") == false) || (jsonAction["users"] == null)) return;
Dictionary <string, object> usersex = (Dictionary<string, object>)jsonAction["users"];
userSessions = new Dictionary<string, int>();
foreach (string user in usersex.Keys) { userSessions.Add(user, (int)usersex[user]); }
UpdateStatus();
break;
}
case "console":
{
string msg = null;
int msgid = -1;
if ((jsonAction.ContainsKey("msg")) && (jsonAction["msg"] != null)) { msg = jsonAction["msg"].ToString(); }
if (jsonAction.ContainsKey("msgid")) { msgid = (int)jsonAction["msgid"]; }
if (msgid == 1) { msg = "Waiting for user to grant access..."; }
if (msgid == 2) { msg = "Denied"; }
if (msgid == 3) { msg = "Failed to start remote terminal session"; } // , {0} ({1})
if (msgid == 4) { msg = "Timeout"; }
if (msgid == 5) { msg = "Received invalid network data"; }
displayMessage(msg);
break;
}
}
} }
private void Wc_onBinaryData(byte[] data, int offset, int length) private void Wc_onBinaryData(byte[] data, int offset, int length)
@@ -162,6 +202,7 @@ namespace MeshCentralRouter
// Connect // Connect
MenuItemConnect_Click(null, null); MenuItemConnect_Click(null, null);
} }
displayMessage(null);
} }
@@ -178,6 +219,8 @@ namespace MeshCentralRouter
mainToolStripStatusLabel.Text = "Disconnected"; mainToolStripStatusLabel.Text = "Disconnected";
displaySelectComboBox.Visible = false; displaySelectComboBox.Visible = false;
kvmControl.Visible = false; kvmControl.Visible = false;
kvmControl.screenWidth = 0;
kvmControl.screenHeight = 0;
connectButton.Text = "Connect"; connectButton.Text = "Connect";
break; break;
case 1: // Connecting case 1: // Connecting
@@ -193,15 +236,17 @@ namespace MeshCentralRouter
connectButton.Text = "Disconnect"; connectButton.Text = "Disconnect";
break; break;
case 3: // Connected case 3: // Connected
//string extras = "."; string label = "Connected";
//if (kvmControl.touchEnabled) extras = ", touch enabled."; if (sessionIsRecorded) { label += ", Recorded Session"; }
//mainToolStripStatusLabel.Text = string.Format("Connected. {0} tiles received, {1} tiles copied, {2} received, {3} sent{4}", kvmControl.tilecount, kvmControl.tilecopy, MeshUtils.GetKiloShortString((ulong)kvmControl.byterecv), MeshUtils.GetKiloShortString((ulong)kvmControl.bytesent), extras); if ((userSessions != null) && (userSessions.Count > 1)) { label += string.Format(", {0} users", userSessions.Count); }
mainToolStripStatusLabel.Text = "Connected."; label += ".";
kvmControl.Visible = true; mainToolStripStatusLabel.Text = label;
connectButton.Text = "Disconnect"; connectButton.Text = "Disconnect";
kvmControl.SendCompressionLevel(); kvmControl.SendCompressionLevel();
break; break;
} }
cadButton.Enabled = (state == 3);
} }
private void updateTimer_Tick(object sender, EventArgs e) private void updateTimer_Tick(object sender, EventArgs e)
@@ -222,11 +267,6 @@ namespace MeshCentralRouter
node.desktopViewer = null; node.desktopViewer = null;
} }
private void statusToolStripMenuItem_CheckedChanged(object sender, EventArgs e)
{
mainStatusStrip.Visible = statusToolStripMenuItem.Checked;
}
private void toolStripMenuItem2_DropDownOpening(object sender, EventArgs e) private void toolStripMenuItem2_DropDownOpening(object sender, EventArgs e)
{ {
//MenuItemConnect.Enabled = (kvmControl.State == KVMControl.ConnectState.Disconnected); //MenuItemConnect.Enabled = (kvmControl.State == KVMControl.ConnectState.Disconnected);
@@ -235,17 +275,6 @@ namespace MeshCentralRouter
//serviceDisconnectToolStripMenuItem.Enabled = (server != null && server.CurrentState != MeshSwarmServer.State.Disconnected); //serviceDisconnectToolStripMenuItem.Enabled = (server != null && server.CurrentState != MeshSwarmServer.State.Disconnected);
} }
private void viewToolStripMenuItem_DropDownOpening(object sender, EventArgs e)
{
debugToolStripMenuItem.Checked = kvmControl.debugmode;
//pauseToolStripMenuItem.Checked = kvmControl.Pause;
}
private void debugToolStripMenuItem_Click(object sender, EventArgs e)
{
if (kvmControl != null) kvmControl.debugmode = debugToolStripMenuItem.Checked;
}
private void kvmControl_StateChanged(object sender, EventArgs e) private void kvmControl_StateChanged(object sender, EventArgs e)
{ {
UpdateStatus(); UpdateStatus();
@@ -271,11 +300,6 @@ namespace MeshCentralRouter
if (kvmControl != null) kvmControl.SendPause(WindowState == FormWindowState.Minimized); if (kvmControl != null) kvmControl.SendPause(WindowState == FormWindowState.Minimized);
} }
private void zoomtofitToolStripMenuItem_CheckStateChanged(object sender, EventArgs e)
{
resizeKvmControl.ZoomToFit = zoomtofitToolStripMenuItem.Checked;
}
private void sendCtrlAltDelToolStripMenuItem_Click(object sender, EventArgs e) private void sendCtrlAltDelToolStripMenuItem_Click(object sender, EventArgs e)
{ {
if (kvmControl != null) kvmControl.SendCtrlAltDel(); if (kvmControl != null) kvmControl.SendCtrlAltDel();
@@ -323,7 +347,7 @@ namespace MeshCentralRouter
if (displayText == "All Displays") displaynum = 0xFFFF; if (displayText == "All Displays") displaynum = 0xFFFF;
if (displaynum != 0 || int.TryParse(displayText.Substring(8), out displaynum)) if (displaynum != 0 || int.TryParse(displayText.Substring(8), out displaynum))
{ {
//if (kvmControl != null) kvmControl.SendDisplay(displaynum); if (kvmControl != null) kvmControl.SendDisplay(displaynum);
} }
} }
@@ -372,5 +396,27 @@ namespace MeshCentralRouter
try { return Registry.GetValue(@"HKEY_CURRENT_USER\SOFTWARE\OpenSource\MeshRouter", name, "").ToString(); } catch (Exception) { return ""; } try { return Registry.GetValue(@"HKEY_CURRENT_USER\SOFTWARE\OpenSource\MeshRouter", name, "").ToString(); } catch (Exception) { return ""; }
} }
public delegate void displayMessageHandler(string msg);
public void displayMessage(string msg)
{
if (this.InvokeRequired) { this.Invoke(new displayMessageHandler(displayMessage), msg); return; }
if (msg == null)
{
consoleMessage.Visible = false;
consoleTimer.Enabled = false;
}
else
{
consoleMessage.Text = msg;
consoleMessage.Visible = true;
//consoleTimer.Enabled = true;
}
}
private void consoleTimer_Tick(object sender, EventArgs e)
{
consoleMessage.Visible = false;
consoleTimer.Enabled = false;
}
} }
} }

View File

@@ -117,134 +117,12 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<metadata name="mainMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="MenuItemConnect.Size" type="System.Drawing.Size, System.Drawing">
<value>167, 22</value>
</data>
<data name="MenuItemConnect.Text" xml:space="preserve">
<value>&amp;Connect...</value>
</data>
<data name="MenuItemDisconnect.Size" type="System.Drawing.Size, System.Drawing">
<value>167, 22</value>
</data>
<data name="MenuItemDisconnect.Text" xml:space="preserve">
<value>&amp;Disconnect</value>
</data>
<data name="toolStripMenuItem5.Size" type="System.Drawing.Size, System.Drawing">
<value>164, 6</value>
</data>
<data name="settingsToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>167, 22</value>
</data>
<data name="settingsToolStripMenuItem.Text" xml:space="preserve">
<value>Session Settings...</value>
</data>
<data name="toolStripMenuItem1.Size" type="System.Drawing.Size, System.Drawing">
<value>164, 6</value>
</data>
<data name="MenuItemExit.Size" type="System.Drawing.Size, System.Drawing">
<value>167, 22</value>
</data>
<data name="MenuItemExit.Text" xml:space="preserve">
<value>E&amp;xit</value>
</data>
<data name="toolStripMenuItem2.Size" type="System.Drawing.Size, System.Drawing">
<value>59, 20</value>
</data>
<data name="toolStripMenuItem2.Text" xml:space="preserve">
<value>&amp;Control</value>
</data>
<data name="zoomtofitToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>138, 22</value>
</data>
<data name="zoomtofitToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Zoom-to-fit</value>
</data>
<data name="statusToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>138, 22</value>
</data>
<data name="statusToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Status</value>
</data>
<data name="debugToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>138, 22</value>
</data>
<data name="debugToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Debug</value>
</data>
<data name="toolStripMenuItem6.Size" type="System.Drawing.Size, System.Drawing">
<value>135, 6</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="refreshToolStripMenuItem.ShortcutKeys" type="System.Windows.Forms.Keys, System.Windows.Forms">
<value>F5</value>
</data>
<data name="refreshToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>138, 22</value>
</data>
<data name="refreshToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Refresh</value>
</data>
<data name="pauseToolStripMenuItem.ShortcutKeys" type="System.Windows.Forms.Keys, System.Windows.Forms">
<value>F7</value>
</data>
<data name="pauseToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>138, 22</value>
</data>
<data name="pauseToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;Pause</value>
</data>
<data name="viewToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>44, 20</value>
</data>
<data name="viewToolStripMenuItem.Text" xml:space="preserve">
<value>&amp;View</value>
</data>
<data name="sendCtrlAltDelToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>164, 22</value>
</data>
<data name="sendCtrlAltDelToolStripMenuItem.Text" xml:space="preserve">
<value>Send &amp;Ctrl-Alt-Del</value>
</data>
<data name="actionsToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>59, 20</value>
</data>
<data name="actionsToolStripMenuItem.Text" xml:space="preserve">
<value>Actions</value>
</data>
<data name="mainMenu.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="mainMenu.Size" type="System.Drawing.Size, System.Drawing">
<value>1227, 24</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="mainMenu.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="mainMenu.Text" xml:space="preserve">
<value>menuStrip1</value>
</data>
<data name="&gt;&gt;mainMenu.Name" xml:space="preserve">
<value>mainMenu</value>
</data>
<data name="&gt;&gt;mainMenu.Type" xml:space="preserve">
<value>System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;mainMenu.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;mainMenu.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<metadata name="mainStatusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="mainStatusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>127, 17</value> <value>127, 17</value>
</metadata> </metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="mainToolStripStatusLabel.Size" type="System.Drawing.Size, System.Drawing"> <data name="mainToolStripStatusLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>1212, 17</value> <value>1029, 17</value>
</data> </data>
<data name="mainToolStripStatusLabel.Text" xml:space="preserve"> <data name="mainToolStripStatusLabel.Text" xml:space="preserve">
<value>---</value> <value>---</value>
@@ -258,14 +136,15 @@
<data name="toolStripStatusLabel1.Text" xml:space="preserve"> <data name="toolStripStatusLabel1.Text" xml:space="preserve">
<value>v</value> <value>v</value>
</data> </data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="toolStripStatusLabel1.Visible" type="System.Boolean, mscorlib"> <data name="toolStripStatusLabel1.Visible" type="System.Boolean, mscorlib">
<value>False</value> <value>False</value>
</data> </data>
<data name="mainStatusStrip.Location" type="System.Drawing.Point, System.Drawing"> <data name="mainStatusStrip.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 787</value> <value>0, 772</value>
</data> </data>
<data name="mainStatusStrip.Size" type="System.Drawing.Size, System.Drawing"> <data name="mainStatusStrip.Size" type="System.Drawing.Size, System.Drawing">
<value>1227, 22</value> <value>1044, 22</value>
</data> </data>
<data name="mainStatusStrip.TabIndex" type="System.Int32, mscorlib"> <data name="mainStatusStrip.TabIndex" type="System.Int32, mscorlib">
<value>9</value> <value>9</value>
@@ -283,7 +162,7 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;mainStatusStrip.ZOrder" xml:space="preserve"> <data name="&gt;&gt;mainStatusStrip.ZOrder" xml:space="preserve">
<value>2</value> <value>3</value>
</data> </data>
<metadata name="updateTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="updateTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>264, 17</value> <value>264, 17</value>
@@ -312,6 +191,10 @@
<data name="&gt;&gt;displaySelectComboBox.ZOrder" xml:space="preserve"> <data name="&gt;&gt;displaySelectComboBox.ZOrder" xml:space="preserve">
<value>0</value> <value>0</value>
</data> </data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="settingsButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="settingsButton.Location" type="System.Drawing.Point, System.Drawing"> <data name="settingsButton.Location" type="System.Drawing.Point, System.Drawing">
<value>288, 3</value> <value>288, 3</value>
</data> </data>
@@ -336,6 +219,9 @@
<data name="&gt;&gt;settingsButton.ZOrder" xml:space="preserve"> <data name="&gt;&gt;settingsButton.ZOrder" xml:space="preserve">
<value>1</value> <value>1</value>
</data> </data>
<data name="zoomButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="zoomButton.Location" type="System.Drawing.Point, System.Drawing"> <data name="zoomButton.Location" type="System.Drawing.Point, System.Drawing">
<value>193, 3</value> <value>193, 3</value>
</data> </data>
@@ -360,6 +246,9 @@
<data name="&gt;&gt;zoomButton.ZOrder" xml:space="preserve"> <data name="&gt;&gt;zoomButton.ZOrder" xml:space="preserve">
<value>2</value> <value>2</value>
</data> </data>
<data name="cadButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="cadButton.Location" type="System.Drawing.Point, System.Drawing"> <data name="cadButton.Location" type="System.Drawing.Point, System.Drawing">
<value>98, 3</value> <value>98, 3</value>
</data> </data>
@@ -384,6 +273,9 @@
<data name="&gt;&gt;cadButton.ZOrder" xml:space="preserve"> <data name="&gt;&gt;cadButton.ZOrder" xml:space="preserve">
<value>3</value> <value>3</value>
</data> </data>
<data name="connectButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="connectButton.Location" type="System.Drawing.Point, System.Drawing"> <data name="connectButton.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 3</value> <value>3, 3</value>
</data> </data>
@@ -412,10 +304,10 @@
<value>Top</value> <value>Top</value>
</data> </data>
<data name="topPanel.Location" type="System.Drawing.Point, System.Drawing"> <data name="topPanel.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 24</value> <value>0, 0</value>
</data> </data>
<data name="topPanel.Size" type="System.Drawing.Size, System.Drawing"> <data name="topPanel.Size" type="System.Drawing.Size, System.Drawing">
<value>1227, 32</value> <value>1044, 32</value>
</data> </data>
<data name="topPanel.TabIndex" type="System.Int32, mscorlib"> <data name="topPanel.TabIndex" type="System.Int32, mscorlib">
<value>11</value> <value>11</value>
@@ -433,16 +325,52 @@
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;topPanel.ZOrder" xml:space="preserve"> <data name="&gt;&gt;topPanel.ZOrder" xml:space="preserve">
<value>1</value> <value>2</value>
</data>
<data name="consoleMessage.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="consoleMessage.Font" type="System.Drawing.Font, System.Drawing">
<value>Microsoft Sans Serif, 15.75pt</value>
</data>
<data name="consoleMessage.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="consoleMessage.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 59</value>
</data>
<data name="consoleMessage.Size" type="System.Drawing.Size, System.Drawing">
<value>70, 25</value>
</data>
<data name="consoleMessage.TabIndex" type="System.Int32, mscorlib">
<value>12</value>
</data>
<data name="consoleMessage.Text" xml:space="preserve">
<value>label1</value>
</data>
<data name="consoleMessage.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;consoleMessage.Name" xml:space="preserve">
<value>consoleMessage</value>
</data>
<data name="&gt;&gt;consoleMessage.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;consoleMessage.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;consoleMessage.ZOrder" xml:space="preserve">
<value>0</value>
</data> </data>
<data name="resizeKvmControl.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms"> <data name="resizeKvmControl.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value> <value>Fill</value>
</data> </data>
<data name="resizeKvmControl.Location" type="System.Drawing.Point, System.Drawing"> <data name="resizeKvmControl.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 56</value> <value>0, 32</value>
</data> </data>
<data name="resizeKvmControl.Size" type="System.Drawing.Size, System.Drawing"> <data name="resizeKvmControl.Size" type="System.Drawing.Size, System.Drawing">
<value>1227, 731</value> <value>1044, 740</value>
</data> </data>
<data name="resizeKvmControl.TabIndex" type="System.Int32, mscorlib"> <data name="resizeKvmControl.TabIndex" type="System.Int32, mscorlib">
<value>10</value> <value>10</value>
@@ -451,14 +379,17 @@
<value>resizeKvmControl</value> <value>resizeKvmControl</value>
</data> </data>
<data name="&gt;&gt;resizeKvmControl.Type" xml:space="preserve"> <data name="&gt;&gt;resizeKvmControl.Type" xml:space="preserve">
<value>MeshCentralRouter.KVMResizeControl, MeshCentralRouter, Version=1.0.7529.21143, Culture=neutral, PublicKeyToken=null</value> <value>MeshCentralRouter.KVMResizeControl, MeshCentralRouter, Version=1.0.7531.27756, Culture=neutral, PublicKeyToken=null</value>
</data> </data>
<data name="&gt;&gt;resizeKvmControl.Parent" xml:space="preserve"> <data name="&gt;&gt;resizeKvmControl.Parent" xml:space="preserve">
<value>$this</value> <value>$this</value>
</data> </data>
<data name="&gt;&gt;resizeKvmControl.ZOrder" xml:space="preserve"> <data name="&gt;&gt;resizeKvmControl.ZOrder" xml:space="preserve">
<value>0</value> <value>1</value>
</data> </data>
<metadata name="consoleTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>385, 17</value>
</metadata>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value> <value>True</value>
</metadata> </metadata>
@@ -466,7 +397,7 @@
<value>6, 13</value> <value>6, 13</value>
</data> </data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing"> <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>1227, 809</value> <value>1044, 794</value>
</data> </data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
@@ -902,102 +833,6 @@
<data name="$this.Text" xml:space="preserve"> <data name="$this.Text" xml:space="preserve">
<value>Remote Desktop</value> <value>Remote Desktop</value>
</data> </data>
<data name="&gt;&gt;toolStripMenuItem2.Name" xml:space="preserve">
<value>toolStripMenuItem2</value>
</data>
<data name="&gt;&gt;toolStripMenuItem2.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;MenuItemConnect.Name" xml:space="preserve">
<value>MenuItemConnect</value>
</data>
<data name="&gt;&gt;MenuItemConnect.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;MenuItemDisconnect.Name" xml:space="preserve">
<value>MenuItemDisconnect</value>
</data>
<data name="&gt;&gt;MenuItemDisconnect.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;toolStripMenuItem5.Name" xml:space="preserve">
<value>toolStripMenuItem5</value>
</data>
<data name="&gt;&gt;toolStripMenuItem5.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;settingsToolStripMenuItem.Name" xml:space="preserve">
<value>settingsToolStripMenuItem</value>
</data>
<data name="&gt;&gt;settingsToolStripMenuItem.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;toolStripMenuItem1.Name" xml:space="preserve">
<value>toolStripMenuItem1</value>
</data>
<data name="&gt;&gt;toolStripMenuItem1.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;MenuItemExit.Name" xml:space="preserve">
<value>MenuItemExit</value>
</data>
<data name="&gt;&gt;MenuItemExit.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;viewToolStripMenuItem.Name" xml:space="preserve">
<value>viewToolStripMenuItem</value>
</data>
<data name="&gt;&gt;viewToolStripMenuItem.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;zoomtofitToolStripMenuItem.Name" xml:space="preserve">
<value>zoomtofitToolStripMenuItem</value>
</data>
<data name="&gt;&gt;zoomtofitToolStripMenuItem.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;statusToolStripMenuItem.Name" xml:space="preserve">
<value>statusToolStripMenuItem</value>
</data>
<data name="&gt;&gt;statusToolStripMenuItem.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;debugToolStripMenuItem.Name" xml:space="preserve">
<value>debugToolStripMenuItem</value>
</data>
<data name="&gt;&gt;debugToolStripMenuItem.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;toolStripMenuItem6.Name" xml:space="preserve">
<value>toolStripMenuItem6</value>
</data>
<data name="&gt;&gt;toolStripMenuItem6.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;refreshToolStripMenuItem.Name" xml:space="preserve">
<value>refreshToolStripMenuItem</value>
</data>
<data name="&gt;&gt;refreshToolStripMenuItem.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;pauseToolStripMenuItem.Name" xml:space="preserve">
<value>pauseToolStripMenuItem</value>
</data>
<data name="&gt;&gt;pauseToolStripMenuItem.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;actionsToolStripMenuItem.Name" xml:space="preserve">
<value>actionsToolStripMenuItem</value>
</data>
<data name="&gt;&gt;actionsToolStripMenuItem.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;sendCtrlAltDelToolStripMenuItem.Name" xml:space="preserve">
<value>sendCtrlAltDelToolStripMenuItem</value>
</data>
<data name="&gt;&gt;sendCtrlAltDelToolStripMenuItem.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;mainToolStripStatusLabel.Name" xml:space="preserve"> <data name="&gt;&gt;mainToolStripStatusLabel.Name" xml:space="preserve">
<value>mainToolStripStatusLabel</value> <value>mainToolStripStatusLabel</value>
</data> </data>
@@ -1016,6 +851,12 @@
<data name="&gt;&gt;updateTimer.Type" xml:space="preserve"> <data name="&gt;&gt;updateTimer.Type" xml:space="preserve">
<value>System.Windows.Forms.Timer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Windows.Forms.Timer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data> </data>
<data name="&gt;&gt;consoleTimer.Name" xml:space="preserve">
<value>consoleTimer</value>
</data>
<data name="&gt;&gt;consoleTimer.Type" xml:space="preserve">
<value>System.Windows.Forms.Timer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve"> <data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>KVMViewer</value> <value>KVMViewer</value>
</data> </data>

View File

@@ -19,6 +19,7 @@ using System.IO;
using System.Text; using System.Text;
using System.Net.Sockets; using System.Net.Sockets;
using System.Net.Security; using System.Net.Security;
using System.IO.Compression;
using System.Collections.Generic; using System.Collections.Generic;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates; using System.Security.Cryptography.X509Certificates;
@@ -45,6 +46,11 @@ namespace MeshCentralRouter
public bool xdebug = false; public bool xdebug = false;
public bool xignoreCert = false; public bool xignoreCert = false;
public string extraHeaders = null; public string extraHeaders = null;
private MemoryStream inflateMemory;
private DeflateStream inflate;
private MemoryStream deflateMemory;
private static byte[] inflateEnd = { 0x00, 0x00, 0xff, 0xff };
private static byte[] inflateStart = { 0x00, 0x00, 0x00, 0x00 };
public enum ConnectionStates public enum ConnectionStates
{ {
@@ -128,6 +134,7 @@ namespace MeshCentralRouter
wsclient = new TcpClient(); wsclient = new TcpClient();
wsclient.BeginConnect(url.Host, url.Port, new AsyncCallback(OnConnectSink), this); wsclient.BeginConnect(url.Host, url.Port, new AsyncCallback(OnConnectSink), this);
} }
return true; return true;
} }
@@ -245,7 +252,9 @@ namespace MeshCentralRouter
// Send the HTTP headers // Send the HTTP headers
Debug("Websocket TLS setup, sending HTTP header..."); Debug("Websocket TLS setup, sending HTTP header...");
string header = "GET " + url.PathAndQuery + " HTTP/1.1\r\nHost: " + url.Host + "\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nSec-WebSocket-Version: 13\r\n" + extraHeaders + "\r\n"; //string header = "GET " + url.PathAndQuery + " HTTP/1.1\r\nHost: " + url.Host + "\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nSec-WebSocket-Version: 13\r\n" + extraHeaders + "\r\n";
//string header = "GET " + url.PathAndQuery + " HTTP/1.1\r\nHost: " + url.Host + "\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Extensions: permessage-deflate; client_no_context_takeover; server_no_context_takeover\r\n" + extraHeaders + "\r\n";
string header = "GET " + url.PathAndQuery + " HTTP/1.1\r\nHost: " + url.Host + "\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Extensions: permessage-deflate; client_no_context_takeover\r\n" + extraHeaders + "\r\n";
wsstream.Write(UTF8Encoding.UTF8.GetBytes(header)); wsstream.Write(UTF8Encoding.UTF8.GetBytes(header));
// Start receiving data // Start receiving data
@@ -313,6 +322,14 @@ namespace MeshCentralRouter
if ((parsedHeader == null) || (parsedHeader["_Path"] != "101")) { Debug("Websocket bad header."); return -1; } // Bad header, close the connection if ((parsedHeader == null) || (parsedHeader["_Path"] != "101")) { Debug("Websocket bad header."); return -1; } // Bad header, close the connection
Debug("Websocket got setup upgrade header."); Debug("Websocket got setup upgrade header.");
SetState(ConnectionStates.Connected); SetState(ConnectionStates.Connected);
if ((parsedHeader.ContainsKey("sec-websocket-extensions") && (parsedHeader["sec-websocket-extensions"].IndexOf("permessage-deflate") >= 0)))
{
inflateMemory = new MemoryStream();
inflate = new DeflateStream(inflateMemory, CompressionMode.Decompress);
deflateMemory = new MemoryStream();
}
fragmentParsingState = 1; fragmentParsingState = 1;
return len; // TODO: Technically we need to return the header length before UTF8 convert. return len; // TODO: Technically we need to return the header length before UTF8 convert.
} }
@@ -371,13 +388,32 @@ namespace MeshCentralRouter
private void ProcessWsBuffer(byte[] data, int offset, int len, int op) private void ProcessWsBuffer(byte[] data, int offset, int len, int op)
{ {
MemoryStream mem = null;
if (((op & 0x40) != 0) && (inflateMemory != null))
{
// This is a deflate compressed frame
inflateMemory.SetLength(0);
inflateMemory.Write(data, offset, len);
inflateMemory.Write(inflateEnd, 0, 4);
inflateMemory.Seek(0, SeekOrigin.Begin);
MemoryStream memoryStream = new MemoryStream();
inflate.CopyTo(memoryStream);
data = memoryStream.GetBuffer();
offset = 0;
len = (int)memoryStream.Length;
}
if ((op & 1) == 0) { if ((op & 1) == 0) {
// This is a birnay frame
Debug("Websocket got binary data, len = " + len); Debug("Websocket got binary data, len = " + len);
if (onBinaryData != null) { onBinaryData(data, offset, len); } if (onBinaryData != null) { onBinaryData(data, offset, len); }
} else { } else {
// This is a string frame
Debug("Websocket got string data, len = " + len); Debug("Websocket got string data, len = " + len);
if (onStringData != null) { onStringData(UTF8Encoding.UTF8.GetString(data, offset, len)); } if (onStringData != null) { onStringData(UTF8Encoding.UTF8.GetString(data, offset, len)); }
} }
if (mem != null) { mem.Dispose(); mem = null; }
} }
private Dictionary<string, string> ParseHttpHeader(string header) private Dictionary<string, string> ParseHttpHeader(string header)
@@ -425,47 +461,47 @@ namespace MeshCentralRouter
public void SendString(string data) public void SendString(string data)
{ {
if (state != ConnectionStates.Connected) return; if (state != ConnectionStates.Connected) return;
byte[] buf = UTF8Encoding.UTF8.GetBytes(data);
// Convert the string into a buffer with 4 byte of header space. SendFragment(buf, 0, buf.Length, 129);
int len = UTF8Encoding.UTF8.GetByteCount(data);
byte[] buf = new byte[4 + len];
UTF8Encoding.UTF8.GetBytes(data, 0, data.Length, buf, 4);
len = buf.Length - 4;
// Check that everything is ok
if ((len < 1) || (len > 65535)) { Dispose(); return; }
//Console.Write("Length: " + len + "\r\n");
//System.Threading.Thread.Sleep(0);
if (len < 126)
{
// Small fragment
buf[2] = 129; // Fragment op code (129 = text, 130 = binary)
buf[3] = (byte)(len & 0x7F);
//try { wsstream.BeginWrite(buf, 2, len + 2, new AsyncCallback(WriteWebSocketAsyncDone), args); } catch (Exception) { Dispose(); return; }
wsstream.Write(buf, 2, len + 2);
}
else
{
// Large fragment
buf[0] = 129; // Fragment op code (129 = text, 130 = binary)
buf[1] = 126;
buf[2] = (byte)((len >> 8) & 0xFF);
buf[3] = (byte)(len & 0xFF);
//try { wsstream.BeginWrite(buf, 0, len + 4, new AsyncCallback(WriteWebSocketAsyncDone), args); } catch (Exception) { Dispose(); return; }
wsstream.Write(buf, 0, len + 4);
}
} }
public void SendBinary(byte[] data, int offset, int len) public void SendBinary(byte[] data, int offset, int len) { SendFragment(data, offset, len, 130); }
// Fragment op code (129 = text, 130 = binary)
public void SendFragment(byte[] data, int offset, int len, byte op)
{ {
if (state != ConnectionStates.Connected) return; if (state != ConnectionStates.Connected) return;
byte[] buf;
// Convert the string into a buffer with 4 byte of header space. // If deflate is active, attempt to compress the data here.
byte[] buf = new byte[4 + len]; if ((deflateMemory != null) && (len > 32))
Array.Copy(data, offset, buf, 4, len); {
len = buf.Length - 4; deflateMemory.SetLength(0);
deflateMemory.Write(inflateStart, 0, 4);
DeflateStream deflate = new DeflateStream(deflateMemory, CompressionMode.Compress, true);
deflate.Write(data, offset, len);
deflate.Dispose();
deflate = null;
if (deflateMemory.Length < len)
{
// Use the compressed data
int newlen = (int)deflateMemory.Length;
buf = deflateMemory.GetBuffer();
len = newlen - 4;
op |= 0x40; // Add compression op
} else {
// Don't use the compress data
// Convert the string into a buffer with 4 byte of header space.
buf = new byte[4 + len];
Array.Copy(data, offset, buf, 4, len);
}
}
else
{
// Convert the string into a buffer with 4 byte of header space.
buf = new byte[4 + len];
Array.Copy(data, offset, buf, 4, len);
}
// Check that everything is ok // Check that everything is ok
if ((len < 1) || (len > 65535)) { Dispose(); return; } if ((len < 1) || (len > 65535)) { Dispose(); return; }
@@ -476,7 +512,7 @@ namespace MeshCentralRouter
if (len < 126) if (len < 126)
{ {
// Small fragment // Small fragment
buf[2] = 130; // Fragment op code (129 = text, 130 = binary) buf[2] = op;
buf[3] = (byte)(len & 0x7F); buf[3] = (byte)(len & 0x7F);
//try { wsstream.BeginWrite(buf, 2, len + 2, new AsyncCallback(WriteWebSocketAsyncDone), args); } catch (Exception) { Dispose(); return; } //try { wsstream.BeginWrite(buf, 2, len + 2, new AsyncCallback(WriteWebSocketAsyncDone), args); } catch (Exception) { Dispose(); return; }
wsstream.Write(buf, 2, len + 2); wsstream.Write(buf, 2, len + 2);
@@ -484,7 +520,7 @@ namespace MeshCentralRouter
else else
{ {
// Large fragment // Large fragment
buf[0] = 130; // Fragment op code (129 = text, 130 = binary) buf[0] = op;
buf[1] = 126; buf[1] = 126;
buf[2] = (byte)((len >> 8) & 0xFF); buf[2] = (byte)((len >> 8) & 0xFF);
buf[3] = (byte)(len & 0xFF); buf[3] = (byte)(len & 0xFF);