Support for new instruction format.
authorMichael Jumper <zhangmaike@users.sourceforge.net>
Sun, 11 Sep 2011 02:09:17 +0000 (19:09 -0700)
committerMichael Jumper <zhangmaike@users.sourceforge.net>
Sun, 11 Sep 2011 02:09:17 +0000 (19:09 -0700)
src/main/resources/guacamole.js
src/main/resources/tunnel.js

index db7ad9b..0e5a5af 100644 (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;
-
 }
index 58ee620..a58c3be 100644 (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 == ";") {
 
-                    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
 
             }