]> git.sesse.net Git - rdpsrv/commitdiff
Parse and send on client updates.
authorSteinar H. Gunderson <sesse@samfundet.no>
Fri, 4 Feb 2005 16:26:29 +0000 (16:26 +0000)
committerSteinar H. Gunderson <sesse@samfundet.no>
Fri, 4 Feb 2005 16:26:29 +0000 (16:26 +0000)
proto.h
rdp.c
rdpsrv.c

diff --git a/proto.h b/proto.h
index 7170509e325e375de4bc3a4f2858bb1695125b02..ac1baacf88a73bdd608e17ece2bd36e9d4f62225 100644 (file)
--- 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 cd2f7c9d9b8e9a313798ebe3f23d05b12a23c711..db74a32c40336fbdd6e8cbe9e9f6f9f27db37931 100644 (file)
--- 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);
index a6064be6cf628188eae2bf608c7298aa1ae23f27..edb6299206847ffbefa32a5624b2e239188eb398 100644 (file)
--- 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]);