/[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 161 - (show annotations)
Sun Sep 15 12:46:41 2002 UTC (21 years, 7 months ago) by matthewc
File MIME type: text/plain
File size: 16808 byte(s)
Reenable bitmap caching (inadvertantly disabled by a patch in 1.1.0)

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) : SEC_LOGON_INFO;
159 STREAM s;
160
161 s = sec_init(sec_flags, 18 + len_domain + len_user + len_password
162 + len_program + len_directory + 10);
163
164 out_uint32(s, 0);
165 out_uint32_le(s, flags);
166 out_uint16_le(s, len_domain);
167 out_uint16_le(s, len_user);
168 out_uint16_le(s, len_password);
169 out_uint16_le(s, len_program);
170 out_uint16_le(s, len_directory);
171 rdp_out_unistr(s, domain, len_domain);
172 rdp_out_unistr(s, user, len_user);
173 rdp_out_unistr(s, password, len_password);
174 rdp_out_unistr(s, program, len_program);
175 rdp_out_unistr(s, directory, len_directory);
176
177 s_mark_end(s);
178 sec_send(s, sec_flags);
179 }
180
181 /* Send a control PDU */
182 static void
183 rdp_send_control(uint16 action)
184 {
185 STREAM s;
186
187 s = rdp_init_data(8);
188
189 out_uint16_le(s, action);
190 out_uint16(s, 0); /* userid */
191 out_uint32(s, 0); /* control id */
192
193 s_mark_end(s);
194 rdp_send_data(s, RDP_DATA_PDU_CONTROL);
195 }
196
197 /* Send a synchronisation PDU */
198 static void
199 rdp_send_synchronise()
200 {
201 STREAM s;
202
203 s = rdp_init_data(4);
204
205 out_uint16_le(s, 1); /* type */
206 out_uint16_le(s, 1002);
207
208 s_mark_end(s);
209 rdp_send_data(s, RDP_DATA_PDU_SYNCHRONISE);
210 }
211
212 /* Send a single input event */
213 void
214 rdp_send_input(uint32 time, uint16 message_type, uint16 device_flags, uint16 param1, uint16 param2)
215 {
216 STREAM s;
217
218 s = rdp_init_data(16);
219
220 out_uint16_le(s, 1); /* number of events */
221 out_uint16(s, 0); /* pad */
222
223 out_uint32_le(s, time);
224 out_uint16_le(s, message_type);
225 out_uint16_le(s, device_flags);
226 out_uint16_le(s, param1);
227 out_uint16_le(s, param2);
228
229 s_mark_end(s);
230 rdp_send_data(s, RDP_DATA_PDU_INPUT);
231 }
232
233 /* Send an (empty) font information PDU */
234 static void
235 rdp_send_fonts(uint16 seq)
236 {
237 STREAM s;
238
239 s = rdp_init_data(8);
240
241 out_uint16(s, 0); /* number of fonts */
242 out_uint16_le(s, 0x3e); /* unknown */
243 out_uint16_le(s, seq); /* unknown */
244 out_uint16_le(s, 0x32); /* entry size */
245
246 s_mark_end(s);
247 rdp_send_data(s, RDP_DATA_PDU_FONT2);
248 }
249
250 /* Output general capability set */
251 static void
252 rdp_out_general_caps(STREAM s)
253 {
254 out_uint16_le(s, RDP_CAPSET_GENERAL);
255 out_uint16_le(s, RDP_CAPLEN_GENERAL);
256
257 out_uint16_le(s, 1); /* OS major type */
258 out_uint16_le(s, 3); /* OS minor type */
259 out_uint16_le(s, 0x200); /* Protocol version */
260 out_uint16(s, 0); /* Pad */
261 out_uint16(s, 0); /* Compression types */
262 out_uint16(s, 0); /* Pad */
263 out_uint16(s, 0); /* Update capability */
264 out_uint16(s, 0); /* Remote unshare capability */
265 out_uint16(s, 0); /* Compression level */
266 out_uint16(s, 0); /* Pad */
267 }
268
269 /* Output bitmap capability set */
270 static void
271 rdp_out_bitmap_caps(STREAM s)
272 {
273 out_uint16_le(s, RDP_CAPSET_BITMAP);
274 out_uint16_le(s, RDP_CAPLEN_BITMAP);
275
276 out_uint16_le(s, 8); /* Preferred BPP */
277 out_uint16(s, 1); /* Receive 1 BPP */
278 out_uint16(s, 1); /* Receive 4 BPP */
279 out_uint16_le(s, 1); /* Receive 8 BPP */
280 out_uint16_le(s, 800); /* Desktop width */
281 out_uint16_le(s, 600); /* Desktop height */
282 out_uint16(s, 0); /* Pad */
283 out_uint16(s, 0); /* Allow resize */
284 out_uint16_le(s, bitmap_compression ? 1 : 0); /* Support compression */
285 out_uint16(s, 0); /* Unknown */
286 out_uint16_le(s, 1); /* Unknown */
287 out_uint16(s, 0); /* Pad */
288 }
289
290 /* Output order capability set */
291 static void
292 rdp_out_order_caps(STREAM s)
293 {
294 uint8 order_caps[32];
295
296
297 memset(order_caps, 0, 32);
298 order_caps[0] = 1; /* dest blt */
299 order_caps[1] = 1; /* pat blt */
300 order_caps[2] = 1; /* screen blt */
301 order_caps[3] = 1; /* required for memblt? */
302 order_caps[8] = 1; /* line */
303 order_caps[9] = 1; /* line */
304 order_caps[10] = 1; /* rect */
305 order_caps[11] = (desktop_save == False ? 0 : 1); /* desksave */
306 order_caps[13] = 1; /* memblt */
307 order_caps[14] = 1; /* triblt */
308 order_caps[22] = 1; /* polyline */
309 order_caps[27] = 1; /* text2 */
310 out_uint16_le(s, RDP_CAPSET_ORDER);
311 out_uint16_le(s, RDP_CAPLEN_ORDER);
312
313 out_uint8s(s, 20); /* Terminal desc, pad */
314 out_uint16_le(s, 1); /* Cache X granularity */
315 out_uint16_le(s, 20); /* Cache Y granularity */
316 out_uint16(s, 0); /* Pad */
317 out_uint16_le(s, 1); /* Max order level */
318 out_uint16_le(s, 0x147); /* Number of fonts */
319 out_uint16_le(s, 0x2a); /* Capability flags */
320 out_uint8p(s, order_caps, 32); /* Orders supported */
321 out_uint16_le(s, 0x6a1); /* Text capability flags */
322 out_uint8s(s, 6); /* Pad */
323 out_uint32(s, desktop_save == False ? 0 : 0x38400); /* Desktop cache size */
324 out_uint32(s, 0); /* Unknown */
325 out_uint32(s, 0x4e4); /* Unknown */
326 }
327
328 /* Output bitmap cache capability set */
329 static void
330 rdp_out_bmpcache_caps(STREAM s)
331 {
332 out_uint16_le(s, RDP_CAPSET_BMPCACHE);
333 out_uint16_le(s, RDP_CAPLEN_BMPCACHE);
334
335 out_uint8s(s, 24); /* unused */
336 out_uint16_le(s, 0x258); /* entries */
337 out_uint16_le(s, 0x100); /* max cell size */
338 out_uint16_le(s, 0x12c); /* entries */
339 out_uint16_le(s, 0x400); /* max cell size */
340 out_uint16_le(s, 0x106); /* entries */
341 out_uint16_le(s, 0x1000); /* max cell size */
342 }
343
344 /* Output control capability set */
345 static void
346 rdp_out_control_caps(STREAM s)
347 {
348 out_uint16_le(s, RDP_CAPSET_CONTROL);
349 out_uint16_le(s, RDP_CAPLEN_CONTROL);
350
351 out_uint16(s, 0); /* Control capabilities */
352 out_uint16(s, 0); /* Remote detach */
353 out_uint16_le(s, 2); /* Control interest */
354 out_uint16_le(s, 2); /* Detach interest */
355 }
356
357 /* Output activation capability set */
358 static void
359 rdp_out_activate_caps(STREAM s)
360 {
361 out_uint16_le(s, RDP_CAPSET_ACTIVATE);
362 out_uint16_le(s, RDP_CAPLEN_ACTIVATE);
363
364 out_uint16(s, 0); /* Help key */
365 out_uint16(s, 0); /* Help index key */
366 out_uint16(s, 0); /* Extended help key */
367 out_uint16(s, 0); /* Window activate */
368 }
369
370 /* Output pointer capability set */
371 static void
372 rdp_out_pointer_caps(STREAM s)
373 {
374 out_uint16_le(s, RDP_CAPSET_POINTER);
375 out_uint16_le(s, RDP_CAPLEN_POINTER);
376
377 out_uint16(s, 0); /* Colour pointer */
378 out_uint16_le(s, 20); /* Cache size */
379 }
380
381 /* Output share capability set */
382 static void
383 rdp_out_share_caps(STREAM s)
384 {
385 out_uint16_le(s, RDP_CAPSET_SHARE);
386 out_uint16_le(s, RDP_CAPLEN_SHARE);
387
388 out_uint16(s, 0); /* userid */
389 out_uint16(s, 0); /* pad */
390 }
391
392 /* Output colour cache capability set */
393 static void
394 rdp_out_colcache_caps(STREAM s)
395 {
396 out_uint16_le(s, RDP_CAPSET_COLCACHE);
397 out_uint16_le(s, RDP_CAPLEN_COLCACHE);
398
399 out_uint16_le(s, 6); /* cache size */
400 out_uint16(s, 0); /* pad */
401 }
402
403 static uint8 canned_caps[] = {
404 0x01, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x04,
405 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
406 0x00, 0x00, 0x00, 0x00, 0x00,
407 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
408 0x00, 0x00, 0x00, 0x00, 0x00,
409 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
410 0x00, 0x00, 0x00, 0x00, 0x00,
411 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
412 0x00, 0x00, 0x00, 0x00, 0x00,
413 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
414 0x0C, 0x00, 0x08, 0x00, 0x01,
415 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00,
416 0x10, 0x00, 0x34, 0x00, 0xFE,
417 0x00, 0x04, 0x00, 0xFE, 0x00, 0x04, 0x00, 0xFE, 0x00, 0x08, 0x00,
418 0xFE, 0x00, 0x08, 0x00, 0xFE,
419 0x00, 0x10, 0x00, 0xFE, 0x00, 0x20, 0x00, 0xFE, 0x00, 0x40, 0x00,
420 0xFE, 0x00, 0x80, 0x00, 0xFE,
421 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01,
422 0x02, 0x00, 0x00, 0x00
423 };
424
425 /* Output unknown capability set */
426 static void
427 rdp_out_unknown_caps(STREAM s)
428 {
429 out_uint16_le(s, RDP_CAPSET_UNKNOWN);
430 out_uint16_le(s, 0x58);
431
432 out_uint8p(s, canned_caps, RDP_CAPLEN_UNKNOWN - 4);
433 }
434
435 /* Send a confirm active PDU */
436 static void
437 rdp_send_confirm_active()
438 {
439 STREAM s;
440 uint16 caplen =
441 RDP_CAPLEN_GENERAL + RDP_CAPLEN_BITMAP + RDP_CAPLEN_ORDER +
442 RDP_CAPLEN_BMPCACHE + RDP_CAPLEN_COLCACHE +
443 RDP_CAPLEN_ACTIVATE + RDP_CAPLEN_CONTROL +
444 RDP_CAPLEN_POINTER + RDP_CAPLEN_SHARE + RDP_CAPLEN_UNKNOWN + 4 /* w2k fix, why? */ ;
445
446 s = rdp_init(14 + caplen + sizeof(RDP_SOURCE));
447
448 out_uint32_le(s, rdp_shareid);
449 out_uint16_le(s, 0x3ea); /* userid */
450 out_uint16_le(s, sizeof(RDP_SOURCE));
451 out_uint16_le(s, caplen);
452
453 out_uint8p(s, RDP_SOURCE, sizeof(RDP_SOURCE));
454 out_uint16_le(s, 0xd); /* num_caps */
455 out_uint8s(s, 2); /* pad */
456
457 rdp_out_general_caps(s);
458 rdp_out_bitmap_caps(s);
459 rdp_out_order_caps(s);
460 rdp_out_bmpcache_caps(s);
461 rdp_out_colcache_caps(s);
462 rdp_out_activate_caps(s);
463 rdp_out_control_caps(s);
464 rdp_out_pointer_caps(s);
465 rdp_out_share_caps(s);
466 rdp_out_unknown_caps(s);
467
468 s_mark_end(s);
469 rdp_send(s, RDP_PDU_CONFIRM_ACTIVE);
470 }
471
472 /* Respond to a demand active PDU */
473 static void
474 process_demand_active(STREAM s)
475 {
476 uint8 type;
477
478 in_uint32_le(s, rdp_shareid);
479
480 DEBUG(("DEMAND_ACTIVE(id=0x%x)\n", rdp_shareid));
481
482 rdp_send_confirm_active();
483 rdp_send_synchronise();
484 rdp_send_control(RDP_CTL_COOPERATE);
485 rdp_send_control(RDP_CTL_REQUEST_CONTROL);
486 rdp_recv(&type); /* RDP_PDU_SYNCHRONIZE */
487 rdp_recv(&type); /* RDP_CTL_COOPERATE */
488 rdp_recv(&type); /* RDP_CTL_GRANT_CONTROL */
489 rdp_send_input(0, RDP_INPUT_SYNCHRONIZE, 0, 0, 0);
490 rdp_send_fonts(1);
491 rdp_send_fonts(2);
492 rdp_recv(&type); /* RDP_PDU_UNKNOWN 0x28 */
493 reset_order_state();
494 }
495
496 /* Process a pointer PDU */
497 static void
498 process_pointer_pdu(STREAM s)
499 {
500 uint16 message_type;
501 uint16 x, y, width, height, cache_idx, masklen, datalen;
502 uint8 *mask, *data;
503 HCURSOR cursor;
504
505 in_uint16_le(s, message_type);
506 in_uint8s(s, 2); /* pad */
507
508 switch (message_type)
509 {
510 case RDP_POINTER_MOVE:
511 in_uint16_le(s, x);
512 in_uint16_le(s, y);
513 if (s_check(s))
514 ui_move_pointer(x, y);
515 break;
516
517 case RDP_POINTER_COLOR:
518 in_uint16_le(s, cache_idx);
519 in_uint16_le(s, x);
520 in_uint16_le(s, y);
521 in_uint16_le(s, width);
522 in_uint16_le(s, height);
523 in_uint16_le(s, masklen);
524 in_uint16_le(s, datalen);
525 in_uint8p(s, data, datalen);
526 in_uint8p(s, mask, masklen);
527 cursor = ui_create_cursor(x, y, width, height, mask, data);
528 ui_set_cursor(cursor);
529 cache_put_cursor(cache_idx, cursor);
530 break;
531
532 case RDP_POINTER_CACHED:
533 in_uint16_le(s, cache_idx);
534 ui_set_cursor(cache_get_cursor(cache_idx));
535 break;
536
537 default:
538 DEBUG(("Pointer message 0x%x\n", message_type));
539 }
540 }
541
542 /* Process bitmap updates */
543 static void
544 process_bitmap_updates(STREAM s)
545 {
546 uint16 num_updates;
547 uint16 left, top, right, bottom, width, height;
548 uint16 cx, cy, bpp, compress, bufsize, size;
549 uint8 *data, *bmpdata;
550 int i;
551
552 in_uint16_le(s, num_updates);
553
554 for (i = 0; i < num_updates; i++)
555 {
556 in_uint16_le(s, left);
557 in_uint16_le(s, top);
558 in_uint16_le(s, right);
559 in_uint16_le(s, bottom);
560 in_uint16_le(s, width);
561 in_uint16_le(s, height);
562 in_uint16_le(s, bpp);
563 in_uint16_le(s, compress);
564 in_uint16_le(s, bufsize);
565
566 cx = right - left + 1;
567 cy = bottom - top + 1;
568
569 DEBUG(("UPDATE(l=%d,t=%d,r=%d,b=%d,w=%d,h=%d,cmp=%d)\n",
570 left, top, right, bottom, width, height, compress));
571
572 if (!compress)
573 {
574 int y;
575 bmpdata = xmalloc(width * height);
576 for (y = 0; y < height; y++)
577 {
578 in_uint8a(s, &bmpdata[(height - y - 1) * width], width);
579 }
580 ui_paint_bitmap(left, top, cx, cy, width, height, bmpdata);
581 xfree(bmpdata);
582 continue;
583 }
584
585 in_uint8s(s, 2); /* pad */
586 in_uint16_le(s, size);
587 in_uint8s(s, 4); /* line_size, final_size */
588 in_uint8p(s, data, size);
589
590 bmpdata = xmalloc(width * height);
591 if (bitmap_decompress(bmpdata, width, height, data, size))
592 {
593 ui_paint_bitmap(left, top, cx, cy, width, height, bmpdata);
594 }
595
596 xfree(bmpdata);
597 }
598 }
599
600 /* Process a palette update */
601 static void
602 process_palette(STREAM s)
603 {
604 HCOLOURMAP hmap;
605 COLOURMAP map;
606 uint8 *colours;
607
608 in_uint8s(s, 2); /* pad */
609 in_uint16_le(s, map.ncolours);
610 in_uint8s(s, 2); /* pad */
611 in_uint8p(s, colours, (map.ncolours * 3));
612 map.colours = (COLOURENTRY *) colours;
613
614 hmap = ui_create_colourmap(&map);
615 ui_set_colourmap(hmap);
616 }
617
618 /* Process an update PDU */
619 static void
620 process_update_pdu(STREAM s)
621 {
622 uint16 update_type;
623
624 in_uint16_le(s, update_type);
625
626 switch (update_type)
627 {
628 case RDP_UPDATE_ORDERS:
629 process_orders(s);
630 break;
631
632 case RDP_UPDATE_BITMAP:
633 process_bitmap_updates(s);
634 break;
635
636 case RDP_UPDATE_PALETTE:
637 process_palette(s);
638 break;
639
640 case RDP_UPDATE_SYNCHRONIZE:
641 break;
642
643 default:
644 unimpl("update %d\n", update_type);
645 }
646
647 }
648
649 /* Process data PDU */
650 static void
651 process_data_pdu(STREAM s)
652 {
653 uint8 data_pdu_type;
654
655 in_uint8s(s, 8); /* shareid, pad, streamid, length */
656 in_uint8(s, data_pdu_type);
657 in_uint8s(s, 3); /* compress_type, compress_len */
658
659 switch (data_pdu_type)
660 {
661 case RDP_DATA_PDU_UPDATE:
662 process_update_pdu(s);
663 break;
664
665 case RDP_DATA_PDU_POINTER:
666 process_pointer_pdu(s);
667 break;
668
669 case RDP_DATA_PDU_BELL:
670 ui_bell();
671 break;
672
673 case RDP_DATA_PDU_LOGON:
674 /* User logged on */
675 break;
676
677 default:
678 unimpl("data PDU %d\n", data_pdu_type);
679 }
680 }
681
682 /* Process incoming packets */
683 void
684 rdp_main_loop()
685 {
686 uint8 type;
687 STREAM s;
688
689 while ((s = rdp_recv(&type)) != NULL)
690 {
691 switch (type)
692 {
693 case RDP_PDU_DEMAND_ACTIVE:
694 process_demand_active(s);
695 break;
696
697 case RDP_PDU_DEACTIVATE:
698 break;
699
700 case RDP_PDU_DATA:
701 process_data_pdu(s);
702 break;
703
704 default:
705 unimpl("PDU %d\n", type);
706 }
707 }
708 }
709
710 /* Establish a connection up to the RDP layer */
711 BOOL
712 rdp_connect(char *server, uint32 flags, char *domain, char *password,
713 char *command, char *directory)
714 {
715 if (!sec_connect(server))
716 return False;
717
718 rdp_send_logon_info(flags, domain, username, password, command, directory);
719 return True;
720 }
721
722 /* Disconnect from the RDP layer */
723 void
724 rdp_disconnect()
725 {
726 sec_disconnect();
727 }

  ViewVC Help
Powered by ViewVC 1.1.26