summaryrefslogtreecommitdiffstats
path: root/vnc/vnc.c
diff options
context:
space:
mode:
authorjsorg71 <jsorg71>2005-02-08 03:45:30 +0000
committerjsorg71 <jsorg71>2005-02-08 03:45:30 +0000
commitcf6e2abd416c26105396fa0dd1834e3879fa2e08 (patch)
tree920d5099051e3b3b036ffa097d554fb3af5bd504 /vnc/vnc.c
parentd2da72f5c96f537a1b8bed9af0f5b648c06e530a (diff)
downloadxrdp-proprietary-cf6e2abd416c26105396fa0dd1834e3879fa2e08.tar.gz
xrdp-proprietary-cf6e2abd416c26105396fa0dd1834e3879fa2e08.zip
added a bunch of error checks
Diffstat (limited to 'vnc/vnc.c')
-rw-r--r--vnc/vnc.c715
1 files changed, 346 insertions, 369 deletions
diff --git a/vnc/vnc.c b/vnc/vnc.c
index 63eda712..63dbfdb8 100644
--- a/vnc/vnc.c
+++ b/vnc/vnc.c
@@ -23,11 +23,93 @@
#include "vnc.h"
/******************************************************************************/
+/* returns error */
+int lib_recv(struct vnc* v, char* data, int len)
+{
+ int rcvd;
+
+ if (v->sck_closed)
+ {
+ return 1;
+ }
+ while (len > 0)
+ {
+ rcvd = g_tcp_recv(v->sck, data, len, 0);
+ if (rcvd == -1)
+ {
+ if (g_tcp_last_error_would_block(v->sck))
+ {
+ g_sleep(1);
+ }
+ else
+ {
+ return 1;
+ }
+ }
+ else if (rcvd == 0)
+ {
+ v->sck_closed = 1;
+ return 1;
+ }
+ else
+ {
+ data += rcvd;
+ len -= rcvd;
+ }
+ }
+ return 0;
+}
+
+/*****************************************************************************/
+/* returns error */
+int lib_send(struct vnc* v, char* data, int len)
+{
+ int sent;
+
+ if (v->sck_closed)
+ {
+ return 1;
+ }
+ while (len > 0)
+ {
+ sent = g_tcp_send(v->sck, data, len, 0);
+ if (sent == -1)
+ {
+ if (g_tcp_last_error_would_block(v->sck))
+ {
+ g_sleep(1);
+ }
+ else
+ {
+ return 1;
+ }
+ }
+ else if (sent == 0)
+ {
+ v->sck_closed = 1;
+ return 1;
+ }
+ else
+ {
+ data += sent;
+ len -= sent;
+ }
+ }
+ return 0;
+}
+
+/******************************************************************************/
int lib_mod_event(struct vnc* v, int msg, int param1, int param2)
{
struct stream* s;
int key;
+ int error;
+ int x;
+ int y;
+ int cx;
+ int cy;
+ error = 0;
make_stream(s);
if (msg >= 15 && msg <= 16) /* key events */
{
@@ -81,13 +163,7 @@ int lib_mod_event(struct vnc* v, int msg, int param1, int param2)
out_uint8(s, msg == 15); /* down flag */
out_uint8s(s, 2);
out_uint32_be(s, key);
- if (g_tcp_force_send(v->sck, s->data, 8) != 0)
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- return 1;
- }
+ error = lib_send(v, s->data, 8);
}
}
else if (msg >= 100 && msg <= 110) /* mouse events */
@@ -111,16 +187,26 @@ int lib_mod_event(struct vnc* v, int msg, int param1, int param2)
out_uint8(s, v->mod_mouse_state);
out_uint16_be(s, param1);
out_uint16_be(s, param2);
- if (g_tcp_force_send(v->sck, s->data, 6) != 0)
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- return 1;
- }
+ error = lib_send(v, s->data, 6);
+ }
+ else if (msg == 200) /* invalidate */
+ {
+ /* FrambufferUpdateRequest */
+ init_stream(s, 8192);
+ out_uint8(s, 3);
+ out_uint8(s, 0);
+ x = (param1 >> 16) & 0xffff;
+ out_uint16_be(s, x);
+ y = param1 & 0xffff;
+ out_uint16_be(s, y);
+ cx = (param2 >> 16) & 0xffff;
+ out_uint16_be(s, cx);
+ cy = param2 & 0xffff;
+ out_uint16_be(s, cy);
+ error = lib_send(v, s->data, 10);
}
free_stream(s);
- return 0;
+ return error;
}
//******************************************************************************
@@ -130,13 +216,21 @@ int get_pixel_safe(char* data, int x, int y, int width, int height, int bpp)
int shift;
if (x < 0)
+ {
return 0;
+ }
if (y < 0)
+ {
return 0;
+ }
if (x >= width)
+ {
return 0;
+ }
if (y >= height)
+ {
return 0;
+ }
if (bpp == 1)
{
width = (width + 7) / 8;
@@ -150,9 +244,13 @@ int get_pixel_safe(char* data, int x, int y, int width, int height, int bpp)
start = y * width + x / 2;
shift = x % 2;
if (shift == 0)
+ {
return (data[start] & 0xf0) >> 4;
+ }
else
+ {
return data[start] & 0x0f;
+ }
}
else if (bpp == 8)
{
@@ -173,22 +271,34 @@ void set_pixel_safe(char* data, int x, int y, int width, int height, int bpp,
int shift;
if (x < 0)
+ {
return;
+ }
if (y < 0)
+ {
return;
+ }
if (x >= width)
+ {
return;
+ }
if (y >= height)
+ {
return;
+ }
if (bpp == 1)
{
width = (width + 7) / 8;
start = (y * width) + x / 8;
shift = x % 8;
if (pixel & 1)
+ {
data[start] = data[start] | (0x80 >> shift);
+ }
else
+ {
data[start] = data[start] & ~(0x80 >> shift);
+ }
}
else if (bpp == 15 || bpp == 16)
{
@@ -259,134 +369,117 @@ int lib_framebuffer_update(struct vnc* v)
int b;
int data_size;
int need_size;
+ int error;
struct stream* s;
data_size = 0;
data = 0;
+ num_recs = 0;
Bpp = (v->mod_bpp + 7) / 8;
make_stream(s);
init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, 3) != 0)
+ error = lib_recv(v, s->data, 3);
+ if (error == 0)
{
- free_stream(s);
- return 1;
+ in_uint8s(s, 1);
+ in_uint16_be(s, num_recs);
+ error = v->server_begin_update(v);
}
- in_uint8s(s, 1);
- in_uint16_be(s, num_recs);
-
- v->server_begin_update(v);
for (i = 0; i < num_recs; i++)
{
- init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, 12) != 0)
+ if (error != 0)
{
- free_stream(s);
- return 1;
+ break;
}
- in_uint16_be(s, x);
- in_uint16_be(s, y);
- in_uint16_be(s, cx);
- in_uint16_be(s, cy);
- in_uint32_be(s, encoding);
- if (encoding == 0) /* raw */
- {
- need_size = cx * cy * Bpp;
- if (need_size > data_size)
- {
- g_free(data);
- data = (char*)g_malloc(need_size, 0);
- data_size = need_size;
- }
- if (g_tcp_force_recv(v->sck, data, cx * cy * Bpp) != 0)
- {
- g_free(data);
- free_stream(s);
- return 1;
- }
- if (v->server_paint_rect(v, x, y, cx, cy, data) != 0)
- {
- g_free(data);
- free_stream(s);
- return 1;
- }
- }
- else if (encoding == 1) /* copy rect */
- {
- init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, 4) != 0)
- {
- g_free(data);
- free_stream(s);
- return 1;
- }
- in_uint16_be(s, srcx);
- in_uint16_be(s, srcy);
- if (v->server_screen_blt(v, x, y, cx, cy, srcx, srcy) != 0)
+ init_stream(s, 8192);
+ error = lib_recv(v, s->data, 12);
+ if (error == 0)
+ {
+ in_uint16_be(s, x);
+ in_uint16_be(s, y);
+ in_uint16_be(s, cx);
+ in_uint16_be(s, cy);
+ in_uint32_be(s, encoding);
+ if (encoding == 0) /* raw */
{
- g_free(data);
- free_stream(s);
- return 1;
+ need_size = cx * cy * Bpp;
+ if (need_size > data_size)
+ {
+ g_free(data);
+ data = (char*)g_malloc(need_size, 0);
+ data_size = need_size;
+ }
+ error = lib_recv(v, data, need_size);
+ /*g_printf("%d %d\n", i, need_size);*/
+ if (error == 0)
+ {
+ error = v->server_paint_rect(v, x, y, cx, cy, data);
+ }
}
- }
- else if (encoding == 0xffffff11) /* cursor */
- {
- g_memset(cursor_data, 0, 32 * (32 * 3));
- g_memset(cursor_mask, 0, 32 * (32 / 8));
- init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data,
- cx * cy * Bpp + ((cx + 7) / 8) * cy) != 0)
+ else if (encoding == 1) /* copy rect */
{
- g_free(data);
- free_stream(s);
- return 1;
+ init_stream(s, 8192);
+ error = lib_recv(v, s->data, 4);
+ if (error == 0)
+ {
+ in_uint16_be(s, srcx);
+ in_uint16_be(s, srcy);
+ error = v->server_screen_blt(v, x, y, cx, cy, srcx, srcy);
+ }
}
- in_uint8p(s, d1, cx * cy * Bpp);
- in_uint8p(s, d2, ((cx + 7) / 8) * cy);
- for (j = 0; j < 32; j++)
+ else if (encoding == 0xffffff11) /* cursor */
{
- for (k = 0; k < 32; k++)
+ g_memset(cursor_data, 0, 32 * (32 * 3));
+ g_memset(cursor_mask, 0, 32 * (32 / 8));
+ init_stream(s, 8192);
+ error = lib_recv(v, s->data, cx * cy * Bpp + ((cx + 7) / 8) * cy);
+ if (error == 0)
{
- pixel = get_pixel_safe(d2, k, 31 - j, cx, cy, 1);
- set_pixel_safe(cursor_mask, k, j, 32, 32, 1, !pixel);
- if (pixel)
+ in_uint8p(s, d1, cx * cy * Bpp);
+ in_uint8p(s, d2, ((cx + 7) / 8) * cy);
+ for (j = 0; j < 32; j++)
{
- pixel = get_pixel_safe(d1, k, 31 - j, cx, cy, v->mod_bpp);
- split_color(pixel, &r, &g, &b, v->mod_bpp, v->palette);
- pixel = make_color(r, g, b, 24);
- set_pixel_safe(cursor_data, k, j, 32, 32, 24, pixel);
+ for (k = 0; k < 32; k++)
+ {
+ pixel = get_pixel_safe(d2, k, 31 - j, cx, cy, 1);
+ set_pixel_safe(cursor_mask, k, j, 32, 32, 1, !pixel);
+ if (pixel)
+ {
+ pixel = get_pixel_safe(d1, k, 31 - j, cx, cy, v->mod_bpp);
+ split_color(pixel, &r, &g, &b, v->mod_bpp, v->palette);
+ pixel = make_color(r, g, b, 24);
+ set_pixel_safe(cursor_data, k, j, 32, 32, 24, pixel);
+ }
+ }
}
+ error = v->server_set_cursor(v, x, y, cursor_data, cursor_mask);
}
}
- if (v->server_set_cursor(v, x, y, cursor_data, cursor_mask) != 0)
+ else
{
- g_free(data);
- free_stream(s);
- return 1;
+ g_printf("error in lib_framebuffer_update\n\r");
}
}
- else
- {
- g_printf("error in lib_framebuffer_update\n\r");
- }
}
- v->server_end_update(v);
+ if (error == 0)
+ {
+ error = v->server_end_update(v);
+ }
g_free(data);
-
- /* FrambufferUpdateRequest */
- init_stream(s, 8192);
- out_uint8(s, 3);
- out_uint8(s, 1);
- out_uint16_be(s, 0);
- out_uint16_be(s, 0);
- out_uint16_be(s, v->mod_width);
- out_uint16_be(s, v->mod_height);
- if (g_tcp_force_send(v->sck, s->data, 10) != 0)
- {
- free_stream(s);
- return 1;
+ if (error == 0)
+ {
+ /* FrambufferUpdateRequest */
+ init_stream(s, 8192);
+ out_uint8(s, 3);
+ out_uint8(s, 1);
+ out_uint16_be(s, 0);
+ out_uint16_be(s, 0);
+ out_uint16_be(s, v->mod_width);
+ out_uint16_be(s, v->mod_height);
+ error = lib_send(v, s->data, 10);
}
free_stream(s);
- return 0;
+ return error;
}
/******************************************************************************/
@@ -394,24 +487,20 @@ int lib_clip_data(struct vnc* v)
{
struct stream* s;
int size;
+ int error;
make_stream(s);
init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, 7) != 0)
- {
- free_stream(s);
- return 1;
- }
- in_uint8s(s, 3);
- in_uint32_be(s, size);
- init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, size) != 0)
+ error = lib_recv(v, s->data, 7);
+ if (error == 0)
{
- free_stream(s);
- return 1;
+ in_uint8s(s, 3);
+ in_uint32_be(s, size);
+ init_stream(s, 8192);
+ error = lib_recv(v, s->data, size);
}
free_stream(s);
- return 0;
+ return error;
}
/******************************************************************************/
@@ -424,83 +513,72 @@ int lib_palette_update(struct vnc* v)
int r;
int g;
int b;
+ int error;
make_stream(s);
init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, 5) != 0)
+ error = lib_recv(v, s->data, 5);
+ if (error == 0)
{
- free_stream(s);
- return 1;
+ in_uint8s(s, 1);
+ in_uint16_be(s, first_color);
+ in_uint16_be(s, num_colors);
+ init_stream(s, 8192);
+ error = lib_recv(v, s->data, num_colors * 6);
}
- in_uint8s(s, 1);
- in_uint16_be(s, first_color);
- in_uint16_be(s, num_colors);
- init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, num_colors * 6) != 0)
+ if (error == 0)
{
- free_stream(s);
- return 1;
+ for (i = 0; i < num_colors; i++)
+ {
+ in_uint16_be(s, r);
+ in_uint16_be(s, g);
+ in_uint16_be(s, b);
+ r = r >> 8;
+ g = g >> 8;
+ b = b >> 8;
+ v->palette[first_color + i] = (r << 16) | (g << 8) | b;
+ }
+ error = v->server_begin_update(v);
+ }
+ if (error == 0)
+ {
+ error = v->server_palette(v, v->palette);
}
- for (i = 0; i < num_colors; i++)
+ if (error == 0)
{
- in_uint16_be(s, r);
- in_uint16_be(s, g);
- in_uint16_be(s, b);
- r = r >> 8;
- g = g >> 8;
- b = b >> 8;
- v->palette[first_color + i] = (r << 16) | (g << 8) | b;
+ error = v->server_end_update(v);
}
- v->server_begin_update(v);
- v->server_palette(v, v->palette);
- v->server_end_update(v);
free_stream(s);
- return 0;
+ return error;
}
/******************************************************************************/
int lib_mod_signal(struct vnc* v)
{
char type;
+ int error;
- if (g_tcp_force_recv(v->sck, &type, 1) != 0)
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- return 1;
- }
- if (type == 0) /* framebuffer update */
+ error = lib_recv(v, &type, 1);
+ if (error == 0)
{
- if (lib_framebuffer_update(v) != 0)
+ if (type == 0) /* framebuffer update */
{
- g_tcp_close(v->sck);
- v->sck = 0;
- return 1;
+ error = lib_framebuffer_update(v);
}
- }
- else if (type == 1) /* palette */
- {
- if (lib_palette_update(v) != 0)
+ else if (type == 1) /* palette */
{
- g_tcp_close(v->sck);
- v->sck = 0;
- return 1;
+ error = lib_palette_update(v);
}
- }
- else if (type == 3) /* clipboard */
- {
- if (lib_clip_data(v) != 0)
+ else if (type == 3) /* clipboard */
{
- g_tcp_close(v->sck);
- v->sck = 0;
- return 1;
+ error = lib_clip_data(v);
+ }
+ else
+ {
+ g_printf("unknown in lib_mod_signal %d\n\r", type);
}
}
- else
- {
- g_printf("unknown in lib_mod_signal %d\n\r", type);
- }
- return 0;
+ return error;
}
/******************************************************************************/
@@ -536,7 +614,6 @@ int lib_mod_connect(struct vnc* v)
int error;
int i;
int check_sec_result;
- int sck;
int version;
int size;
int code;
@@ -554,8 +631,9 @@ int lib_mod_connect(struct vnc* v)
i = 0;
error = 0;
init_stream(s, 8192);
- sck = g_tcp_socket();
- if (g_tcp_connect(sck, v->ip, "3350") == 0)
+ v->sck = g_tcp_socket();
+ v->sck_closed = 0;
+ if (g_tcp_connect(v->sck, v->ip, "3350") == 0)
{
s_push_layer(s, channel_hdr, 8);
out_uint16_be(s, 0); // code
@@ -572,49 +650,37 @@ int lib_mod_connect(struct vnc* v)
s_pop_layer(s, channel_hdr);
out_uint32_be(s, 0); // version
out_uint32_be(s, s->end - s->data); // size
- if (g_tcp_force_send(sck, s->data, s->end - s->data) != 0)
+ error = lib_send(v, s->data, s->end - s->data);
+ if (error == 0)
{
- g_tcp_close(sck);
- free_stream(s);
- return 7;
+ init_stream(s, 8192);
+ error = lib_recv(v, s->data, 8);
}
- init_stream(s, 8192);
- if (g_tcp_force_recv(sck, s->data, 8) == 0)
+ if (error == 0)
{
in_uint32_be(s, version);
in_uint32_be(s, size);
init_stream(s, 8192);
- if (g_tcp_force_recv(sck, s->data, size - 8) == 0)
+ error = lib_recv(v, s->data, size - 8);
+ }
+ if (error == 0)
+ {
+ if (version == 0)
{
- if (version == 0)
+ in_uint16_be(s, code);
+ if (code == 3)
{
- in_uint16_be(s, code);
- if (code == 3)
+ in_uint16_be(s, ok);
+ in_uint16_be(s, display);
+ if (ok)
{
- in_uint16_be(s, ok);
- in_uint16_be(s, display);
- if (ok)
- {
- i = display;
- }
+ i = display;
}
}
}
- else
- {
- g_tcp_close(sck);
- free_stream(s);
- return 7;
- }
- }
- else
- {
- g_tcp_close(sck);
- free_stream(s);
- return 7;
}
}
- g_tcp_close(sck);
+ g_tcp_close(v->sck);
if (error != 0 || i == 0)
{
free_stream(s);
@@ -629,128 +695,87 @@ int lib_mod_connect(struct vnc* v)
}
make_stream(pixel_format);
v->sck = g_tcp_socket();
+ v->sck_closed = 0;
error = g_tcp_connect(v->sck, v->ip, con_port);
if (error == 0)
{
g_tcp_set_non_blocking(v->sck);
+ g_tcp_set_no_delay(v->sck);
/* protocal version */
init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, 12) != 0)
+ error = lib_recv(v, s->data, 12);
+ if (error == 0)
{
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
- if (g_tcp_force_send(v->sck, "RFB 003.003\n", 12) != 0)
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
+ error = lib_send(v, "RFB 003.003\n", 12);
}
/* sec type */
- init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, 4) != 0)
+ if (error == 0)
{
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
- in_uint32_be(s, i);
- if (i == 1) /* none */
- {
- check_sec_result = 0;
+ init_stream(s, 8192);
+ error = lib_recv(v, s->data, 4);
}
- else if (i == 2) /* dec the password and the server random */
+ if (error == 0)
{
- init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, 16) != 0)
+ in_uint32_be(s, i);
+ if (i == 1) /* none */
+ {
+ check_sec_result = 0;
+ }
+ else if (i == 2) /* dec the password and the server random */
{
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
+ init_stream(s, 8192);
+ error = lib_recv(v, s->data, 16);
+ if (error == 0)
+ {
+ rfbEncryptBytes((unsigned char*)s->data, v->password);
+ error = lib_send(v, s->data, 16);
+ }
}
- rfbEncryptBytes((unsigned char*)s->data, v->password);
- if (g_tcp_force_send(v->sck, s->data, 16) != 0)
+ else
{
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
+ error = 1;
}
}
- else
- {
- error = 1;
- }
}
if (error == 0 && check_sec_result)
{
/* sec result */
init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, 4) != 0)
+ error = lib_recv(v, s->data, 4);
+ if (error == 0)
{
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
- in_uint32_be(s, i);
- if (i != 0)
- {
- error = 2;
+ in_uint32_be(s, i);
+ if (i != 0)
+ {
+ error = 2;
+ }
}
}
if (error == 0)
{
init_stream(s, 8192);
s->data[0] = 1;
- if (g_tcp_force_send(v->sck, s->data, 1) != 0) /* share flag */
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
- if (g_tcp_force_recv(v->sck, s->data, 4) != 0) /* server init */
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
+ error = lib_send(v, s->data, 1); /* share flag */
+ }
+ if (error == 0)
+ {
+ error = lib_recv(v, s->data, 4); /* server init */
+ }
+ if (error == 0)
+ {
in_uint16_be(s, v->mod_width);
in_uint16_be(s, v->mod_height);
init_stream(pixel_format, 8192);
- if (g_tcp_force_recv(v->sck, pixel_format->data, 16) != 0)
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
+ error = lib_recv(v, pixel_format->data, 16);
+ }
+ if (error == 0)
+ {
in_uint8(pixel_format, v->mod_bpp);
init_stream(s, 8192);
- if (g_tcp_force_recv(v->sck, s->data, 4) != 0) /* name len */
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
+ error = lib_recv(v, s->data, 4); /* name len */
+ }
+ if (error == 0)
+ {
in_uint32_be(s, i);
if (i > 255 || i < 0)
{
@@ -758,18 +783,11 @@ int lib_mod_connect(struct vnc* v)
}
else
{
- if (g_tcp_force_recv(v->sck, v->mod_name, i) != 0)
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
+ error = lib_recv(v, v->mod_name, i);
v->mod_name[i] = 0;
}
- /* should be connected */
}
+ /* should be connected */
if (error == 0)
{
/* SetPixelFormat */
@@ -794,14 +812,10 @@ int lib_mod_connect(struct vnc* v)
out_uint8s(pixel_format, 3); /* pad */
}
out_uint8a(s, pixel_format->data, 16);
- if (g_tcp_force_send(v->sck, s->data, 20) != 0)
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
+ error = lib_send(v, s->data, 20);
+ }
+ if (error == 0)
+ {
/* SetEncodings */
init_stream(s, 8192);
out_uint8(s, 2);
@@ -810,14 +824,10 @@ int lib_mod_connect(struct vnc* v)
out_uint32_be(s, 0); /* raw */
out_uint32_be(s, 1); /* copy rect */
out_uint32_be(s, 0xffffff11); /* cursor */
- if (g_tcp_force_send(v->sck, s->data, 4 + 3 * 4) != 0)
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
+ error = lib_send(v, s->data, 4 + 3 * 4);
+ }
+ if (error == 0)
+ {
/* FrambufferUpdateRequest */
init_stream(s, 8192);
out_uint8(s, 3);
@@ -826,14 +836,7 @@ int lib_mod_connect(struct vnc* v)
out_uint16_be(s, 0);
out_uint16_be(s, v->mod_width);
out_uint16_be(s, v->mod_height);
- if (g_tcp_force_send(v->sck, s->data, 10) != 0)
- {
- g_tcp_close(v->sck);
- v->sck = 0;
- free_stream(s);
- free_stream(pixel_format);
- return 7;
- }
+ error = lib_send(v, s->data, 10);
}
if (error == 0)
{
@@ -843,46 +846,19 @@ int lib_mod_connect(struct vnc* v)
error = 4;
}
}
- /* set almost null cursor */
- g_memset(cursor_data, 0, 32 * (32 * 3));
- g_memset(cursor_data + (32 * (32 * 3) - 1 * 32 * 3), 0xff, 9);
- g_memset(cursor_data + (32 * (32 * 3) - 2 * 32 * 3), 0xff, 9);
- g_memset(cursor_data + (32 * (32 * 3) - 3 * 32 * 3), 0xff, 9);
- g_memset(cursor_mask, 0xff, 32 * (32 / 8));
- v->server_set_cursor(v, 0, 0, cursor_data, cursor_mask);
- free_stream(s);
- free_stream(pixel_format);
- if (error != 0)
+ if (error == 0)
{
- g_tcp_close(v->sck);
- v->sck = 0;
- }
- return error;
-}
-
-/******************************************************************************/
-int lib_mod_invalidate(struct vnc* v, int x, int y, int cx, int cy)
-{
- struct stream* s;
-
- make_stream(s);
- /* FrambufferUpdateRequest */
- init_stream(s, 8192);
- out_uint8(s, 3);
- out_uint8(s, 0);
- out_uint16_be(s, x);
- out_uint16_be(s, y);
- out_uint16_be(s, cx);
- out_uint16_be(s, cy);
- if (g_tcp_force_send(v->sck, s->data, 10) != 0)
- {
- free_stream(s);
- g_tcp_close(v->sck);
- v->sck = 0;
- return 1;
+ /* set almost null cursor */
+ g_memset(cursor_data, 0, 32 * (32 * 3));
+ g_memset(cursor_data + (32 * (32 * 3) - 1 * 32 * 3), 0xff, 9);
+ g_memset(cursor_data + (32 * (32 * 3) - 2 * 32 * 3), 0xff, 9);
+ g_memset(cursor_data + (32 * (32 * 3) - 3 * 32 * 3), 0xff, 9);
+ g_memset(cursor_mask, 0xff, 32 * (32 / 8));
+ error = v->server_set_cursor(v, 0, 0, cursor_data, cursor_mask);
}
free_stream(s);
- return 0;
+ free_stream(pixel_format);
+ return error;
}
/******************************************************************************/
@@ -924,12 +900,11 @@ int mod_init()
v = (struct vnc*)g_malloc(sizeof(struct vnc), 1);
/* set client functions */
v->size = sizeof(struct vnc);
- v->handle = (int)v;
+ v->handle = (long)v;
v->mod_connect = lib_mod_connect;
v->mod_start = lib_mod_start;
v->mod_event = lib_mod_event;
v->mod_signal = lib_mod_signal;
- v->mod_invalidate = lib_mod_invalidate;
v->mod_end = lib_mod_end;
v->mod_set_param = lib_mod_set_param;
return (int)v;
@@ -939,7 +914,9 @@ int mod_init()
int mod_exit(struct vnc* v)
{
if (v == 0)
+ {
return 0;
+ }
g_tcp_close(v->sck);
g_free(v);
return 0;