GUACAMOLE-629: Add support for updating connection parameters of in-progress connections.
This commit is contained in:
parent
54fda21366
commit
8456c050ea
@ -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.
|
||||
|
@ -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;
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user