GUAC-614: Migrate RDP to simpler stream API. Add missing linkage to RDP build. Fix last character truncation bug.
This commit is contained in:
parent
83093f1bd3
commit
0096cf677c
@ -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@
|
||||
|
||||
|
@ -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 <errno.h>
|
||||
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user