From 438980d23354436d6bd9a2d1dbd6e78bca9018e7 Mon Sep 17 00:00:00 2001 From: Malcolm Scott Date: Sat, 28 Sep 2013 19:24:54 +0100 Subject: [PATCH] Implement XVP extension (shutdown/reboot/reset) --- include/rfb.js | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/include/rfb.js b/include/rfb.js index 83fe031..700e5a8 100644 --- a/include/rfb.js +++ b/include/rfb.js @@ -47,6 +47,8 @@ var that = {}, // Public API methods rfb_auth_scheme= '', rfb_tightvnc = false, + rfb_xvp_ver = 0, + // In preference order encodings = [ @@ -65,7 +67,8 @@ var that = {}, // Public API methods //['JPEG_quality_hi', -23 ], //['compress_lo', -255 ], ['compress_hi', -247 ], - ['last_rect', -224 ] + ['last_rect', -224 ], + ['xvp', -309 ] ], encHandlers = {}, @@ -161,6 +164,8 @@ Util.conf_defaults(conf, that, defaults, [ 'onFBResize(rfb, width, height): frame buffer resized'], ['onDesktopName', 'rw', 'func', function() { }, 'onDesktopName(rfb, name): desktop name received'], + ['onXvpInit', 'rw', 'func', function() { }, + 'onXvpInit(version): XVP extensions active for this connection'], // These callback names are deprecated ['updateState', 'rw', 'func', function() { }, @@ -991,7 +996,8 @@ normal_msg = function() { //Util.Debug(">> normal_msg"); var ret = true, msg_type, length, text, - c, first_colour, num_colours, red, green, blue; + c, first_colour, num_colours, red, green, blue, + xvp_ver, xvp_msg; if (FBU.rects > 0) { msg_type = 0; @@ -1041,6 +1047,24 @@ normal_msg = function() { conf.clipboardReceive(that, text); // Obsolete conf.onClipboard(that, text); break; + case 250: // XVP + ws.rQshift8(); // Padding + xvp_ver = ws.rQshift8(); + xvp_msg = ws.rQshift8(); + switch (xvp_msg) { + case 0: // XVP_FAIL + updateState(rfb_state, "Operation failed"); + break; + case 1: // XVP_INIT + rfb_xvp_ver = xvp_ver; + Util.Info("XVP extensions enabled (version " + rfb_xvp_ver + ")"); + conf.onXvpInit(rfb_xvp_ver); + break; + default: + fail("Disconnected: illegal server XVP message " + xvp_msg); + break; + } + break; default: fail("Disconnected: illegal server message type " + msg_type); Util.Debug("ws.rQslice(0,30):" + ws.rQslice(0,30)); @@ -1895,6 +1919,25 @@ that.sendCtrlAltDel = function() { ws.send(arr); }; +that.xvpOp = function(ver, op) { + if (rfb_xvp_ver < ver) { return false; } + Util.Info("Sending XVP operation " + op + " (version " + ver + ")") + ws.send_string("\xFA\x00" + String.fromCharCode(ver) + String.fromCharCode(op)); + return true; +}; + +that.xvpShutdown = function() { + return that.xvpOp(1, 2); +}; + +that.xvpReboot = function() { + return that.xvpOp(1, 3); +}; + +that.xvpReset = function() { + return that.xvpOp(1, 4); +}; + // Send a key press. If 'down' is not specified then send a down key // followed by an up key. that.sendKey = function(code, down) {