summaryrefslogtreecommitdiffstats
path: root/xrdp/xrdp_rdp.c
diff options
context:
space:
mode:
authorjsorg71 <jsorg71>2004-09-11 21:27:39 +0000
committerjsorg71 <jsorg71>2004-09-11 21:27:39 +0000
commite856dc67abedd0a38b766d2f0ecdde9a75424e27 (patch)
treebad2c717659514642a73407dddb98248e4924b73 /xrdp/xrdp_rdp.c
parent6560bcc78bd78a8d63dedea622702fc7368d23ad (diff)
downloadxrdp-proprietary-e856dc67abedd0a38b766d2f0ecdde9a75424e27.tar.gz
xrdp-proprietary-e856dc67abedd0a38b766d2f0ecdde9a75424e27.zip
major work and login screen
Diffstat (limited to 'xrdp/xrdp_rdp.c')
-rw-r--r--xrdp/xrdp_rdp.c83
1 files changed, 74 insertions, 9 deletions
diff --git a/xrdp/xrdp_rdp.c b/xrdp/xrdp_rdp.c
index b8eadccb..005f4d58 100644
--- a/xrdp/xrdp_rdp.c
+++ b/xrdp/xrdp_rdp.c
@@ -63,6 +63,8 @@ struct xrdp_rdp* xrdp_rdp_create(struct xrdp_process* owner)
/*****************************************************************************/
void xrdp_rdp_delete(struct xrdp_rdp* self)
{
+ if (self == 0)
+ return;
xrdp_sec_delete(self->sec_layer);
g_free(self);
}
@@ -91,16 +93,24 @@ int xrdp_rdp_recv(struct xrdp_rdp* self, int* code)
int error;
int len;
int pdu_code;
+ int chan;
if (self->next_packet == 0 || self->next_packet >= self->in_s->end)
{
- error = xrdp_sec_recv(self->sec_layer);
+ chan = 0;
+ error = xrdp_sec_recv(self->sec_layer, &chan);
if (error == -1) /* special code for send demand active */
{
self->next_packet = 0;
*code = -1;
return 0;
}
+ if (chan != MCS_GLOBAL_CHANNEL && chan > 0)
+ {
+ self->next_packet = 0;
+ *code = 0;
+ return 0;
+ }
if (error != 0)
return 1;
self->next_packet = self->in_s->p;
@@ -126,6 +136,7 @@ int xrdp_rdp_send(struct xrdp_rdp* self, int pdu_type)
{
int len;
+ DEBUG(("in xrdp_rdp_send\n\r"));
s_pop_layer(self->out_s, rdp_hdr);
len = self->out_s->end - self->out_s->p;
out_uint16_le(self->out_s, len);
@@ -133,6 +144,7 @@ int xrdp_rdp_send(struct xrdp_rdp* self, int pdu_type)
out_uint16_le(self->out_s, self->mcs_channel);
if (xrdp_sec_send(self->sec_layer, 0) != 0)
return 1;
+ DEBUG(("out xrdp_rdp_send\n\r"));
return 0;
}
@@ -141,6 +153,7 @@ int xrdp_rdp_send_data(struct xrdp_rdp* self, int data_pdu_type)
{
int len;
+ DEBUG(("in xrdp_rdp_send_data\n\r"));
s_pop_layer(self->out_s, rdp_hdr);
len = self->out_s->end - self->out_s->p;
out_uint16_le(self->out_s, len);
@@ -155,6 +168,7 @@ int xrdp_rdp_send_data(struct xrdp_rdp* self, int data_pdu_type)
out_uint16_le(self->out_s, 0);
if (xrdp_sec_send(self->sec_layer, 0) != 0)
return 1;
+ DEBUG(("out xrdp_rdp_send_data\n\r"));
return 0;
}
@@ -350,14 +364,20 @@ int xrdp_rdp_process_data_pointer(struct xrdp_rdp* self)
int xrdp_rdp_process_input_sync(struct xrdp_rdp* self, int device_flags,
int key_flags)
{
+ DEBUG(("sync event flags %d key %d\n\r", device_flags, key_flags))
+ if (!self->up_and_running)
+ return 0;
return 0;
}
/*****************************************************************************/
/* RDP_INPUT_SCANCODE */
int xrdp_rdp_process_input_scancode(struct xrdp_rdp* self, int device_flags,
- int ext_flags, int scan_code)
+ int scan_code)
{
+ DEBUG(("key event flags %d scan_code %d\n\r", device_flags, scan_code))
+ if (!self->up_and_running)
+ return 0;
return 0;
}
@@ -366,6 +386,25 @@ int xrdp_rdp_process_input_scancode(struct xrdp_rdp* self, int device_flags,
int xrdp_rdp_process_input_mouse(struct xrdp_rdp* self, int device_flags,
int x, int y)
{
+ DEBUG(("mouse event flags %4.4x x - %d y - %d\n\r", device_flags, x, y));
+ if (!self->up_and_running)
+ return 0;
+ if (device_flags & MOUSE_FLAG_MOVE) /* 0x0800 */
+ xrdp_wm_mouse_move(self->pro_layer->wm, x, y);
+ if (device_flags & MOUSE_FLAG_BUTTON1) /* 0x1000 */
+ {
+ if (device_flags & MOUSE_FLAG_DOWN) /* 0x8000 */
+ xrdp_wm_mouse_click(self->pro_layer->wm, x, y, 1, 1);
+ else
+ xrdp_wm_mouse_click(self->pro_layer->wm, x, y, 1, 0);
+ }
+ if (device_flags & MOUSE_FLAG_BUTTON2) /* 0x2000 */
+ {
+ if (device_flags & MOUSE_FLAG_DOWN) /* 0x8000 */
+ xrdp_wm_mouse_click(self->pro_layer->wm, x, y, 2, 1);
+ else
+ xrdp_wm_mouse_click(self->pro_layer->wm, x, y, 2, 0);
+ }
return 0;
}
@@ -382,26 +421,27 @@ int xrdp_rdp_process_data_input(struct xrdp_rdp* self)
in_uint16_le(self->in_s, num_events);
in_uint8s(self->in_s, 2); /* pad */
+ DEBUG(("xrdp_rdp_process_data_input %d events\n\r", num_events))
for (index = 0; index < num_events; index++)
{
in_uint8s(self->in_s, 4); /* time */
in_uint16_le(self->in_s, msg_type);
in_uint16_le(self->in_s, device_flags);
- in_uint16_le(self->in_s, param1);
- in_uint16_le(self->in_s, param2);
+ in_sint16_le(self->in_s, param1);
+ in_sint16_le(self->in_s, param2);
switch (msg_type)
{
case RDP_INPUT_SYNCHRONIZE: /* 0 */
xrdp_rdp_process_input_sync(self, device_flags, param1);
break;
case RDP_INPUT_SCANCODE: /* 4 */
- xrdp_rdp_process_input_scancode(self, device_flags, param1, param2);
+ xrdp_rdp_process_input_scancode(self, device_flags, param1);
break;
case RDP_INPUT_MOUSE: /* 8001 */
xrdp_rdp_process_input_mouse(self, device_flags, param1, param2);
break;
default:
- g_printf("unknown in xrdp_rdp_process_data_input\n");
+ g_printf("unknown in xrdp_rdp_process_data_input\n\r");
break;
}
}
@@ -461,6 +501,21 @@ int xrdp_rdp_process_data_sync(struct xrdp_rdp* self)
/*****************************************************************************/
int xrdp_rdp_process_screen_update(struct xrdp_rdp* self)
{
+ int op;
+ int left;
+ int top;
+ int right;
+ int bottom;
+ struct xrdp_rect rect;
+
+ in_uint32_le(self->in_s, op);
+ in_uint16_le(self->in_s, left);
+ in_uint16_le(self->in_s, top);
+ in_uint16_le(self->in_s, right);
+ in_uint16_le(self->in_s, bottom);
+ xrdp_wm_rect(&rect, left, top, (right - left) + 1, (bottom - top) + 1);
+ if (self->up_and_running && self->pro_layer->wm != 0)
+ xrdp_bitmap_invalidate(self->pro_layer->wm->screen, &rect);
return 0;
}
@@ -489,6 +544,7 @@ int xrdp_rdp_process_data_font(struct xrdp_rdp* self)
if (seq == 2 || seq == 3) /* after second font message, we are up and */
{ /* running */
xrdp_rdp_send_unknown1(self);
+ self->up_and_running = 1;
}
return 0;
}
@@ -507,7 +563,7 @@ int xrdp_rdp_process_data(struct xrdp_rdp* self)
in_uint8(self->in_s, data_type);
in_uint8(self->in_s, ctype);
in_uint16_le(self->in_s, clen);
- DEBUG(("xrdp_rdp_process_data code %d\n", data_type));
+ DEBUG(("xrdp_rdp_process_data code %d\n\r", data_type));
switch (data_type)
{
case RDP_DATA_PDU_POINTER: /* 27 */
@@ -525,15 +581,24 @@ int xrdp_rdp_process_data(struct xrdp_rdp* self)
case 33: /* 33 ?? */
xrdp_rdp_process_screen_update(self);
break;
- case 36: /* 36 ?? */
+
+ //case 35: /* 35 ?? this comes when minimuzing a full screen mstsc.exe 2600 */
+
+ case 36: /* 36 ?? disconnect? */
return 1;
break;
case RDP_DATA_PDU_FONT2: /* 39 */
xrdp_rdp_process_data_font(self);
break;
default:
- g_printf("unknown in xrdp_rdp_process_data\n");
+ g_printf("unknown in xrdp_rdp_process_data %d\n\r", data_type);
break;
}
return 0;
}
+
+/*****************************************************************************/
+int xrdp_rdp_disconnect(struct xrdp_rdp* self)
+{
+ return xrdp_sec_disconnect(self->sec_layer);
+}