diff --git a/guacamole/client/src/net/sourceforge/guacamole/GuacamoleClient.java b/guacamole/client/src/net/sourceforge/guacamole/GuacamoleClient.java index b94d8eee3..c87d32a2f 100644 --- a/guacamole/client/src/net/sourceforge/guacamole/GuacamoleClient.java +++ b/guacamole/client/src/net/sourceforge/guacamole/GuacamoleClient.java @@ -133,7 +133,7 @@ public class GuacamoleClient extends Client { try { // While we're blocking, or input is available - do { + for (;;) { // If past threshold, resize buffer before reading if (usedLength > buffer.length/2) { @@ -176,14 +176,13 @@ public class GuacamoleClient extends Client { } - } while (input.ready()); // End read loop + } // End read loop } catch (IOException e) { throw new GuacamoleException(e); } - return null; } } diff --git a/guacamole/client/web/javascript/guacamole.js b/guacamole/client/web/javascript/guacamole.js index d5047c77a..83ca58adf 100644 --- a/guacamole/client/web/javascript/guacamole.js +++ b/guacamole/client/web/javascript/guacamole.js @@ -57,7 +57,6 @@ function VNCClient(display) { var cursorHotspotX = 0; var cursorHotspotY = 0; - // FIXME: Make object. Clean up. var cursorRectX = 0; var cursorRectY = 0; @@ -282,6 +281,7 @@ function VNCClient(display) { } var clipboardHandler = null; + var requests = 0; this.setClipboardHandler = function(handler) { clipboardHandler = handler; @@ -290,28 +290,20 @@ function VNCClient(display) { function handleResponse(xmlhttprequest) { - var startOffset = null; + var nextRequest = null; + + function startNextRequest() { + nextRequest = makeRequest(); + } + + // Start next request in 2 seconds. + setTimeout(startNextRequest, 2000); var instructionStart = 0; var startIndex = 0; - // Make request for next before it's too late - var nextRequest = null; - if (xmlhttprequest.readyState >= 2) - nextRequest = makeRequest(); - function parseResponse() { - // Make request the moment we receive headers - // If the event handler isn't set by the time headers are available, we will - // already have made this request. - if (xmlhttprequest.readyState == 2) { - if (nextRequest == null) - nextRequest = makeRequest(); - - startOffset = 0; - } - // Parse stream when data is received and when complete. if (xmlhttprequest.readyState == 3 || xmlhttprequest.readyState == 4) { @@ -357,7 +349,8 @@ function VNCClient(display) { if (isConnected()) { delete xmlhttprequest; - handleResponse(nextRequest); + if (nextRequest) + handleResponse(nextRequest); } break; @@ -375,21 +368,21 @@ function VNCClient(display) { } - }; + } xmlhttprequest.onreadystatechange = parseResponse; - - // Handle what we have so far. parseResponse(); + } + function makeRequest() { // Download self var xmlhttprequest = new XMLHttpRequest(); xmlhttprequest.open("GET", "instructions"); - xmlhttprequest.send(null); + xmlhttprequest.send(null); return xmlhttprequest; } @@ -555,7 +548,7 @@ function VNCClient(display) { var message = new GuacamoleMessage(connect_xmlhttprequest.responseXML); if (!message.hasErrors()) { setState(STATE_WAITING); - handleResponse(makeRequest()); // Start stream if connection successful + handleResponse(makeRequest()); } else handleErrors(message); diff --git a/guacamole/proxy/guacio.c b/guacamole/proxy/guacio.c index 87ab9184a..3deff95f9 100644 --- a/guacamole/proxy/guacio.c +++ b/guacamole/proxy/guacio.c @@ -65,11 +65,6 @@ void guac_close(GUACIO* io) { ssize_t __guac_write(GUACIO* io, const char* buf, int count) { struct timeval start, end; - suseconds_t elapsed; - - suseconds_t required_usecs; - struct timespec required_sleep; - int retval; /* Write and time how long the write takes (microseconds) */ @@ -82,18 +77,27 @@ ssize_t __guac_write(GUACIO* io, const char* buf, int count) { if (io->transfer_limit > 0) { + suseconds_t elapsed; + suseconds_t required_usecs; + /* Get elapsed time */ elapsed = (end.tv_sec - start.tv_sec) * 1000000 + end.tv_usec - start.tv_usec; - /* Sleep as necessary */ - required_usecs = retval * 1000 / io->transfer_limit; /* useconds at 128 k/s*/ - required_sleep.tv_sec = required_usecs / 1000000; - required_sleep.tv_nsec = (required_usecs % 1000000) * 1000; - nanosleep(&required_sleep, NULL); + /* Calculate how much time we must sleep */ + required_usecs = retval * 1000 / io->transfer_limit - elapsed; /* useconds at transfer_limit KB/s*/ + + /* Sleep as necessary */ + if (required_usecs > 0) { + + struct timespec required_sleep; + + required_sleep.tv_sec = required_usecs / 1000000; + required_sleep.tv_nsec = (required_usecs % 1000000) * 1000; + + nanosleep(&required_sleep, NULL); + + } - /* Get new elapsed time */ - gettimeofday(&end, NULL); - elapsed = (end.tv_sec - start.tv_sec) * 1000000 + end.tv_usec - start.tv_usec; } return retval;