return server_sock;
}
+void handle_input_pdu(STREAM s)
+{
+ uint32 time;
+ uint16 message_type, device_flags, param1, param2;
+ uint16 num_events;
+ int i;
+
+ in_uint16_le(s, num_events); // number of events
+ in_uint8s(s, 2); // pad
+
+ for (i = 0; i < num_events; ++i) {
+ rdp_recv_input(s, &time, &message_type, &device_flags, ¶m1, ¶m2);
+ printf("Input event at time %u\n", time);
+
+ switch (message_type) {
+ case RDP_INPUT_SYNCHRONIZE:
+ printf("- Type: Synchronize (ignored)\n");
+ break;
+ case RDP_INPUT_CODEPOINT:
+ printf("- Type: Codepoint (ignored)\n");
+ break;
+ case RDP_INPUT_VIRTKEY:
+ printf("- Type: Virtual key (ignored)\n");
+ break;
+ case RDP_INPUT_SCANCODE:
+ printf("- Type: Scancode (ignored)\n");
+ break;
+ case RDP_INPUT_MOUSE:
+ printf("- Type: Mouse\n");
+ printf("- Device flags: %x\n", device_flags);
+ printf("- Position: (%u,%u)\n", param1, param2);
+
+ // debug
+ rdp_send_bitmap_update(param1, param2);
+
+ break;
+ default:
+ printf("- Unknown type %x\n", message_type);
+ break;
+ }
+ printf("\n");
+ }
+}
int serve_client()
{
mcs_send_connect_response();
for ( ;; ) {
- uint8 type;
+ uint8 type, data_pdu_type;
STREAM s;
while ((s = rdp_recv(&type)) != NULL) {
- printf("RDP packet! type %u\n", type);
+ if (type != RDP_PDU_DATA) {
+ printf("Unknown RDP packet of type %u\n", type);
+ continue;
+ }
+
+ in_uint8s(s, 8); /* shareid, pad, streamid, length */
+ in_uint8(s, data_pdu_type);
+ in_uint8s(s, 3); /* compress_type, compress_len */
+
+ switch (data_pdu_type) {
+ case RDP_DATA_PDU_INPUT:
+ printf("Input PDU\n");
+ handle_input_pdu(s);
+ break;
+ default:
+ printf("Unknown data PDU type %u\n", data_pdu_type);
+ };
}
}
}