1 /* -*- c-basic-offset: 8 -*-
2 rdesktop: A Remote Desktop Protocol client.
3 Protocol services - RDP5 short form PDU processing
4 Copyright (C) Matthew Chapman <matthewc.unsw.edu.au> 1999-2008
5 Copyright 2003-2008 Erik Forsberg <forsberg@cendio.se> for Cendio AB
7 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 3 of the License, or
10 (at your option) any later version.
12 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.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 extern uint8
*g_next_packet
;
25 extern RDPCOMP g_mppc_dict
;
28 rdp5_process(STREAM s
)
30 uint16 length
, count
, x
, y
;
35 struct stream
*ns
= &(g_mppc_dict
.ns
);
39 printf("RDP5 data:\n");
40 hexdump(s
->p
, s
->end
- s
->p
);
47 if (type
& RDP5_COMPRESSED
)
50 in_uint16_le(s
, length
);
51 type
^= RDP5_COMPRESSED
;
56 in_uint16_le(s
, length
);
58 g_next_packet
= next
= s
->p
+ length
;
60 if (ctype
& RDP_MPPC_COMPRESSED
)
62 if (mppc_expand(s
->p
, length
, ctype
, &roff
, &rlen
) == -1)
63 error("error while decompressing packet\n");
65 /* allocate memory and copy the uncompressed data into the temporary stream */
66 ns
->data
= (uint8
*) xrealloc(ns
->data
, rlen
);
68 memcpy((ns
->data
), (unsigned char *) (g_mppc_dict
.hist
+ roff
), rlen
);
71 ns
->end
= (ns
->data
+ ns
->size
);
82 case 0: /* update orders */
83 in_uint16_le(ts
, count
);
84 process_orders(ts
, count
);
86 case 1: /* update bitmap */
87 in_uint8s(ts
, 2); /* part length */
88 process_bitmap_updates(ts
);
90 case 2: /* update palette */
91 in_uint8s(ts
, 2); /* uint16 = 2 */
94 case 3: /* update synchronize */
96 case 5: /* null pointer */
99 case 6: /* default pointer */
101 case 8: /* pointer position */
105 ui_move_pointer(x
, y
);
107 case 9: /* color pointer */
108 process_colour_pointer_pdu(ts
);
110 case 10: /* cached pointer */
111 process_cached_pointer_pdu(ts
);
114 process_new_pointer_pdu(ts
);
117 unimpl("RDP5 opcode %d\n", type
);