Commit ff36b127 authored by Joel Martin's avatar Joel Martin

Refactor settings object, add connectTimeout setting.

- include/util.js: Add type and desc field to conf_default routine.
  Make comment descriptions of settings into desc parameters that can
  be queried. Also, use set_FOO in conf_default to set or coerce the
  current setting so that we always have the right type for the value.

- include/rfb.js, include/default_config.js: add connectTimeout
  setting to address situations with slow connections that may need
  more than 2 seconds.
parent aa787069
...@@ -31,18 +31,20 @@ var that = {}, // Public API interface ...@@ -31,18 +31,20 @@ var that = {}, // Public API interface
c_mouseMove = null; c_mouseMove = null;
// Capability settings, default can be overridden
Util.conf_default(conf, that, 'prefer_js', null);
Util.conf_default(conf, that, 'cursor_uri', null);
// Configuration settings // Configuration settings
Util.conf_default(conf, that, 'target', null); function cdef(v, type, defval, desc) {
// Area that traps keyboard input Util.conf_default(conf, that, v, type, defval, desc); }
Util.conf_default(conf, that, 'focusContainer', document);
Util.conf_default(conf, that, 'true_color', true); // Capability settings, default can be overridden
Util.conf_default(conf, that, 'focused', true); cdef('prefer_js', 'raw', null, 'Prefer Javascript over canvas methods');
Util.conf_default(conf, that, 'colourMap', []); cdef('cursor_uri', 'raw', null, 'Can we render cursor using data URI');
Util.conf_default(conf, that, 'scale', 1);
cdef('target', 'dom', null, 'Canvas element for VNC viewport');
cdef('focusContainer', 'dom', document, 'DOM element that traps keyboard input');
cdef('true_color', 'bool', true, 'Request true color pixel data');
cdef('focused', 'bool', true, 'Capture and send key strokes');
cdef('colourMap', 'raw', [], 'Colour map array (not true color)');
cdef('scale', 'float', 1, 'VNC viewport scale factor');
// Override some specific getters/setters // Override some specific getters/setters
that.set_prefer_js = function(val) { that.set_prefer_js = function(val) {
......
...@@ -49,6 +49,8 @@ load: function(target) { ...@@ -49,6 +49,8 @@ load: function(target) {
html += ' type="checkbox" checked> True Color</li>'; html += ' type="checkbox" checked> True Color</li>';
html += ' <li><input id="VNC_cursor"'; html += ' <li><input id="VNC_cursor"';
html += ' type="checkbox"> Local Cursor</li>'; html += ' type="checkbox"> Local Cursor</li>';
html += ' <li><input id="VNC_connectTimeout"';
html += ' type="input"> Connect Timeout (s)</li>';
html += ' <hr>'; html += ' <hr>';
// Stylesheet selection dropdown // Stylesheet selection dropdown
...@@ -113,6 +115,7 @@ load: function(target) { ...@@ -113,6 +115,7 @@ load: function(target) {
DC.initSetting('encrypt', false); DC.initSetting('encrypt', false);
DC.initSetting('true_color', true); DC.initSetting('true_color', true);
DC.initSetting('cursor', false); DC.initSetting('cursor', false);
DC.initSetting('connectTimeout', 2);
DC.rfb = RFB({'target': 'VNC_canvas', DC.rfb = RFB({'target': 'VNC_canvas',
'updateState': DC.updateState, 'updateState': DC.updateState,
...@@ -215,6 +218,7 @@ clickSettingsMenu: function() { ...@@ -215,6 +218,7 @@ clickSettingsMenu: function() {
DC.updateSetting('cursor', false); DC.updateSetting('cursor', false);
$('VNC_cursor').disabled = true; $('VNC_cursor').disabled = true;
} }
DC.updateSetting('connectTimeout');
DC.updateSetting('stylesheet'); DC.updateSetting('stylesheet');
DC.updateSetting('logging'); DC.updateSetting('logging');
...@@ -245,6 +249,7 @@ settingsDisabled: function(disabled, rfb) { ...@@ -245,6 +249,7 @@ settingsDisabled: function(disabled, rfb) {
DefaultControls.updateSetting('cursor', false); DefaultControls.updateSetting('cursor', false);
$('VNC_cursor').disabled = true; $('VNC_cursor').disabled = true;
} }
$('VNC_connectTimeout').disabled = disabled;
//Util.Debug("<< settingsDisabled"); //Util.Debug("<< settingsDisabled");
}, },
...@@ -257,6 +262,7 @@ settingsApply: function() { ...@@ -257,6 +262,7 @@ settingsApply: function() {
if (DC.rfb.get_canvas().get_cursor_uri()) { if (DC.rfb.get_canvas().get_cursor_uri()) {
DC.saveSetting('cursor'); DC.saveSetting('cursor');
} }
DC.saveSetting('connectTimeout');
DC.saveSetting('stylesheet'); DC.saveSetting('stylesheet');
DC.saveSetting('logging'); DC.saveSetting('logging');
...@@ -357,6 +363,7 @@ connect: function() { ...@@ -357,6 +363,7 @@ connect: function() {
DC.rfb.set_encrypt(DC.getSetting('encrypt')); DC.rfb.set_encrypt(DC.getSetting('encrypt'));
DC.rfb.set_true_color(DC.getSetting('true_color')); DC.rfb.set_true_color(DC.getSetting('true_color'));
DC.rfb.set_local_cursor(DC.getSetting('cursor')); DC.rfb.set_local_cursor(DC.getSetting('cursor'));
DC.rfb.set_connectTimeout(DC.getSetting('connectTimeout'));
DC.rfb.connect(host, port, password); DC.rfb.connect(host, port, password);
}, },
......
...@@ -22,8 +22,11 @@ ...@@ -22,8 +22,11 @@
} }
#VNC_encrypt { #VNC_encrypt {
} }
#VNC_connectTimeout {
width: 30;
}
#VNC_connect_button { #VNC_connect_button {
width: 100px; width: 110px;
} }
#VNC_status_bar td { #VNC_status_bar td {
......
...@@ -127,31 +127,27 @@ var that = {}, // Public API interface ...@@ -127,31 +127,27 @@ var that = {}, // Public API interface
// //
// Configuration settings // Configuration settings
// //
function cdef(v, type, defval, desc) {
Util.conf_default(conf, that, v, type, defval, desc); }
// VNC viewport rendering Canvas cdef('target', 'str', 'VNC_canvas', 'VNC viewport rendering Canvas');
Util.conf_default(conf, that, 'target', 'VNC_canvas'); cdef('focusContainer', 'dom', document, 'Area that traps keyboard input');
// Area that traps keyboard input
Util.conf_default(conf, that, 'focusContainer', document);
Util.conf_default(conf, that, 'encrypt', false, true); cdef('encrypt', 'bool', false, 'Use TLS/SSL/wss encryption');
Util.conf_default(conf, that, 'true_color', true, true); cdef('true_color', 'bool', true, 'Request true color pixel data');
Util.conf_default(conf, that, 'local_cursor', false, true); cdef('local_cursor', 'bool', false, 'Request locally rendered cursor');
// time to wait for connection cdef('connectTimeout', 'int', 2, 'Time (s) to wait for connection');
Util.conf_default(conf, that, 'connectTimeout', 2000); cdef('disconnectTimeout', 'int', 3, 'Time (s) to wait for disconnection');
// time to wait for disconnection cdef('check_rate', 'int', 217, 'Timing (ms) of send/receive check');
Util.conf_default(conf, that, 'disconnectTimeout', 3000); cdef('fbu_req_rate', 'int', 1413, 'Timing (ms) of frameBufferUpdate requests');
// frequency to check for send/receive
Util.conf_default(conf, that, 'check_rate', 217);
// frequency to send frameBufferUpdate requests
Util.conf_default(conf, that, 'fbu_req_rate', 1413);
// state update callback cdef('updateState',
Util.conf_default(conf, that, 'updateState', function () { 'func', function() { Util.Debug("updateState stub"); },
Util.Debug(">> externalUpdateState stub"); }); 'callback: state update');
// clipboard contents received callback cdef('clipboardReceive',
Util.conf_default(conf, that, 'clipboardReceive', function () { 'func', function() { Util.Debug("clipboardReceive stub"); },
Util.Debug(">> clipboardReceive stub"); }); 'callback: clipboard contents received');
// Override/add some specific getters/setters // Override/add some specific getters/setters
...@@ -426,7 +422,7 @@ updateState = function(state, statusMsg) { ...@@ -426,7 +422,7 @@ updateState = function(state, statusMsg) {
connTimer = setTimeout(function () { connTimer = setTimeout(function () {
updateState('failed', "Connect timeout"); updateState('failed', "Connect timeout");
}, conf.connectTimeout); }, conf.connectTimeout * 1000);
init_vars(); init_vars();
init_ws(); init_ws();
...@@ -437,9 +433,11 @@ updateState = function(state, statusMsg) { ...@@ -437,9 +433,11 @@ updateState = function(state, statusMsg) {
case 'disconnect': case 'disconnect':
disconnTimer = setTimeout(function () { if (! test_mode) {
updateState('failed', "Disconnect timeout"); disconnTimer = setTimeout(function () {
}, conf.disconnectTimeout); updateState('failed', "Disconnect timeout");
}, conf.disconnectTimeout * 1000);
}
// WebSocket.onclose transitions to 'disconnected' // WebSocket.onclose transitions to 'disconnected'
break; break;
...@@ -526,7 +524,7 @@ function handle_message() { ...@@ -526,7 +524,7 @@ function handle_message() {
} }
recv_message = function(e) { recv_message = function(e) {
//Util.Debug(">> recv_message"); //Util.Debug(">> recv_message: " + e.data.length);
try { try {
decode_message(e.data); decode_message(e.data);
......
...@@ -131,10 +131,9 @@ Util.getQueryVar = function(name, defVal) { ...@@ -131,10 +131,9 @@ Util.getQueryVar = function(name, defVal) {
}; };
// Set defaults for Crockford style function namespaces // Set defaults for Crockford style function namespaces
Util.conf_default = function(cfg, api, v, val, force_bool) { Util.conf_default = function(cfg, api, v, type, defval, desc) {
if (typeof cfg[v] === 'undefined') { // Description
cfg[v] = val; api['get_' + v + '_desc'] = desc;
}
// Default getter // Default getter
if (typeof api['get_' + v] === 'undefined') { if (typeof api['get_' + v] === 'undefined') {
api['get_' + v] = function () { api['get_' + v] = function () {
...@@ -144,16 +143,26 @@ Util.conf_default = function(cfg, api, v, val, force_bool) { ...@@ -144,16 +143,26 @@ Util.conf_default = function(cfg, api, v, val, force_bool) {
// Default setter // Default setter
if (typeof api['set_' + v] === 'undefined') { if (typeof api['set_' + v] === 'undefined') {
api['set_' + v] = function (val) { api['set_' + v] = function (val) {
if (force_bool) { if (type in {'boolean':1, 'bool':1}) {
if ((!val) || (val in {'0':1, 'no':1, 'false':1})) { if ((!val) || (val in {'0':1, 'no':1, 'false':1})) {
val = false; val = false;
} else { } else {
val = true; val = true;
} }
} else if (type in {'integer':1, 'int':1}) {
val = parseInt(val, 10);
} }
cfg[v] = val; cfg[v] = val;
}; };
} }
if (typeof cfg[v] === 'undefined') {
// Set to default
api['set_' + v](defval);
} else {
// Coerce existing setting to the right type
api['set_' + v](cfg[v]);
}
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment