From 8a5d7eadbead1cdf9ba7e027dd853c37b36e1b7e Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Fri, 30 Mar 2012 11:26:52 -0700 Subject: [PATCH] Added clipboard event stubs. --- Makefile.am | 2 +- include/rdp_cliprdr.h | 50 ++++++++++++++++++++++++ src/client.c | 8 ++++ src/guac_handlers.c | 16 ++++++++ src/rdp_cliprdr.c | 104 +++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 include/rdp_cliprdr.h create mode 100644 src/rdp_cliprdr.c diff --git a/Makefile.am b/Makefile.am index 9ad53f8..a18a14f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -41,7 +41,7 @@ AM_CFLAGS = -Werror -Wall -pedantic -Iinclude lib_LTLIBRARIES = libguac-client-rdp.la -libguac_client_rdp_la_SOURCES = src/client.c src/rdp_bitmap.c src/rdp_glyph.c src/rdp_pointer.c src/rdp_gdi.c src/guac_handlers.c \ +libguac_client_rdp_la_SOURCES = src/client.c src/rdp_bitmap.c src/rdp_glyph.c src/rdp_pointer.c src/rdp_gdi.c src/guac_handlers.c src/rdp_cliprdr.c \ src/rdp_keymap.c \ src/rdp_keymap_base.c \ src/rdp_keymap_en_us.c diff --git a/include/rdp_cliprdr.h b/include/rdp_cliprdr.h new file mode 100644 index 0000000..83ab599 --- /dev/null +++ b/include/rdp_cliprdr.h @@ -0,0 +1,50 @@ + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is libguac-client-rdp. + * + * The Initial Developer of the Original Code is + * Michael Jumper. + * Portions created by the Initial Developer are Copyright (C) 2011 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef __GUAC_RDP_RDP_CLIPRDR_H +#define __GUAC_RDP_RDP_CLIPRDR_H + +#include + +void guac_rdp_process_cliprdr_event(guac_client* client, RDP_EVENT* event); +void guac_rdp_process_cb_monitor_ready(guac_client* client); +void guac_rdp_process_cb_format_list(guac_client* client); +void guac_rdp_process_cb_data_request(guac_client* client); +void guac_rdp_process_cb_data_response(guac_client* client); + +#endif + diff --git a/src/client.c b/src/client.c index e6a028b..caca83f 100644 --- a/src/client.c +++ b/src/client.c @@ -91,6 +91,10 @@ enum ARGS_IDX { IDX_COLOR_DEPTH }; +int __guac_receive_channel_data(freerdp* rdp_inst, int channelId, uint8* data, int size, int flags, int total_size) { + return freerdp_channels_data(rdp_inst, channelId, data, size, flags, total_size); +} + boolean rdp_freerdp_pre_connect(freerdp* instance) { rdpContext* context = instance->context; @@ -102,6 +106,9 @@ boolean rdp_freerdp_pre_connect(freerdp* instance) { rdpPrimaryUpdate* primary; CLRCONV* clrconv; + /* Load clipboard plugin */ + freerdp_channels_load_plugin(channels, instance->settings, "cliprdr", NULL); + /* Init color conversion structure */ clrconv = xnew(CLRCONV); clrconv->alpha = 1; @@ -274,6 +281,7 @@ int guac_client_init(guac_client* client, int argc, char** argv) { rdp_inst = freerdp_new(); rdp_inst->PreConnect = rdp_freerdp_pre_connect; rdp_inst->PostConnect = rdp_freerdp_post_connect; + rdp_inst->ReceiveChannelData = __guac_receive_channel_data; /* Allocate FreeRDP context */ rdp_inst->context_size = sizeof(rdp_freerdp_context); diff --git a/src/guac_handlers.c b/src/guac_handlers.c index dab2b27..671fd8f 100644 --- a/src/guac_handlers.c +++ b/src/guac_handlers.c @@ -47,6 +47,8 @@ #include #include #include +#include +#include #include #include @@ -55,6 +57,7 @@ #include "client.h" #include "rdp_keymap.h" +#include "rdp_cliprdr.h" #include "guac_handlers.h" void __guac_rdp_update_keysyms(guac_client* client, const int* keysym_string, int from, int to); @@ -98,6 +101,7 @@ int rdp_guac_client_handle_messages(guac_client* client) { int read_count = 0; int write_count = 0; fd_set rfds, wfds; + RDP_EVENT* event; struct timeval timeout = { .tv_sec = 0, @@ -172,6 +176,18 @@ int rdp_guac_client_handle_messages(guac_client* client) { return 1; } + /* Check for channel events */ + event = freerdp_channels_pop_event(channels); + if (event) { + + /* Handle clipboard events */ + if (event->event_class == RDP_EVENT_CLASS_CLIPRDR) + guac_rdp_process_cliprdr_event(client, event); + + freerdp_event_free(event); + + } + /* Handle RDP disconnect */ if (freerdp_shall_disconnect(rdp_inst)) { guac_error = GUAC_STATUS_NO_INPUT; diff --git a/src/rdp_cliprdr.c b/src/rdp_cliprdr.c new file mode 100644 index 0000000..bb1ede7 --- /dev/null +++ b/src/rdp_cliprdr.c @@ -0,0 +1,104 @@ + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is libguac-client-rdp. + * + * The Initial Developer of the Original Code is + * Michael Jumper. + * Portions created by the Initial Developer are Copyright (C) 2011 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + + +#include +#include +#include +#include + +#include + +#include "client.h" +#include "rdp_cliprdr.h" + +void guac_rdp_process_cliprdr_event(guac_client* client, RDP_EVENT* event) { + + switch (event->event_type) { + + case RDP_EVENT_TYPE_CB_MONITOR_READY: + guac_rdp_process_cb_monitor_ready(client); + break; + + case RDP_EVENT_TYPE_CB_FORMAT_LIST: + guac_rdp_process_cb_format_list(client); + break; + + case RDP_EVENT_TYPE_CB_DATA_REQUEST: + guac_rdp_process_cb_data_request(client); + break; + + case RDP_EVENT_TYPE_CB_DATA_RESPONSE: + guac_rdp_process_cb_data_response(client); + break; + + default: + guac_client_log_info(client, + "Unknown cliprdr event type: 0x%x", + event->event_type); + } + +} + +void guac_rdp_process_cb_monitor_ready(guac_client* client) { + + rdpChannels* channels = + ((rdp_guac_client_data*) client->data)->rdp_inst->context->channels; + + RDP_EVENT* event = freerdp_event_new( + RDP_EVENT_CLASS_CLIPRDR, + RDP_EVENT_TYPE_CB_FORMAT_LIST, + NULL, NULL); + + ((RDP_CB_FORMAT_LIST_EVENT*) event)->num_formats = 0; + + freerdp_channels_send_event(channels, event); + +} + +void guac_rdp_process_cb_format_list(guac_client* client) { + /* STUB */ +} + +void guac_rdp_process_cb_data_request(guac_client* client) { + /* STUB */ +} + +void guac_rdp_process_cb_data_response(guac_client* client) { + /* STUB */ +} + -- 1.7.10.4