From 38804e804acfd31c44aae9877dd7fa1183e732d7 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Fri, 4 Feb 2005 16:26:29 +0000 Subject: [PATCH] Parse and send on client updates. --- proto.h | 2 +- rdp.c | 30 ++++++++---------------------- rdpsrv.c | 49 ++++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 53 insertions(+), 28 deletions(-) diff --git a/proto.h b/proto.h index 7170509..ac1baac 100644 --- a/proto.h +++ b/proto.h @@ -75,7 +75,7 @@ BOOL rdp_main_loop(void); BOOL rdp_connect(char *server, uint32 flags, char *domain, char *password, char *command, char *directory); void rdp_disconnect(void); -void rdp_send_bitmap_update(unsigned x, unsigned y); +void rdp_send_bitmap_update(unsigned x, unsigned y, unsigned width, unsigned height, unsigned char *data); /* rdpdr.c */ void rdpdr_send_connect(void); void rdpdr_send_name(void); diff --git a/rdp.c b/rdp.c index cd2f7c9..db74a32 100644 --- a/rdp.c +++ b/rdp.c @@ -148,38 +148,24 @@ rdp_in_unistr(STREAM s, char *string, int len) s->p += len; } -void rdp_send_bitmap_update(unsigned x, unsigned y) +void rdp_send_bitmap_update(unsigned x, unsigned y, unsigned width, unsigned height, unsigned char *data) { STREAM s; - s = rdp_init_data(11*2 + 2*2*3); + s = rdp_init_data(11*2 + width*height*3); out_uint16_le(s, RDP_UPDATE_BITMAP); out_uint16_le(s, 1); // one update out_uint16_le(s, x); // left, top, right, bottom out_uint16_le(s, y); - out_uint16_le(s, x+2); - out_uint16_le(s, y+2); - out_uint16_le(s, 2); // width, height - out_uint16_le(s, 2); + out_uint16_le(s, x+width); + out_uint16_le(s, y+height); + out_uint16_le(s, width); // width, height + out_uint16_le(s, height); out_uint16_le(s, 24); // bpp out_uint16_le(s, 0); // no compression - out_uint16_le(s, 2*2*3); // bufsize + out_uint16_le(s, width*height*3); // bufsize - out_uint8(s, 255); - out_uint8(s, 0); - out_uint8(s, 0); - - out_uint8(s, 0); - out_uint8(s, 255); - out_uint8(s, 0); - - out_uint8(s, 0); - out_uint8(s, 0); - out_uint8(s, 255); - - out_uint8(s, 255); - out_uint8(s, 255); - out_uint8(s, 255); + out_uint8p(s, data, width*height*3); s_mark_end(s); rdp_send_data(s, RDP_DATA_PDU_UPDATE); diff --git a/rdpsrv.c b/rdpsrv.c index a6064be..edb6299 100644 --- a/rdpsrv.c +++ b/rdpsrv.c @@ -91,9 +91,6 @@ void handle_input_pdu(STREAM s) printf("- Device flags: %x\n", device_flags); printf("- Position: (%u,%u)\n", param1, param2); - // debug - rdp_send_bitmap_update(param1, param2); - break; default: printf("- Unknown type %x\n", message_type); @@ -174,6 +171,48 @@ int vnc_init() return vnc_sock; } +struct vnc_rectangle { + unsigned short x, y, width, height; + unsigned int encoding; +}; + +void handle_vnc_fbupdate(int vnc_sock) +{ + struct vnc_rectangle rect; + unsigned char *data, *ptr; + unsigned short num_rect; + int ret, data_left, i; + + if (read(vnc_sock, &num_rect, 2) != 2) + error("short read on num_rect\n"); + + for (i = 0; i < ntohs(num_rect); ++i) { + if (read(vnc_sock, &rect, sizeof(struct vnc_rectangle)) != sizeof(struct vnc_rectangle)) + error("short read on vnc_rectangle\n"); + + printf("UPDATE: %ux%u at (%u,%u)\n", ntohs(rect.width), ntohs(rect.height), + ntohs(rect.x), ntohs(rect.y)); + + if (ntohl(rect.encoding) != 0) + error("unsupported encoding\n"); + + ptr = data = xmalloc(ntohs(rect.width) * ntohs(rect.height) * 3); + data_left = ntohs(rect.width) * ntohs(rect.height) * 3; + + while (data_left > 0) { + ret = read(vnc_sock, ptr, data_left); + if (ret <= 0) + error("error on data read\n"); + + ptr += ret; + data_left -= ret; + } + + rdp_send_bitmap_update(ntohs(rect.x), ntohs(rect.y), ntohs(rect.width), ntohs(rect.height), data); + xfree(data); + } +} + int serve_client() { int vnc_sock = vnc_init(); @@ -222,11 +261,11 @@ int serve_client() printf("Activity on VNC socket!\n"); - read(vnc_sock, buf, 1); + read(vnc_sock, buf, 2); switch (buf[0]) { case 0: // frame buffer update! - printf("Frame buffer update\n"); + handle_vnc_fbupdate(vnc_sock); break; default: printf("Unknown server message %x\n", buf[0]); -- 2.39.5