break;
case RDP_EVENT_TYPE_CB_DATA_REQUEST:
- guac_rdp_process_cb_data_request(client, event);
+ guac_rdp_process_cb_data_request(client,
+ (RDP_CB_DATA_REQUEST_EVENT*) event);
break;
case RDP_EVENT_TYPE_CB_DATA_RESPONSE:
}
-void guac_rdp_process_cb_data_request(guac_client* client, RDP_EVENT* event) {
- /* STUB */
- guac_client_log_info(client, "data_request");
+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(
+ RDP_EVENT_CLASS_CLIPRDR,
+ RDP_EVENT_TYPE_CB_DATA_RESPONSE,
+ NULL, NULL);
+
+ /* Set data and length */
+ if (clipboard != NULL) {
+ data_response->data = (uint8*) strdup(clipboard);
+ data_response->size = strlen(clipboard) + 1;
+ }
+ else {
+ data_response->data = (uint8*) strdup("");
+ data_response->size = 1;
+ }
+
+ /* Send response */
+ freerdp_channels_send_event(channels, (RDP_EVENT*) data_response);
+
+ }
+
+ /* Otherwise ... failure */
+ else
+ guac_client_log_error(client,
+ "Server requested unsupported clipboard data type");
+
}
void guac_rdp_process_cb_data_response(guac_client* client,
RDP_CB_DATA_RESPONSE_EVENT* event) {
/* Received clipboard data */
- if (event->data[event->size - 1] == '\0')
+ if (event->data[event->size - 1] == '\0') {
+
+ /* Free existing data */
+ free(((rdp_guac_client_data*) client->data)->clipboard);
+
+ /* Store clipboard data */
+ ((rdp_guac_client_data*) client->data)->clipboard =
+ strdup((char*) event->data);
+
+ /* Send clipboard data */
guac_protocol_send_clipboard(client->socket, (char*) event->data);
+
+ }
else
guac_client_log_error(client,
"Clipboard data missing null terminator");