summaryrefslogtreecommitdiffstats
path: root/xrdp/xrdp_wm.c
diff options
context:
space:
mode:
Diffstat (limited to 'xrdp/xrdp_wm.c')
-rw-r--r--xrdp/xrdp_wm.c161
1 files changed, 90 insertions, 71 deletions
diff --git a/xrdp/xrdp_wm.c b/xrdp/xrdp_wm.c
index 8b06159a..da5aa62e 100644
--- a/xrdp/xrdp_wm.c
+++ b/xrdp/xrdp_wm.c
@@ -35,7 +35,6 @@ struct xrdp_wm* xrdp_wm_create(struct xrdp_process* owner)
self->pro_layer = owner;
self->orders = owner->orders;
self->painter = xrdp_painter_create(self);
- self->out_s = &owner->out_s;
self->rdp_layer = owner->rdp_layer;
self->cache = xrdp_cache_create(self, self->orders);
return self;
@@ -57,21 +56,25 @@ int xrdp_wm_send_palette(struct xrdp_wm* self)
{
int i;
int color;
+ struct stream* s;
- xrdp_rdp_init_data(self->rdp_layer, 776);
- out_uint16_le(self->out_s, RDP_UPDATE_PALETTE);
- out_uint16_le(self->out_s, 0);
- out_uint16_le(self->out_s, 256); /* # of colors */
- out_uint16_le(self->out_s, 0);
+ make_stream(s);
+ init_stream(s, 8192);
+ xrdp_rdp_init_data(self->rdp_layer, s);
+ out_uint16_le(s, RDP_UPDATE_PALETTE);
+ out_uint16_le(s, 0);
+ out_uint16_le(s, 256); /* # of colors */
+ out_uint16_le(s, 0);
for (i = 0; i < 256; i++)
{
color = self->palette[i];
- out_uint8(self->out_s, color >> 16);
- out_uint8(self->out_s, color >> 8);
- out_uint8(self->out_s, color);
+ out_uint8(s, color >> 16);
+ out_uint8(s, color >> 8);
+ out_uint8(s, color);
}
- s_mark_end(self->out_s);
- xrdp_rdp_send_data(self->rdp_layer, RDP_DATA_PDU_UPDATE);
+ s_mark_end(s);
+ xrdp_rdp_send_data(self->rdp_layer, s, RDP_DATA_PDU_UPDATE);
+ free_stream(s);
return 0;
}
@@ -86,7 +89,10 @@ int xrdp_wm_send_bitmap(struct xrdp_wm* self, struct xrdp_bitmap* bitmap,
int total_lines;
int lines_sending;
char* p;
+ struct stream* s;
+ make_stream(s);
+ init_stream(s, 8192);
data_size = bitmap->width * bitmap->height * ((bitmap->bpp + 7) / 8);
line_size = bitmap->width * ((bitmap->bpp + 7) / 8);
total_lines = data_size / line_size;
@@ -97,21 +103,21 @@ int xrdp_wm_send_bitmap(struct xrdp_wm* self, struct xrdp_bitmap* bitmap,
lines_sending = total_lines;
while (i < total_lines)
{
- xrdp_rdp_init_data(self->rdp_layer, 8192);
- out_uint16_le(self->out_s, RDP_UPDATE_BITMAP);
- out_uint16_le(self->out_s, 1); /* num updates */
- out_uint16_le(self->out_s, x);
- out_uint16_le(self->out_s, y + i);
- out_uint16_le(self->out_s, (x + cx) - 1);
- out_uint16_le(self->out_s, (y + i + cy) - 1);
- out_uint16_le(self->out_s, bitmap->width);
- out_uint16_le(self->out_s, lines_sending);
- out_uint16_le(self->out_s, bitmap->bpp); /* bpp */
- out_uint16_le(self->out_s, 0); /* compress */
- out_uint16_le(self->out_s, line_size * lines_sending); /* bufsize */
- out_uint8a(self->out_s, p, line_size * lines_sending);
- s_mark_end(self->out_s);
- xrdp_rdp_send_data(self->rdp_layer, RDP_DATA_PDU_UPDATE);
+ xrdp_rdp_init_data(self->rdp_layer, s);
+ out_uint16_le(s, RDP_UPDATE_BITMAP);
+ out_uint16_le(s, 1); /* num updates */
+ out_uint16_le(s, x);
+ out_uint16_le(s, y + i);
+ out_uint16_le(s, (x + cx) - 1);
+ out_uint16_le(s, (y + i + cy) - 1);
+ out_uint16_le(s, bitmap->width);
+ out_uint16_le(s, lines_sending);
+ out_uint16_le(s, bitmap->bpp); /* bpp */
+ out_uint16_le(s, 0); /* compress */
+ out_uint16_le(s, line_size * lines_sending); /* bufsize */
+ out_uint8a(s, p, line_size * lines_sending);
+ s_mark_end(s);
+ xrdp_rdp_send_data(self->rdp_layer, s, RDP_DATA_PDU_UPDATE);
p = p + line_size * lines_sending;
i = i + lines_sending;
if (i + lines_sending > total_lines)
@@ -119,6 +125,7 @@ int xrdp_wm_send_bitmap(struct xrdp_wm* self, struct xrdp_bitmap* bitmap,
if (lines_sending <= 0)
break;
}
+ free_stream(s);
return 0;
}
@@ -262,12 +269,17 @@ int xrdp_wm_login_notify(struct xrdp_bitmap* wnd,
/*****************************************************************************/
int xrdp_set_cursor(struct xrdp_wm* self, int cache_idx)
{
- xrdp_rdp_init_data(self->rdp_layer, 8000);
- out_uint16_le(self->out_s, RDP_POINTER_CACHED);
- out_uint16_le(self->out_s, 0); /* pad */
- out_uint16_le(self->out_s, cache_idx); /* cache_idx */
- s_mark_end(self->out_s);
- xrdp_rdp_send_data(self->rdp_layer, RDP_DATA_PDU_POINTER);
+ struct stream* s;
+
+ make_stream(s);
+ init_stream(s, 8192);
+ xrdp_rdp_init_data(self->rdp_layer, s);
+ out_uint16_le(s, RDP_POINTER_CACHED);
+ out_uint16_le(s, 0); /* pad */
+ out_uint16_le(s, cache_idx); /* cache_idx */
+ s_mark_end(s);
+ xrdp_rdp_send_data(self->rdp_layer, s, RDP_DATA_PDU_POINTER);
+ free_stream(s);
return 0;
}
@@ -313,68 +325,75 @@ int xrdp_send_cursor(struct xrdp_wm* self, char* file_name, int cache_idx)
int rv;
int pixel;
int palette[16];
+ struct stream* fs;
struct stream* s;
rv = 1;
- s = (struct stream*)g_malloc(sizeof(struct stream), 1);
- init_stream(s, 8001);
+ make_stream(s);
+ init_stream(s, 8192);
+ make_stream(fs);
+ init_stream(fs, 8192);
fd = g_file_open(file_name);
- g_file_read(fd, s->data, 8000);
+ g_file_read(fd, fs->data, 8192);
g_file_close(fd);
- in_uint8s(s, 6);
- in_uint8(s, w);
- in_uint8(s, h);
- in_uint8s(s, 2);
- in_uint16_le(s, x);
- in_uint16_le(s, y);
- in_uint8s(s, 22);
- in_uint8(s, bpp);
- in_uint8s(s, 25);
+ in_uint8s(fs, 6);
+ in_uint8(fs, w);
+ in_uint8(fs, h);
+ in_uint8s(fs, 2);
+ in_uint16_le(fs, x);
+ in_uint16_le(fs, y);
+ in_uint8s(fs, 22);
+ in_uint8(fs, bpp);
+ in_uint8s(fs, 25);
if (w == 32 && h == 32)
{
- xrdp_rdp_init_data(self->rdp_layer, 8000);
- out_uint16_le(self->out_s, RDP_POINTER_COLOR);
- out_uint16_le(self->out_s, 0); /* pad */
- out_uint16_le(self->out_s, cache_idx); /* cache_idx */
- out_uint16_le(self->out_s, x);
- out_uint16_le(self->out_s, y);
- out_uint16_le(self->out_s, w);
- out_uint16_le(self->out_s, h);
- out_uint16_le(self->out_s, 128);
- out_uint16_le(self->out_s, 3072);
+ xrdp_rdp_init_data(self->rdp_layer, s);
+ out_uint16_le(s, RDP_POINTER_COLOR);
+ out_uint16_le(s, 0); /* pad */
+ out_uint16_le(s, cache_idx); /* cache_idx */
+ out_uint16_le(s, x);
+ out_uint16_le(s, y);
+ out_uint16_le(s, w);
+ out_uint16_le(s, h);
+ out_uint16_le(s, 128);
+ out_uint16_le(s, 3072);
if (bpp == 1)
{
- in_uint8a(s, palette, 8);
+ in_uint8a(fs, palette, 8);
for (i = 0; i < 32; i++)
+ {
for (j = 0; j < 32; j++)
{
- pixel = palette[xrdp_wm_get_pixel(s->p, j, i, 32, 1)];
- out_uint8(self->out_s, pixel);
- out_uint8(self->out_s, pixel >> 8);
- out_uint8(self->out_s, pixel >> 16);
+ pixel = palette[xrdp_wm_get_pixel(fs->p, j, i, 32, 1)];
+ out_uint8(s, pixel);
+ out_uint8(s, pixel >> 8);
+ out_uint8(s, pixel >> 16);
}
- in_uint8s(s, 128);
+ }
+ in_uint8s(fs, 128);
}
else if (bpp == 4)
{
- in_uint8a(s, palette, 64);
+ in_uint8a(fs, palette, 64);
for (i = 0; i < 32; i++)
+ {
for (j = 0; j < 32; j++)
{
- pixel = palette[xrdp_wm_get_pixel(s->p, j, i, 32, 4)];
- out_uint8(self->out_s, pixel);
- out_uint8(self->out_s, pixel >> 8);
- out_uint8(self->out_s, pixel >> 16);
+ pixel = palette[xrdp_wm_get_pixel(fs->p, j, i, 32, 4)];
+ out_uint8(s, pixel);
+ out_uint8(s, pixel >> 8);
+ out_uint8(s, pixel >> 16);
}
- in_uint8s(s, 512);
+ }
+ in_uint8s(fs, 512);
}
- out_uint8a(self->out_s, s->p, 128); /* mask */
- s_mark_end(self->out_s);
- xrdp_rdp_send_data(self->rdp_layer, RDP_DATA_PDU_POINTER);
+ out_uint8a(s, fs->p, 128); /* mask */
+ s_mark_end(s);
+ xrdp_rdp_send_data(self->rdp_layer, s, RDP_DATA_PDU_POINTER);
rv = 0;
}
- g_free(s->data);
- g_free(s);
+ free_stream(s);
+ free_stream(fs);
return rv;
}