Support for new instruction format.

This commit is contained in:
Michael Jumper
2011-09-10 19:09:17 -07:00
parent 970665f037
commit 5e92911073
2 changed files with 78 additions and 70 deletions

View File

@@ -227,16 +227,16 @@ Guacamole.Client = function(display, tunnel) {
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) {
@@ -454,35 +454,6 @@ Guacamole.Client = function(display, tunnel) {
}
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) {
@@ -499,7 +470,4 @@ Guacamole.Client = function(display, tunnel) {
setState(STATE_WAITING);
};
guac_client.escapeGuacamoleString = escapeGuacamoleString;
guac_client.unescapeGuacamoleString = unescapeGuacamoleString;
}

View File

@@ -154,9 +154,16 @@ Guacamole.HTTPTunnel = function(tunnelURL) {
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
@@ -208,51 +215,84 @@ Guacamole.HTTPTunnel = function(tunnelURL) {
}
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 == ";") {
// Get opcode
var opcode = elements.shift();
// Call instruction handler.
if (tunnel.oninstruction != null)
tunnel.oninstruction(opcode, elements);
// Clear elements
elements.length = 0;
}
// Start searching for length at character after
// element terminator
startIndex = elementEnd + 1;
var opcode;
var parameters;
if (opcodeEnd == -1) {
opcode = instruction;
parameters = new Array();
}
// Search for end of length
var lengthEnd = current.indexOf(".", startIndex);
if (lengthEnd != -1) {
// Parse length
var length = parseInt(current.substring(elementEnd+1, lengthEnd));
// 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 {
opcode = instruction.substr(0, opcodeEnd);
parameters = instruction.substr(opcodeEnd+1).split(",");
}
// If we're done parsing, handle the next response.
if (opcode.length == 0) {
delete xmlhttprequest;
if (nextRequest)
handleResponse(nextRequest);
startIndex = current.length;
break;
}
// Call instruction handler.
if (tunnel.oninstruction != null)
tunnel.oninstruction(opcode, parameters);
}
// Start search at end of string.
startIndex = current.length;
delete instruction;
delete parameters;
} // end parse loop
}