From f0c7bdb304846829259edaab25454f81ab5a4c36 Mon Sep 17 00:00:00 2001 From: jsorg71 Date: Fri, 21 Jan 2005 03:55:16 +0000 Subject: [PATCH] added pointer cache, some debug messages and some other fixes --- common/os_calls.c | 34 +++++ xrdp/funcs.c | 8 + xrdp/libxrdp.h | 2 +- xrdp/xrdp.h | 10 +- xrdp/xrdp_bitmap.c | 41 +++--- xrdp/xrdp_cache.c | 61 ++++++++ xrdp/xrdp_interface.c | 10 +- xrdp/xrdp_iso.c | 2 + xrdp/xrdp_login_wnd.c | 30 ++-- xrdp/xrdp_mcs.c | 4 + xrdp/xrdp_painter.c | 9 ++ xrdp/xrdp_process.c | 335 +++++++++++++++++++++--------------------- xrdp/xrdp_rdp.c | 35 ++++- xrdp/xrdp_sec.c | 1 + xrdp/xrdp_tcp.c | 8 +- xrdp/xrdp_types.h | 31 +++- xrdp/xrdp_wm.c | 68 +++++---- 17 files changed, 440 insertions(+), 249 deletions(-) diff --git a/common/os_calls.c b/common/os_calls.c index e6422b83..9b3a9e31 100644 --- a/common/os_calls.c +++ b/common/os_calls.c @@ -751,7 +751,9 @@ int g_file_lock(int fd, int start, int len) lock.l_start = start; lock.l_len = len; if (fcntl(fd, F_SETLK, &lock) == -1) + { return 0; + } return 1; #endif } @@ -759,12 +761,25 @@ int g_file_lock(int fd, int start, int len) /*****************************************************************************/ int g_strlen(char* text) { + if (text == 0) + { + return 0; + } return strlen(text); } /*****************************************************************************/ char* g_strcpy(char* dest, char* src) { + if (src == 0 && dest != 0) + { + dest[0] = 0; + return dest; + } + if (dest == 0 || src == 0) + { + return 0; + } return strcpy(dest, src); } @@ -773,6 +788,15 @@ char* g_strncpy(char* dest, char* src, int len) { char* rv; + if (src == 0 && dest != 0) + { + dest[0] = 0; + return dest; + } + if (dest == 0 || src == 0) + { + return 0; + } rv = strncpy(dest, src, len); dest[len] = 0; return rv; @@ -781,6 +805,10 @@ char* g_strncpy(char* dest, char* src, int len) /*****************************************************************************/ char* g_strcat(char* dest, char* src) { + if (dest == 0 || src == 0) + { + return 0; + } return strcat(dest, src); } @@ -791,7 +819,9 @@ char* g_strdup(char* in) char* p; if (in == 0) + { return 0; + } len = g_strlen(in); p = (char*)g_malloc(len + 1, 0); g_strcpy(p, in); @@ -814,7 +844,9 @@ int g_load_library(char* in) int g_free_library(int lib) { if (lib == 0) + { return 0; + } return dlclose((void*)lib); } @@ -823,7 +855,9 @@ int g_free_library(int lib) void* g_get_proc_address(int lib, char* name) { if (lib == 0) + { return 0; + } return dlsym((void*)lib, name); } diff --git a/xrdp/funcs.c b/xrdp/funcs.c index 35c95445..4c3ac42b 100644 --- a/xrdp/funcs.c +++ b/xrdp/funcs.c @@ -285,7 +285,9 @@ int add_char_at(char* text, char ch, int index) return 0; } for (i = len - 1; i >= index; i--) + { text[i + 1] = text[i]; + } text[i + 1] = ch; text[len + 1] = 0; return 0; @@ -301,14 +303,18 @@ int remove_char_at(char* text, int index) len = g_strlen(text); if (len <= 0) + { return 0; + } if (index >= len - 1 || index < 0) { text[len - 1] = 0; return 0; } for (i = index; i < len - 1; i++) + { text[i] = text[i + 1]; + } text[len - 1] = 0; return 0; } @@ -317,7 +323,9 @@ int remove_char_at(char* text, int index) int set_string(char** in_str, char* in) { if (in_str == 0) + { return 0; + } g_free(*in_str); *in_str = g_strdup(in); return 0; diff --git a/xrdp/libxrdp.h b/xrdp/libxrdp.h index 0d86dab5..28b68828 100644 --- a/xrdp/libxrdp.h +++ b/xrdp/libxrdp.h @@ -14,6 +14,6 @@ int server_end_update(void); int server_fill_rect(int x, int y, int cx, int cy, int color); int server_screen_blt(int x, int y, int cx, int cy, int srcx, int srcy); int server_paint_rect(int x, int y, int cx, int cy, char* data); -int server_set_cursor(int x, int y, char* data, char* mask); +int server_set_pointer(int x, int y, char* data, char* mask); int server_palette(int* palette); diff --git a/xrdp/xrdp.h b/xrdp/xrdp.h index e13cdb7e..c484e01f 100644 --- a/xrdp/xrdp.h +++ b/xrdp/xrdp.h @@ -136,6 +136,8 @@ int xrdp_cache_add_bitmap(struct xrdp_cache* self, struct xrdp_bitmap* bitmap); int xrdp_cache_add_palette(struct xrdp_cache* self, int* palette); int xrdp_cache_add_char(struct xrdp_cache* self, struct xrdp_font_item* font_item); +int xrdp_cache_add_pointer(struct xrdp_cache* self, + struct xrdp_pointer_item* pointer_item); /* xrdp_wm.c */ struct xrdp_wm* xrdp_wm_create(struct xrdp_process* owner, @@ -145,6 +147,7 @@ int xrdp_wm_send_palette(struct xrdp_wm* self); int xrdp_wm_init(struct xrdp_wm* self); int xrdp_wm_send_bitmap(struct xrdp_wm* self, struct xrdp_bitmap* bitmap, int x, int y, int cx, int cy); +int xrdp_wm_set_pointer(struct xrdp_wm* self, int cache_idx); int xrdp_wm_set_focused(struct xrdp_wm* self, struct xrdp_bitmap* wnd); int xrdp_wm_get_vis_region(struct xrdp_wm* self, struct xrdp_bitmap* bitmap, int x, int y, int cx, int cy, @@ -154,8 +157,9 @@ int xrdp_wm_mouse_click(struct xrdp_wm* self, int x, int y, int but, int down); int xrdp_wm_key(struct xrdp_wm* self, int device_flags, int scan_code); int xrdp_wm_key_sync(struct xrdp_wm* self, int device_flags, int key_flags); int xrdp_wm_pu(struct xrdp_wm* self, struct xrdp_bitmap* control); -int xrdp_wm_send_cursor(struct xrdp_wm* self, int cache_idx, +int xrdp_wm_send_pointer(struct xrdp_wm* self, int cache_idx, char* data, char* mask, int x, int y); +int xrdp_wm_pointer(struct xrdp_wm* self, char* data, char* mask, int x, int y); /* xrdp_process.c */ struct xrdp_process* xrdp_process_create(struct xrdp_listen* owner); @@ -285,8 +289,8 @@ int server_screen_blt(struct xrdp_mod* mod, int x, int y, int cx, int cy, int srcx, int srcy); int server_paint_rect(struct xrdp_mod* mod, int x, int y, int cx, int cy, char* data); -int server_set_cursor(struct xrdp_mod* mod, int x, int y, - char* data, char* mask); +int server_set_pointer(struct xrdp_mod* mod, int x, int y, + char* data, char* mask); int server_palette(struct xrdp_mod* mod, int* palette); int server_error_popup(struct xrdp_mod* mod, char* error, char* caption); #endif diff --git a/xrdp/xrdp_bitmap.c b/xrdp/xrdp_bitmap.c index 3554f9a0..de0c0d57 100644 --- a/xrdp/xrdp_bitmap.c +++ b/xrdp/xrdp_bitmap.c @@ -99,7 +99,7 @@ struct xrdp_bitmap* xrdp_bitmap_create(int width, int height, int bpp, } if (self->type == WND_TYPE_SCREEN || self->type == WND_TYPE_BITMAP) { - self->data = (char*)g_malloc(width * height * Bpp, 1); + self->data = (char*)g_malloc(width * height * Bpp, 0); } if (self->type != WND_TYPE_BITMAP) { @@ -196,6 +196,7 @@ void xrdp_bitmap_delete(struct xrdp_bitmap* self) { g_free(self->data); } + g_free(self->caption1); g_free(self); } @@ -249,7 +250,7 @@ int xrdp_bitmap_set_focus(struct xrdp_bitmap* self, int focused) xrdp_painter_fill_rect(painter, self, 3, 3, self->width - 5, 18); painter->font->color = self->wm->black; } - xrdp_painter_draw_text(painter, self, 4, 4, self->caption); + xrdp_painter_draw_text(painter, self, 4, 4, self->caption1); xrdp_painter_end_update(painter); xrdp_painter_delete(painter); return 0; @@ -884,7 +885,7 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect) xrdp_painter_fill_rect(painter, self, 3, 3, self->width - 5, 18); painter->font->color = self->wm->black; } - xrdp_painter_draw_text(painter, self, 4, 4, self->caption); + xrdp_painter_draw_text(painter, self, 4, 4, self->caption1); } else if (self->type == WND_TYPE_SCREEN) /* 2 */ { @@ -913,11 +914,11 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect) { xrdp_bitmap_draw_button(self, painter, 0, 0, self->width, self->height, 0); - w = xrdp_painter_text_width(painter, self->caption); - h = xrdp_painter_text_height(painter, self->caption); + w = xrdp_painter_text_width(painter, self->caption1); + h = xrdp_painter_text_height(painter, self->caption1); painter->font->color = self->wm->black; xrdp_painter_draw_text(painter, self, self->width / 2 - w / 2, - self->height / 2 - h / 2, self->caption); + self->height / 2 - h / 2, self->caption1); if (self->parent != 0) if (self->wm->focused_window == self->parent) if (self->parent->focused_control == self) @@ -928,11 +929,11 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect) { xrdp_bitmap_draw_button(self, painter, 0, 0, self->width, self->height, 1); - w = xrdp_painter_text_width(painter, self->caption); - h = xrdp_painter_text_height(painter, self->caption); + w = xrdp_painter_text_width(painter, self->caption1); + h = xrdp_painter_text_height(painter, self->caption1); painter->font->color = self->wm->black; xrdp_painter_draw_text(painter, self, (self->width / 2 - w / 2) + 1, - (self->height / 2 - h / 2) + 1, self->caption); + (self->height / 2 - h / 2) + 1, self->caption1); if (self->parent != 0) if (self->wm->focused_window == self->parent) if (self->parent->focused_control == self) @@ -976,13 +977,13 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect) painter->fg_color = self->wm->black; if (self->password_char != 0) { - i = g_strlen(self->caption); + i = g_strlen(self->caption1); g_memset(text, self->password_char, i); text[i] = 0; xrdp_painter_draw_text(painter, self, 4, 2, text); } else - xrdp_painter_draw_text(painter, self, 4, 2, self->caption); + xrdp_painter_draw_text(painter, self, 4, 2, self->caption1); /* draw xor box(cursor) */ if (self->parent != 0) { @@ -994,7 +995,7 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect) text[self->edit_pos] = 0; } else - g_strncpy(text, self->caption, self->edit_pos); + g_strncpy(text, self->caption1, self->edit_pos); w = xrdp_painter_text_width(painter, text); painter->fg_color = self->wm->black; painter->rop = 0x5a; @@ -1007,7 +1008,7 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect) else if (self->type == WND_TYPE_LABEL) /* 6 */ { painter->font->color = self->wm->black; - xrdp_painter_draw_text(painter, self, 0, 0, self->caption); + xrdp_painter_draw_text(painter, self, 0, 0, self->caption1); } else if (self->type == WND_TYPE_COMBO) /* 7 combo box */ { @@ -1205,7 +1206,7 @@ int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg, else if ((scan_code == 77 || scan_code == 80) && (ext || self->wm->num_lock == 0)) { - if (self->edit_pos < g_strlen(self->caption)) + if (self->edit_pos < g_strlen(self->caption1)) { self->edit_pos++; xrdp_bitmap_invalidate(self, 0); @@ -1214,13 +1215,13 @@ int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg, /* backspace */ else if (scan_code == 14) { - n = g_strlen(self->caption); + n = g_strlen(self->caption1); if (n > 0) { if (self->edit_pos > 0) { self->edit_pos--; - remove_char_at(self->caption, self->edit_pos); + remove_char_at(self->caption1, self->edit_pos); xrdp_bitmap_invalidate(self, 0); } } @@ -1229,12 +1230,12 @@ int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg, else if (scan_code == 83 && (ext || self->wm->num_lock == 0)) { - n = g_strlen(self->caption); + n = g_strlen(self->caption1); if (n > 0) { if (self->edit_pos < n) { - remove_char_at(self->caption, self->edit_pos); + remove_char_at(self->caption1, self->edit_pos); xrdp_bitmap_invalidate(self, 0); } } @@ -1243,7 +1244,7 @@ int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg, else if (scan_code == 79 && (ext || self->wm->num_lock == 0)) { - n = g_strlen(self->caption); + n = g_strlen(self->caption1); if (self->edit_pos < n) { self->edit_pos = n; @@ -1268,7 +1269,7 @@ int xrdp_bitmap_def_proc(struct xrdp_bitmap* self, int msg, self->wm->scroll_lock); if (c != 0) { - add_char_at(self->caption, c, self->edit_pos); + add_char_at(self->caption1, c, self->edit_pos); self->edit_pos++; xrdp_bitmap_invalidate(self, 0); } diff --git a/xrdp/xrdp_cache.c b/xrdp/xrdp_cache.c index 031563f6..7c315526 100644 --- a/xrdp/xrdp_cache.c +++ b/xrdp/xrdp_cache.c @@ -39,6 +39,7 @@ struct xrdp_cache* xrdp_cache_create(struct xrdp_wm* owner, self->cache2_size = client_info->cache2_size; self->cache3_entries = client_info->cache3_entries; self->cache3_size = client_info->cache3_size; + self->pointer_cache_entries = client_info->pointer_cache_entries; return self; } @@ -320,3 +321,63 @@ int xrdp_cache_add_char(struct xrdp_cache* self, xrdp_orders_send_font(self->orders, fi, f, c); return MAKELONG(f, c); } + +/*****************************************************************************/ +/* added the pointer to the cache and send it to client, it also sets the + client if it finds it + returns the index in the cache + does not take ownership of pointer_item */ +int xrdp_cache_add_pointer(struct xrdp_cache* self, + struct xrdp_pointer_item* pointer_item) +{ + int i; + int oldest; + int index; + + if (self == 0) + { + return 0; + } + self->pointer_stamp++; + /* look for match */ + for (i = 0; i < self->pointer_cache_entries; i++) + { + if (self->pointer_items[i].x == pointer_item->x && + self->pointer_items[i].y == pointer_item->y && + g_memcmp(self->pointer_items[i].data, + pointer_item->data, 32 * 32 * 3) == 0 && + g_memcmp(self->pointer_items[i].mask, + pointer_item->mask, 32 * 32 / 8) == 0) + { + self->pointer_items[i].stamp = self->pointer_stamp; + xrdp_wm_set_pointer(self->wm, i); + DEBUG(("found pointer at %d\n\r", i)); + return i; + } + } + /* look for oldest */ + index = 0; + oldest = 0x7fffffff; + for (i = 0; i < self->pointer_cache_entries; i++) + { + if (self->pointer_items[i].stamp < oldest) + { + oldest = self->pointer_items[i].stamp; + index = i; + } + } + self->pointer_items[index].x = pointer_item->x; + self->pointer_items[index].y = pointer_item->y; + g_memcpy(self->pointer_items[index].data, + pointer_item->data, 32 * 32 * 3); + g_memcpy(self->pointer_items[index].mask, + pointer_item->mask, 32 * 32 / 8); + self->pointer_items[index].stamp = self->pointer_stamp; + xrdp_wm_send_pointer(self->wm, index, + self->pointer_items[index].data, + self->pointer_items[index].mask, + self->pointer_items[index].x, + self->pointer_items[index].y); + DEBUG(("adding pointer at %d\n\r", index)); + return index; +} diff --git a/xrdp/xrdp_interface.c b/xrdp/xrdp_interface.c index b52ce3b4..55b1de55 100644 --- a/xrdp/xrdp_interface.c +++ b/xrdp/xrdp_interface.c @@ -190,12 +190,12 @@ int server_paint_rect(int x, int y, int cx, int cy, char* data) } /*****************************************************************************/ -int server_set_cursor(int x, int y, char* data, char* mask) +int server_set_pointer(int x, int y, char* data, char* mask) { struct xrdp_wm* wm; wm = (struct xrdp_wm*)g_mod.wm; - xrdp_wm_send_cursor(wm, 2, data, mask, x, y); + xrdp_wm_pointer(wm, data, mask, x, y); return 0; } @@ -283,13 +283,13 @@ int server_paint_rect(struct xrdp_mod* mod, int x, int y, int cx, int cy, } /*****************************************************************************/ -int server_set_cursor(struct xrdp_mod* mod, int x, int y, - char* data, char* mask) +int server_set_pointer(struct xrdp_mod* mod, int x, int y, + char* data, char* mask) { struct xrdp_wm* wm; wm = (struct xrdp_wm*)mod->wm; - xrdp_wm_send_cursor(wm, 2, data, mask, x, y); + xrdp_wm_pointer(wm, data, mask, x, y); return 0; } diff --git a/xrdp/xrdp_iso.c b/xrdp/xrdp_iso.c index 131fefde..7180c8b9 100644 --- a/xrdp/xrdp_iso.c +++ b/xrdp/xrdp_iso.c @@ -89,10 +89,12 @@ int xrdp_iso_recv(struct xrdp_iso* self, struct stream* s) DEBUG((" in xrdp_iso_recv\n\r")); if (xrdp_iso_recv_msg(self, s, &code) != 0) { + DEBUG((" out xrdp_iso_recv xrdp_iso_recv_msg return non zero\n\r")); return 1; } if (code != ISO_PDU_DT) { + DEBUG((" out xrdp_iso_recv code != ISO_PDU_DT\n\r")); return 1; } DEBUG((" out xrdp_iso_recv\n\r")); diff --git a/xrdp/xrdp_login_wnd.c b/xrdp/xrdp_login_wnd.c index 56861b22..38b58d99 100644 --- a/xrdp/xrdp_login_wnd.c +++ b/xrdp/xrdp_login_wnd.c @@ -107,7 +107,7 @@ int xrdp_wm_setup_mod(struct xrdp_wm* self, self->mod->server_fill_rect = server_fill_rect; self->mod->server_screen_blt = server_screen_blt; self->mod->server_paint_rect = server_paint_rect; - self->mod->server_set_cursor = server_set_cursor; + self->mod->server_set_pointer = server_set_pointer; self->mod->server_palette = server_palette; self->mod->server_error_popup= server_error_popup; } @@ -167,7 +167,7 @@ int xrdp_wm_login_notify(struct xrdp_bitmap* wnd, help->left = wnd->wm->screen->width / 2 - help->width / 2; help->top = wnd->wm->screen->height / 2 - help->height / 2; help->notify = xrdp_wm_login_help_notify; - g_strcpy(help->caption, "Login help"); + set_string(&help->caption1, "Login help"); /* ok button */ but = xrdp_bitmap_create(60, 25, wnd->wm->screen->bpp, 3, wnd->wm); xrdp_list_insert_item(help->child_list, 0, (int)but); @@ -177,7 +177,7 @@ int xrdp_wm_login_notify(struct xrdp_bitmap* wnd, but->top = 260; but->id = 1; but->tab_stop = 1; - g_strcpy(but->caption, "OK"); + set_string(&but->caption1, "OK"); /* draw it */ help->focused_control = but; //wnd->wm->focused_window = help; @@ -207,7 +207,7 @@ int xrdp_wm_login_notify(struct xrdp_bitmap* wnd, edit = xrdp_bitmap_get_child_by_id(wnd, 4); if (edit != 0) { - g_strcpy(con_mod.username, edit->caption); + g_strcpy(con_mod.username, edit->caption1); } } if (g_strcmp(con_mod.password, "ask") == 0) @@ -215,7 +215,7 @@ int xrdp_wm_login_notify(struct xrdp_bitmap* wnd, edit = xrdp_bitmap_get_child_by_id(wnd, 5); if (edit != 0) { - g_strcpy(con_mod.password, edit->caption); + g_strcpy(con_mod.password, edit->caption1); } } if (xrdp_wm_setup_mod(wm, mod) == 0) @@ -364,7 +364,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self) self->login_window->top = self->screen->height / 2 - self->login_window->height / 2; self->login_window->notify = xrdp_wm_login_notify; - g_strcpy(self->login_window->caption, "Login to xrdp"); + set_string(&self->login_window->caption1, "Login to xrdp"); /* image */ but = xrdp_bitmap_create(4, 4, self->screen->bpp, WND_TYPE_IMAGE, self); @@ -391,7 +391,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self) but->owner = self->login_window; but->left = 155; but->top = 50; - g_strcpy(but->caption, "Username"); + set_string(&but->caption1, "Username"); /* edit */ but = xrdp_bitmap_create(140, 20, self->screen->bpp, WND_TYPE_EDIT, self); @@ -401,8 +401,9 @@ int xrdp_login_wnd_create(struct xrdp_wm* self) but->left = 220; but->top = 50; but->id = 4; - but->cursor = 1; + but->pointer = 1; but->tab_stop = 1; + but->caption1 = g_malloc(256, 1); self->login_window->focused_control = but; /* label */ @@ -412,7 +413,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self) but->owner = self->login_window; but->left = 155; but->top = 80; - g_strcpy(but->caption, "Password"); + set_string(&but->caption1, "Password"); /* edit */ but = xrdp_bitmap_create(140, 20, self->screen->bpp, WND_TYPE_EDIT, self); @@ -422,8 +423,9 @@ int xrdp_login_wnd_create(struct xrdp_wm* self) but->left = 220; but->top = 80; but->id = 5; - but->cursor = 1; + but->pointer = 1; but->tab_stop = 1; + but->caption1 = g_malloc(256, 1); but->password_char = '*'; /* label */ @@ -433,7 +435,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self) but->owner = self->login_window; but->left = 155; but->top = 110; - g_strcpy(but->caption, "Module"); + set_string(&but->caption1, "Module"); /* combo */ but = xrdp_bitmap_create(140, 20, self->screen->bpp, WND_TYPE_COMBO, self); @@ -454,7 +456,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self) but->left = 180; but->top = 160; but->id = 3; - g_strcpy(but->caption, "OK"); + set_string(&but->caption1, "OK"); but->tab_stop = 1; /* button */ @@ -465,7 +467,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self) but->left = 250; but->top = 160; but->id = 2; - g_strcpy(but->caption, "Cancel"); + set_string(&but->caption1, "Cancel"); but->tab_stop = 1; /* button */ @@ -476,7 +478,7 @@ int xrdp_login_wnd_create(struct xrdp_wm* self) but->left = 320; but->top = 160; but->id = 1; - g_strcpy(but->caption, "Help"); + set_string(&but->caption1, "Help"); but->tab_stop = 1; return 0; diff --git a/xrdp/xrdp_mcs.c b/xrdp/xrdp_mcs.c index e47a36f3..82eeff0f 100644 --- a/xrdp/xrdp_mcs.c +++ b/xrdp/xrdp_mcs.c @@ -91,12 +91,14 @@ int xrdp_mcs_recv(struct xrdp_mcs* self, struct stream* s, int* chan) { if (xrdp_iso_recv(self->iso_layer, s) != 0) { + DEBUG((" out xrdp_mcs_recv xrdp_iso_recv returned non zero\n\r")); return 1; } in_uint8(s, opcode); appid = opcode >> 2; if (appid == MCS_DPUM) { + DEBUG((" out xrdp_mcs_recv appid != MCS_DPUM\n\r")); return 1; } if (appid == MCS_CJRQ) @@ -141,7 +143,9 @@ int xrdp_mcs_ber_parse_header(struct xrdp_mcs* self, struct stream* s, in_uint8(s, tag); } if (tag != tag_val) + { return 1; + } in_uint8(s, l); if (l & 0x80) { diff --git a/xrdp/xrdp_painter.c b/xrdp/xrdp_painter.c index ba9605e8..7fcb7170 100644 --- a/xrdp/xrdp_painter.c +++ b/xrdp/xrdp_painter.c @@ -380,6 +380,7 @@ int xrdp_painter_draw_bitmap(struct xrdp_painter* self, srcy = srcy - y1; y1 = 0; } + //g_printf("%d %d %d %d %d %d\n", x1, y1, w, h, srcx, srcy); xrdp_orders_mem_blt(self->orders, cache_id, palette_id, x1, y1, w, h, self->rop, srcx, srcy, cache_idx, &rect1); @@ -425,6 +426,10 @@ int xrdp_painter_text_width(struct xrdp_painter* self, char* text) struct xrdp_font_item* font_item; xrdp_painter_font_needed(self); + if (text == 0) + { + return 0; + } rv = 0; len = g_strlen(text); for (index = 0; index < len; index++) @@ -444,6 +449,10 @@ int xrdp_painter_text_height(struct xrdp_painter* self, char* text) struct xrdp_font_item* font_item; xrdp_painter_font_needed(self); + if (text == 0) + { + return 0; + } rv = 0; len = g_strlen(text); for (index = 0; index < len; index++) diff --git a/xrdp/xrdp_process.c b/xrdp/xrdp_process.c index c38b9257..aa9acfa1 100644 --- a/xrdp/xrdp_process.c +++ b/xrdp/xrdp_process.c @@ -1,166 +1,169 @@ -/* - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - xrdp: A Remote Desktop Protocol server. - Copyright (C) Jay Sorg 2004-2005 - - main rdp process - -*/ - -#include "xrdp.h" - -/*****************************************************************************/ -struct xrdp_process* xrdp_process_create(struct xrdp_listen* owner) -{ - struct xrdp_process* self; - - self = (struct xrdp_process*)g_malloc(sizeof(struct xrdp_process), 1); - self->lis_layer = owner; - return self; -} - -/*****************************************************************************/ -void xrdp_process_delete(struct xrdp_process* self) -{ - if (self == 0) - { - return; - } - xrdp_rdp_delete(self->rdp_layer); - xrdp_orders_delete(self->orders); - xrdp_wm_delete(self->wm); - g_free(self); -} - -/*****************************************************************************/ -int xrdp_process_loop(struct xrdp_process* self, struct stream* s) -{ - int cont; - int rv; - int code; - - code = 0; - rv = 0; - cont = 1; - while (cont && !self->term) - { - if (xrdp_rdp_recv(self->rdp_layer, s, &code) != 0) - { - rv = 1; - break; - } - DEBUG(("xrdp_process_main_loop code %d\n\r", code)); - switch (code) - { - case -1: - xrdp_rdp_send_demand_active(self->rdp_layer); - break; - case 0: - break; - case RDP_PDU_CONFIRM_ACTIVE: /* 3 */ - xrdp_rdp_process_confirm_active(self->rdp_layer, s); - break; - case RDP_PDU_DATA: /* 7 */ - if (xrdp_rdp_process_data(self->rdp_layer, s) != 0) - { - DEBUG(("xrdp_rdp_process_data returned non zero\n\r")); - cont = 0; - self->term = 1; - } - break; - default: - g_printf("unknown in xrdp_process_main_loop\n\r"); - break; - } - if (cont) - { - cont = s->next_packet < s->end; - } - } - if (self->rdp_layer->up_and_running && self->wm == 0 && rv == 0) - { - /* only do this once */ - DEBUG(("xrdp_process_main_loop up and running\n\r")); - self->orders = xrdp_orders_create(self, self->rdp_layer); - self->wm = xrdp_wm_create(self, &self->rdp_layer->client_info); - xrdp_wm_init(self->wm); - } - return rv; -} - -/*****************************************************************************/ -int xrdp_process_main_loop(struct xrdp_process* self) -{ -#ifndef XRDP_LIB - int i; - struct stream* s; - - make_stream(s); - self->status = 1; - self->rdp_layer = xrdp_rdp_create(self, self->sck); - g_tcp_set_non_blocking(self->sck); - if (xrdp_rdp_incoming(self->rdp_layer) == 0) - { - while (!g_is_term() && !self->term) - { - i = g_tcp_select(self->sck, self->app_sck); - if (i & 1) - { - init_stream(s, 8192); - xrdp_process_loop(self, s); - } - if (i & 2) /* mod socket fired */ - { - if (self->wm->mod == 0) - { - break; - } - if (self->wm->mod->mod_signal == 0) - { - break; - } - if (self->wm->mod->mod_signal(self->wm->mod) != 0) - { - break; - } - } - if (i == 0) /* no data on any stream */ - { - g_sleep(10); - } - else if (i < 0) - { - break; - } - } - } - if (self->wm->mod != 0) - { - if (self->wm->mod->mod_end != 0) - { - self->wm->mod->mod_end(self->wm->mod); - } - } - xrdp_rdp_disconnect(self->rdp_layer); - xrdp_rdp_delete(self->rdp_layer); - self->rdp_layer = 0; - g_tcp_close(self->sck); - self->status = -1; - xrdp_listen_delete_pro(self->lis_layer, self); - free_stream(s); -#endif - return 0; -} +/* + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + xrdp: A Remote Desktop Protocol server. + Copyright (C) Jay Sorg 2004-2005 + + main rdp process + +*/ + +#include "xrdp.h" + +/*****************************************************************************/ +struct xrdp_process* xrdp_process_create(struct xrdp_listen* owner) +{ + struct xrdp_process* self; + + self = (struct xrdp_process*)g_malloc(sizeof(struct xrdp_process), 1); + self->lis_layer = owner; + return self; +} + +/*****************************************************************************/ +void xrdp_process_delete(struct xrdp_process* self) +{ + if (self == 0) + { + return; + } + xrdp_rdp_delete(self->rdp_layer); + xrdp_orders_delete(self->orders); + xrdp_wm_delete(self->wm); + g_free(self); +} + +/*****************************************************************************/ +int xrdp_process_loop(struct xrdp_process* self, struct stream* s) +{ + int cont; + int rv; + int code; + + code = 0; + rv = 0; + cont = 1; + while (cont && !self->term) + { + if (xrdp_rdp_recv(self->rdp_layer, s, &code) != 0) + { + rv = 1; + break; + } + DEBUG(("xrdp_process_main_loop code %d\n\r", code)); + switch (code) + { + case -1: + xrdp_rdp_send_demand_active(self->rdp_layer); + break; + case 0: + break; + case RDP_PDU_CONFIRM_ACTIVE: /* 3 */ + xrdp_rdp_process_confirm_active(self->rdp_layer, s); + break; + case RDP_PDU_DATA: /* 7 */ + if (xrdp_rdp_process_data(self->rdp_layer, s) != 0) + { + DEBUG(("xrdp_rdp_process_data returned non zero\n\r")); + cont = 0; + self->term = 1; + } + break; + default: + g_printf("unknown in xrdp_process_main_loop\n\r"); + break; + } + if (cont) + { + cont = s->next_packet < s->end; + } + } + if (self->rdp_layer->up_and_running && self->wm == 0 && rv == 0) + { + /* only do this once */ + DEBUG(("xrdp_process_main_loop up and running\n\r")); + self->orders = xrdp_orders_create(self, self->rdp_layer); + self->wm = xrdp_wm_create(self, &self->rdp_layer->client_info); + xrdp_wm_init(self->wm); + } + return rv; +} + +/*****************************************************************************/ +int xrdp_process_main_loop(struct xrdp_process* self) +{ +#ifndef XRDP_LIB + int i; + struct stream* s; + + make_stream(s); + self->status = 1; + self->rdp_layer = xrdp_rdp_create(self, self->sck); + g_tcp_set_non_blocking(self->sck); + if (xrdp_rdp_incoming(self->rdp_layer) == 0) + { + while (!g_is_term() && !self->term) + { + i = g_tcp_select(self->sck, self->app_sck); + if (i & 1) + { + init_stream(s, 8192); + if (xrdp_process_loop(self, s) != 0) + { + break; + } + } + if (i & 2) /* mod socket fired */ + { + if (self->wm->mod == 0) + { + break; + } + if (self->wm->mod->mod_signal == 0) + { + break; + } + if (self->wm->mod->mod_signal(self->wm->mod) != 0) + { + break; + } + } + if (i == 0) /* no data on any stream */ + { + g_sleep(10); + } + else if (i < 0) + { + break; + } + } + } + if (self->wm->mod != 0) + { + if (self->wm->mod->mod_end != 0) + { + self->wm->mod->mod_end(self->wm->mod); + } + } + xrdp_rdp_disconnect(self->rdp_layer); + xrdp_rdp_delete(self->rdp_layer); + self->rdp_layer = 0; + g_tcp_close(self->sck); + self->status = -1; + xrdp_listen_delete_pro(self->lis_layer, self); + free_stream(s); +#endif + return 0; +} diff --git a/xrdp/xrdp_rdp.c b/xrdp/xrdp_rdp.c index 0098252f..bed3e833 100644 --- a/xrdp/xrdp_rdp.c +++ b/xrdp/xrdp_rdp.c @@ -138,6 +138,7 @@ int xrdp_rdp_init_data(struct xrdp_rdp* self, struct stream* s) } /*****************************************************************************/ +/* returns erros */ int xrdp_rdp_recv(struct xrdp_rdp* self, struct stream* s, int* code) { int error; @@ -145,6 +146,7 @@ int xrdp_rdp_recv(struct xrdp_rdp* self, struct stream* s, int* code) int pdu_code; int chan; + DEBUG(("in xrdp_rdp_recv\n\r")); if (s->next_packet == 0 || s->next_packet >= s->end) { chan = 0; @@ -153,18 +155,21 @@ int xrdp_rdp_recv(struct xrdp_rdp* self, struct stream* s, int* code) { s->next_packet = 0; *code = -1; + DEBUG(("out xrdp_rdp_recv\n\r")); return 0; } + if (error != 0) + { + DEBUG(("out xrdp_rdp_recv error\n\r")); + return 1; + } if (chan != MCS_GLOBAL_CHANNEL && chan > 0) { s->next_packet = 0; *code = 0; + DEBUG(("out xrdp_rdp_recv\n\r")); return 0; } - if (error != 0) - { - return 1; - } s->next_packet = s->p; } else @@ -176,12 +181,14 @@ int xrdp_rdp_recv(struct xrdp_rdp* self, struct stream* s, int* code) { s->next_packet += 8; *code = 0; + DEBUG(("out xrdp_rdp_recv\n\r")); return 0; } in_uint16_le(s, pdu_code); *code = pdu_code & 0xf; in_uint8s(s, 2); /* mcs user id */ s->next_packet += len; + DEBUG(("out xrdp_rdp_recv\n\r")); return 0; } @@ -198,6 +205,7 @@ int xrdp_rdp_send(struct xrdp_rdp* self, struct stream* s, int pdu_type) out_uint16_le(s, self->mcs_channel); if (xrdp_sec_send(self->sec_layer, s, 0) != 0) { + DEBUG(("out xrdp_rdp_send error\n\r")); return 1; } DEBUG(("out xrdp_rdp_send\n\r")); @@ -225,6 +233,7 @@ int xrdp_rdp_send_data(struct xrdp_rdp* self, struct stream* s, out_uint16_le(s, 0); if (xrdp_sec_send(self->sec_layer, s, 0) != 0) { + DEBUG(("out xrdp_rdp_send_data error\n\r")); return 1; } DEBUG(("out xrdp_rdp_send_data\n\r")); @@ -440,6 +449,21 @@ int xrdp_process_capset_bmpcache(struct xrdp_rdp* self, struct stream* s, return 0; } +/*****************************************************************************/ +int xrdp_process_capset_pointercache(struct xrdp_rdp* self, struct stream* s, + int len) +{ + int i; + + //g_hexdump(s->p, len); + in_uint8s(s, 2); /* color pointer */ + in_uint16_le(s, i); + i = MIN(i, 32); + self->client_info.pointer_cache_entries = i; + //g_printf("%d\n", self->client_info.pointer_cache_entries); + return 0; +} + /*****************************************************************************/ int xrdp_rdp_process_confirm_active(struct xrdp_rdp* self, struct stream* s) { @@ -469,6 +493,9 @@ int xrdp_rdp_process_confirm_active(struct xrdp_rdp* self, struct stream* s) case RDP_CAPSET_BMPCACHE: xrdp_process_capset_bmpcache(self, s, len); break; + case RDP_CAPSET_POINTER: + xrdp_process_capset_pointercache(self, s, len); + break; } s->p = p + len; } diff --git a/xrdp/xrdp_sec.c b/xrdp/xrdp_sec.c index b5a69de9..f1982f5e 100644 --- a/xrdp/xrdp_sec.c +++ b/xrdp/xrdp_sec.c @@ -430,6 +430,7 @@ int xrdp_sec_recv(struct xrdp_sec* self, struct stream* s, int* chan) DEBUG((" in xrdp_sec_recv\n\r")); if (xrdp_mcs_recv(self->mcs_layer, s, chan) != 0) { + DEBUG((" out xrdp_sec_recv error\n\r")); return 1; } in_uint32_le(s, flags); diff --git a/xrdp/xrdp_tcp.c b/xrdp/xrdp_tcp.c index 479b3ae6..ed08aef7 100644 --- a/xrdp/xrdp_tcp.c +++ b/xrdp/xrdp_tcp.c @@ -54,12 +54,13 @@ int xrdp_tcp_recv(struct xrdp_tcp* self, struct stream* s, int len) { int rcvd; - DEBUG((" in xrdp_tcp_recv, gota get %d bytes\n", len)) + DEBUG((" in xrdp_tcp_recv, gota get %d bytes\n\r", len)); init_stream(s, len); while (len > 0) { if (g_is_term()) { + DEBUG((" out xrdp_tcp_recv, g_is_term is true\n\r")); return 1; } rcvd = g_tcp_recv(self->sck, s->end, len, 0); @@ -71,13 +72,13 @@ int xrdp_tcp_recv(struct xrdp_tcp* self, struct stream* s, int len) } else { - DEBUG((" error = -1 in xrdp_tcp_recv socket %d\n", self->sck)) + DEBUG((" error = -1 in xrdp_tcp_recv socket %d\n\r", self->sck)); return 1; } } else if (rcvd == 0) { - DEBUG((" error = 0 in xrdp_tcp_recv socket %d\n", self->sck)) + DEBUG((" error = 0 in xrdp_tcp_recv socket %d\n\r", self->sck)); return 1; } else @@ -86,6 +87,7 @@ int xrdp_tcp_recv(struct xrdp_tcp* self, struct stream* s, int len) len -= rcvd; } } + DEBUG((" out xrdp_tcp_recv\n\r")); return 0; } diff --git a/xrdp/xrdp_types.h b/xrdp/xrdp_types.h index db61a603..03fa7a69 100644 --- a/xrdp/xrdp_types.h +++ b/xrdp/xrdp_types.h @@ -42,7 +42,7 @@ struct xrdp_mod int srcx, int srcy); int (*server_paint_rect)(struct xrdp_mod* v, int x, int y, int cx, int cy, char* data); - int (*server_set_cursor)(struct xrdp_mod* v, int x, int y, char* data, char* mask); + int (*server_set_pointer)(struct xrdp_mod* v, int x, int y, char* data, char* mask); int (*server_palette)(struct xrdp_mod* v, int* palette); int (*server_error_popup)(struct xrdp_mod* v, char* error, char* caption); int d2[92]; @@ -181,6 +181,7 @@ struct xrdp_client_info int cache2_size; int cache3_entries; int cache3_size; + int pointer_cache_entries; int use_bitmap_comp; int use_bitmap_cache; int op1; /* use smaller bitmap header, todo */ @@ -314,17 +315,26 @@ struct xrdp_char_item struct xrdp_font_item font_item; }; +struct xrdp_pointer_item +{ + int stamp; + int x; /* hotspot */ + int y; + char data[32 * 32 * 3]; + char mask[32 * 32 / 8]; +}; + /* differnce caches */ struct xrdp_cache { struct xrdp_wm* wm; /* owner */ struct xrdp_orders* orders; + /* palette */ int palette_stamp; struct xrdp_palette_item palette_items[6]; + /* bitmap */ int bitmap_stamp; struct xrdp_bitmap_item bitmap_items[3][600]; - int char_stamp; - struct xrdp_char_item char_items[12][256]; int use_bitmap_comp; int cache1_entries; int cache1_size; @@ -332,6 +342,13 @@ struct xrdp_cache int cache2_size; int cache3_entries; int cache3_size; + /* font */ + int char_stamp; + struct xrdp_char_item char_items[12][256]; + /* pointer */ + int pointer_stamp; + struct xrdp_pointer_item pointer_items[32]; + int pointer_cache_entries; }; /* the window manager */ @@ -372,8 +389,8 @@ struct xrdp_wm struct xrdp_bitmap* popup_wnd; /* focused window */ struct xrdp_bitmap* focused_window; - /* cursor */ - int current_cursor; + /* pointer */ + int current_pointer; int mouse_x; int mouse_y; /* keyboard info */ @@ -458,11 +475,11 @@ struct xrdp_bitmap /* for all but bitmap */ int left; int top; - int cursor; + int pointer; int bg_color; int tab_stop; int id; - char caption[256]; + char* caption1; /* for window or screen */ struct xrdp_bitmap* modal_dialog; struct xrdp_bitmap* focused_control; diff --git a/xrdp/xrdp_wm.c b/xrdp/xrdp_wm.c index e776ef21..bd6e9e7e 100644 --- a/xrdp/xrdp_wm.c +++ b/xrdp/xrdp_wm.c @@ -299,23 +299,6 @@ int xrdp_wm_set_focused(struct xrdp_wm* self, struct xrdp_bitmap* wnd) return 0; } -/*****************************************************************************/ -int xrdp_set_cursor(struct xrdp_wm* self, int cache_idx) -{ - 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; -} - //****************************************************************************** int xrdp_wm_get_pixel(char* data, int x, int y, int width, int bpp) { @@ -347,7 +330,22 @@ int xrdp_wm_get_pixel(char* data, int x, int y, int width, int bpp) } /*****************************************************************************/ -int xrdp_wm_load_cursor(struct xrdp_wm* self, char* file_name, char* data, +int xrdp_wm_pointer(struct xrdp_wm* self, char* data, char* mask, int x, int y) +{ + + struct xrdp_pointer_item pointer_item; + + g_memset(&pointer_item, 0, sizeof(struct xrdp_pointer_item)); + pointer_item.x = x; + pointer_item.y = y; + g_memcpy(pointer_item.data, data, 32 * 32 * 3); + g_memcpy(pointer_item.mask, mask, 32 * 32 / 8); + xrdp_cache_add_pointer(self->cache, &pointer_item); + return 0; +} + +/*****************************************************************************/ +int xrdp_wm_load_pointer(struct xrdp_wm* self, char* file_name, char* data, char* mask, int* x, int* y) { int fd; @@ -419,7 +417,7 @@ int xrdp_wm_load_cursor(struct xrdp_wm* self, char* file_name, char* data, } /*****************************************************************************/ -int xrdp_wm_send_cursor(struct xrdp_wm* self, int cache_idx, +int xrdp_wm_send_pointer(struct xrdp_wm* self, int cache_idx, char* data, char* mask, int x, int y) { struct stream* s; @@ -459,6 +457,24 @@ int xrdp_wm_send_cursor(struct xrdp_wm* self, int cache_idx, return 0; } +/*****************************************************************************/ +int xrdp_wm_set_pointer(struct xrdp_wm* self, int cache_idx) +{ + 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 */ + //g_printf("%d\n", cache_idx); + s_mark_end(s); + xrdp_rdp_send_data(self->rdp_layer, s, RDP_DATA_PDU_POINTER); + free_stream(s); + return 0; +} + /*****************************************************************************/ int xrdp_wm_init(struct xrdp_wm* self) { @@ -537,10 +553,10 @@ int xrdp_wm_init(struct xrdp_wm* self) xrdp_wm_set_focused(self, self->login_window); - xrdp_wm_load_cursor(self, "cursor1.cur", data, mask, &x, &y); - xrdp_wm_send_cursor(self, 1, data, mask, x, y); - xrdp_wm_load_cursor(self, "cursor0.cur", data, mask, &x, &y); - xrdp_wm_send_cursor(self, 0, data, mask, x, y); + xrdp_wm_load_pointer(self, "cursor1.cur", data, mask, &x, &y); + xrdp_wm_send_pointer(self, 1, data, mask, x, y); + xrdp_wm_load_pointer(self, "cursor0.cur", data, mask, &x, &y); + xrdp_wm_send_pointer(self, 0, data, mask, x, y); #endif return 0; } @@ -850,10 +866,10 @@ int xrdp_wm_mouse_move(struct xrdp_wm* self, int x, int y) { if (!self->dragging) { - if (b->cursor != self->current_cursor) + if (b->pointer != self->current_pointer) { - xrdp_set_cursor(self, b->cursor); - self->current_cursor = b->cursor; + xrdp_wm_set_pointer(self, b->pointer); + self->current_pointer = b->pointer; } xrdp_bitmap_def_proc(b, WM_MOUSEMOVE, xrdp_bitmap_from_screenx(b, x),