diff --git a/sesman/chansrv/chansrv.c b/sesman/chansrv/chansrv.c index 8e6c83b6..aa5cfc8e 100644 --- a/sesman/chansrv/chansrv.c +++ b/sesman/chansrv/chansrv.c @@ -553,6 +553,17 @@ get_display_num_from_display(char* display_text) return 0; } +/*****************************************************************************/ +int DEFAULT_CC +my_error_handler(Display* dis, XErrorEvent* xer) +{ + char text[256]; + + XGetErrorText(dis, xer->error_code, text, 255); + g_writeln("xrdp-chansrv: error [%s]", text); + return 0; +} + /*****************************************************************************/ /* The X server had an internal error. This is the last function called. Do any cleanup that needs to be done on exit, like removing temporary files. @@ -596,6 +607,7 @@ main(int argc, char** argv) g_writeln("xrdp-chansrv: main: XOpenDisplay failed"); return 1; } + XSetErrorHandler(my_error_handler); XSetIOErrorHandler(my_fatal_handler); g_snprintf(text, 255, "xrdp_chansrv_%8.8x_main_term", pid); g_term_event = g_create_wait_obj(text); diff --git a/sesman/chansrv/clipboard.c b/sesman/chansrv/clipboard.c index 00c13193..2a5a08ca 100644 --- a/sesman/chansrv/clipboard.c +++ b/sesman/chansrv/clipboard.c @@ -52,8 +52,10 @@ static Atom g_last_clip_type = 0; static int g_got_selection = 0; /* boolean */ static Time g_selection_time = 0; +static struct stream* g_ins = 0; + extern int g_cliprdr_chan_id; /* in chansrv.c */ -extern Display* g_display; +extern Display* g_display; /* in chansrv.c */ /*****************************************************************************/ /* returns time in miliseconds @@ -163,8 +165,10 @@ clipboard_init(void) if (rv == 0) { g_clip_up = 1; - g_writeln("xrdp-chansrv: clipboard_init: dumping env"); - g_system("env"); + make_stream(g_ins); + init_stream(g_ins, 8192) + //g_writeln("xrdp-chansrv: clipboard_init: dumping env"); + //g_system("env"); } return rv; } @@ -184,6 +188,7 @@ clipboard_deinit(void) g_x_socket = 0; g_free(g_last_clip_data); g_last_clip_data = 0; + free_stream(g_ins); g_clip_up = 0; return 0; } @@ -269,7 +274,7 @@ clipboard_out_unicode(struct stream* s, char* text, int num_chars) int lnum_chars; twchar* ltext; - if (num_chars < 1) + if ((num_chars < 1) || (text == 0)) { return 0; } @@ -301,17 +306,22 @@ clipboard_send_data_response(void) g_writeln("xrdp-chansrv: clipboard_send_data_response:"); num_chars = 0; - if (g_last_clip_type == XA_STRING) + if (g_last_clip_data != 0) { - num_chars = g_mbstowcs(0, g_last_clip_data, 1024); - if (num_chars < 0) + if (g_last_clip_type == XA_STRING) { - g_writeln("xrdp-chansrv: clipboard_send_data_response: bad string"); - num_chars = 0; + num_chars = g_mbstowcs(0, g_last_clip_data, 1024); + if (num_chars < 0) + { + g_writeln("xrdp-chansrv: clipboard_send_data_response: bad string"); + num_chars = 0; + } } } + g_writeln("xrdp-chansrv: clipboard_send_data_response: g_last_clip_size %d " + "num_chars %d", g_last_clip_size, num_chars); make_stream(s); - init_stream(s, 8192); + init_stream(s, 64 + num_chars * 2); out_uint16_le(s, 5); /* CLIPRDR_DATA_RESPONSE */ out_uint16_le(s, 1); /* status */ out_uint32_le(s, num_chars * 2 + 2); /* length */ @@ -333,7 +343,8 @@ clipboard_send_data_response(void) /*****************************************************************************/ static int APP_CC -clipboard_process_format_announce(struct stream* s) +clipboard_process_format_announce(struct stream* s, int clip_msg_status, + int clip_msg_len) { Time now; @@ -349,7 +360,8 @@ clipboard_process_format_announce(struct stream* s) /*****************************************************************************/ static int APP_CC -clipboard_prcoess_format_ack(struct stream* s) +clipboard_prcoess_format_ack(struct stream* s, int clip_msg_status, + int clip_msg_len) { g_writeln("xrdp-chansrv: clipboard_prcoess_format_ack:"); g_hexdump(s->p, s->end - s->p); @@ -358,7 +370,8 @@ clipboard_prcoess_format_ack(struct stream* s) /*****************************************************************************/ static int APP_CC -clipboard_process_data_request(struct stream* s) +clipboard_process_data_request(struct stream* s, int clip_msg_status, + int clip_msg_len) { g_writeln("xrdp-chansrv: clipboard_process_data_request:"); g_hexdump(s->p, s->end - s->p); @@ -368,7 +381,8 @@ clipboard_process_data_request(struct stream* s) /*****************************************************************************/ static int APP_CC -clipboard_process_data_response(struct stream* s) +clipboard_process_data_response(struct stream* s, int clip_msg_status, + int clip_msg_len) { g_writeln("xrdp-chansrv: clipboard_process_data_response:"); g_hexdump(s->p, s->end - s->p); @@ -384,10 +398,32 @@ clipboard_data_in(struct stream* s, int chan_id, int chan_flags, int length, int clip_msg_len; int clip_msg_status; int rv; + struct stream* ls; - in_uint16_le(s, clip_msg_id); - in_uint16_le(s, clip_msg_status); - in_uint32_le(s, clip_msg_len); + g_writeln("xrdp-chansrv: clipboard_data_in: chan_is %d " + "chan_flags %d length %d total_length %d", + chan_id, chan_flags, length, total_length); + if ((chan_flags & 3) == 3) + { + ls = s; + } + else + { + if (chan_flags & 1) + { + init_stream(g_ins, total_length) + } + in_uint8a(s, g_ins->end, length); + g_ins->end += length; + if ((chan_flags & 2) == 0) + { + return 0; + } + ls = g_ins; + } + in_uint16_le(ls, clip_msg_id); + in_uint16_le(ls, clip_msg_status); + in_uint32_le(ls, clip_msg_len); g_writeln("xrdp-chansrv: clipboard_data_in: clip_msg_id %d " "clip_msg_status %d clip_msg_len %d", clip_msg_id, clip_msg_status, clip_msg_len); @@ -395,16 +431,20 @@ clipboard_data_in(struct stream* s, int chan_id, int chan_flags, int length, switch (clip_msg_id) { case 2: /* CLIPRDR_FORMAT_ANNOUNCE */ - rv = clipboard_process_format_announce(s); + rv = clipboard_process_format_announce(ls, clip_msg_status, + clip_msg_len); break; case 3: /* CLIPRDR_FORMAT_ACK */ - rv = clipboard_prcoess_format_ack(s); + rv = clipboard_prcoess_format_ack(ls, clip_msg_status, + clip_msg_len); break; case 4: /* CLIPRDR_DATA_REQUEST */ - rv = clipboard_process_data_request(s); + rv = clipboard_process_data_request(ls, clip_msg_status, + clip_msg_len); break; case 5: /* CLIPRDR_DATA_RESPONSE */ - rv = clipboard_process_data_response(s); + rv = clipboard_process_data_response(ls, clip_msg_status, + clip_msg_len); break; default: g_writeln("xrdp-chansrv: clipboard_data_in: unknown clip_msg_id %d", @@ -725,6 +765,8 @@ clipboard_check_wait_objs(void) case SelectionClear: clipboard_process_selection_clear(&xevent); break; + case MappingNotify: + break; default: if (xevent.type == g_xfixes_event_base + XFixesSetSelectionOwnerNotify) @@ -732,7 +774,7 @@ clipboard_check_wait_objs(void) clipboard_process_selection_owner_notify(&xevent); break; } - g_writeln("xrdp-chansrv: clipboard_check_wait_objs type %d", + g_writeln("xrdp-chansrv: clipboard_check_wait_objs unknown type %d", xevent.type); break; }