var instructionHandlers = {
"error": function(parameters) {
- if (guac_client.onerror) guac_client.onerror(unescapeGuacamoleString(parameters[0]));
+ if (guac_client.onerror) guac_client.onerror(parameters[0]);
disconnect();
},
"name": function(parameters) {
- if (guac_client.onname) guac_client.onname(unescapeGuacamoleString(parameters[0]));
+ if (guac_client.onname) guac_client.onname(parameters[0]);
},
"clipboard": function(parameters) {
- if (guac_client.onclipboard) guac_client.onclipboard(unescapeGuacamoleString(parameters[0]));
+ if (guac_client.onclipboard) guac_client.onclipboard(parameters[0]);
},
"size": function(parameters) {
}
- 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;
-
- }
-
guac_client.disconnect = disconnect;
guac_client.connect = function(data) {
setState(STATE_WAITING);
};
- guac_client.escapeGuacamoleString = escapeGuacamoleString;
- guac_client.unescapeGuacamoleString = unescapeGuacamoleString;
-
}
var nextRequest = null;
var dataUpdateEvents = 0;
- var instructionStart = 0;
+
+ // The location of the last element's terminator
+ var elementEnd = -1;
+
+ // Where to start the next length search or the next element
var startIndex = 0;
+ // Parsed elements
+ var elements = new Array();
+
function parseResponse() {
// Do not handle responses if not connected
}
var current = xmlhttprequest.responseText;
- var instructionEnd;
- while ((instructionEnd = current.indexOf(";", startIndex)) != -1) {
+ // While search is within currently received data
+ while (elementEnd < current.length) {
- // Start next search at next instruction
- startIndex = instructionEnd+1;
+ // If we are waiting for element data
+ if (elementEnd >= startIndex) {
- var instruction = current.substr(instructionStart,
- instructionEnd - instructionStart);
+ // We now have enough data for the element. Parse.
+ var element = current.substring(startIndex, elementEnd);
+ var terminator = current.substring(elementEnd, elementEnd+1);
- instructionStart = startIndex;
+ // Add element to array
+ elements.push(element);
- var opcodeEnd = instruction.indexOf(":");
+ // If last element, handle instruction
+ if (terminator == ";") {
- var opcode;
- var parameters;
- if (opcodeEnd == -1) {
- opcode = instruction;
- parameters = new Array();
- }
- else {
- opcode = instruction.substr(0, opcodeEnd);
- parameters = instruction.substr(opcodeEnd+1).split(",");
- }
+ // Get opcode
+ var opcode = elements.shift();
- // If we're done parsing, handle the next response.
- if (opcode.length == 0) {
+ // Call instruction handler.
+ if (tunnel.oninstruction != null)
+ tunnel.oninstruction(opcode, elements);
- delete xmlhttprequest;
- if (nextRequest)
- handleResponse(nextRequest);
+ // Clear elements
+ elements.length = 0;
+
+ }
+
+ // Start searching for length at character after
+ // element terminator
+ startIndex = elementEnd + 1;
- break;
}
- // Call instruction handler.
- if (tunnel.oninstruction != null)
- tunnel.oninstruction(opcode, parameters);
- }
+ // Search for end of length
+ var lengthEnd = current.indexOf(".", startIndex);
+ if (lengthEnd != -1) {
+
+ // Parse length
+ var length = parseInt(current.substring(elementEnd+1, lengthEnd));
- // Start search at end of string.
- startIndex = current.length;
+ // If we're done parsing, handle the next response.
+ if (length == 0) {
+
+ // Clean up interval if polling
+ if (interval != null)
+ clearInterval(interval);
+
+ // Clean up object
+ xmlhttprequest.onreadystatechange = null;
+ xmlhttprequest.abort();
+
+ // Start handling next request
+ if (nextRequest)
+ handleResponse(nextRequest);
+
+ // Done parsing
+ break;
+
+ }
+
+ // Calculate start of element
+ startIndex = lengthEnd + 1;
+
+ // Calculate location of element terminator
+ elementEnd = startIndex + length;
+
+ }
+
+ // If no period yet, continue search when more data
+ // is received
+ else {
+ startIndex = current.length;
+ break;
+ }
- delete instruction;
- delete parameters;
+ } // end parse loop
}