GUACAMOLE-629: Add support for updating connection parameters of in-progress connections.

This commit is contained in:
Michael Jumper 2018-09-23 22:39:31 -07:00
parent 54fda21366
commit 8456c050ea
4 changed files with 83 additions and 0 deletions

View File

@ -237,6 +237,36 @@ typedef int guac_user_file_handler(guac_user* user, guac_stream* stream,
typedef int guac_user_pipe_handler(guac_user* user, guac_stream* stream,
char* mimetype, char* name);
/**
* Handler for Guacamole argument value (argv) streams received from a user.
* Argument value streams are real-time revisions to the connection parameters
* of an in-progress connection. Each such argument value stream begins when
* the user sends a "argv" instruction. To handle received data along this
* stream, implementations of this handler must assign blob and end handlers to
* the given stream object.
*
* @param user
* The user that opened the argument value stream.
*
* @param stream
* The stream object allocated by libguac to represent the argument value
* stream opened by the user.
*
* @param mimetype
* The mimetype of the data that will be sent along the stream.
*
* @param name
* The name of the connection parameter being updated. It is up to the
* implementation of this handler to decide whether and how to update a
* connection parameter.
*
* @return
* Zero if the opening of the argument value stream has been handled
* successfully, or non-zero if an error occurs.
*/
typedef int guac_user_argv_handler(guac_user* user, guac_stream* stream,
char* mimetype, char* name);
/**
* Handler for Guacamole stream blobs. Each blob originates from a "blob"
* instruction which was associated with a previously-created stream.

View File

@ -475,6 +475,27 @@ struct guac_user {
*/
guac_user_audio_handler* audio_handler;
/**
* Handler for argv events (updates to the connection parameters of an
* in-progress connection) sent by the Guacamole web-client.
*
* The handler takes a guac_stream which contains the stream index and
* will persist through the duration of the transfer, the mimetype of
* the data being transferred, and the argument (connection parameter)
* name.
*
* Example:
* @code
* int argv_handler(guac_user* user, guac_stream* stream,
* char* mimetype, char* name);
*
* int guac_user_init(guac_user* user, int argc, char** argv) {
* user->argv_handler = argv_handler;
* }
* @endcode
*/
guac_user_argv_handler* argv_handler;
};
/**

View File

@ -49,6 +49,7 @@ __guac_instruction_handler_mapping __guac_instruction_handler_map[] = {
{"get", __guac_handle_get},
{"put", __guac_handle_put},
{"audio", __guac_handle_audio},
{"argv", __guac_handle_argv},
{NULL, NULL}
};
@ -382,6 +383,30 @@ int __guac_handle_pipe(guac_user* user, int argc, char** argv) {
return 0;
}
int __guac_handle_argv(guac_user* user, int argc, char** argv) {
/* Pull corresponding stream */
int stream_index = atoi(argv[0]);
guac_stream* stream = __init_input_stream(user, stream_index);
if (stream == NULL)
return 0;
/* If supported, call handler */
if (user->argv_handler)
return user->argv_handler(
user,
stream,
argv[1], /* mimetype */
argv[2] /* name */
);
/* Otherwise, abort */
guac_protocol_send_ack(user->socket, stream,
"Reconfiguring in-progress connections unsupported",
GUAC_PROTOCOL_STATUS_UNSUPPORTED);
return 0;
}
int __guac_handle_ack(guac_user* user, int argc, char** argv) {
guac_stream* stream;

View File

@ -120,6 +120,13 @@ __guac_instruction_handler __guac_handle_file;
*/
__guac_instruction_handler __guac_handle_pipe;
/**
* Internal initial handler for the argv instruction. When a argv instruction
* is received, this handler will be called. The client's argv handler will
* be invoked if defined.
*/
__guac_instruction_handler __guac_handle_argv;
/**
* Internal initial handler for the ack instruction. When a ack instruction
* is received, this handler will be called. The client's ack handler will