ReactOS  0.4.15-dev-1206-g731eddf
iso.c
Go to the documentation of this file.
1 /* -*- c-basic-offset: 8 -*-
2  rdesktop: A Remote Desktop Protocol client.
3  Protocol services - ISO layer
4  Copyright (C) Matthew Chapman 1999-2005
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 along
17  with this program; if not, write to the Free Software Foundation, Inc.,
18  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 */
20 
21 #include "rdesktop.h"
22 
23 /* Send a self-contained ISO PDU */
24 static BOOL
26 {
27  STREAM s;
28 
29  s = tcp_init(This, 11);
30 
31  if(s == NULL)
32  return False;
33 
34  out_uint8(s, 3); /* version */
35  out_uint8(s, 0); /* reserved */
36  out_uint16_be(s, 11); /* length */
37 
38  out_uint8(s, 6); /* hdrlen */
39  out_uint8(s, code);
40  out_uint16(s, 0); /* dst_ref */
41  out_uint16(s, 0); /* src_ref */
42  out_uint8(s, 0); /* class */
43 
44  s_mark_end(s);
45  return tcp_send(This, s);
46 }
47 
48 static BOOL
50 {
51  STREAM s;
52  int cookielen = (int)strlen(cookie);
53  int length = 11 + cookielen;
54 
55  s = tcp_init(This, length);
56 
57  if(s == NULL)
58  return False;
59 
60  out_uint8(s, 3); /* version */
61  out_uint8(s, 0); /* reserved */
62  out_uint16_be(s, length); /* length */
63 
64  out_uint8(s, length - 5); /* hdrlen */
66  out_uint16(s, 0); /* dst_ref */
67  out_uint16(s, 0); /* src_ref */
68  out_uint8(s, 0); /* class */
69 
70  out_uint8p(s, cookie, cookielen);
71 
72  s_mark_end(s);
73  return tcp_send(This, s);
74 }
75 
76 /* Receive a message on the ISO layer, return code */
77 static STREAM
79 {
80  STREAM s;
81  uint16 length;
82  uint8 version;
83 
84  s = tcp_recv(This, NULL, 4);
85  if (s == NULL)
86  return NULL;
87  in_uint8(s, version);
88  if (rdpver != NULL)
89  *rdpver = version;
90  if (version == 3)
91  {
92  in_uint8s(s, 1); /* pad */
94  }
95  else
96  {
97  in_uint8(s, length);
98  if (length & 0x80)
99  {
100  length &= ~0x80;
101  next_be(s, length);
102  }
103  }
104  s = tcp_recv(This, s, length - 4);
105  if (s == NULL)
106  return NULL;
107  if (version != 3)
108  return s;
109  in_uint8s(s, 1); /* hdrlen */
110  in_uint8(s, *code);
111  if (*code == ISO_PDU_DT)
112  {
113  in_uint8s(s, 1); /* eot */
114  return s;
115  }
116  in_uint8s(s, 5); /* dst_ref, src_ref, class */
117  return s;
118 }
119 
120 /* Initialise ISO transport data packet */
121 STREAM
123 {
124  STREAM s;
125 
126  s = tcp_init(This, length + 7);
127 
128  if(s == NULL)
129  return NULL;
130 
131  s_push_layer(s, iso_hdr, 7);
132 
133  return s;
134 }
135 
136 /* Send an ISO data PDU */
137 BOOL
139 {
140  uint16 length;
141 
142  s_pop_layer(s, iso_hdr);
143  length = (uint16)(s->end - s->p);
144 
145  out_uint8(s, 3); /* version */
146  out_uint8(s, 0); /* reserved */
148 
149  out_uint8(s, 2); /* hdrlen */
150  out_uint8(s, ISO_PDU_DT); /* code */
151  out_uint8(s, 0x80); /* eot */
152 
153  return tcp_send(This, s);
154 }
155 
156 /* Receive ISO transport data packet */
157 STREAM
159 {
160  STREAM s;
161  uint8 code = 0;
162 
163  s = iso_recv_msg(This, &code, rdpver);
164  if (s == NULL)
165  return NULL;
166  if (rdpver != NULL)
167  if (*rdpver != 3)
168  return s;
169  if (code != ISO_PDU_DT)
170  {
171  error("expected DT, got 0x%x\n", code);
172  return NULL;
173  }
174  return s;
175 }
176 
177 /* Establish a connection up to the ISO layer */
178 BOOL
180 {
181  uint8 code = 0;
182 
183  if (!tcp_connect(This, server))
184  return False;
185 
187  return False;
188 
189  if (iso_recv_msg(This, &code, NULL) == NULL)
190  return False;
191 
192  if (code != ISO_PDU_CC)
193  {
194  error("expected CC, got 0x%x\n", code);
196  return False;
197  }
198 
199  return True;
200 }
201 
202 /* Establish a reconnection up to the ISO layer */
203 BOOL
205 {
206  uint8 code = 0;
207 
208  if (!tcp_connect(This, server))
209  return False;
210 
211  if (!iso_send_connection_request(This, cookie)) // BUGBUG should we really pass the cookie here?
212  return False;
213 
214  if (iso_recv_msg(This, &code, NULL) == NULL)
215  return False;
216 
217  if (code != ISO_PDU_CC)
218  {
219  error("expected CC, got 0x%x\n", code);
221  return False;
222  }
223 
224  return True;
225 }
226 
227 /* Disconnect from the ISO layer */
228 BOOL
230 {
232  return tcp_disconnect(This);
233 }
234 
235 /* reset the state to support reconnecting */
236 void
238 {
240 }
#define out_uint8p(s, v, n)
Definition: parse.h:93
static rfbScreenInfoPtr server
Definition: vnc.c:74
#define error(str)
Definition: mkdosfs.c:1605
static BOOL iso_send_connection_request(RDPCLIENT *This, char *cookie)
Definition: iso.c:49
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
STREAM tcp_recv(STREAM s, uint32 length)
Definition: tcp.c:344
#define out_uint16(s, v)
Definition: parse.h:84
BOOL iso_reconnect(RDPCLIENT *This, char *server, char *cookie)
Definition: iso.c:204
void tcp_send(STREAM s)
Definition: tcp.c:270
#define out_uint8(s, v)
Definition: parse.h:92
void iso_disconnect(void)
Definition: iso.c:362
unsigned int BOOL
Definition: ntddk_ex.h:94
#define s_pop_layer(s, h)
Definition: parse.h:40
smooth NULL
Definition: ftsmooth.c:416
static const WCHAR version[]
Definition: asmname.c:66
STREAM tcp_init(uint32 maxlen)
Definition: tcp.c:82
#define in_uint8s(s, n)
Definition: parse.h:91
STREAM iso_init(int length)
Definition: iso.c:150
#define True
Definition: types.h:24
#define False
Definition: types.h:25
GLenum GLuint GLenum GLsizei length
Definition: glext.h:5579
STREAM iso_recv(uint8 *rdpver)
Definition: iso.c:182
void iso_send(STREAM s)
Definition: iso.c:162
unsigned char uint8
Definition: types.h:28
RD_BOOL tcp_connect(char *server)
Definition: tcp.c:717
void tcp_reset_state(void)
Definition: tcp.c:894
RD_BOOL iso_connect(char *server, char *username, char *domain, char *password, RD_BOOL reconnect, uint32 *selected_protocol)
Definition: iso.c:203
Definition: parse.h:22
static BOOL iso_send_msg(RDPCLIENT *This, uint8 code)
Definition: iso.c:25
GLdouble s
Definition: gl.h:2039
Definition: inflate.c:139
#define s_push_layer(s, h, n)
Definition: parse.h:39
void tcp_disconnect(void)
Definition: tcp.c:832
void iso_reset_state(void)
Definition: iso.c:370
unsigned short uint16
Definition: types.h:30
#define in_uint8(s, v)
Definition: parse.h:88
Definition: cookie.c:33
#define next_be(s, v)
Definition: parse.h:97
static STREAM iso_recv_msg(RDPCLIENT *This, uint8 *code, uint8 *rdpver)
Definition: iso.c:78
#define out_uint16_be(s, v)
Definition: parse.h:77
#define s_mark_end(s)
Definition: parse.h:41
#define in_uint16_be(s, v)
Definition: parse.h:75
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31