From 0096cf677c46b438e7b3fab2f33549c3f219409c Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Thu, 10 Apr 2014 14:53:32 -0700 Subject: [PATCH] GUAC-614: Migrate RDP to simpler stream API. Add missing linkage to RDP build. Fix last character truncation bug. --- src/protocols/rdp/Makefile.am | 6 +- src/protocols/rdp/client.c | 12 +- src/protocols/rdp/guac_handlers.c | 109 ------------------- src/protocols/rdp/guac_rdpdr/rdpdr_service.c | 1 + src/protocols/rdp/rdp_stream.c | 8 ++ 5 files changed, 18 insertions(+), 118 deletions(-) diff --git a/src/protocols/rdp/Makefile.am b/src/protocols/rdp/Makefile.am index ed955b82..2db9de3d 100644 --- a/src/protocols/rdp/Makefile.am +++ b/src/protocols/rdp/Makefile.am @@ -45,7 +45,8 @@ libguac_client_rdp_la_SOURCES = \ unicode.c guacsvc_sources = \ - guac_svc/svc_service.c + guac_svc/svc_service.c \ + rdp_svc.c guacsnd_sources = \ guac_rdpsnd/rdpsnd_messages.c \ @@ -61,6 +62,7 @@ guacdr_sources = \ guac_rdpdr/rdpdr_printer.c \ guac_rdpdr/rdpdr_service.c \ rdp_fs.c \ + rdp_stream.c \ unicode.c noinst_HEADERS = \ @@ -109,7 +111,7 @@ guacsnd_ldflags = -module -avoid-version -shared @RDP_LIBS@ @PTHREAD_LIBS@ guacdr_ldflags = -module -avoid-version -shared @RDP_LIBS@ @PTHREAD_LIBS@ libguac_client_rdp_la_LIBADD = @LIBGUAC_LTLIB@ @COMMON_LTLIB@ -guacsvc_libadd = @LIBGUAC_LTLIB@ +guacsvc_libadd = @LIBGUAC_LTLIB@ @COMMON_LTLIB@ guacsnd_libadd = @LIBGUAC_LTLIB@ guacdr_libadd = @LIBGUAC_LTLIB@ diff --git a/src/protocols/rdp/client.c b/src/protocols/rdp/client.c index 9fc24de7..5d2bd998 100644 --- a/src/protocols/rdp/client.c +++ b/src/protocols/rdp/client.c @@ -33,6 +33,7 @@ #include "rdp_glyph.h" #include "rdp_keymap.h" #include "rdp_pointer.h" +#include "rdp_stream.h" #include "rdp_svc.h" #include @@ -349,14 +350,11 @@ BOOL rdp_freerdp_post_connect(freerdp* instance) { client->handle_messages = rdp_guac_client_handle_messages; client->mouse_handler = rdp_guac_client_mouse_handler; client->key_handler = rdp_guac_client_key_handler; - client->clipboard_handler = rdp_guac_client_clipboard_handler; - /* File transfer handlers */ - client->file_handler = rdp_guac_client_file_handler; - client->pipe_handler = rdp_guac_client_pipe_handler; - client->blob_handler = rdp_guac_client_blob_handler; - client->end_handler = rdp_guac_client_end_handler; - client->ack_handler = rdp_guac_client_ack_handler; + /* Stream handlers */ + client->clipboard_handler = guac_rdp_clipboard_handler; + client->file_handler = guac_rdp_upload_file_handler; + client->pipe_handler = guac_rdp_svc_pipe_handler; return TRUE; diff --git a/src/protocols/rdp/guac_handlers.c b/src/protocols/rdp/guac_handlers.c index f23ba173..27d84084 100644 --- a/src/protocols/rdp/guac_handlers.c +++ b/src/protocols/rdp/guac_handlers.c @@ -461,112 +461,3 @@ int rdp_guac_client_key_handler(guac_client* client, int keysym, int pressed) { } -int rdp_guac_client_clipboard_handler(guac_client* client, guac_stream* stream, - char* mimetype) { - - return guac_rdp_clipboard_handler(client, stream, mimetype); - -} - -int rdp_guac_client_file_handler(guac_client* client, guac_stream* stream, - char* mimetype, char* filename) { - - /* All inbound files are file uploads */ - return guac_rdp_upload_file_handler(client, stream, mimetype, filename); - -} - -int rdp_guac_client_pipe_handler(guac_client* client, guac_stream* stream, - char* mimetype, char* name) { - - /* All inbound pipes are SVC-related */ - return guac_rdp_svc_pipe_handler(client, stream, mimetype, name); - -} - -int rdp_guac_client_blob_handler(guac_client* client, guac_stream* stream, - void* data, int length) { - - guac_rdp_stream* rdp_stream = (guac_rdp_stream*) stream->data; - - /* Handle based on stream type */ - switch (rdp_stream->type) { - - /* Inbound file stream */ - case GUAC_RDP_UPLOAD_STREAM: - return guac_rdp_upload_blob_handler(client, stream, data, length); - - /* SVC stream */ - case GUAC_RDP_INBOUND_SVC_STREAM: - return guac_rdp_svc_blob_handler(client, stream, data, length); - - /* Clipboard stream */ - case GUAC_RDP_INBOUND_CLIPBOARD_STREAM: - return guac_rdp_clipboard_blob_handler(client, stream, data, length); - - /* Other streams do not accept blobs */ - default: - guac_protocol_send_ack(client->socket, stream, - "FAIL (BLOB NOT EXPECTED)", - GUAC_PROTOCOL_STATUS_CLIENT_BAD_REQUEST); - - guac_socket_flush(client->socket); - return 0; - - } - -} - -int rdp_guac_client_end_handler(guac_client* client, guac_stream* stream) { - - guac_rdp_stream* rdp_stream = (guac_rdp_stream*) stream->data; - - /* Handle based on stream type */ - switch (rdp_stream->type) { - - /* Inbound file stream */ - case GUAC_RDP_UPLOAD_STREAM: - return guac_rdp_upload_end_handler(client, stream); - - /* Clipboard stream */ - case GUAC_RDP_INBOUND_CLIPBOARD_STREAM: - return guac_rdp_clipboard_end_handler(client, stream); - - /* Other streams do not accept explicit closure */ - default: - guac_protocol_send_ack(client->socket, stream, - "FAIL (END NOT EXPECTED)", - GUAC_PROTOCOL_STATUS_CLIENT_BAD_REQUEST); - - guac_socket_flush(client->socket); - return 0; - - } - -} - -int rdp_guac_client_ack_handler(guac_client* client, guac_stream* stream, - char* message, guac_protocol_status status) { - - guac_rdp_stream* rdp_stream = (guac_rdp_stream*) stream->data; - - /* Ignore acks for non-download stream data */ - if (rdp_stream == NULL) - return 0; - - /* Handle other acks based on stream type */ - switch (rdp_stream->type) { - - /* Inbound file stream */ - case GUAC_RDP_DOWNLOAD_STREAM: - return guac_rdp_download_ack_handler( - client, stream, message, status); - - /* Ignore acks on all other streams */ - default: - return 0; - - } - -} - diff --git a/src/protocols/rdp/guac_rdpdr/rdpdr_service.c b/src/protocols/rdp/guac_rdpdr/rdpdr_service.c index 16c94ae3..9e8cf4bf 100644 --- a/src/protocols/rdp/guac_rdpdr/rdpdr_service.c +++ b/src/protocols/rdp/guac_rdpdr/rdpdr_service.c @@ -243,6 +243,7 @@ void guac_rdpdr_start_download(guac_rdpdr_device* device, const char* path) { /* Associate stream with transfer status */ guac_stream* stream = guac_client_alloc_stream(client); stream->data = rdp_stream = malloc(sizeof(guac_rdp_stream)); + stream->ack_handler = guac_rdp_download_ack_handler; rdp_stream->type = GUAC_RDP_DOWNLOAD_STREAM; rdp_stream->download_status.file_id = file_id; rdp_stream->download_status.offset = 0; diff --git a/src/protocols/rdp/rdp_stream.c b/src/protocols/rdp/rdp_stream.c index cbe05534..480d70f7 100644 --- a/src/protocols/rdp/rdp_stream.c +++ b/src/protocols/rdp/rdp_stream.c @@ -112,6 +112,8 @@ int guac_rdp_upload_file_handler(guac_client* client, guac_stream* stream, rdp_stream->upload_status.offset = 0; rdp_stream->upload_status.file_id = file_id; stream->data = rdp_stream; + stream->blob_handler = guac_rdp_upload_blob_handler; + stream->end_handler = guac_rdp_upload_end_handler; guac_protocol_send_ack(client->socket, stream, "OK (STREAM BEGIN)", GUAC_PROTOCOL_STATUS_SUCCESS); @@ -143,6 +145,7 @@ int guac_rdp_svc_pipe_handler(guac_client* client, guac_stream* stream, /* Init stream data */ stream->data = rdp_stream = malloc(sizeof(guac_rdp_stream)); + stream->blob_handler = guac_rdp_svc_blob_handler; rdp_stream->type = GUAC_RDP_INBOUND_SVC_STREAM; rdp_stream->svc = svc; svc->input_pipe = stream; @@ -159,6 +162,8 @@ int guac_rdp_clipboard_handler(guac_client* client, guac_stream* stream, /* Init stream data */ stream->data = rdp_stream = malloc(sizeof(guac_rdp_stream)); + stream->blob_handler = guac_rdp_clipboard_blob_handler; + stream->end_handler = guac_rdp_clipboard_end_handler; rdp_stream->type = GUAC_RDP_INBOUND_CLIPBOARD_STREAM; guac_common_clipboard_reset(client_data->clipboard, mimetype); @@ -274,6 +279,9 @@ int guac_rdp_clipboard_end_handler(guac_client* client, guac_stream* stream) { CliprdrChannel_FormatList, NULL, NULL); + /* Terminate clipboard data with NULL */ + guac_common_clipboard_append(client_data->clipboard, "", 1); + /* Notify server that text data is now available */ format_list->formats = (UINT32*) malloc(sizeof(UINT32)); format_list->formats[0] = CB_FORMAT_TEXT;