From 776445013da948b102c941c2db3050293e880dc7 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Mon, 6 Sep 2010 01:04:10 -0700 Subject: [PATCH] Working VNC client! --- guacamole/proxy/daemon.c | 2 +- guacamole/proxy/proxy.c | 84 +++++++++++++++++++++++++++------------- 2 files changed, 58 insertions(+), 28 deletions(-) diff --git a/guacamole/proxy/daemon.c b/guacamole/proxy/daemon.c index 9ce67e345..48773cecd 100644 --- a/guacamole/proxy/daemon.c +++ b/guacamole/proxy/daemon.c @@ -60,7 +60,7 @@ int main(int argc, char* argv[]) { } /* Fork proxy */ - proxy_pid = 0; /*fork();*/ + proxy_pid = fork(); if (proxy_pid < 0) { perror("Could not fork child"); } diff --git a/guacamole/proxy/proxy.c b/guacamole/proxy/proxy.c index cc0c30446..a187467ca 100644 --- a/guacamole/proxy/proxy.c +++ b/guacamole/proxy/proxy.c @@ -99,18 +99,6 @@ void guac_send_png(GUACIO* io, int x, int y, png_byte** png_rows, int w, int h) png_infop png_info; png_byte* row; - /* For now, generate random test image */ - for (y=0; yformat.bitsPerPixel/8; + unsigned int bytesPerRow = bpp * client->width; + unsigned char* fb_row_current = client->frameBuffer + (y * bytesPerRow) + (x * bpp); + unsigned char* fb_row; + unsigned int v; + + /* Copy image data from VNC client to PNG */ + for (dy = y; dy> client->format.redShift) * 256 / (client->format.redMax+1); + *(row++) = (v >> client->format.greenShift) * 256 / (client->format.greenMax+1); + *(row++) = (v >> client->format.blueShift) * 256 / (client->format.blueMax+1); + + fb_row += bpp; + + } + } + + guac_send_png(io, x, y, png_rows, w, h); guac_flush(io); } @@ -205,13 +236,6 @@ void proxy(int client_fd) { /*** INIT ***/ - /* Allocate rows for PNG */ - png_rows = (png_byte**) malloc(100 /* height */ * sizeof(png_byte*)); - for (y=0; y<100 /* height */; y++) { - row = (png_byte*) malloc(sizeof(png_byte) * 3 * 100 /* width */); - png_rows[y] = row; - } - rfb_client = rfbGetClient(8, 3, 4); /* 32-bpp client */ /* Framebuffer update handler */ @@ -230,6 +254,13 @@ void proxy(int client_fd) { fprintf(stderr, "SUCCESS.\n"); } + /* Allocate rows for PNG */ + png_rows = (png_byte**) malloc(rfb_client->height * sizeof(png_byte*)); + for (y=0; ywidth; y++) { + row = (png_byte*) malloc(sizeof(png_byte) * 3 * rfb_client->width); + png_rows[y] = row; + } + /* Store Guac data in client */ rfbClientSetClientData(rfb_client, __GUAC_VNC_TAG_IO, io); rfbClientSetClientData(rfb_client, __GUAC_VNC_TAG_PNG_ROWS, png_rows); @@ -262,17 +293,16 @@ void proxy(int client_fd) { } } - /* Clean up */ + /* Free PNG data */ + for (y = 0; yheight; y++) + free(png_rows[y]); + free(png_rows); + + /* Clean up VNC client*/ rfbClientCleanup(rfb_client); guac_write_string(io, "error:Test finished.;"); - - /* Free PNG data */ - for (y = 0; y<100 /* height */; y++) - free(png_rows[y]); - free(png_rows); - guac_close(io); }