guacamole-spice-protocol/src/protocols/rdp/rdp_cliprdr.c

212 lines
6.4 KiB
C
Raw Normal View History

/*
* Copyright (C) 2013 Glyptodon LLC
2012-03-30 18:26:52 +00:00
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
2012-03-30 18:26:52 +00:00
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
2012-03-30 18:26:52 +00:00
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
2012-03-30 18:26:52 +00:00
2014-01-01 22:44:28 +00:00
#include "config.h"
#include "client.h"
#include "rdp_cliprdr.h"
2012-03-30 18:26:52 +00:00
#include <freerdp/channels/channels.h>
2014-01-01 22:44:28 +00:00
#include <freerdp/freerdp.h>
2012-03-30 18:26:52 +00:00
#include <freerdp/utils/event.h>
2014-01-01 22:44:28 +00:00
#include <guacamole/client.h>
#include <guacamole/protocol.h>
2012-03-30 18:26:52 +00:00
2013-07-17 18:54:24 +00:00
#ifdef ENABLE_WINPR
#include <winpr/wtypes.h>
#else
#include "compat/winpr-wtypes.h"
#endif
2014-01-01 22:44:28 +00:00
#ifdef HAVE_FREERDP_CLIENT_CLIPRDR_H
#include <freerdp/client/cliprdr.h>
#else
#include "compat/client-cliprdr.h"
#endif
2012-03-30 18:26:52 +00:00
2013-07-18 19:57:06 +00:00
void guac_rdp_process_cliprdr_event(guac_client* client, wMessage* event) {
2012-03-30 18:26:52 +00:00
#ifdef LEGACY_EVENT
2012-03-30 18:26:52 +00:00
switch (event->event_type) {
#else
switch (GetMessageType(event->id)) {
#endif
2012-03-30 18:26:52 +00:00
case CliprdrChannel_MonitorReady:
2012-04-30 06:09:00 +00:00
guac_rdp_process_cb_monitor_ready(client, event);
2012-03-30 18:26:52 +00:00
break;
case CliprdrChannel_FormatList:
2012-04-30 06:09:00 +00:00
guac_rdp_process_cb_format_list(client,
(RDP_CB_FORMAT_LIST_EVENT*) event);
2012-03-30 18:26:52 +00:00
break;
case CliprdrChannel_DataRequest:
2012-04-30 06:28:29 +00:00
guac_rdp_process_cb_data_request(client,
(RDP_CB_DATA_REQUEST_EVENT*) event);
2012-03-30 18:26:52 +00:00
break;
case CliprdrChannel_DataResponse:
2012-04-30 06:09:00 +00:00
guac_rdp_process_cb_data_response(client,
(RDP_CB_DATA_RESPONSE_EVENT*) event);
2012-03-30 18:26:52 +00:00
break;
default:
#ifdef LEGACY_EVENT
2012-03-30 18:26:52 +00:00
guac_client_log_info(client,
"Unknown cliprdr event type: 0x%x",
event->event_type);
#else
guac_client_log_info(client,
"Unknown cliprdr event type: 0x%x",
GetMessageType(event->id));
#endif
2012-03-30 18:26:52 +00:00
}
}
2013-07-18 19:57:06 +00:00
void guac_rdp_process_cb_monitor_ready(guac_client* client, wMessage* event) {
2012-03-30 18:26:52 +00:00
rdpChannels* channels =
((rdp_guac_client_data*) client->data)->rdp_inst->context->channels;
2012-04-30 06:09:00 +00:00
RDP_CB_FORMAT_LIST_EVENT* format_list =
(RDP_CB_FORMAT_LIST_EVENT*) freerdp_event_new(
CliprdrChannel_Class,
CliprdrChannel_FormatList,
2012-03-30 18:26:52 +00:00
NULL, NULL);
2012-04-30 06:09:00 +00:00
/* Received notification of clipboard support. */
2012-03-30 18:26:52 +00:00
2012-04-30 06:09:00 +00:00
/* Respond with supported format list */
2013-07-17 18:54:24 +00:00
format_list->formats = (UINT32*) malloc(sizeof(UINT32));
2012-04-30 06:09:00 +00:00
format_list->formats[0] = CB_FORMAT_TEXT;
format_list->num_formats = 1;
2013-07-18 19:57:06 +00:00
freerdp_channels_send_event(channels, (wMessage*) format_list);
2012-03-30 18:26:52 +00:00
}
2012-04-30 06:09:00 +00:00
void guac_rdp_process_cb_format_list(guac_client* client,
RDP_CB_FORMAT_LIST_EVENT* event) {
rdpChannels* channels =
((rdp_guac_client_data*) client->data)->rdp_inst->context->channels;
/* Received notification of available data */
int i;
for (i=0; i<event->num_formats; i++) {
/* If plain text available, request it */
if (event->formats[i] == CB_FORMAT_TEXT) {
/* Create new data request */
RDP_CB_DATA_REQUEST_EVENT* data_request =
(RDP_CB_DATA_REQUEST_EVENT*) freerdp_event_new(
CliprdrChannel_Class,
CliprdrChannel_DataRequest,
2012-04-30 06:09:00 +00:00
NULL, NULL);
/* We want plain text */
data_request->format = CB_FORMAT_TEXT;
/* Send request */
2013-07-18 19:57:06 +00:00
freerdp_channels_send_event(channels, (wMessage*) data_request);
2012-04-30 06:09:00 +00:00
return;
}
}
/* Otherwise, no supported data available */
guac_client_log_info(client, "Ignoring unsupported clipboard data");
2012-03-30 18:26:52 +00:00
}
2012-04-30 06:28:29 +00:00
void guac_rdp_process_cb_data_request(guac_client* client,
RDP_CB_DATA_REQUEST_EVENT* event) {
rdpChannels* channels =
((rdp_guac_client_data*) client->data)->rdp_inst->context->channels;
/* If text requested, send clipboard text contents */
if (event->format == CB_FORMAT_TEXT) {
/* Get clipboard data */
const char* clipboard =
((rdp_guac_client_data*) client->data)->clipboard;
/* Create new data response */
RDP_CB_DATA_RESPONSE_EVENT* data_response =
(RDP_CB_DATA_RESPONSE_EVENT*) freerdp_event_new(
CliprdrChannel_Class,
CliprdrChannel_DataResponse,
2012-04-30 06:28:29 +00:00
NULL, NULL);
/* Set data and length */
2012-04-30 06:33:27 +00:00
if (clipboard != NULL) {
2013-07-17 18:54:24 +00:00
data_response->data = (UINT8*) strdup(clipboard);
2012-04-30 06:33:27 +00:00
data_response->size = strlen(clipboard) + 1;
}
else {
2013-07-17 18:54:24 +00:00
data_response->data = (UINT8*) strdup("");
2012-04-30 06:33:27 +00:00
data_response->size = 1;
}
2012-04-30 06:28:29 +00:00
/* Send response */
2013-07-18 19:57:06 +00:00
freerdp_channels_send_event(channels, (wMessage*) data_response);
2012-04-30 06:28:29 +00:00
}
/* Otherwise ... failure */
else
guac_client_log_error(client,
"Server requested unsupported clipboard data type");
2012-03-30 18:26:52 +00:00
}
2012-04-30 06:09:00 +00:00
void guac_rdp_process_cb_data_response(guac_client* client,
RDP_CB_DATA_RESPONSE_EVENT* event) {
/* Received clipboard data */
2012-04-30 06:12:58 +00:00
if (event->data[event->size - 1] == '\0') {
2012-04-30 06:33:27 +00:00
/* Free existing data */
free(((rdp_guac_client_data*) client->data)->clipboard);
2012-04-30 06:12:58 +00:00
/* Store clipboard data */
((rdp_guac_client_data*) client->data)->clipboard =
strdup((char*) event->data);
/* Send clipboard data */
2012-04-30 06:09:00 +00:00
guac_protocol_send_clipboard(client->socket, (char*) event->data);
2012-04-30 06:12:58 +00:00
}
2012-04-30 06:09:00 +00:00
else
guac_client_log_error(client,
"Clipboard data missing null terminator");
2012-03-30 18:26:52 +00:00
}