/[rdesktop]/sourceforge.net/trunk/rdesktop/rdp5.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

Annotation of /sourceforge.net/trunk/rdesktop/rdp5.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 889 - (hide annotations)
Sun Apr 17 23:14:20 2005 UTC (19 years, 1 month ago) by jdmeijer
File MIME type: text/plain
File size: 3026 byte(s)
Add alternative mppc decompression code with 64kB history buffer from Vahur Sinijärv, and reenable rdp5 (persistent) bitmap cache 2 (64x64)

1 forsberg 343 /* -*- c-basic-offset: 8 -*-
2     rdesktop: A Remote Desktop Protocol client.
3     Protocol services - Multipoint Communications Service
4 stargo 828 Copyright (C) Matthew Chapman 1999-2005
5 forsberg 343 Copyright (C) Erik Forsberg 2003
6 jsorg71 713
7 forsberg 343 This program is free software; you can redistribute it and/or modify
8     it under the terms of the GNU General Public License as published by
9     the Free Software Foundation; either version 2 of the License, or
10     (at your option) any later version.
11 jsorg71 713
12 forsberg 343 This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     GNU General Public License for more details.
16 jsorg71 713
17 forsberg 343 You should have received a copy of the GNU General Public License
18     along with this program; if not, write to the Free Software
19     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20     */
21    
22     #include "rdesktop.h"
23    
24 jsorg71 438 extern uint8 *g_next_packet;
25 forsberg 343
26 n-ki 687 extern RDPCOMP g_mppc_dict;
27    
28 forsberg 343 void
29 jsorg71 733 rdp5_process(STREAM s)
30 forsberg 343 {
31 forsberg 428 uint16 length, count, x, y;
32 n-ki 687 uint8 type, ctype;
33 forsberg 343 uint8 *next;
34    
35 n-ki 687 uint32 roff, rlen;
36     struct stream *ns = &(g_mppc_dict.ns);
37     struct stream *ts;
38    
39 forsberg 343 #if 0
40     printf("RDP5 data:\n");
41     hexdump(s->p, s->end - s->p);
42     #endif
43    
44 jsorg71 713 ui_begin_update();
45 forsberg 343 while (s->p < s->end)
46     {
47     in_uint8(s, type);
48 jdmeijer 889 if (type & RDP5_COMPRESSED)
49 n-ki 687 {
50     in_uint8(s, ctype);
51     in_uint16_le(s, length);
52 jdmeijer 889 type ^= RDP5_COMPRESSED;
53 n-ki 687 }
54     else
55     {
56     ctype = 0;
57     in_uint16_le(s, length);
58     }
59 jsorg71 438 g_next_packet = next = s->p + length;
60 forsberg 343
61 n-ki 687 if (ctype & RDP_MPPC_COMPRESSED)
62     {
63     if (mppc_expand(s->p, length, ctype, &roff, &rlen) == -1)
64     error("error while decompressing packet\n");
65    
66     /* allocate memory and copy the uncompressed data into the temporary stream */
67 jsorg71 711 ns->data = (uint8 *) xrealloc(ns->data, rlen);
68 n-ki 687
69     memcpy((ns->data), (unsigned char *) (g_mppc_dict.hist + roff), rlen);
70    
71     ns->size = rlen;
72     ns->end = (ns->data + ns->size);
73     ns->p = ns->data;
74     ns->rdp_hdr = ns->p;
75    
76     ts = ns;
77     }
78     else
79     ts = s;
80    
81 forsberg 343 switch (type)
82     {
83 astrand 435 /* Thanks to Jeroen Meijer <jdmeijer at yahoo
84     dot com> for finding out the meaning of
85     most of the opcodes here. Especially opcode
86     8! :) */
87 forsberg 343 case 0: /* orders */
88 n-ki 687 in_uint16_le(ts, count);
89     process_orders(ts, count);
90 forsberg 343 break;
91     case 1: /* bitmap update (???) */
92 n-ki 687 in_uint8s(ts, 2); /* part length */
93     process_bitmap_updates(ts);
94 forsberg 343 break;
95     case 2: /* palette */
96 n-ki 687 in_uint8s(ts, 2); /* uint16 = 2 */
97     process_palette(ts);
98 forsberg 343 break;
99 forsberg 411 case 3: /* probably an palette with offset 3. Weird */
100 forsberg 343 break;
101     case 5:
102 astrand 508 ui_set_null_cursor();
103 forsberg 343 break;
104 stargo 885 case 6: /* TODO: W2K3 SP1 sends this on connect */
105     break;
106 astrand 435 case 8:
107 n-ki 687 in_uint16_le(ts, x);
108     in_uint16_le(ts, y);
109     if (s_check(ts))
110 forsberg 428 ui_move_pointer(x, y);
111     break;
112 forsberg 343 case 9:
113 n-ki 687 process_colour_pointer_pdu(ts);
114 forsberg 343 break;
115     case 10:
116 n-ki 687 process_cached_pointer_pdu(ts);
117 forsberg 343 break;
118     default:
119     unimpl("RDP5 opcode %d\n", type);
120     }
121    
122     s->p = next;
123     }
124 jsorg71 713 ui_end_update();
125 forsberg 343 }

  ViewVC Help
Powered by ViewVC 1.1.26