From 3925eedc5300c8002c59fc7a5683369589f463af Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Tue, 15 Oct 2013 11:51:14 -0700 Subject: [PATCH] Implement ack, use instead of sync to signal continuing upload. --- .../src/main/resources/guacamole.js | 34 ++++++++++++++----- .../src/main/webapp/scripts/client-ui.js | 31 +++-------------- 2 files changed, 30 insertions(+), 35 deletions(-) diff --git a/guacamole-common-js/src/main/resources/guacamole.js b/guacamole-common-js/src/main/resources/guacamole.js index e0fe0bf8f..9652d12ba 100644 --- a/guacamole-common-js/src/main/resources/guacamole.js +++ b/guacamole-common-js/src/main/resources/guacamole.js @@ -372,6 +372,17 @@ Guacamole.OutputStream = function(client, index) { */ this.onerror = null; + /** + * Fired whenever an acknowledgement is received from the server, indicating + * that a stream operation has completed. + * + * @event + * @param {String} message A human-readable status message related to the + * operation performed. + * @param {Number} code The error code associated with the operation. + */ + this.onack = null; + /** * Writes the given base64-encoded data to this stream as a blob. * @@ -875,7 +886,7 @@ Guacamole.Client = function(tunnel) { */ var instructionHandlers = { - "abort": function(parameters) { + "ack": function(parameters) { var stream_index = parseInt(parameters[0]); var reason = parameters[1]; @@ -883,16 +894,23 @@ Guacamole.Client = function(tunnel) { // Get stream var stream = output_streams[stream_index]; - - // Invalidate stream if (stream) { - // Signal error if handler defined - if (stream.onerror) - stream.onerror(reason, code); + // If code is an error, invalidate stream + if (code >= 0x0100) { + + // Signal error + if (stream.onerror) + stream.onerror(reason, code); + + stream_indices.free(stream_index); + delete output_streams[stream_index]; + } + + // Signal error if handler defined + else if (stream.onack) + stream.onack(reason, code); - stream_indices.free(stream_index); - delete output_streams[stream_index]; } }, diff --git a/guacamole/src/main/webapp/scripts/client-ui.js b/guacamole/src/main/webapp/scripts/client-ui.js index 8904005f5..7cebea370 100644 --- a/guacamole/src/main/webapp/scripts/client-ui.js +++ b/guacamole/src/main/webapp/scripts/client-ui.js @@ -673,9 +673,6 @@ GuacUI.Client.attach = function(guac) { // Get display element var guac_display = guac.getDisplay(); - // Array of any pending uploads - var pending_uploads = []; - /* * Update the scale of the display when the client display size changes. */ @@ -773,18 +770,6 @@ GuacUI.Client.attach = function(guac) { GuacUI.sessionState.setProperty("clipboard", data); }; - // Handle any pending uploads when server is ready - guac.onsync = function() { - - // Pull top pending upload from head of list - var pending_upload = pending_uploads.shift(); - - // If still more to upload, add to tail of list - if (pending_upload && pending_upload()) - pending_uploads.push(pending_upload); - - }; - /* * Prompt to download file when file received. */ @@ -1112,9 +1097,9 @@ GuacUI.Client.attach = function(guac) { stream.onerror = function() { valid = false; }; - - // Create upload callback - function continueUpload() { + + // Continue upload when acknowledged + stream.onack = function() { // Abort upload if stream is invalid if (!valid) return false; @@ -1130,19 +1115,11 @@ GuacUI.Client.attach = function(guac) { offset += 4096; // If at end, stop upload - if (offset >= bytes.length) { + if (offset >= bytes.length) stream.close(); - return false; - } - - // Otherwise, continue - return true; }; - // Add to list, ready for sending - pending_uploads.push(continueUpload); - }; reader.readAsArrayBuffer(file);