[WIP]: Code cleanup
This commit is contained in:
parent
4dae4fe5c1
commit
2268df76a9
@ -33,13 +33,13 @@ guac_argv_callback guac_spice_argv_callback;
|
||||
|
||||
/**
|
||||
* The name of the parameter Guacamole will use to specify/update the username
|
||||
* for the SPICE connection.
|
||||
* for the Spice connection.
|
||||
*/
|
||||
#define GUAC_SPICE_ARGV_USERNAME "username"
|
||||
|
||||
/**
|
||||
* The name of the parameter Guacamole will use to specify/update the password
|
||||
* for the SPICE connection.
|
||||
* for the Spice connection.
|
||||
*/
|
||||
#define GUAC_SPICE_ARGV_PASSWORD "password"
|
||||
|
||||
|
@ -27,14 +27,14 @@
|
||||
#include <glib-unix.h>
|
||||
|
||||
/**
|
||||
* Handler invoked when an authentication error is received from the SPICE
|
||||
* Handler invoked when an authentication error is received from the Spice
|
||||
* server, which retrieves the credentials from the Guacamole Client accessing
|
||||
* the connection, if those credentials have not been explicitly set in the
|
||||
* configuration. Returns TRUE if credentials are successfully retrieved, or
|
||||
* FALSE otherwise.
|
||||
*
|
||||
* @param client
|
||||
* The guac_client that is attempting to connect to the SPICE server and
|
||||
* The guac_client that is attempting to connect to the Spice server and
|
||||
* that will be asked for the credentials.
|
||||
*
|
||||
* @return
|
||||
|
@ -32,9 +32,7 @@ void guac_spice_client_audio_playback_data_handler(
|
||||
SpicePlaybackChannel* channel, gpointer data, gint size,
|
||||
guac_client* client) {
|
||||
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Calling audio playback data handler.");
|
||||
guac_spice_client* spice_client = (guac_spice_client*) client->data;
|
||||
|
||||
guac_audio_stream_write_pcm(spice_client->audio_playback, data, size);
|
||||
|
||||
}
|
||||
@ -42,7 +40,8 @@ void guac_spice_client_audio_playback_data_handler(
|
||||
void guac_spice_client_audio_playback_delay_handler(
|
||||
SpicePlaybackChannel* channel, guac_client* client) {
|
||||
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Calling audio playback delay handler.");
|
||||
guac_client_log(client, GUAC_LOG_WARNING,
|
||||
"Delay handler for audio playback is not currently implemented.");
|
||||
|
||||
}
|
||||
|
||||
@ -50,31 +49,30 @@ void guac_spice_client_audio_playback_start_handler(
|
||||
SpicePlaybackChannel* channel, gint format, gint channels, gint rate,
|
||||
guac_client* client) {
|
||||
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Calling audio playback start handler.");
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Starting audio playback.");
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Format: %d", format);
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Channels: %d", channels);
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Rate: %d", rate);
|
||||
|
||||
guac_spice_client* spice_client = (guac_spice_client*) client->data;
|
||||
|
||||
int bps = 16;
|
||||
|
||||
/* Spice only supports a single audio format. */
|
||||
if (format != SPICE_AUDIO_FMT_S16) {
|
||||
guac_client_log(client, GUAC_LOG_WARNING, "Unknown Spice audio format: %d", format);
|
||||
return;
|
||||
}
|
||||
|
||||
spice_client->audio_playback = guac_audio_stream_alloc(client, NULL, rate, channels, bps);
|
||||
/* Allocate the stream. */
|
||||
guac_spice_client* spice_client = (guac_spice_client*) client->data;
|
||||
spice_client->audio_playback = guac_audio_stream_alloc(client, NULL, rate, channels, 16);
|
||||
|
||||
}
|
||||
|
||||
void guac_spice_client_audio_playback_stop_handler(
|
||||
SpicePlaybackChannel* channel, guac_client* client) {
|
||||
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Calling audio playback stop handler.");
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Stoppig audio playback..");
|
||||
|
||||
/* Free the audio stream. */
|
||||
guac_spice_client* spice_client = (guac_spice_client*) client->data;
|
||||
|
||||
guac_audio_stream_free(spice_client->audio_playback);
|
||||
|
||||
}
|
||||
@ -110,14 +108,8 @@ static int guac_spice_audio_parse_mimetype(const char* mimetype, int* rate,
|
||||
int parsed_channels = 1;
|
||||
int parsed_bps;
|
||||
|
||||
/* PCM audio with one byte per sample */
|
||||
if (strncmp(mimetype, "audio/L8;", 9) == 0) {
|
||||
mimetype += 8; /* Advance to semicolon ONLY */
|
||||
parsed_bps = 1;
|
||||
}
|
||||
|
||||
/* PCM audio with two bytes per sample */
|
||||
else if (strncmp(mimetype, "audio/L16;", 10) == 0) {
|
||||
if (strncmp(mimetype, "audio/L16;", 10) == 0) {
|
||||
mimetype += 9; /* Advance to semicolon ONLY */
|
||||
parsed_bps = 2;
|
||||
}
|
||||
@ -175,6 +167,27 @@ static int guac_spice_audio_parse_mimetype(const char* mimetype, int* rate,
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* A callback function that is invoked to send audio data from the given
|
||||
* stream to the Spice server.
|
||||
*
|
||||
* @param user
|
||||
* The user who owns the connection and the stream. This is unused by
|
||||
* this function.
|
||||
*
|
||||
* @param stream
|
||||
* The stream where the audio data originated. This is unused by this
|
||||
* function.
|
||||
*
|
||||
* @param data
|
||||
* The audio data to send.
|
||||
*
|
||||
* @param length
|
||||
* The number of bytes of audio data to send.
|
||||
*
|
||||
* @return
|
||||
* Zero on success, non-zero on error.
|
||||
*/
|
||||
static int guac_spice_audio_blob_handler(guac_user* user, guac_stream* stream,
|
||||
void* data, int length) {
|
||||
|
||||
@ -188,6 +201,19 @@ static int guac_spice_audio_blob_handler(guac_user* user, guac_stream* stream,
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* A callback function that is called when the audio stream ends sending data
|
||||
* to the Spice server.
|
||||
*
|
||||
* @param user
|
||||
* The user who owns the connection and the stream.
|
||||
*
|
||||
* @param stream
|
||||
* The stream that was sending the audio data.
|
||||
*
|
||||
* @return
|
||||
* Zero on success, non-zero on failure.
|
||||
*/
|
||||
static int guac_spice_audio_end_handler(guac_user* user, guac_stream* stream) {
|
||||
|
||||
/* Ignore - the RECORD_CHANNEL channel will simply not receive anything */
|
||||
@ -218,7 +244,7 @@ int guac_spice_client_audio_record_handler(guac_user* user, guac_stream* stream,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Init stream data */
|
||||
/* Initialize stream handlers */
|
||||
stream->blob_handler = guac_spice_audio_blob_handler;
|
||||
stream->end_handler = guac_spice_audio_end_handler;
|
||||
|
||||
@ -253,7 +279,7 @@ int guac_spice_client_audio_record_handler(guac_user* user, guac_stream* stream,
|
||||
static void guac_spice_audio_stream_ack(guac_user* user, guac_stream* stream,
|
||||
const char* message, guac_protocol_status status) {
|
||||
|
||||
/* Do not send ack unless both sides of the audio stream are ready */
|
||||
/* Do not send if the connection owner or stream is null. */
|
||||
if (user == NULL || stream == NULL)
|
||||
return;
|
||||
|
||||
@ -263,6 +289,20 @@ static void guac_spice_audio_stream_ack(guac_user* user, guac_stream* stream,
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* A callback that is invoked for the connection owner when audio recording
|
||||
* starts, which will notify the client the owner is connected from to start
|
||||
* sending audio data.
|
||||
*
|
||||
* @param owner
|
||||
* The owner of the connection.
|
||||
*
|
||||
* @param data
|
||||
* A pointer to the guac_client associated with this connection.
|
||||
*
|
||||
* @return
|
||||
* Always NULL;
|
||||
*/
|
||||
static void* spice_client_record_start_callback(guac_user* owner, void* data) {
|
||||
|
||||
guac_spice_client* spice_client = (guac_spice_client*) data;
|
||||
@ -274,6 +314,19 @@ static void* spice_client_record_start_callback(guac_user* owner, void* data) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* A callback that is invoked for the connection owner when audio recording
|
||||
* is stopped, telling the client to stop sending audio data.
|
||||
*
|
||||
* @param owner
|
||||
* The user who owns this connection.
|
||||
*
|
||||
* @param data
|
||||
* A pointer to the guac_client associated with this connection.
|
||||
*
|
||||
* @return
|
||||
* Always NULL;
|
||||
*/
|
||||
static void* spice_client_record_stop_callback(guac_user* owner, void* data) {
|
||||
|
||||
guac_spice_client* spice_client = (guac_spice_client*) data;
|
||||
|
@ -28,7 +28,7 @@
|
||||
|
||||
/**
|
||||
* A callback function invoked with the SPICE client receives audio playback
|
||||
* data from the SPICE server.
|
||||
* data from the Spice server.
|
||||
*
|
||||
* @param channel
|
||||
* The SpicePlaybackChannel on which the data was sent.
|
||||
@ -47,7 +47,7 @@ void guac_spice_client_audio_playback_data_handler(
|
||||
guac_client* client);
|
||||
|
||||
/**
|
||||
* A callback function invoked when the SPICE server requests the audio playback
|
||||
* A callback function invoked when the Spice server requests the audio playback
|
||||
* delay value from the client.
|
||||
*
|
||||
* @param channel
|
||||
@ -60,7 +60,7 @@ void guac_spice_client_audio_playback_delay_handler(
|
||||
SpicePlaybackChannel* channel, guac_client* client);
|
||||
|
||||
/**
|
||||
* A callback function invoked by the client when the SPICE server sends a
|
||||
* A callback function invoked by the client when the Spice server sends a
|
||||
* signal indicating that it is starting an audio transmission.
|
||||
*
|
||||
* @param channel
|
||||
@ -101,8 +101,8 @@ void guac_spice_client_audio_playback_stop_handler(
|
||||
guac_user_audio_handler guac_spice_client_audio_record_handler;
|
||||
|
||||
/**
|
||||
* The callback function invoked by the client when the SPICE server requests
|
||||
* that the client begin recording audio data to send to the server.
|
||||
* The callback function invoked by the Spice client when the Spice server
|
||||
* requests that the client begin recording audio data to send to the server.
|
||||
*
|
||||
* @param channel
|
||||
* The SpiceRecordChannel on which the record event is being requested.
|
||||
@ -123,7 +123,7 @@ void guac_spice_client_audio_record_start_handler(SpiceRecordChannel* channel,
|
||||
gint format, gint channels, gint rate, guac_client* client);
|
||||
|
||||
/**
|
||||
* The callback function invoked by the client when the SPICE server sends
|
||||
* The callback function invoked by the Spice client when the Spice server sends
|
||||
* an event requesting that recording be stopped.
|
||||
*
|
||||
* @param channel
|
||||
|
@ -39,8 +39,8 @@ int guac_spice_clipboard_handler(guac_user* user, guac_stream* stream,
|
||||
|
||||
/* Some versions of VDAgent do not support sending clipboard data. */
|
||||
if (!spice_main_channel_agent_test_capability(spice_client->main_channel, VD_AGENT_CAP_CLIPBOARD_BY_DEMAND)) {
|
||||
guac_client_log(user->client, GUAC_LOG_WARNING, "SPICE Agent does not "
|
||||
" support sending clipboard data on demend.");
|
||||
guac_client_log(user->client, GUAC_LOG_WARNING, "Spice guest agent does"
|
||||
" not support sending clipboard data on demand.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -71,17 +71,13 @@ int guac_spice_clipboard_end_handler(guac_user* user, guac_stream* stream) {
|
||||
|
||||
guac_spice_client* spice_client = (guac_spice_client*) user->client->data;
|
||||
|
||||
/* Send via VNC only if finished connecting */
|
||||
/* Send via Spice only if finished connecting */
|
||||
if (spice_client->main_channel != NULL) {
|
||||
spice_main_channel_clipboard_selection_notify(spice_client->main_channel,
|
||||
VD_AGENT_CLIPBOARD_SELECTION_CLIPBOARD,
|
||||
VD_AGENT_CLIPBOARD_UTF8_TEXT,
|
||||
(const unsigned char*) spice_client->clipboard->buffer,
|
||||
spice_client->clipboard->length);
|
||||
|
||||
/* Release the grab on the agent clipboard. */
|
||||
// spice_main_channel_clipboard_selection_release(spice_client->main_channel,
|
||||
// VD_AGENT_CLIPBOARD_SELECTION_CLIPBOARD);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -93,6 +89,7 @@ void guac_spice_clipboard_selection_handler(SpiceMainChannel* channel,
|
||||
|
||||
guac_spice_client* spice_client = (guac_spice_client*) client->data;
|
||||
|
||||
/* Loop through clipboard types - currently Guacamole only supports text. */
|
||||
switch (type) {
|
||||
case VD_AGENT_CLIPBOARD_UTF8_TEXT:
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Notifying client of text "
|
||||
@ -125,15 +122,16 @@ void guac_spice_clipboard_selection_grab_handler(SpiceMainChannel* channel,
|
||||
return;
|
||||
}
|
||||
|
||||
/* Loop through the data types sent by the SPICE server and process them. */
|
||||
/* Loop through the data types sent by the Spice server and process them. */
|
||||
for (int i = 0; i < ntypes; i++) {
|
||||
/* At present, Guacamole only supports text. */
|
||||
|
||||
/* Currently Guacamole only supports text. */
|
||||
if (types[i] != VD_AGENT_CLIPBOARD_UTF8_TEXT) {
|
||||
guac_client_log(client, GUAC_LOG_WARNING, "Unsupported clipboard data type: %d", types[i]);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Reset our clipboard and request the data from the SPICE serer. */
|
||||
/* Reset our clipboard and request the data from the Spice serer. */
|
||||
guac_spice_client* spice_client = (guac_spice_client*) client->data;
|
||||
guac_common_clipboard_reset(spice_client->clipboard, "text/plain");
|
||||
spice_main_channel_clipboard_selection_request(channel, selection, types[i]);
|
||||
@ -149,6 +147,7 @@ void guac_spice_clipboard_selection_release_handler(SpiceMainChannel* channel,
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Notifying client of clipboard"
|
||||
" release in the guest.");
|
||||
|
||||
/* Transfer data from guest to Guacamole clipboard. */
|
||||
guac_spice_client* spice_client = (guac_spice_client*) client->data;
|
||||
guac_common_clipboard_send(spice_client->clipboard, client);
|
||||
|
||||
@ -160,11 +159,13 @@ void guac_spice_clipboard_selection_request_handler(SpiceMainChannel* channel,
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Requesting clipboard data from"
|
||||
" the client.");
|
||||
|
||||
/* Guacamole only supports one clipboard selection type. */
|
||||
if (selection != VD_AGENT_CLIPBOARD_SELECTION_CLIPBOARD) {
|
||||
guac_client_log(client, GUAC_LOG_WARNING, "Unsupported selection type: %d", selection);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Currently Guacamole only implements text support - other types are images. */
|
||||
if (type != VD_AGENT_CLIPBOARD_UTF8_TEXT) {
|
||||
guac_client_log(client, GUAC_LOG_WARNING, "Unsupported clipboard data type: %d", type);
|
||||
return;
|
||||
@ -173,6 +174,7 @@ void guac_spice_clipboard_selection_request_handler(SpiceMainChannel* channel,
|
||||
guac_spice_client* spice_client = (guac_spice_client*) client->data;
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Sending clipboard data to server: %s", spice_client->clipboard->buffer);
|
||||
|
||||
/* Send the clipboard data to the guest. */
|
||||
spice_main_channel_clipboard_selection_notify(channel,
|
||||
selection,
|
||||
type,
|
||||
|
@ -43,11 +43,11 @@ guac_user_blob_handler guac_spice_clipboard_blob_handler;
|
||||
guac_user_end_handler guac_spice_clipboard_end_handler;
|
||||
|
||||
/**
|
||||
* A handler that will be registered with the SPICE client to handle clipboard
|
||||
* data sent from the SPICE server to the client.
|
||||
* A handler that will be registered with the Spice client to handle clipboard
|
||||
* data sent from the Spice server to the client.
|
||||
*
|
||||
* @param channel
|
||||
* The main SPICE channel on which this event was fired.
|
||||
* The main Spice channel on which this event was fired.
|
||||
*
|
||||
* @param selection
|
||||
* The clipboard on which the selection occurred.
|
||||
@ -70,15 +70,15 @@ void guac_spice_clipboard_selection_handler(SpiceMainChannel* channel,
|
||||
guac_client* client);
|
||||
|
||||
/**
|
||||
* A handler that will be registered with the SPICE client to handle clipboard
|
||||
* events where the guest (vdagent) within the SPICE server notifies the client
|
||||
* A handler that will be registered with the Spice client to handle clipboard
|
||||
* events where the guest (vdagent) within the Spice server notifies the client
|
||||
* that data is available on the clipboard.
|
||||
*
|
||||
* @param channel
|
||||
* The main SpiceChannel on which this event is fired.
|
||||
*
|
||||
* @param selection
|
||||
* The SPICE clipboard from which the event is fired.
|
||||
* The Spice clipboard from which the event is fired.
|
||||
*
|
||||
* @param types
|
||||
* The type of data being sent by the agent.
|
||||
@ -93,14 +93,14 @@ void guac_spice_clipboard_selection_grab_handler(SpiceMainChannel* channel,
|
||||
guint selection, guint32* types, guint ntypes, guac_client* client);
|
||||
|
||||
/**
|
||||
* A handler that will be called by the SPICE client when the SPICE server
|
||||
* A handler that will be called by the Spice client when the Spice server
|
||||
* is done with the clipboard and releases control of it.
|
||||
*
|
||||
* @param chennl
|
||||
* The main SPICE channel on which this event is fired.
|
||||
* The main Spice channel on which this event is fired.
|
||||
*
|
||||
* @param selection
|
||||
* The SPICE server clipboard releasing control.
|
||||
* The Spice server clipboard releasing control.
|
||||
*
|
||||
* @param client
|
||||
* The guac_client that was registered with the callback.
|
||||
@ -109,17 +109,17 @@ void guac_spice_clipboard_selection_release_handler(SpiceMainChannel* channel,
|
||||
guint selection, guac_client* client);
|
||||
|
||||
/**
|
||||
* A handler that will be called by the SPICE client when the SPICE server
|
||||
* A handler that will be called by the Spice client when the Spice server
|
||||
* would like to check and receive the contents of the client's clipboard.
|
||||
*
|
||||
* @param channel
|
||||
* The main SPICE channel on which this event is fired.
|
||||
* The main Spice channel on which this event is fired.
|
||||
*
|
||||
* @param selection
|
||||
* The SPICE server clipboard that is requesting data.
|
||||
* The Spice server clipboard that is requesting data.
|
||||
*
|
||||
* @param type
|
||||
* The type of data to be sent to the SPICE server.
|
||||
* The type of data to be sent to the Spice server.
|
||||
*
|
||||
* @param client
|
||||
* The guac_client object that was registered with the callback.
|
||||
|
@ -33,11 +33,6 @@
|
||||
#include <guacamole/socket.h>
|
||||
#include <spice-client-glib-2.0/spice-client.h>
|
||||
|
||||
/* Define cairo_format_stride_for_width() if missing */
|
||||
#ifndef HAVE_CAIRO_FORMAT_STRIDE_FOR_WIDTH
|
||||
#define cairo_format_stride_for_width(format, width) (width*4)
|
||||
#endif
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
@ -46,8 +41,9 @@
|
||||
|
||||
void guac_spice_cursor_hide(SpiceChannel* channel, guac_client* client) {
|
||||
|
||||
guac_client_log(client, GUAC_LOG_TRACE, "Cursor hide signal received.");
|
||||
guac_client_log(client, GUAC_LOG_TRACE, "Hiding the cursor.");
|
||||
|
||||
/* Set the cursor to a blank image, hiding it. */
|
||||
guac_spice_client* spice_client = (guac_spice_client*) client->data;
|
||||
guac_common_cursor_set_blank(spice_client->display->cursor);
|
||||
}
|
||||
@ -55,14 +51,16 @@ void guac_spice_cursor_hide(SpiceChannel* channel, guac_client* client) {
|
||||
void guac_spice_cursor_move(SpiceChannel* channel, int x, int y,
|
||||
guac_client* client) {
|
||||
|
||||
guac_client_log(client, GUAC_LOG_TRACE, "Cursor move signal received.");
|
||||
guac_client_log(client, GUAC_LOG_TRACE, "Cursor move signal received: %d, %d", x, y);
|
||||
|
||||
/* Update the cursor with the new coordinates. */
|
||||
guac_spice_client* spice_client = (guac_spice_client*) client->data;
|
||||
guac_common_cursor_update(spice_client->display->cursor, client->__owner, x, y, spice_client->display->cursor->button_mask);
|
||||
}
|
||||
|
||||
void guac_spice_cursor_reset(SpiceChannel* channel, guac_client* client) {
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Cursor reset signal received, not yet implemented");
|
||||
guac_client_log(client, GUAC_LOG_DEBUG,
|
||||
"Cursor reset signal received, not yet implemented");
|
||||
}
|
||||
|
||||
void guac_spice_cursor_set(SpiceChannel* channel, int width, int height,
|
||||
|
@ -25,20 +25,20 @@
|
||||
#include <spice-client-glib-2.0/spice-client.h>
|
||||
|
||||
/**
|
||||
* The callback function that is executed when the cursor hide signal is received
|
||||
* from the SPICE server.
|
||||
* The callback function that is executed when the cursor hide signal is
|
||||
* received from the Spice server.
|
||||
*
|
||||
* @param channel
|
||||
* The channel which received the cursor hide event.
|
||||
*
|
||||
* @param client
|
||||
* The guac_client associated with this session.
|
||||
* The guac_client associated with this Spice session.
|
||||
*/
|
||||
void guac_spice_cursor_hide(SpiceCursorChannel* channel, guac_client* client);
|
||||
|
||||
/**
|
||||
* The callback function that is executed when the cursor move signal is
|
||||
* received from the server.
|
||||
* received from the Spice server.
|
||||
*
|
||||
* @param channel
|
||||
* The channel that received the cursor move event.
|
||||
@ -50,7 +50,7 @@ void guac_spice_cursor_hide(SpiceCursorChannel* channel, guac_client* client);
|
||||
* The y position of the cursor.
|
||||
*
|
||||
* @param client
|
||||
* The guac_client associated with this SPICE session.
|
||||
* The guac_client associated with this Spice session.
|
||||
*/
|
||||
void guac_spice_cursor_move(SpiceCursorChannel* channel, int x, int y,
|
||||
guac_client* client);
|
||||
@ -63,13 +63,13 @@ void guac_spice_cursor_move(SpiceCursorChannel* channel, int x, int y,
|
||||
* The channel that received the cursor reset signal.
|
||||
*
|
||||
* @param client
|
||||
* The guac_client associated with this SPICE session.
|
||||
* The guac_client associated with this Spice session.
|
||||
*/
|
||||
void guac_spice_cursor_reset(SpiceCursorChannel* channel, guac_client* client);
|
||||
|
||||
/**
|
||||
* The callback function that is executed in response to receiving the cursor
|
||||
* set signal from the SPICE server, which sets the width, height, and image
|
||||
* set signal from the Spice server, which sets the width, height, and image
|
||||
* of the cursor, and the x and y coordinates of the cursor hotspot.
|
||||
*
|
||||
* @param channel
|
||||
@ -92,7 +92,7 @@ void guac_spice_cursor_reset(SpiceCursorChannel* channel, guac_client* client);
|
||||
* or NULL if the default cursor image should be used.
|
||||
*
|
||||
* @param client
|
||||
* The guac_client associated with this SPICE session.
|
||||
* The guac_client associated with this Spice session.
|
||||
*/
|
||||
void guac_spice_cursor_set(SpiceCursorChannel* channel, int width, int height,
|
||||
int x, int y, gpointer* rgba, guac_client* client);
|
||||
|
@ -32,11 +32,6 @@
|
||||
#include <guacamole/socket.h>
|
||||
#include <spice-client-glib-2.0/spice-client.h>
|
||||
|
||||
/* Define cairo_format_stride_for_width() if missing */
|
||||
#ifndef HAVE_CAIRO_FORMAT_STRIDE_FOR_WIDTH
|
||||
#define cairo_format_stride_for_width(format, width) (width*4)
|
||||
#endif
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
@ -46,7 +41,9 @@
|
||||
void guac_spice_client_display_update(SpiceChannel* channel, int x,
|
||||
int y, int w, int h, guac_client* client) {
|
||||
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Received request to update Spice display: %d, %d, %d, %d", x, y, w, h);
|
||||
guac_client_log(client, GUAC_LOG_TRACE,
|
||||
"Received request to update Spice display: %d, %d, %d, %d",
|
||||
x, y, w, h);
|
||||
guac_spice_client* spice_client = (guac_spice_client*) client->data;
|
||||
|
||||
/* Retrieve the primary display buffer */
|
||||
@ -94,7 +91,7 @@ void guac_spice_client_display_update(SpiceChannel* channel, int x,
|
||||
void guac_spice_client_display_gl_draw(SpiceChannel* channel, int x,
|
||||
int y, int w, int h, guac_client* client) {
|
||||
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Received gl draw request.");
|
||||
guac_client_log(client, GUAC_LOG_TRACE, "Received GL draw request.");
|
||||
|
||||
guac_spice_client* spice_client = (guac_spice_client*) client->data;
|
||||
|
||||
@ -109,13 +106,8 @@ void guac_spice_client_display_gl_draw(SpiceChannel* channel, int x,
|
||||
void guac_spice_client_display_mark(SpiceChannel* channel, gint mark,
|
||||
guac_client* client) {
|
||||
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Received signal to mark display.");
|
||||
|
||||
int channelId;
|
||||
|
||||
g_object_get(channel, "channel-id", &channelId, NULL);
|
||||
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Channel %i marked as available.", channelId);
|
||||
guac_client_log(client, GUAC_LOG_DEBUG,
|
||||
"Received signal to mark display, which currently has no effect.");
|
||||
|
||||
}
|
||||
|
||||
@ -125,10 +117,12 @@ void guac_spice_client_display_primary_create(SpiceChannel* channel,
|
||||
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Received request to create primary display.");
|
||||
|
||||
/* Allocate the Guacamole display. */
|
||||
guac_spice_client* spice_client = (guac_spice_client*) client->data;
|
||||
spice_client->display = guac_common_display_alloc(client,
|
||||
width, height);
|
||||
|
||||
/* Create a matching Cairo image surface. */
|
||||
guac_client_log(client, GUAC_LOG_TRACE, "Creating Cairo image surface.");
|
||||
cairo_surface_t* surface = cairo_image_surface_create_for_data(imgdata, CAIRO_FORMAT_RGB24,
|
||||
width, height, stride);
|
||||
@ -138,9 +132,11 @@ void guac_spice_client_display_primary_create(SpiceChannel* channel,
|
||||
guac_common_surface_draw(spice_client->display->default_surface,
|
||||
0, 0, surface);
|
||||
|
||||
/* Flush the default surface. */
|
||||
guac_client_log(client, GUAC_LOG_TRACE, "Flushing the default surface.");
|
||||
guac_common_surface_flush(spice_client->display->default_surface);
|
||||
|
||||
/* Mark the end of the frame and flush the socket. */
|
||||
guac_client_end_frame(client);
|
||||
guac_socket_flush(client->socket);
|
||||
|
||||
@ -152,6 +148,7 @@ void guac_spice_client_display_primary_destroy(SpiceChannel* channel,
|
||||
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Received request to destroy the primary display.");
|
||||
|
||||
/* Free the Guacamole display. */
|
||||
guac_spice_client* spice_client = (guac_spice_client*) client->data;
|
||||
guac_common_display_free(spice_client->display);
|
||||
|
||||
|
@ -24,9 +24,14 @@
|
||||
|
||||
#include <spice-client-glib-2.0/spice-client.h>
|
||||
|
||||
/* Define cairo_format_stride_for_width() if missing */
|
||||
#ifndef HAVE_CAIRO_FORMAT_STRIDE_FOR_WIDTH
|
||||
#define cairo_format_stride_for_width(format, width) (width*4)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Callback invoked by the SPICE library when it receives a new binary image
|
||||
* data from the SPICE server. The image itself will be stored in the designated
|
||||
* Callback invoked by the Spice library when it receives a new binary image
|
||||
* data from the Spice server. The image itself will be stored in the designated
|
||||
* sub-rectangle of client->framebuffer.
|
||||
*
|
||||
* @param channel
|
||||
@ -54,7 +59,7 @@ void guac_spice_client_display_update(SpiceDisplayChannel* channel, int x,
|
||||
|
||||
/**
|
||||
* The callback function invoked when the RED_DISPLAY_MARK command is received
|
||||
* from the SPICE server and the display should be exposed.
|
||||
* from the Spice server and the display should be exposed.
|
||||
*
|
||||
* @param channel
|
||||
* The SpiceDisplayChannel on which the event was received.
|
||||
@ -70,13 +75,13 @@ void guac_spice_client_display_mark(SpiceDisplayChannel* channel, gint mark,
|
||||
|
||||
/**
|
||||
* The callback function invoked when primary display buffer data is sent from
|
||||
* the SPICE server to the client.
|
||||
* the Spice server to the client.
|
||||
*
|
||||
* @param channel
|
||||
* The SpiceDisplayChannel on which this event was received.
|
||||
*
|
||||
* @param format
|
||||
* The SPICE format of the received data.
|
||||
* The Spice format of the received data.
|
||||
*
|
||||
* @param width
|
||||
* The total width of the display.
|
||||
@ -132,7 +137,7 @@ void guac_spice_client_display_mark(SpiceDisplayChannel* channel,
|
||||
gboolean marked, guac_client* client);
|
||||
|
||||
/**
|
||||
* Callback invoked by the SPICE client when it receives a CopyRect message.
|
||||
* Callback invoked by the Spice client when it receives a CopyRect message.
|
||||
* CopyRect specified a rectangle of source data within the display and a
|
||||
* set of X/Y coordinates to which that rectangle should be copied.
|
||||
*
|
||||
|
@ -46,7 +46,7 @@ typedef struct guac_spice_file_download_status {
|
||||
} guac_spice_file_download_status;
|
||||
|
||||
/**
|
||||
* Function which uses Linux's fanotify facility to monitor the "Download"
|
||||
* Function which uses Linux's inotify facility to monitor the "Download"
|
||||
* directory of a shared folder for changes and trigger the automatic download
|
||||
* of that data to the Guacamole user who has access to the shared folder.
|
||||
*
|
||||
|
@ -48,7 +48,7 @@
|
||||
#include <string.h>
|
||||
|
||||
/**
|
||||
* Handle events for the main SPICE channel, taking the appropriate action
|
||||
* Handle events for the main Spice channel, taking the appropriate action
|
||||
* for known events, and logging warnings for unknowns and non-fatal events.
|
||||
*
|
||||
* @param channel
|
||||
@ -72,7 +72,7 @@ static void guac_spice_client_main_channel_handler(SpiceChannel *channel,
|
||||
/* Channel has been closed, so we abort the connection. */
|
||||
case SPICE_CHANNEL_CLOSED:
|
||||
guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR,
|
||||
"Disconnected from SPICE server.");
|
||||
"Disconnected from Spice server.");
|
||||
break;
|
||||
|
||||
/* Channel has been opened - log it and do nothing else. */
|
||||
@ -100,25 +100,25 @@ static void guac_spice_client_main_channel_handler(SpiceChannel *channel,
|
||||
/* TLS error, abort the connection with a warning. */
|
||||
case SPICE_CHANNEL_ERROR_TLS:
|
||||
guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR,
|
||||
"TLS failure connecting to SPICE server.");
|
||||
"TLS failure connecting to Spice server.");
|
||||
break;
|
||||
|
||||
/* I/O error, abort the connection with a warning. */
|
||||
case SPICE_CHANNEL_ERROR_IO:
|
||||
guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR,
|
||||
"IO error communicating with SPICE server.");
|
||||
"IO error communicating with Spice server.");
|
||||
break;
|
||||
|
||||
/* SPICE link error, abort the connection with a warning. */
|
||||
case SPICE_CHANNEL_ERROR_LINK:
|
||||
guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR,
|
||||
"Link error communicating with SPICE server.");
|
||||
"Link error communicating with Spice server.");
|
||||
break;
|
||||
|
||||
/* Connect error, abort the connection with a warning. */
|
||||
case SPICE_CHANNEL_ERROR_CONNECT:
|
||||
guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR,
|
||||
"Connection error communicating with SPICe server.");
|
||||
"Connection error communicating with Spice server.");
|
||||
break;
|
||||
|
||||
/* Some other unknown event - log it and move on. */
|
||||
@ -134,7 +134,7 @@ int guac_client_init(guac_client* client) {
|
||||
/* Set client args */
|
||||
client->args = GUAC_SPICE_CLIENT_ARGS;
|
||||
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Initializing SPICE client.");
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Initializing Spice client.");
|
||||
|
||||
/* Alloc client data */
|
||||
guac_spice_client* spice_client = calloc(1, sizeof(guac_spice_client));
|
||||
|
@ -40,9 +40,9 @@
|
||||
#define GUAC_SPICE_FRAME_TIMEOUT 0
|
||||
|
||||
/**
|
||||
* The amount of time to wait for a new message from the SPICE server when
|
||||
* The amount of time to wait for a new message from the Spice server when
|
||||
* beginning a new frame. This value must be kept reasonably small such that
|
||||
* a slow SPICE server will not prevent external events from being handled (such
|
||||
* a slow Spice server will not prevent external events from being handled (such
|
||||
* as the stop signal from guac_client_stop()), but large enough that the
|
||||
* message handling loop does not eat up CPU spinning.
|
||||
*/
|
||||
|
@ -40,7 +40,7 @@
|
||||
* The keysym being pressed.
|
||||
*
|
||||
* @return
|
||||
* Zero if the keysym was successfully decomposed and sent to the SPICE
|
||||
* Zero if the keysym was successfully decomposed and sent to the Spice
|
||||
* server as a pair of key events (the dead key and base key), non-zero
|
||||
* otherwise.
|
||||
*/
|
||||
|
@ -36,7 +36,7 @@ guac_user_mouse_handler guac_spice_user_mouse_handler;
|
||||
guac_user_key_handler guac_spice_user_key_handler;
|
||||
|
||||
/**
|
||||
* A callback that is invoked when the SPICE server updates the mouse mode.
|
||||
* A callback that is invoked when the Spice server updates the mouse mode.
|
||||
*
|
||||
* @param channel
|
||||
* The channel on which the update occurred.
|
||||
|
@ -29,14 +29,14 @@
|
||||
|
||||
/**
|
||||
* Translates the given keysym into the corresponding lock flag, as would be
|
||||
* required by the SPICE synchronize event. If the given keysym does not
|
||||
* required by the Spice synchronize event. If the given keysym does not
|
||||
* represent a lock key, zero is returned.
|
||||
*
|
||||
* @param keysym
|
||||
* The keysym to translate into a SPICE lock flag.
|
||||
* The keysym to translate into a Spice lock flag.
|
||||
*
|
||||
* @return
|
||||
* The SPICE lock flag which corresponds to the given keysym, or zero if the
|
||||
* The Spice lock flag which corresponds to the given keysym, or zero if the
|
||||
* given keysym does not represent a lock key.
|
||||
*/
|
||||
static int guac_spice_keyboard_lock_flag(int keysym) {
|
||||
@ -64,17 +64,17 @@ static int guac_spice_keyboard_lock_flag(int keysym) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Immediately sends an SPICE key event having the given scancode and flags.
|
||||
* Immediately sends an Spice key event having the given scancode and flags.
|
||||
*
|
||||
* @param spice_client
|
||||
* The SPICE client instance associated with the SPICE session along which the
|
||||
* The Spice client instance associated with the SPICE session along which the
|
||||
* key event should be sent.
|
||||
*
|
||||
* @param scancode
|
||||
* The scancode of the key to press or release via the SPICE key event.
|
||||
* The scancode of the key to press or release via the Spice key event.
|
||||
*
|
||||
* @param flags
|
||||
* Any SPICE-specific flags required for the provided scancode to have the
|
||||
* Any Spice-specific flags required for the provided scancode to have the
|
||||
* intended meaning, such as KBD_FLAGS_EXTENDED. The possible flags and
|
||||
* their meanings are dictated by SPICE. KBD_FLAGS_DOWN and KBD_FLAGS_UP
|
||||
* need not be specified here - they will automatically be added depending
|
||||
@ -97,17 +97,17 @@ static void guac_spice_send_key_event(guac_spice_client* spice_client,
|
||||
}
|
||||
|
||||
/**
|
||||
* Immediately sends an SPICE synchonize event having the given flags. An SPICE
|
||||
* Immediately sends an Spice synchonize event having the given flags. A Spice
|
||||
* synchronize event sets the state of remote lock keys absolutely, where a
|
||||
* lock key will be active only if its corresponding flag is set in the event.
|
||||
*
|
||||
* @param spice_client
|
||||
* The SPICE client instance associated with the SPICE session along which the
|
||||
* The Spice client instance associated with the Spice session along which the
|
||||
* synchronize event should be sent.
|
||||
*
|
||||
* @param modifiers
|
||||
* Bitwise OR of the flags representing the lock keys which should be set,
|
||||
* if any, as dictated by the SPICE protocol. If no flags are set, then no
|
||||
* if any, as dictated by the Spice protocol. If no flags are set, then no
|
||||
* lock keys will be active.
|
||||
*/
|
||||
static void guac_spice_send_synchronize_event(guac_spice_client* spice_client,
|
||||
@ -132,7 +132,7 @@ static void guac_spice_send_synchronize_event(guac_spice_client* spice_client,
|
||||
* returned.
|
||||
*
|
||||
* @param keyboard
|
||||
* The guac_spice_keyboard associated with the current SPICE session.
|
||||
* The guac_spice_keyboard associated with the current Spice session.
|
||||
*
|
||||
* @param keysym
|
||||
* The keysym of the key to lookup within the given keyboard.
|
||||
@ -188,7 +188,7 @@ static int guac_spice_count_bits(unsigned int value) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an estimated cost for sending the necessary SPICE events to type the
|
||||
* Returns an estimated cost for sending the necessary Spice events to type the
|
||||
* key described by the given guac_spice_keysym_desc, given the current lock and
|
||||
* modifier state of the keyboard. A higher cost value indicates that a greater
|
||||
* number of events are expected to be required.
|
||||
@ -234,10 +234,10 @@ static int guac_spice_keyboard_get_cost(guac_spice_keyboard* keyboard,
|
||||
/**
|
||||
* Returns a pointer to the guac_spice_key structure representing the
|
||||
* definition(s) and state of the key having the given keysym. If no such key
|
||||
* is defined within the keyboard layout of the SPICE server, NULL is returned.
|
||||
* is defined within the keyboard layout of the Spice server, NULL is returned.
|
||||
*
|
||||
* @param keyboard
|
||||
* The guac_spice_keyboard associated with the current SPICE session.
|
||||
* The guac_spice_keyboard associated with the current Spice session.
|
||||
*
|
||||
* @param keysym
|
||||
* The keysym of the key to lookup within the given keyboard.
|
||||
@ -245,7 +245,7 @@ static int guac_spice_keyboard_get_cost(guac_spice_keyboard* keyboard,
|
||||
* @return
|
||||
* A pointer to the guac_spice_key structure representing the definition(s)
|
||||
* and state of the key having the given keysym, or NULL if no such key is
|
||||
* defined within the keyboard layout of the SPICE server.
|
||||
* defined within the keyboard layout of the Spice server.
|
||||
*/
|
||||
static guac_spice_key* guac_spice_keyboard_get_key(guac_spice_keyboard* keyboard,
|
||||
int keysym) {
|
||||
@ -265,7 +265,7 @@ static guac_spice_key* guac_spice_keyboard_get_key(guac_spice_keyboard* keyboard
|
||||
* current keyboard lock and modifier states.
|
||||
*
|
||||
* @param keyboard
|
||||
* The guac_spice_keyboard associated with the current SPICE session.
|
||||
* The guac_spice_keyboard associated with the current Spice session.
|
||||
*
|
||||
* @param key
|
||||
* The key whose lowest-cost possible definition should be retrieved.
|
||||
@ -312,7 +312,7 @@ static const guac_spice_keysym_desc* guac_spice_keyboard_get_definition(guac_spi
|
||||
* logged.
|
||||
*
|
||||
* @param keyboard
|
||||
* The guac_spice_keyboard associated with the current SPICE session.
|
||||
* The guac_spice_keyboard associated with the current Spice session.
|
||||
*
|
||||
* @param mapping
|
||||
* The keysym/scancode mapping that should be added to the given keyboard.
|
||||
@ -364,7 +364,7 @@ static void guac_spice_keyboard_add_mapping(guac_spice_keyboard* keyboard,
|
||||
* Loads all keysym/scancode mappings declared within the given keymap and its
|
||||
* parent keymap, if any. These mappings are stored within the given
|
||||
* guac_spice_keyboard structure for future use in translating keysyms to the
|
||||
* scancodes required by SPICE key events.
|
||||
* scancodes required by Spice key events.
|
||||
*
|
||||
* @param keyboard
|
||||
* The guac_spice_keyboard which should be initialized with the
|
||||
@ -449,11 +449,11 @@ unsigned int guac_spice_keyboard_get_modifier_flags(guac_spice_keyboard* keyboar
|
||||
}
|
||||
|
||||
/**
|
||||
* Presses/releases the requested key by sending one or more SPICE key events, as
|
||||
* Presses/releases the requested key by sending one or more Spice key events, as
|
||||
* defined within the keymap defining that key.
|
||||
*
|
||||
* @param keyboard
|
||||
* The guac_spice_keyboard associated with the current SPICE session.
|
||||
* The guac_spice_keyboard associated with the current Spice session.
|
||||
*
|
||||
* @param key
|
||||
* The guac_spice_keysym_desc of the key being pressed or released, as
|
||||
@ -464,7 +464,7 @@ unsigned int guac_spice_keyboard_get_modifier_flags(guac_spice_keyboard* keyboar
|
||||
*
|
||||
* @return
|
||||
* Zero if the key was successfully pressed/released, non-zero if the key
|
||||
* cannot be sent using SPICE key events.
|
||||
* cannot be sent using Spice key events.
|
||||
*/
|
||||
static const guac_spice_keysym_desc* guac_spice_keyboard_send_defined_key(guac_spice_keyboard* keyboard,
|
||||
guac_spice_key* key, int pressed) {
|
||||
@ -643,7 +643,7 @@ void guac_spice_keyboard_set_indicators(SpiceChannel* channel, guac_client* clie
|
||||
g_object_get(channel, SPICE_PROPERTY_KEY_MODIFIERS, &modifiers, NULL);
|
||||
|
||||
/* Update with received locks */
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Received updated keyboard lock flags from SPICE server: 0x%X", modifiers);
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Received updated keyboard lock flags from Spice server: 0x%X", modifiers);
|
||||
keyboard->modifiers = modifiers;
|
||||
|
||||
complete:
|
||||
|
@ -39,7 +39,7 @@
|
||||
#define GUAC_SPICE_KEY_MAX_DEFINITIONS 4
|
||||
|
||||
/**
|
||||
* All possible sources of SPICE key events tracked by guac_spice_keyboard.
|
||||
* All possible sources of Spice key events tracked by guac_spice_keyboard.
|
||||
*/
|
||||
typedef enum guac_spice_key_source {
|
||||
|
||||
@ -50,7 +50,7 @@ typedef enum guac_spice_key_source {
|
||||
GUAC_SPICE_KEY_SOURCE_CLIENT = 0,
|
||||
|
||||
/**
|
||||
* The key event is being synthesized internally within the SPICE support.
|
||||
* The key event is being synthesized internally within the Spice support.
|
||||
*/
|
||||
GUAC_SPICE_KEY_SOURCE_SYNTHETIC = 1
|
||||
|
||||
@ -58,15 +58,15 @@ typedef enum guac_spice_key_source {
|
||||
|
||||
/**
|
||||
* A representation of a single key within the overall local keyboard,
|
||||
* including the definition of that key within the SPICE server's keymap and
|
||||
* including the definition of that key within the Spice server's keymap and
|
||||
* whether the key is currently pressed locally.
|
||||
*/
|
||||
typedef struct guac_spice_key {
|
||||
|
||||
/**
|
||||
* All definitions of this key within the SPICE server's keymap (keyboard
|
||||
* All definitions of this key within the Spice server's keymap (keyboard
|
||||
* layout). Each definition describes which scancode corresponds to this
|
||||
* key from the perspective of the SPICE server, as well as which other
|
||||
* key from the perspective of the Spice server, as well as which other
|
||||
* scancodes must be pressed/released for this key to have the desired
|
||||
* meaning.
|
||||
*/
|
||||
@ -74,7 +74,7 @@ typedef struct guac_spice_key {
|
||||
|
||||
/**
|
||||
* The number of definitions within the definitions array. If this key does
|
||||
* not exist within the SPICE server's keymap, this will be 0.
|
||||
* not exist within the Spice server's keymap, this will be 0.
|
||||
*/
|
||||
int num_definitions;
|
||||
|
||||
@ -93,18 +93,18 @@ typedef struct guac_spice_key {
|
||||
} guac_spice_key;
|
||||
|
||||
/**
|
||||
* The current keyboard state of an SPICE session.
|
||||
* The current keyboard state of an Spice session.
|
||||
*/
|
||||
typedef struct guac_spice_keyboard {
|
||||
|
||||
/**
|
||||
* The guac_client associated with the SPICE session whose keyboard state is
|
||||
* The guac_client associated with the Spice session whose keyboard state is
|
||||
* being managed by this guac_spice_keyboard.
|
||||
*/
|
||||
guac_client* client;
|
||||
|
||||
/**
|
||||
* The local state of all known lock keys, as a bitwise OR of all SPICE lock
|
||||
* The local state of all known lock keys, as a bitwise OR of all Spice lock
|
||||
* key flags. Legal flags are KBD_SYNC_SCROLL_LOCK, KBD_SYNC_NUM_LOCK,
|
||||
* KBD_SYNC_CAPS_LOCK, and KBD_SYNC_KANA_LOCK.
|
||||
*/
|
||||
@ -124,7 +124,7 @@ typedef struct guac_spice_keyboard {
|
||||
/**
|
||||
* The local state of all keys, as well as the necessary information to
|
||||
* translate received keysyms into scancodes or sequences of scancodes for
|
||||
* SPICE. The state of each key is updated based on received Guacamole key
|
||||
* Spice. The state of each key is updated based on received Guacamole key
|
||||
* events, while the information describing the behavior and scancode
|
||||
* mapping of each key is populated based on an associated keymap.
|
||||
*
|
||||
@ -149,8 +149,8 @@ typedef struct guac_spice_keyboard {
|
||||
/**
|
||||
* The total number of keys that the user of the connection is currently
|
||||
* holding down. This value indicates only the client-side keyboard state.
|
||||
* It DOES NOT indicate the number of keys currently pressed within the SPICE
|
||||
* server.
|
||||
* It DOES NOT indicate the number of keys currently pressed within the
|
||||
* Spice server.
|
||||
*/
|
||||
int user_pressed_keys;
|
||||
|
||||
@ -159,12 +159,12 @@ typedef struct guac_spice_keyboard {
|
||||
/**
|
||||
* Allocates a new guac_spice_keyboard which manages the keyboard state of the
|
||||
* SPICE session associated with the given guac_client. Keyboard events will be
|
||||
* dynamically translated from keysym to SPICE scancode according to the
|
||||
* dynamically translated from keysym to Spice scancode according to the
|
||||
* provided keymap. The returned guac_spice_keyboard must eventually be freed
|
||||
* with guac_spice_keyboard_free().
|
||||
*
|
||||
* @param client
|
||||
* The guac_client associated with the SPICE session whose keyboard state is
|
||||
* The guac_client associated with the Spice session whose keyboard state is
|
||||
* to be managed by the newly-allocated guac_spice_keyboard.
|
||||
*
|
||||
* @param keymap
|
||||
@ -172,7 +172,7 @@ typedef struct guac_spice_keyboard {
|
||||
*
|
||||
* @return
|
||||
* A newly-allocated guac_spice_keyboard which manages the keyboard state
|
||||
* for the SPICE session associated given guac_client.
|
||||
* for the Spice session associated given guac_client.
|
||||
*/
|
||||
guac_spice_keyboard* guac_spice_keyboard_alloc(guac_client* client,
|
||||
const guac_spice_keymap* keymap);
|
||||
@ -228,7 +228,7 @@ int guac_spice_keyboard_is_pressed(guac_spice_keyboard* keyboard, int keysym);
|
||||
* @see GUAC_SPICE_KEYMAP_MODIFIER_ALTGR
|
||||
*
|
||||
* @param keyboard
|
||||
* The guac_spice_keyboard associated with the current SPICE session.
|
||||
* The guac_spice_keyboard associated with the current Spice session.
|
||||
*
|
||||
* @return
|
||||
* The local state of all known modifier keys.
|
||||
@ -240,7 +240,7 @@ unsigned int guac_spice_keyboard_get_modifier_flags(guac_spice_keyboard* keyboar
|
||||
* synchronizing the remote state of those keys if it is expected to differ.
|
||||
*
|
||||
* @param keyboard
|
||||
* The guac_spice_keyboard associated with the current SPICE session.
|
||||
* The guac_spice_keyboard associated with the current Spice session.
|
||||
*
|
||||
* @param set_modifiers
|
||||
* The lock key flags which should be set. Legal flags are
|
||||
@ -264,7 +264,7 @@ void guac_spice_keyboard_update_locks(guac_spice_keyboard* keyboard,
|
||||
* @see GUAC_SPICE_KEYMAP_MODIFIER_ALTGR
|
||||
*
|
||||
* @param keyboard
|
||||
* The guac_spice_keyboard associated with the current SPICE session.
|
||||
* The guac_spice_keyboard associated with the current Spice session.
|
||||
*
|
||||
* @param set_modifiers
|
||||
* The modifier key flags which should be set.
|
||||
@ -277,7 +277,7 @@ void guac_spice_keyboard_update_modifiers(guac_spice_keyboard* keyboard,
|
||||
|
||||
/**
|
||||
* Updates the local state of the given keysym, sending the key events required
|
||||
* to replicate that state remotely (on the SPICE server). The key events sent
|
||||
* to replicate that state remotely (on the Spice server). The key events sent
|
||||
* will depend on the current keymap.
|
||||
*
|
||||
* @param keyboard
|
||||
@ -300,20 +300,20 @@ int guac_spice_keyboard_update_keysym(guac_spice_keyboard* keyboard,
|
||||
int keysym, int pressed, guac_spice_key_source source);
|
||||
|
||||
/**
|
||||
* Releases all currently pressed keys, sending key release events to the SPICE
|
||||
* Releases all currently pressed keys, sending key release events to the Spice
|
||||
* server as necessary. Lock states (Caps Lock, etc.) are not affected.
|
||||
*
|
||||
* @param keyboard
|
||||
* The guac_spice_keyboard associated with the current SPICE session.
|
||||
* The guac_spice_keyboard associated with the current Spice session.
|
||||
*/
|
||||
void guac_spice_keyboard_reset(guac_spice_keyboard* keyboard);
|
||||
|
||||
/**
|
||||
* Callback which is invoked when the SPICE server reports changes to keyboard
|
||||
* Callback which is invoked when the Spice server reports changes to keyboard
|
||||
* lock status using a Server Set Keyboard Indicators PDU.
|
||||
*
|
||||
* @param channel
|
||||
* The spiceContext associated with the current SPICE session.
|
||||
* The spiceContext associated with the current Spice session.
|
||||
*
|
||||
* @param client
|
||||
* The guac_client object associated with the callback.
|
||||
|
@ -86,7 +86,7 @@
|
||||
#define GUAC_SPICE_KEYMAP_MODIFIER_ALTGR 2
|
||||
|
||||
/**
|
||||
* Represents a keysym-to-scancode mapping for SPICE, with extra information
|
||||
* Represents a keysym-to-scancode mapping for Spice, with extra information
|
||||
* about the state of prerequisite keysyms.
|
||||
*/
|
||||
typedef struct guac_spice_keysym_desc {
|
||||
@ -102,7 +102,7 @@ typedef struct guac_spice_keysym_desc {
|
||||
int scancode;
|
||||
|
||||
/**
|
||||
* Required SPICE-specific flags that must be sent along with the scancode.
|
||||
* Required Spice-specific flags that must be sent along with the scancode.
|
||||
*/
|
||||
int flags;
|
||||
|
||||
@ -111,7 +111,7 @@ typedef struct guac_spice_keysym_desc {
|
||||
* associated scancode to be interpreted as this keysym.
|
||||
*
|
||||
* If the associated keysym is pressed, and any of these modifiers are not
|
||||
* currently active, Guacamole's SPICE support must send additional events
|
||||
* currently active, Guacamole's Spice support must send additional events
|
||||
* to activate these modifiers prior to sending the scancode for this
|
||||
* keysym.
|
||||
*
|
||||
@ -125,7 +125,7 @@ typedef struct guac_spice_keysym_desc {
|
||||
* associated scancode to be interpreted as this keysym.
|
||||
*
|
||||
* If the associated keysym is pressed, and any of these modifiers are
|
||||
* currently active, Guacamole's SPICE support must send additional events
|
||||
* currently active, Guacamole's Spice support must send additional events
|
||||
* to deactivate these modifiers prior to sending the scancode for this
|
||||
* keysym.
|
||||
*
|
||||
|
@ -39,7 +39,7 @@
|
||||
#include <syslog.h>
|
||||
|
||||
/**
|
||||
* Callback invoked by SPICE when an informational message needs to be
|
||||
* Callback invoked by Spice when an informational message needs to be
|
||||
* logged.
|
||||
*
|
||||
* @param format
|
||||
@ -52,7 +52,7 @@
|
||||
void guac_spice_client_log_info(const char* format, ...);
|
||||
|
||||
/**
|
||||
* Callback invoked by SPICE when an error message needs to be logged.
|
||||
* Callback invoked by Spice when an error message needs to be logged.
|
||||
*
|
||||
* @param format
|
||||
* A printf-style format string to log.
|
||||
|
@ -95,24 +95,24 @@ const char* GUAC_SPICE_CLIENT_ARGS[] = {
|
||||
enum SPICE_ARGS_IDX {
|
||||
|
||||
/**
|
||||
* The hostname of the SPICE server (or repeater) to connect to.
|
||||
* The hostname of the Spice server to connect to.
|
||||
*/
|
||||
IDX_HOSTNAME,
|
||||
|
||||
/**
|
||||
* The port of the SPICE server (or repeater) to connect to.
|
||||
* The port of the Spice server to connect to.
|
||||
*/
|
||||
IDX_PORT,
|
||||
|
||||
/**
|
||||
* Whether or not the connection to the SPICE server should be made via
|
||||
* Whether or not the connection to the Spice server should be made via
|
||||
* TLS.
|
||||
*/
|
||||
IDX_TLS,
|
||||
|
||||
/**
|
||||
* The verification mode that should be used to validate TLS connections
|
||||
* to the SPICE server.
|
||||
* to the Spice server.
|
||||
*/
|
||||
IDX_TLS_VERIFY,
|
||||
|
||||
@ -134,7 +134,7 @@ enum SPICE_ARGS_IDX {
|
||||
IDX_PUBKEY,
|
||||
|
||||
/**
|
||||
* The proxy server to connect through when connecting to the SPICE server.
|
||||
* The proxy server to connect through when connecting to the Spice server.
|
||||
*/
|
||||
IDX_PROXY,
|
||||
|
||||
@ -145,7 +145,7 @@ enum SPICE_ARGS_IDX {
|
||||
IDX_READ_ONLY,
|
||||
|
||||
/**
|
||||
* Space-separated list of encodings to use within the SPICE session. If not
|
||||
* Space-separated list of encodings to use within the Spice session. If not
|
||||
* specified, this will be:
|
||||
*
|
||||
* "zrle ultra copyrect hextile zlib corre rre raw".
|
||||
@ -153,18 +153,18 @@ enum SPICE_ARGS_IDX {
|
||||
IDX_ENCODINGS,
|
||||
|
||||
/**
|
||||
* The username to send to the SPICE server if authentication is requested.
|
||||
* The username to send to the Spice server if authentication is requested.
|
||||
*/
|
||||
IDX_USERNAME,
|
||||
|
||||
/**
|
||||
* The password to send to the SPICE server if authentication is requested.
|
||||
* The password to send to the Spice server if authentication is requested.
|
||||
*/
|
||||
IDX_PASSWORD,
|
||||
|
||||
/**
|
||||
* "true" if the red and blue components of each color should be swapped,
|
||||
* "false" or blank otherwise. This is mainly used for SPICE servers that do
|
||||
* "false" or blank otherwise. This is mainly used for Spice servers that do
|
||||
* not properly handle colors.
|
||||
*/
|
||||
IDX_SWAP_RED_BLUE,
|
||||
@ -187,10 +187,10 @@ enum SPICE_ARGS_IDX {
|
||||
IDX_AUTORETRY,
|
||||
|
||||
/**
|
||||
* The encoding to use for clipboard data sent to the SPICE server if we are
|
||||
* The encoding to use for clipboard data sent to the Spice server if we are
|
||||
* going to be deviating from the standard (which mandates ISO 8829-1).
|
||||
* Valid values are "ISO8829-1" (the only legal value with respect to the
|
||||
* SPICE standard), "UTF-8", "UTF-16", and "CP2252".
|
||||
* Spice standard), "UTF-8", "UTF-16", and "CP2252".
|
||||
*/
|
||||
IDX_CLIPBOARD_ENCODING,
|
||||
|
||||
@ -216,7 +216,7 @@ enum SPICE_ARGS_IDX {
|
||||
IDX_FILE_DIRECTORY,
|
||||
|
||||
/**
|
||||
* Whether or not the shared directory should be read-only to the SPICE
|
||||
* Whether or not the shared directory should be read-only to the Spice
|
||||
* server.
|
||||
*/
|
||||
IDX_FILE_TRANSFER_RO,
|
||||
@ -242,20 +242,20 @@ enum SPICE_ARGS_IDX {
|
||||
/**
|
||||
* The name of the keymap chosen as the layout of the server. Legal names
|
||||
* are defined within the *.keymap files in the "keymaps" directory of the
|
||||
* source for Guacamole's SPICE support.
|
||||
* source for Guacamole's Spice support.
|
||||
*/
|
||||
IDX_SERVER_LAYOUT,
|
||||
|
||||
#ifdef ENABLE_COMMON_SSH
|
||||
/**
|
||||
* "true" if SFTP should be enabled for the SPICE connection, "false" or
|
||||
* "true" if SFTP should be enabled for the Spice connection, "false" or
|
||||
* blank otherwise.
|
||||
*/
|
||||
IDX_ENABLE_SFTP,
|
||||
|
||||
/**
|
||||
* The hostname of the SSH server to connect to for SFTP. If blank, the
|
||||
* hostname of the SPICE server will be used.
|
||||
* hostname of the Spice server will be used.
|
||||
*/
|
||||
IDX_SFTP_HOSTNAME,
|
||||
|
||||
@ -651,7 +651,7 @@ void guac_spice_settings_free(guac_spice_settings* settings) {
|
||||
free(settings->username);
|
||||
|
||||
#ifdef ENABLE_SPICE_REPEATER
|
||||
/* Free SPICE repeater settings */
|
||||
/* Free Spice repeater settings */
|
||||
free(settings->dest_host);
|
||||
#endif
|
||||
|
||||
|
@ -34,17 +34,17 @@
|
||||
#define GUAC_SPICE_DEFAULT_RECORDING_NAME "recording"
|
||||
|
||||
/**
|
||||
* SPICE-specific client data.
|
||||
* Spice-specific client data.
|
||||
*/
|
||||
typedef struct guac_spice_settings {
|
||||
|
||||
/**
|
||||
* The hostname of the SPICE server (or repeater) to connect to.
|
||||
* The hostname of the Spice server (or repeater) to connect to.
|
||||
*/
|
||||
char* hostname;
|
||||
|
||||
/**
|
||||
* The port of the SPICE server (or repeater) to connect to.
|
||||
* The port of the Spice server (or repeater) to connect to.
|
||||
*/
|
||||
char* port;
|
||||
|
||||
@ -55,13 +55,13 @@ typedef struct guac_spice_settings {
|
||||
|
||||
/**
|
||||
* The type of TLS validation that should be done for encrypted connections
|
||||
* to SPICE servers.
|
||||
* to Spice servers.
|
||||
*/
|
||||
SpiceSessionVerify tls_verify;
|
||||
|
||||
/**
|
||||
* One or more Base64-encoded certificates to use to validate TLS
|
||||
* connections to the SPICE server.
|
||||
* connections to the Spice server.
|
||||
*/
|
||||
char* ca;
|
||||
|
||||
@ -72,12 +72,12 @@ typedef struct guac_spice_settings {
|
||||
char* ca_file;
|
||||
|
||||
/**
|
||||
* The public key of the SPICE server for TLS verification.
|
||||
* The public key of the Spice server for TLS verification.
|
||||
*/
|
||||
char* pubkey;
|
||||
|
||||
/**
|
||||
* SPICE supports connecting to remote servers via a proxy server. You can
|
||||
* Spice supports connecting to remote servers via a proxy server. You can
|
||||
* specify the proxy server to use in this property.
|
||||
*/
|
||||
char* proxy;
|
||||
@ -93,7 +93,7 @@ typedef struct guac_spice_settings {
|
||||
char* password;
|
||||
|
||||
/**
|
||||
* Space-separated list of encodings to use within the SPICE session.
|
||||
* Space-separated list of encodings to use within the Spice session.
|
||||
*/
|
||||
char* encodings;
|
||||
|
||||
@ -161,8 +161,8 @@ typedef struct guac_spice_settings {
|
||||
int retries;
|
||||
|
||||
/**
|
||||
* The encoding to use for clipboard data sent to the SPICE server, or NULL
|
||||
* to use the encoding required by the SPICE standard.
|
||||
* The encoding to use for clipboard data sent to the Spice server, or NULL
|
||||
* to use the encoding required by the Spice standard.
|
||||
*/
|
||||
char* clipboard_encoding;
|
||||
|
||||
@ -182,7 +182,7 @@ typedef struct guac_spice_settings {
|
||||
|
||||
#ifdef ENABLE_COMMON_SSH
|
||||
/**
|
||||
* Whether SFTP should be enabled for the SPICE connection.
|
||||
* Whether SFTP should be enabled for the Spice connection.
|
||||
*/
|
||||
bool enable_sftp;
|
||||
|
||||
|
@ -22,7 +22,7 @@
|
||||
|
||||
/**
|
||||
* The key used to store and retrieve Guacamole-related data from within the
|
||||
* SPICE client structure.
|
||||
* Spice client structure.
|
||||
*/
|
||||
#define GUAC_SPICE_CLIENT_KEY "GUAC_SPICE"
|
||||
|
||||
@ -125,54 +125,54 @@
|
||||
#define GUAC_SPICE_PARAMETER_TLS_VERIFY_SUBJECT "subject"
|
||||
|
||||
/**
|
||||
* The property within a SPICE client channel that indicates if the SPICE
|
||||
* The property within a Spice client channel that indicates if the SPICE
|
||||
* agent is connected.
|
||||
*/
|
||||
#define SPICE_PROPERTY_AGENT_CONNECTED "agent-connected"
|
||||
|
||||
/**
|
||||
* The SPICE client property that defines CA certificates used to validate
|
||||
* the TLS connection to the SPICE server.
|
||||
* The Spice client property that defines CA certificates used to validate
|
||||
* the TLS connection to the Spice server.
|
||||
*/
|
||||
#define SPICE_PROPERTY_CA "ca"
|
||||
|
||||
/**
|
||||
* The SPICE client property that defines a path on the server running guacd
|
||||
* The Spice client property that defines a path on the server running guacd
|
||||
* to the file containing the certificate authority certificates to use to
|
||||
* validate the TLS connection to the SPICE server.
|
||||
* validate the TLS connection to the Spice server.
|
||||
*/
|
||||
#define SPICE_PROPERTY_CA_FILE "ca-file"
|
||||
|
||||
/**
|
||||
* The property that the SPICE client uses to set the image cache size. If
|
||||
* The property that the Spice client uses to set the image cache size. If
|
||||
* undefined a default of 0 will be used.
|
||||
*/
|
||||
#define SPICE_PROPERTY_CACHE_SIZE "cache-size"
|
||||
|
||||
/**
|
||||
* The SPICE client channel property that stores the identifier of the channel.
|
||||
* The Spice client channel property that stores the identifier of the channel.
|
||||
*/
|
||||
#define SPICE_PROPERTY_CHANNEL_ID "channel-id"
|
||||
|
||||
/**
|
||||
* THe SPICE client channel property that stores the type of the channel.
|
||||
* THe Spice client channel property that stores the type of the channel.
|
||||
*/
|
||||
#define SPICE_PROPERTY_CHANNEL_TYPE "channel-type"
|
||||
|
||||
/**
|
||||
* SPICE library property that determines whether or not the sockets are provided
|
||||
* Spice library property that determines whether or not the sockets are provided
|
||||
* by the client.
|
||||
*/
|
||||
#define SPICE_PROPERTY_CLIENT_SOCKETS "client-sockets"
|
||||
|
||||
/**
|
||||
* The property that tells the SPICE client the color depth to use when
|
||||
* The property that tells the Spice client the color depth to use when
|
||||
* allocating new displays.
|
||||
*/
|
||||
#define SPICE_PROPERTY_COLOR_DEPTH "color-depth"
|
||||
|
||||
/**
|
||||
* The property that tells the SPICE client to enable audio playback and
|
||||
* The property that tells the Spice client to enable audio playback and
|
||||
* recording. The SPICE client default is TRUE.
|
||||
*/
|
||||
#define SPICE_PROPERTY_ENABLE_AUDIO "enable-audio"
|
||||
@ -183,13 +183,13 @@
|
||||
#define SPICE_PROPERTY_ENABLE_USBREDIR "enable-usbredir"
|
||||
|
||||
/**
|
||||
* The property that contains the hostname, IP address, or URL of the SPICE
|
||||
* The property that contains the hostname, IP address, or URL of the Spice
|
||||
* server that the client should attempt to connect to.
|
||||
*/
|
||||
#define SPICE_PROPERTY_HOST "host"
|
||||
|
||||
/**
|
||||
* A read-only property exposed by the SPICE client library indicating the
|
||||
* A read-only property exposed by the Spice client library indicating the
|
||||
* current state of key modifiers - such as lock keys - on the server.
|
||||
*/
|
||||
#define SPICE_PROPERTY_KEY_MODIFIERS "key-modifiers"
|
||||
@ -201,88 +201,88 @@
|
||||
|
||||
/**
|
||||
* The property used to toggle the playback and/or record
|
||||
* mute status on the SPICE server.
|
||||
* mute status on the Spice server.
|
||||
*/
|
||||
#define SPICE_PROPERTY_MUTE "mute"
|
||||
|
||||
/**
|
||||
* The property used to get or set the number of audio playback and/or recording
|
||||
* channels that will be available between the SPICE server and client.
|
||||
* channels that will be available between the Spice server and client.
|
||||
*/
|
||||
#define SPICE_PROPERTY_NUM_CHANNELS "nchannels"
|
||||
|
||||
/**
|
||||
* The property used to tell the SPICE client the password to send on to the
|
||||
* The property used to tell the Spice client the password to send on to the
|
||||
* SPICE server for authentication.
|
||||
*/
|
||||
#define SPICE_PROPERTY_PASSWORD "password"
|
||||
|
||||
/**
|
||||
* The property used to set the unencrypted communication port for communicating
|
||||
* with the SPICE server.
|
||||
* with the Spice server.
|
||||
*/
|
||||
#define SPICE_PROPERTY_PORT "port"
|
||||
|
||||
/**
|
||||
* The property that the SPICE client uses to set the proxy server that is used
|
||||
* to connect to the SPICE server.
|
||||
* The property that the Spice client uses to set the proxy server that is used
|
||||
* to connect to the Spice server.
|
||||
*/
|
||||
#define SPICE_PROPERTY_PROXY "proxy"
|
||||
|
||||
/**
|
||||
* The property used by the SPICE client to tell the server that the session
|
||||
* The property used by the Spice client to tell the server that the session
|
||||
* should be read-only.
|
||||
*/
|
||||
#define SPICE_PROPERTY_READ_ONLY "read-only"
|
||||
|
||||
/**
|
||||
* The property that the SPICE client uses to determine a local (to guacd)
|
||||
* directory that will be shared with the SPICE server.
|
||||
* The property that the Spice client uses to determine a local (to guacd)
|
||||
* directory that will be shared with the Spice server.
|
||||
*/
|
||||
#define SPICE_PROPERTY_SHARED_DIR "shared-dir"
|
||||
|
||||
/**
|
||||
* The property that tells the SPICE client that the shared directory should be
|
||||
* read-only to the SPICE server and should not allow writes.
|
||||
* The property that tells the Spice client that the shared directory should be
|
||||
* read-only to the Spice server and should not allow writes.
|
||||
*/
|
||||
#define SPICE_PROPERTY_SHARED_DIR_RO "share-dir-ro"
|
||||
|
||||
/**
|
||||
* The property within the SPICE client that is used to set the port used for
|
||||
* secure, TLS-based communication with the SPICE server.
|
||||
* The property within the Spice client that is used to set the port used for
|
||||
* secure, TLS-based communication with the Spice server.
|
||||
*/
|
||||
#define SPICE_PROPERTY_TLS_PORT "tls-port"
|
||||
|
||||
/**
|
||||
* The property that is used to set the username that the SPICE client will use
|
||||
* The property that is used to set the username that the Spice client will use
|
||||
* to authenticate with the server.
|
||||
*/
|
||||
#define SPICE_PROPERTY_USERNAME "username"
|
||||
|
||||
/**
|
||||
* The property that tells the SPICE client whether or not to verify the
|
||||
* certificate presented by the SPICE server in TLS communications.
|
||||
* The property that tells the Spiec client whether or not to verify the
|
||||
* certificate presented by the Spice server in TLS communications.
|
||||
*/
|
||||
#define SPICE_PROPERTY_VERIFY "verify"
|
||||
|
||||
/**
|
||||
* The property used to get or set the playback and/or recording volume of audio
|
||||
* on the SPICE server to the remote client.
|
||||
* on the Spice server to the remote client.
|
||||
*/
|
||||
#define SPICE_PROPERTY_VOLUME "volume"
|
||||
|
||||
/**
|
||||
* The signal sent by the SPICE client when a new channel is created.
|
||||
* The signal sent by the Spice client when a new channel is created.
|
||||
*/
|
||||
#define SPICE_SIGNAL_CHANNEL_NEW "channel-new"
|
||||
|
||||
/**
|
||||
* The signal sent by the SPICE client when a channel is destroyed.
|
||||
* The signal sent by the Spice client when a channel is destroyed.
|
||||
*/
|
||||
#define SPICE_SIGNAL_CHANNEL_DESTROY "channel-destroy"
|
||||
|
||||
/**
|
||||
* The signal sent by the SPICE client when an event occurs on a channel.
|
||||
* The signal sent by the Spice client when an event occurs on a channel.
|
||||
*/
|
||||
#define SPICE_SIGNAL_CHANNEL_EVENT "channel-event"
|
||||
|
||||
@ -309,7 +309,7 @@
|
||||
#define SPICE_SIGNAL_CURSOR_SET "cursor-set"
|
||||
|
||||
/**
|
||||
* The signal sent by the SPICE client when the client is disconnected from
|
||||
* The signal sent by the Spice client when the client is disconnected from
|
||||
* the server.
|
||||
*/
|
||||
#define SPICE_SIGNAL_DISCONNECTED "disconnected"
|
||||
@ -348,24 +348,24 @@
|
||||
#define SPICE_SIGNAL_INPUTS_MODIFIERS "inputs-modifiers"
|
||||
|
||||
/**
|
||||
* The signal sent by the SPICE client when the connected status or capabilities
|
||||
* The signal sent by the Spice client when the connected status or capabilities
|
||||
* of a channel change.
|
||||
*/
|
||||
#define SPICE_SIGNAL_MAIN_AGENT_UPDATE "main-agent-update"
|
||||
|
||||
/**
|
||||
* Signal fired by the SPICE client when clipboard selection data is available.
|
||||
* Signal fired by the Spice client when clipboard selection data is available.
|
||||
*/
|
||||
#define SPICE_SIGNAL_MAIN_CLIPBOARD_SELECTION "main-clipboard-selection"
|
||||
|
||||
/**
|
||||
* A signal fired by the SPICE client when clipboard selection data is available
|
||||
* A signal fired by the Spice client when clipboard selection data is available
|
||||
* from the guest, and of what type.
|
||||
*/
|
||||
#define SPICE_SIGNAL_MAIN_CLIPBOARD_SELECTION_GRAB "main-clipboard-selection-grab"
|
||||
|
||||
/**
|
||||
* A signal fired by the SPICE client when clipboard selection data is no longer
|
||||
* A signal fired by the Spice client when clipboard selection data is no longer
|
||||
* available from the guest.
|
||||
*/
|
||||
#define SPICE_SIGNAL_MAIN_CLIPBOARD_SELECTION_RELEASE "main-clipboard-selection-release"
|
||||
@ -381,19 +381,19 @@
|
||||
#define SPICE_SIGNAL_MAIN_MOUSE_UPDATE "main-mouse-update"
|
||||
|
||||
/**
|
||||
* A signal sent by the SPICE client when the server has indicated that live
|
||||
* A signal sent by the Spice client when the server has indicated that live
|
||||
* migration has started.
|
||||
*/
|
||||
#define SPICE_SIGNAL_MIGRATION_STARTED "migration-started"
|
||||
|
||||
/**
|
||||
* The signal sent by the SPICE client when a MM time discontinuity is
|
||||
* The signal sent by the Spice client when a MM time discontinuity is
|
||||
* detected.
|
||||
*/
|
||||
#define SPICE_SIGNAL_MM_TIME_RESET "mm-time-reset"
|
||||
|
||||
/**
|
||||
* The signal fired by the SPICE client when a new file transfer task has been
|
||||
* The signal fired by the Spice client when a new file transfer task has been
|
||||
* initiated.
|
||||
*/
|
||||
#define SPICE_SIGNAL_NEW_FILE_TRANSFER "new-file-transfer"
|
||||
@ -421,7 +421,7 @@
|
||||
#define SPICE_SIGNAL_PLAYBACK_STOP "playback-stop"
|
||||
|
||||
/**
|
||||
* A signal indicating that the SPICE server would like to capture audio data
|
||||
* A signal indicating that the Spice server would like to capture audio data
|
||||
* from the client, along with the required format of that data.
|
||||
*/
|
||||
#define SPICE_SIGNAL_RECORD_START "record-start"
|
||||
@ -437,7 +437,7 @@
|
||||
#define SPICE_SIGNAL_SHARE_FOLDER "notify::share-folder"
|
||||
|
||||
/**
|
||||
* The signal indicating that the SPICE server has gone to streaming mode.
|
||||
* The signal indicating that the Spice server has gone to streaming mode.
|
||||
*/
|
||||
#define SPICE_SIGNAL_STREAMING_MODE "streaming-mode"
|
||||
|
||||
|
@ -26,12 +26,12 @@
|
||||
#define SPICE_DEFAULT_HOST "localhost"
|
||||
|
||||
/**
|
||||
* The default SPICE port number to connect to if none is specified.
|
||||
* The default Spice port number to connect to if none is specified.
|
||||
*/
|
||||
#define SPICE_DEFAULT_PORT "5900"
|
||||
|
||||
/**
|
||||
* The default encodings to use for the SPICE clipboard.
|
||||
* The default encodings to use for the Spice clipboard.
|
||||
*/
|
||||
#define SPICE_DEFAULT_ENCODINGS "zrle ultra copyrect hextile zlib corre rre raw"
|
||||
|
||||
|
@ -53,23 +53,17 @@ SpiceSession* guac_spice_get_session(guac_client* client) {
|
||||
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Initializing new SPICE session.");
|
||||
|
||||
/* Set up the SPICE session and Guacamole client. */
|
||||
/* Set up the Spice session and Guacamole client. */
|
||||
guac_spice_client* spice_client = (guac_spice_client*) client->data;
|
||||
guac_spice_settings* spice_settings = spice_client->settings;
|
||||
|
||||
/* Create a new SPICE client. */
|
||||
/* Create a new Spice client. */
|
||||
SpiceSession* spice_session = spice_session_new();
|
||||
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Registering new channel callback.");
|
||||
|
||||
/* Register a callback for handling new channel events. */
|
||||
g_signal_connect(spice_session, SPICE_SIGNAL_CHANNEL_NEW,
|
||||
G_CALLBACK(guac_spice_client_channel_handler), client);
|
||||
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Setting up connection properties.");
|
||||
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Setting up host/port.");
|
||||
|
||||
/* Set hostname and port */
|
||||
g_object_set(spice_session, SPICE_PROPERTY_HOST, spice_settings->hostname, NULL);
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Connecting to host %s",
|
||||
@ -100,6 +94,7 @@ SpiceSession* guac_spice_get_session(guac_client* client) {
|
||||
spice_client->keyboard = guac_spice_keyboard_alloc(client,
|
||||
spice_settings->server_layout);
|
||||
|
||||
/* If file transfer is enabled, set up the required properties. */
|
||||
if (spice_settings->file_transfer) {
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "File transfer enabled, configuring Spice client.");
|
||||
g_object_set(spice_session, SPICE_PROPERTY_SHARED_DIR, spice_settings->file_directory, NULL);
|
||||
@ -113,12 +108,9 @@ SpiceSession* guac_spice_get_session(guac_client* client) {
|
||||
guac_client_for_owner(client, guac_spice_folder_expose,
|
||||
spice_client->shared_folder);
|
||||
}
|
||||
else {
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Disabling file transfer.");
|
||||
g_object_set(spice_session, SPICE_PROPERTY_SHARED_DIR, NULL, NULL);
|
||||
}
|
||||
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Finished setting properties.");
|
||||
else
|
||||
g_object_set(spice_session, SPICE_PROPERTY_SHARED_DIR, NULL, NULL);
|
||||
|
||||
/* Return the configured session. */
|
||||
return spice_session;
|
||||
@ -158,12 +150,8 @@ void* guac_spice_client_thread(void* data) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Configuration completed, flushing socket.");
|
||||
|
||||
guac_socket_flush(client->socket);
|
||||
|
||||
// guac_timestamp last_frame_end = guac_timestamp_current();
|
||||
|
||||
guac_client_log(client, GUAC_LOG_DEBUG, "Connection configuration finished, calling spice_session_connect.");
|
||||
|
||||
if(!spice_session_connect(spice_client->spice_session))
|
||||
@ -193,6 +181,7 @@ void* guac_spice_client_thread(void* data) {
|
||||
g_object_unref(spice_client->spice_session);
|
||||
spice_client->spice_session = NULL;
|
||||
}
|
||||
|
||||
guac_client_stop(client);
|
||||
guac_client_log(client, GUAC_LOG_INFO, "Internal SPICE client disconnected");
|
||||
return NULL;
|
||||
|
@ -46,42 +46,42 @@
|
||||
#include <pthread.h>
|
||||
|
||||
/**
|
||||
* SPICE-specific client data.
|
||||
* Spice-specific client data.
|
||||
*/
|
||||
typedef struct guac_spice_client {
|
||||
|
||||
/**
|
||||
* The SPICE client thread.
|
||||
* The Spice client thread.
|
||||
*/
|
||||
pthread_t client_thread;
|
||||
|
||||
/**
|
||||
* The underlying SPICE session.
|
||||
* The underlying Spice session.
|
||||
*/
|
||||
SpiceSession* spice_session;
|
||||
|
||||
/**
|
||||
* The main SPICE channel.
|
||||
* The main Spice channel.
|
||||
*/
|
||||
SpiceMainChannel* main_channel;
|
||||
|
||||
/**
|
||||
* The SPICE audio playback channel.
|
||||
* The Spice audio playback channel.
|
||||
*/
|
||||
SpicePlaybackChannel* playback_channel;
|
||||
|
||||
/**
|
||||
* The SPICE audio recording/input channel.
|
||||
* The Spice audio recording/input channel.
|
||||
*/
|
||||
SpiceRecordChannel* record_channel;
|
||||
|
||||
/**
|
||||
* The SPICE channel that handles the cursor display and events.
|
||||
* The Spice channel that handles the cursor display and events.
|
||||
*/
|
||||
SpiceCursorChannel* cursor_channel;
|
||||
|
||||
/**
|
||||
* The SPICE channel that handles mouse and keyboard inputs.
|
||||
* The Spice channel that handles mouse and keyboard inputs.
|
||||
*/
|
||||
SpiceInputsChannel* inputs_channel;
|
||||
|
||||
@ -96,7 +96,7 @@ typedef struct guac_spice_client {
|
||||
guac_common_display* display;
|
||||
|
||||
/**
|
||||
* The SPICE display channel.
|
||||
* The Spice display channel.
|
||||
*/
|
||||
SpiceDisplayChannel* spice_display;
|
||||
|
||||
@ -149,16 +149,16 @@ typedef struct guac_spice_client {
|
||||
pthread_mutexattr_t attributes;
|
||||
|
||||
/**
|
||||
* Lock which is used to synchronizes access to SPICE data structures
|
||||
* Lock which is used to synchronizes access to Spice data structures
|
||||
* between user input and client threads. It prevents input handlers
|
||||
* from running when SPICE data structures are allocated or freed
|
||||
* from running when Spice data structures are allocated or freed
|
||||
* by the client thread.
|
||||
*/
|
||||
pthread_rwlock_t lock;
|
||||
|
||||
/**
|
||||
* Lock which synchronizes the sending of each SPICE message, ensuring
|
||||
* attempts to send SPICE messages never overlap.
|
||||
* Lock which synchronizes the sending of each Spice message, ensuring
|
||||
* attempts to send Spice messages never overlap.
|
||||
*/
|
||||
pthread_mutex_t message_lock;
|
||||
|
||||
@ -175,27 +175,27 @@ typedef struct guac_spice_client {
|
||||
} guac_spice_client;
|
||||
|
||||
/**
|
||||
* Allocates a new rfbClient instance given the parameters stored within the
|
||||
* Allocates a new Spice client session given the parameters stored within the
|
||||
* client, returning NULL on failure.
|
||||
*
|
||||
* @param client
|
||||
* The guac_client associated with the settings of the desired SPICE
|
||||
* The guac_client associated with the settings of the desired Spice
|
||||
* connection.
|
||||
*
|
||||
* @return
|
||||
* A new rfbClient instance allocated and connected according to the
|
||||
* A new Spice session instance allocated and connected according to the
|
||||
* parameters stored within the given client, or NULL if connecting to the
|
||||
* SPICE server fails.
|
||||
* Spice server fails.
|
||||
*/
|
||||
SpiceSession* guac_spice_get_session(guac_client* client);
|
||||
|
||||
/**
|
||||
* SPICE client thread. This thread initiates the SPICE connection and
|
||||
* Spice client thread. This thread initiates the Spice connection and
|
||||
* ultimately runs throughout the duration of the client, existing as a single
|
||||
* instance, shared by all users.
|
||||
*
|
||||
* @param data
|
||||
* The guac_client instance associated with the requested SPICE connection.
|
||||
* The guac_client instance associated with the requested Spice connection.
|
||||
*
|
||||
* @return
|
||||
* Always NULL.
|
||||
|
@ -55,7 +55,7 @@ int guac_spice_user_join_handler(guac_user* user, int argc, char** argv) {
|
||||
/* Store settings at user level */
|
||||
user->data = settings;
|
||||
|
||||
/* Connect via SPICE if owner */
|
||||
/* Connect via Spice if owner */
|
||||
if (user->owner) {
|
||||
|
||||
/* Store owner's settings at client level */
|
||||
|
Loading…
Reference in New Issue
Block a user