diff --git a/guacamole-common-js/src/main/resources/guacamole.js b/guacamole-common-js/src/main/resources/guacamole.js index db7ad9b6b..0e5a5af1c 100644 --- a/guacamole-common-js/src/main/resources/guacamole.js +++ b/guacamole-common-js/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 == ";") { + + // 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 }