this.setOnStateChangeHandler = function(handler) {
stateChangeHandler = handler;
- }
+ };
function isConnected() {
return currentState == STATE_CONNECTED
return;
tunnel.sendMessage("key:" + keysym + "," + pressed + ";");
- }
+ };
this.sendMouseState = function(mouseState) {
// Send message
tunnel.sendMessage("mouse:" + mouseState.getX() + "," + mouseState.getY() + "," + buttonMask + ";");
- }
+ };
this.setClipboard = function(data) {
if (!isConnected())
return;
- tunnel.sendMessage("clipboard:" + tunnel.escapeGuacamoleString(data) + ";");
- }
+ tunnel.sendMessage("clipboard:" + escapeGuacamoleString(data) + ";");
+ };
// Handlers
this.getLayers = function() {
return layers;
- }
+ };
function getLayer(index) {
var instructionHandlers = {
"error": function(parameters) {
- if (errorHandler) errorHandler(tunnel.unescapeGuacamoleString(parameters[0]));
+ if (errorHandler) errorHandler(unescapeGuacamoleString(parameters[0]));
disconnect();
},
"name": function(parameters) {
- if (nameHandler) nameHandler(tunnel.unescapeGuacamoleString(parameters[0]));
+ if (nameHandler) nameHandler(unescapeGuacamoleString(parameters[0]));
},
"clipboard": function(parameters) {
- if (clipboardHandler) clipboardHandler(tunnel.unescapeGuacamoleString(parameters[0]));
+ if (clipboardHandler) clipboardHandler(unescapeGuacamoleString(parameters[0]));
},
"size": function(parameters) {
handler(parameters);
}
-
- this.connect = function() {
- setState(STATE_CONNECTING);
- tunnel.connect();
- setState(STATE_WAITING);
-
- };
-
-
function disconnect() {
// Only attempt disconnection not disconnected.
}
+ function escapeGuacamoleString(str) {
+
+ var escapedString = "";
+
+ for (var i=0; i<str.length; i++) {
+
+ var c = str.charAt(i);
+ if (c == ",")
+ escapedString += "\\c";
+ else if (c == ";")
+ escapedString += "\\s";
+ else if (c == "\\")
+ escapedString += "\\\\";
+ else
+ escapedString += c;
+
+ }
+
+ return escapedString;
+
+ }
+
+ function unescapeGuacamoleString(str) {
+
+ var unescapedString = "";
+
+ for (var i=0; i<str.length; i++) {
+
+ var c = str.charAt(i);
+ if (c == "\\" && i<str.length-1) {
+
+ var escapeChar = str.charAt(++i);
+ if (escapeChar == "c")
+ unescapedString += ",";
+ else if (escapeChar == "s")
+ unescapedString += ";";
+ else if (escapeChar == "\\")
+ unescapedString += "\\";
+ else
+ unescapedString += "\\" + escapeChar;
+
+ }
+ else
+ unescapedString += c;
+
+ }
+
+ return unescapedString;
+
+ }
+
this.disconnect = disconnect;
+ this.connect = function() {
+
+ setState(STATE_CONNECTING);
+ tunnel.connect();
+ setState(STATE_WAITING);
+
+ };
+
+ this.escapeGuacamoleString = escapeGuacamoleString;
+ this.unescapeGuacamoleString = unescapeGuacamoleString;
}
var TUNNEL_READ = tunnelURL + "?read";
var TUNNEL_WRITE = tunnelURL + "?write";
- var connected = 0;
- var pollResponse = 1; // Default to polling - will be turned off automatically if not needed
+ var STATE_IDLE = 0;
+ var STATE_CONNECTED = 1;
+ var STATE_DISCONNECTED = 2;
+
+ var currentState = STATE_IDLE;
+
+ var POLLING_ENABLED = 1;
+ var POLLING_DISABLED = 0;
+
+ // Default to polling - will be turned off automatically if not needed
+ var pollingMode = POLLING_ENABLED;
+
var instructionHandler = null;
var sendingMessages = 0;
function sendMessage(message) {
// Do not attempt to send messages if not connected
- if (!connected)
+ if (currentState != STATE_CONNECTED)
return;
// Add event to queue, restart send loop if finished.
if (sendingMessages == 0)
sendPendingMessages();
- };
+ }
function sendPendingMessages() {
function parseResponse() {
// Do not handle responses if not connected
- if (!connected) {
+ if (currentState != STATE_CONNECTED) {
// Clean up interval if polling
if (interval != null)
xmlhttprequest.readyState == 4) {
// Also poll every 30ms (some browsers don't repeatedly call onreadystatechange for new data)
- if (pollResponse == 1) {
+ if (pollingMode == POLLING_ENABLED) {
if (xmlhttprequest.readyState == 3 && interval == null)
interval = setInterval(parseResponse, 30);
else if (xmlhttprequest.readyState == 4 && interval != null)
// If response polling enabled, attempt to detect if still
// necessary (via wrapping parseResponse())
- if (pollResponse == 1) {
+ if (pollingMode == POLLING_ENABLED) {
xmlhttprequest.onreadystatechange = function() {
// If we receive two or more readyState==3 events,
if (xmlhttprequest.readyState == 3) {
dataUpdateEvents++;
if (dataUpdateEvents >= 2) {
- pollResponse = 0;
+ pollingMode = POLLING_DISABLED;
xmlhttprequest.onreadystatechange = parseResponse;
}
}
connect_xmlhttprequest.send(null);
// Start reading data
- connected = 1;
+ currentState = STATE_CONNECTED;
handleResponse(makeRequest());
}
function disconnect() {
- connected = 0;
+ currentState = STATE_DISCONNECTED;
}
// External API
this.sendMessage = sendMessage;
this.setInstructionHandler = function(handler) {
instructionHandler = handler;
- }
-
- this.escapeGuacamoleString = function(str) {
-
- var escapedString = "";
-
- for (var i=0; i<str.length; i++) {
-
- var c = str.charAt(i);
- if (c == ",")
- escapedString += "\\c";
- else if (c == ";")
- escapedString += "\\s";
- else if (c == "\\")
- escapedString += "\\\\";
- else
- escapedString += c;
-
- }
-
- return escapedString;
-
- }
-
- this.unescapeGuacamoleString = function(str) {
-
- var unescapedString = "";
-
- for (var i=0; i<str.length; i++) {
-
- var c = str.charAt(i);
- if (c == "\\" && i<str.length-1) {
-
- var escapeChar = str.charAt(++i);
- if (escapeChar == "c")
- unescapedString += ",";
- else if (escapeChar == "s")
- unescapedString += ";";
- else if (escapeChar == "\\")
- unescapedString += "\\";
- else
- unescapedString += "\\" + escapeChar;
-
- }
- else
- unescapedString += c;
-
- }
-
- return unescapedString;
-
- }
+ };
}