/[rdesktop]/sourceforge.net/trunk/rdesktop/rdp.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /sourceforge.net/trunk/rdesktop/rdp.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 30 - (show annotations)
Fri Sep 14 13:51:38 2001 UTC (22 years, 8 months ago) by matty
File MIME type: text/plain
File size: 16812 byte(s)
Portability fixes, including elimination of variable argument macros.
Rudimentary configure script.
Miscellaneous cleanups.

1 /*
2 rdesktop: A Remote Desktop Protocol client.
3 Protocol services - RDP layer
4 Copyright (C) Matthew Chapman 1999-2001
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20
21 #include "rdesktop.h"
22
23 extern uint16 mcs_userid;
24 extern char username[16];
25 extern BOOL bitmap_compression;
26 extern BOOL orders;
27 extern BOOL encryption;
28 extern BOOL desktop_save;
29
30 uint8 *next_packet;
31 uint32 rdp_shareid;
32
33 /* Initialise an RDP packet */
34 static STREAM
35 rdp_init(int maxlen)
36 {
37 STREAM s;
38
39 s = sec_init(encryption ? SEC_ENCRYPT : 0, maxlen + 6);
40 s_push_layer(s, rdp_hdr, 6);
41
42 return s;
43 }
44
45 /* Send an RDP packet */
46 static void
47 rdp_send(STREAM s, uint8 pdu_type)
48 {
49 uint16 length;
50
51 s_pop_layer(s, rdp_hdr);
52 length = s->end - s->p;
53
54 out_uint16_le(s, length);
55 out_uint16_le(s, (pdu_type | 0x10)); /* Version 1 */
56 out_uint16_le(s, (mcs_userid + 1001));
57
58 sec_send(s, encryption ? SEC_ENCRYPT : 0);
59 }
60
61 /* Receive an RDP packet */
62 static STREAM
63 rdp_recv(uint8 *type)
64 {
65 static STREAM rdp_s;
66 uint16 length, pdu_type;
67
68 if ((rdp_s == NULL) || (next_packet >= rdp_s->end))
69 {
70 rdp_s = sec_recv();
71 if (rdp_s == NULL)
72 return NULL;
73
74 next_packet = rdp_s->p;
75 }
76 else
77 {
78 rdp_s->p = next_packet;
79 }
80
81 in_uint16_le(rdp_s, length);
82 in_uint16_le(rdp_s, pdu_type);
83 in_uint8s(rdp_s, 2); /* userid */
84 *type = pdu_type & 0xf;
85
86 #if WITH_DEBUG
87 DEBUG(("RDP packet (type %x):\n", *type));
88 hexdump(next_packet, length);
89 #endif /* */
90
91 next_packet += length;
92 return rdp_s;
93 }
94
95 /* Initialise an RDP data packet */
96 static STREAM
97 rdp_init_data(int maxlen)
98 {
99 STREAM s;
100
101 s = sec_init(encryption ? SEC_ENCRYPT : 0, maxlen + 18);
102 s_push_layer(s, rdp_hdr, 18);
103
104 return s;
105 }
106
107 /* Send an RDP data packet */
108 static void
109 rdp_send_data(STREAM s, uint8 data_pdu_type)
110 {
111 uint16 length;
112
113 s_pop_layer(s, rdp_hdr);
114 length = s->end - s->p;
115
116 out_uint16_le(s, length);
117 out_uint16_le(s, (RDP_PDU_DATA | 0x10));
118 out_uint16_le(s, (mcs_userid + 1001));
119
120 out_uint32_le(s, rdp_shareid);
121 out_uint8(s, 0); /* pad */
122 out_uint8(s, 1); /* streamid */
123 out_uint16(s, (length - 14));
124 out_uint8(s, data_pdu_type);
125 out_uint8(s, 0); /* compress_type */
126 out_uint16(s, 0); /* compress_len */
127
128 sec_send(s, encryption ? SEC_ENCRYPT : 0);
129 }
130
131 /* Output a string in Unicode */
132 void
133 rdp_out_unistr(STREAM s, char *string, int len)
134 {
135 int i = 0, j = 0;
136
137 len += 2;
138
139 while (i < len)
140 {
141 s->p[i++] = string[j++];
142 s->p[i++] = 0;
143 }
144
145 s->p += len;
146 }
147
148 /* Parse a logon info packet */
149 static void
150 rdp_send_logon_info(uint32 flags, char *domain, char *user,
151 char *password, char *program, char *directory)
152 {
153 int len_domain = 2 * strlen(domain);
154 int len_user = 2 * strlen(user);
155 int len_password = 2 * strlen(password);
156 int len_program = 2 * strlen(program);
157 int len_directory = 2 * strlen(directory);
158 uint32 sec_flags = encryption ? (SEC_LOGON_INFO | SEC_ENCRYPT)
159 : SEC_LOGON_INFO;
160 STREAM s;
161
162 s = sec_init(sec_flags, 18 + len_domain + len_user + len_password
163 + len_program + len_directory + 10);
164
165 out_uint32(s, 0);
166 out_uint32_le(s, flags);
167 out_uint16_le(s, len_domain);
168 out_uint16_le(s, len_user);
169 out_uint16_le(s, len_password);
170 out_uint16_le(s, len_program);
171 out_uint16_le(s, len_directory);
172 rdp_out_unistr(s, domain, len_domain);
173 rdp_out_unistr(s, user, len_user);
174 rdp_out_unistr(s, password, len_password);
175 rdp_out_unistr(s, program, len_program);
176 rdp_out_unistr(s, directory, len_directory);
177
178 s_mark_end(s);
179 sec_send(s, sec_flags);
180 }
181
182 /* Send a control PDU */
183 static void
184 rdp_send_control(uint16 action)
185 {
186 STREAM s;
187
188 s = rdp_init_data(8);
189
190 out_uint16_le(s, action);
191 out_uint16(s, 0); /* userid */
192 out_uint32(s, 0); /* control id */
193
194 s_mark_end(s);
195 rdp_send_data(s, RDP_DATA_PDU_CONTROL);
196 }
197
198 /* Send a synchronisation PDU */
199 static void
200 rdp_send_synchronise()
201 {
202 STREAM s;
203
204 s = rdp_init_data(4);
205
206 out_uint16_le(s, 1); /* type */
207 out_uint16_le(s, 1002);
208
209 s_mark_end(s);
210 rdp_send_data(s, RDP_DATA_PDU_SYNCHRONISE);
211 }
212
213 /* Send a single input event */
214 void
215 rdp_send_input(uint32 time, uint16 message_type, uint16 device_flags,
216 uint16 param1, uint16 param2)
217 {
218 STREAM s;
219
220 s = rdp_init_data(16);
221
222 out_uint16_le(s, 1); /* number of events */
223 out_uint16(s, 0); /* pad */
224
225 out_uint32_le(s, time);
226 out_uint16_le(s, message_type);
227 out_uint16_le(s, device_flags);
228 out_uint16_le(s, param1);
229 out_uint16_le(s, param2);
230
231 s_mark_end(s);
232 rdp_send_data(s, RDP_DATA_PDU_INPUT);
233 }
234
235 /* Send an (empty) font information PDU */
236 static void
237 rdp_send_fonts(uint16 seq)
238 {
239 STREAM s;
240
241 s = rdp_init_data(8);
242
243 out_uint16(s, 0); /* number of fonts */
244 out_uint16_le(s, 0x3e); /* unknown */
245 out_uint16_le(s, seq); /* unknown */
246 out_uint16_le(s, 0x32); /* entry size */
247
248 s_mark_end(s);
249 rdp_send_data(s, RDP_DATA_PDU_FONT2);
250 }
251
252 /* Output general capability set */
253 static void
254 rdp_out_general_caps(STREAM s)
255 {
256 out_uint16_le(s, RDP_CAPSET_GENERAL);
257 out_uint16_le(s, RDP_CAPLEN_GENERAL);
258
259 out_uint16_le(s, 1); /* OS major type */
260 out_uint16_le(s, 3); /* OS minor type */
261 out_uint16_le(s, 0x200); /* Protocol version */
262 out_uint16(s, 0); /* Pad */
263 out_uint16(s, 0); /* Compression types */
264 out_uint16(s, 0); /* Pad */
265 out_uint16(s, 0); /* Update capability */
266 out_uint16(s, 0); /* Remote unshare capability */
267 out_uint16(s, 0); /* Compression level */
268 out_uint16(s, 0); /* Pad */
269 }
270
271 /* Output bitmap capability set */
272 static void
273 rdp_out_bitmap_caps(STREAM s)
274 {
275 out_uint16_le(s, RDP_CAPSET_BITMAP);
276 out_uint16_le(s, RDP_CAPLEN_BITMAP);
277
278 out_uint16_le(s, 8); /* Preferred BPP */
279 out_uint16(s, 1); /* Receive 1 BPP */
280 out_uint16(s, 1); /* Receive 4 BPP */
281 out_uint16_le(s, 1); /* Receive 8 BPP */
282 out_uint16_le(s, 800); /* Desktop width */
283 out_uint16_le(s, 600); /* Desktop height */
284 out_uint16(s, 0); /* Pad */
285 out_uint16(s, 0); /* Allow resize */
286 out_uint16_le(s, bitmap_compression ? 1 : 0); /* Support compression */
287 out_uint16(s, 0); /* Unknown */
288 out_uint16_le(s, 1); /* Unknown */
289 out_uint16(s, 0); /* Pad */
290 }
291
292 /* Output order capability set */
293 static void
294 rdp_out_order_caps(STREAM s)
295 {
296 uint8 order_caps[32];
297
298
299 memset(order_caps, 0, 32);
300 order_caps[0] = 1; /* dest blt */
301 order_caps[1] = 1; /* pat blt */
302 order_caps[2] = 1; /* screen blt */
303 order_caps[8] = 1; /* line */
304 order_caps[9] = 1; /* line */
305 order_caps[10] = 1; /* rect */
306 order_caps[11] = (desktop_save == False ? 0 : 1); /* desksave */
307 order_caps[13] = 1; /* memblt */
308 order_caps[14] = 1; /* triblt */
309 order_caps[22] = 1; /* polyline */
310 order_caps[27] = 1; /* text2 */
311 out_uint16_le(s, RDP_CAPSET_ORDER);
312 out_uint16_le(s, RDP_CAPLEN_ORDER);
313
314 out_uint8s(s, 20); /* Terminal desc, pad */
315 out_uint16_le(s, 1); /* Cache X granularity */
316 out_uint16_le(s, 20); /* Cache Y granularity */
317 out_uint16(s, 0); /* Pad */
318 out_uint16_le(s, 1); /* Max order level */
319 out_uint16_le(s, 0x147); /* Number of fonts */
320 out_uint16_le(s, 0x2a); /* Capability flags */
321 out_uint8p(s, order_caps, 32); /* Orders supported */
322 out_uint16_le(s, 0x6a1); /* Text capability flags */
323 out_uint8s(s, 6); /* Pad */
324 out_uint32(s, desktop_save == False ? 0 : 0x38400); /* Desktop cache size */
325 out_uint32(s, 0); /* Unknown */
326 out_uint32(s, 0x4e4); /* Unknown */
327 }
328
329 /* Output bitmap cache capability set */
330 static void
331 rdp_out_bmpcache_caps(STREAM s)
332 {
333 out_uint16_le(s, RDP_CAPSET_BMPCACHE);
334 out_uint16_le(s, RDP_CAPLEN_BMPCACHE);
335
336 out_uint8s(s, 24); /* unused */
337 out_uint16_le(s, 0x258); /* entries */
338 out_uint16_le(s, 0x100); /* max cell size */
339 out_uint16_le(s, 0x12c); /* entries */
340 out_uint16_le(s, 0x400); /* max cell size */
341 out_uint16_le(s, 0x106); /* entries */
342 out_uint16_le(s, 0x1000); /* max cell size */
343 }
344
345 /* Output control capability set */
346 static void
347 rdp_out_control_caps(STREAM s)
348 {
349 out_uint16_le(s, RDP_CAPSET_CONTROL);
350 out_uint16_le(s, RDP_CAPLEN_CONTROL);
351
352 out_uint16(s, 0); /* Control capabilities */
353 out_uint16(s, 0); /* Remote detach */
354 out_uint16_le(s, 2); /* Control interest */
355 out_uint16_le(s, 2); /* Detach interest */
356 }
357
358 /* Output activation capability set */
359 static void
360 rdp_out_activate_caps(STREAM s)
361 {
362 out_uint16_le(s, RDP_CAPSET_ACTIVATE);
363 out_uint16_le(s, RDP_CAPLEN_ACTIVATE);
364
365 out_uint16(s, 0); /* Help key */
366 out_uint16(s, 0); /* Help index key */
367 out_uint16(s, 0); /* Extended help key */
368 out_uint16(s, 0); /* Window activate */
369 }
370
371 /* Output pointer capability set */
372 static void
373 rdp_out_pointer_caps(STREAM s)
374 {
375 out_uint16_le(s, RDP_CAPSET_POINTER);
376 out_uint16_le(s, RDP_CAPLEN_POINTER);
377
378 out_uint16(s, 0); /* Colour pointer */
379 out_uint16_le(s, 20); /* Cache size */
380 }
381
382 /* Output share capability set */
383 static void
384 rdp_out_share_caps(STREAM s)
385 {
386 out_uint16_le(s, RDP_CAPSET_SHARE);
387 out_uint16_le(s, RDP_CAPLEN_SHARE);
388
389 out_uint16(s, 0); /* userid */
390 out_uint16(s, 0); /* pad */
391 }
392
393 /* Output colour cache capability set */
394 static void
395 rdp_out_colcache_caps(STREAM s)
396 {
397 out_uint16_le(s, RDP_CAPSET_COLCACHE);
398 out_uint16_le(s, RDP_CAPLEN_COLCACHE);
399
400 out_uint16_le(s, 6); /* cache size */
401 out_uint16(s, 0); /* pad */
402 }
403
404 static uint8 canned_caps[] = {
405 0x01, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x04,
406 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
407 0x00, 0x00, 0x00, 0x00, 0x00,
408 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
409 0x00, 0x00, 0x00, 0x00, 0x00,
410 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
411 0x00, 0x00, 0x00, 0x00, 0x00,
412 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
413 0x00, 0x00, 0x00, 0x00, 0x00,
414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
415 0x0C, 0x00, 0x08, 0x00, 0x01,
416 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00,
417 0x10, 0x00, 0x34, 0x00, 0xFE,
418 0x00, 0x04, 0x00, 0xFE, 0x00, 0x04, 0x00, 0xFE, 0x00, 0x08, 0x00,
419 0xFE, 0x00, 0x08, 0x00, 0xFE,
420 0x00, 0x10, 0x00, 0xFE, 0x00, 0x20, 0x00, 0xFE, 0x00, 0x40, 0x00,
421 0xFE, 0x00, 0x80, 0x00, 0xFE,
422 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01,
423 0x02, 0x00, 0x00, 0x00
424 };
425
426 /* Output unknown capability set */
427 static void
428 rdp_out_unknown_caps(STREAM s)
429 {
430 out_uint16_le(s, RDP_CAPSET_UNKNOWN);
431 out_uint16_le(s, 0x58);
432
433 out_uint8p(s, canned_caps, RDP_CAPLEN_UNKNOWN - 4);
434 }
435
436 /* Send a confirm active PDU */
437 static void
438 rdp_send_confirm_active()
439 {
440 STREAM s;
441 uint16 caplen =
442 RDP_CAPLEN_GENERAL + RDP_CAPLEN_BITMAP + RDP_CAPLEN_ORDER +
443 RDP_CAPLEN_BMPCACHE + RDP_CAPLEN_COLCACHE +
444 RDP_CAPLEN_ACTIVATE + RDP_CAPLEN_CONTROL +
445 RDP_CAPLEN_POINTER + RDP_CAPLEN_SHARE + RDP_CAPLEN_UNKNOWN
446 + 4 /* w2k fix, why? */;
447
448 s = rdp_init(14 + caplen + sizeof(RDP_SOURCE));
449
450 out_uint32_le(s, rdp_shareid);
451 out_uint16_le(s, 0x3ea); /* userid */
452 out_uint16_le(s, sizeof(RDP_SOURCE));
453 out_uint16_le(s, caplen);
454
455 out_uint8p(s, RDP_SOURCE, sizeof(RDP_SOURCE));
456 out_uint16_le(s, 0xd); /* num_caps */
457 out_uint8s(s, 2); /* pad */
458
459 rdp_out_general_caps(s);
460 rdp_out_bitmap_caps(s);
461 rdp_out_order_caps(s);
462 rdp_out_bmpcache_caps(s);
463 rdp_out_colcache_caps(s);
464 rdp_out_activate_caps(s);
465 rdp_out_control_caps(s);
466 rdp_out_pointer_caps(s);
467 rdp_out_share_caps(s);
468 rdp_out_unknown_caps(s);
469
470 s_mark_end(s);
471 rdp_send(s, RDP_PDU_CONFIRM_ACTIVE);
472 }
473
474 /* Respond to a demand active PDU */
475 static void
476 process_demand_active(STREAM s)
477 {
478 uint8 type;
479
480 in_uint32_le(s, rdp_shareid);
481
482 DEBUG(("DEMAND_ACTIVE(id=0x%x)\n", rdp_shareid));
483
484 rdp_send_confirm_active();
485 rdp_send_synchronise();
486 rdp_send_control(RDP_CTL_COOPERATE);
487 rdp_send_control(RDP_CTL_REQUEST_CONTROL);
488 rdp_recv(&type); /* RDP_PDU_SYNCHRONIZE */
489 rdp_recv(&type); /* RDP_CTL_COOPERATE */
490 rdp_recv(&type); /* RDP_CTL_GRANT_CONTROL */
491 rdp_send_input(0, RDP_INPUT_SYNCHRONIZE, 0, 0, 0);
492 rdp_send_fonts(1);
493 rdp_send_fonts(2);
494 rdp_recv(&type); /* RDP_PDU_UNKNOWN 0x28 */
495 reset_order_state();
496 }
497
498 /* Process a pointer PDU */
499 static void
500 process_pointer_pdu(STREAM s)
501 {
502 uint16 message_type;
503 uint16 x, y, width, height, cache_idx, masklen, datalen;
504 uint8 *mask, *data;
505 HCURSOR cursor;
506
507 in_uint16_le(s, message_type);
508 in_uint8s(s, 2); /* pad */
509
510 switch (message_type)
511 {
512 case RDP_POINTER_MOVE:
513 in_uint16_le(s, x);
514 in_uint16_le(s, y);
515 if (s_check(s))
516 ui_move_pointer(x, y);
517 break;
518
519 case RDP_POINTER_COLOR:
520 in_uint16_le(s, cache_idx);
521 in_uint16_le(s, x);
522 in_uint16_le(s, y);
523 in_uint16_le(s, width);
524 in_uint16_le(s, height);
525 in_uint16_le(s, masklen);
526 in_uint16_le(s, datalen);
527 in_uint8p(s, data, datalen);
528 in_uint8p(s, mask, masklen);
529 cursor = ui_create_cursor(x, y, width, height, mask,
530 data);
531 ui_set_cursor(cursor);
532 cache_put_cursor(cache_idx, cursor);
533 break;
534
535 case RDP_POINTER_CACHED:
536 in_uint16_le(s, cache_idx);
537 ui_set_cursor(cache_get_cursor(cache_idx));
538 break;
539
540 default:
541 DEBUG(("Pointer message 0x%x\n", message_type));
542 }
543 }
544
545 /* Process bitmap updates */
546 static void
547 process_bitmap_updates(STREAM s)
548 {
549 uint16 num_updates;
550 uint16 left, top, right, bottom, width, height;
551 uint16 cx, cy, bpp, compress, bufsize, size;
552 uint8 *data, *bmpdata;
553 int i;
554
555 in_uint16_le(s, num_updates);
556
557 for (i = 0; i < num_updates; i++)
558 {
559 in_uint16_le(s, left);
560 in_uint16_le(s, top);
561 in_uint16_le(s, right);
562 in_uint16_le(s, bottom);
563 in_uint16_le(s, width);
564 in_uint16_le(s, height);
565 in_uint16_le(s, bpp);
566 in_uint16_le(s, compress);
567 in_uint16_le(s, bufsize);
568
569 cx = right - left + 1;
570 cy = bottom - top + 1;
571
572 DEBUG(("UPDATE(l=%d,t=%d,r=%d,b=%d,w=%d,h=%d,cmp=%d)\n",
573 left, top, right, bottom, width, height, compress));
574
575 if (!compress)
576 {
577 int y;
578 bmpdata = xmalloc(width * height);
579 for (y = 0; y < height; y++)
580 {
581 in_uint8a(s,
582 &bmpdata[(height - y - 1) * width],
583 width);
584 }
585 ui_paint_bitmap(left, top, cx, cy, width, height,
586 bmpdata);
587 xfree(bmpdata);
588 continue;
589 }
590
591 in_uint8s(s, 2); /* pad */
592 in_uint16_le(s, size);
593 in_uint8s(s, 4); /* line_size, final_size */
594 in_uint8p(s, data, size);
595
596 bmpdata = xmalloc(width * height);
597 if (bitmap_decompress(bmpdata, width, height, data, size))
598 {
599 ui_paint_bitmap(left, top, cx, cy, width, height,
600 bmpdata);
601 }
602
603 xfree(bmpdata);
604 }
605 }
606
607 /* Process a palette update */
608 static void
609 process_palette(STREAM s)
610 {
611 HCOLOURMAP hmap;
612 COLOURMAP map;
613 uint8 *colours;
614
615 in_uint8s(s, 2); /* pad */
616 in_uint16_le(s, map.ncolours);
617 in_uint8s(s, 2); /* pad */
618 in_uint8p(s, colours, (map.ncolours * 3));
619 map.colours = (COLOURENTRY *)colours;
620
621 hmap = ui_create_colourmap(&map);
622 ui_set_colourmap(hmap);
623 }
624
625 /* Process an update PDU */
626 static void
627 process_update_pdu(STREAM s)
628 {
629 uint16 update_type;
630
631 in_uint16_le(s, update_type);
632
633 switch (update_type)
634 {
635 case RDP_UPDATE_ORDERS:
636 process_orders(s);
637 break;
638
639 case RDP_UPDATE_BITMAP:
640 process_bitmap_updates(s);
641 break;
642
643 case RDP_UPDATE_PALETTE:
644 process_palette(s);
645 break;
646
647 case RDP_UPDATE_SYNCHRONIZE:
648 break;
649
650 default:
651 unimpl("update %d\n", update_type);
652 }
653
654 }
655
656 /* Process data PDU */
657 static void
658 process_data_pdu(STREAM s)
659 {
660 uint8 data_pdu_type;
661
662 in_uint8s(s, 8); /* shareid, pad, streamid, length */
663 in_uint8(s, data_pdu_type);
664 in_uint8s(s, 3); /* compress_type, compress_len */
665
666 switch (data_pdu_type)
667 {
668 case RDP_DATA_PDU_UPDATE:
669 process_update_pdu(s);
670 break;
671
672 case RDP_DATA_PDU_POINTER:
673 process_pointer_pdu(s);
674 break;
675
676 case RDP_DATA_PDU_BELL:
677 ui_bell();
678 break;
679
680 case RDP_DATA_PDU_LOGON:
681 /* User logged on */
682 break;
683
684 default:
685 unimpl("data PDU %d\n", data_pdu_type);
686 }
687 }
688
689 /* Process incoming packets */
690 void
691 rdp_main_loop()
692 {
693 uint8 type;
694 STREAM s;
695
696 while ((s = rdp_recv(&type)) != NULL)
697 {
698 switch (type)
699 {
700 case RDP_PDU_DEMAND_ACTIVE:
701 process_demand_active(s);
702 break;
703
704 case RDP_PDU_DEACTIVATE:
705 break;
706
707 case RDP_PDU_DATA:
708 process_data_pdu(s);
709 break;
710
711 default:
712 unimpl("PDU %d\n", type);
713 }
714 }
715 }
716
717 /* Establish a connection up to the RDP layer */
718 BOOL
719 rdp_connect(char *server, uint32 flags, char *domain, char *password,
720 char *command, char *directory)
721 {
722 if (!sec_connect(server))
723 return False;
724
725 rdp_send_logon_info(flags, domain, username, password,
726 command, directory);
727 return True;
728 }
729
730 /* Disconnect from the RDP layer */
731 void
732 rdp_disconnect()
733 {
734 sec_disconnect();
735 }

  ViewVC Help
Powered by ViewVC 1.1.26