From: Michael Jumper Date: Sun, 11 Sep 2011 02:09:17 +0000 (-0700) Subject: Support for new instruction format. X-Git-Url: http://git.alex.org.uk Support for new instruction format. --- diff --git a/src/main/resources/guacamole.js b/src/main/resources/guacamole.js index db7ad9b..0e5a5af 100644 --- a/src/main/resources/guacamole.js +++ b/src/main/resources/guacamole.js @@ -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= 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 }