mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-07 05:31:22 +00:00
Changed semantics of stream, more IO limiting code.
This commit is contained in:
@@ -133,7 +133,7 @@ public class GuacamoleClient extends Client {
|
|||||||
try {
|
try {
|
||||||
|
|
||||||
// While we're blocking, or input is available
|
// While we're blocking, or input is available
|
||||||
do {
|
for (;;) {
|
||||||
|
|
||||||
// If past threshold, resize buffer before reading
|
// If past threshold, resize buffer before reading
|
||||||
if (usedLength > buffer.length/2) {
|
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) {
|
catch (IOException e) {
|
||||||
throw new GuacamoleException(e);
|
throw new GuacamoleException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -57,7 +57,6 @@ function VNCClient(display) {
|
|||||||
var cursorHotspotX = 0;
|
var cursorHotspotX = 0;
|
||||||
var cursorHotspotY = 0;
|
var cursorHotspotY = 0;
|
||||||
|
|
||||||
|
|
||||||
// FIXME: Make object. Clean up.
|
// FIXME: Make object. Clean up.
|
||||||
var cursorRectX = 0;
|
var cursorRectX = 0;
|
||||||
var cursorRectY = 0;
|
var cursorRectY = 0;
|
||||||
@@ -282,6 +281,7 @@ function VNCClient(display) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var clipboardHandler = null;
|
var clipboardHandler = null;
|
||||||
|
var requests = 0;
|
||||||
|
|
||||||
this.setClipboardHandler = function(handler) {
|
this.setClipboardHandler = function(handler) {
|
||||||
clipboardHandler = handler;
|
clipboardHandler = handler;
|
||||||
@@ -290,28 +290,20 @@ function VNCClient(display) {
|
|||||||
|
|
||||||
function handleResponse(xmlhttprequest) {
|
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 instructionStart = 0;
|
||||||
var startIndex = 0;
|
var startIndex = 0;
|
||||||
|
|
||||||
// Make request for next before it's too late
|
|
||||||
var nextRequest = null;
|
|
||||||
if (xmlhttprequest.readyState >= 2)
|
|
||||||
nextRequest = makeRequest();
|
|
||||||
|
|
||||||
function parseResponse() {
|
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.
|
// Parse stream when data is received and when complete.
|
||||||
if (xmlhttprequest.readyState == 3 ||
|
if (xmlhttprequest.readyState == 3 ||
|
||||||
xmlhttprequest.readyState == 4) {
|
xmlhttprequest.readyState == 4) {
|
||||||
@@ -357,7 +349,8 @@ function VNCClient(display) {
|
|||||||
|
|
||||||
if (isConnected()) {
|
if (isConnected()) {
|
||||||
delete xmlhttprequest;
|
delete xmlhttprequest;
|
||||||
handleResponse(nextRequest);
|
if (nextRequest)
|
||||||
|
handleResponse(nextRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -375,21 +368,21 @@ function VNCClient(display) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
}
|
||||||
|
|
||||||
xmlhttprequest.onreadystatechange = parseResponse;
|
xmlhttprequest.onreadystatechange = parseResponse;
|
||||||
|
|
||||||
// Handle what we have so far.
|
|
||||||
parseResponse();
|
parseResponse();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function makeRequest() {
|
function makeRequest() {
|
||||||
|
|
||||||
// Download self
|
// Download self
|
||||||
var xmlhttprequest = new XMLHttpRequest();
|
var xmlhttprequest = new XMLHttpRequest();
|
||||||
xmlhttprequest.open("GET", "instructions");
|
xmlhttprequest.open("GET", "instructions");
|
||||||
xmlhttprequest.send(null);
|
|
||||||
|
|
||||||
|
xmlhttprequest.send(null);
|
||||||
return xmlhttprequest;
|
return xmlhttprequest;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -555,7 +548,7 @@ function VNCClient(display) {
|
|||||||
var message = new GuacamoleMessage(connect_xmlhttprequest.responseXML);
|
var message = new GuacamoleMessage(connect_xmlhttprequest.responseXML);
|
||||||
if (!message.hasErrors()) {
|
if (!message.hasErrors()) {
|
||||||
setState(STATE_WAITING);
|
setState(STATE_WAITING);
|
||||||
handleResponse(makeRequest()); // Start stream if connection successful
|
handleResponse(makeRequest());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
handleErrors(message);
|
handleErrors(message);
|
||||||
|
@@ -65,11 +65,6 @@ void guac_close(GUACIO* io) {
|
|||||||
ssize_t __guac_write(GUACIO* io, const char* buf, int count) {
|
ssize_t __guac_write(GUACIO* io, const char* buf, int count) {
|
||||||
|
|
||||||
struct timeval start, end;
|
struct timeval start, end;
|
||||||
suseconds_t elapsed;
|
|
||||||
|
|
||||||
suseconds_t required_usecs;
|
|
||||||
struct timespec required_sleep;
|
|
||||||
|
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
/* Write and time how long the write takes (microseconds) */
|
/* 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) {
|
if (io->transfer_limit > 0) {
|
||||||
|
|
||||||
|
suseconds_t elapsed;
|
||||||
|
suseconds_t required_usecs;
|
||||||
|
|
||||||
/* Get elapsed time */
|
/* Get elapsed time */
|
||||||
elapsed = (end.tv_sec - start.tv_sec) * 1000000 + end.tv_usec - start.tv_usec;
|
elapsed = (end.tv_sec - start.tv_sec) * 1000000 + end.tv_usec - start.tv_usec;
|
||||||
|
|
||||||
/* Sleep as necessary */
|
/* Calculate how much time we must sleep */
|
||||||
required_usecs = retval * 1000 / io->transfer_limit; /* useconds at 128 k/s*/
|
required_usecs = retval * 1000 / io->transfer_limit - elapsed; /* useconds at transfer_limit KB/s*/
|
||||||
required_sleep.tv_sec = required_usecs / 1000000;
|
|
||||||
required_sleep.tv_nsec = (required_usecs % 1000000) * 1000;
|
/* Sleep as necessary */
|
||||||
nanosleep(&required_sleep, NULL);
|
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;
|
return retval;
|
||||||
|
Reference in New Issue
Block a user