/[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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 828 by stargo, Sun Mar 6 21:11:18 2005 UTC revision 865 by stargo, Tue Mar 15 11:25:50 2005 UTC
# Line 19  Line 19 
19  */  */
20    
21  #include <time.h>  #include <time.h>
22    #include <errno.h>
23    #include <unistd.h>
24  #include "rdesktop.h"  #include "rdesktop.h"
25    
26    #ifdef HAVE_ICONV
27    #ifdef HAVE_ICONV_H
28    #include <iconv.h>
29    #endif
30    
31    #ifndef ICONV_CONST
32    #define ICONV_CONST ""
33    #endif
34    #endif
35    
36  extern uint16 g_mcs_userid;  extern uint16 g_mcs_userid;
37  extern char g_username[16];  extern char g_username[64];
38    extern char g_codepage[16];
39  extern BOOL g_bitmap_compression;  extern BOOL g_bitmap_compression;
40  extern BOOL g_orders;  extern BOOL g_orders;
41  extern BOOL g_encryption;  extern BOOL g_encryption;
42  extern BOOL g_desktop_save;  extern BOOL g_desktop_save;
43    extern BOOL g_polygon_ellipse_orders;
44  extern BOOL g_use_rdp5;  extern BOOL g_use_rdp5;
45  extern uint16 g_server_rdp_version;  extern uint16 g_server_rdp_version;
46  extern uint32 g_rdp5_performanceflags;  extern uint32 g_rdp5_performanceflags;
# Line 45  extern RDPCOMP g_mppc_dict; Line 59  extern RDPCOMP g_mppc_dict;
59  static uint32 g_packetno;  static uint32 g_packetno;
60  #endif  #endif
61    
62    #ifdef HAVE_ICONV
63    static BOOL g_iconv_works = True;
64    #endif
65    
66  /* Receive an RDP packet */  /* Receive an RDP packet */
67  static STREAM  static STREAM
68  rdp_recv(uint8 * type)  rdp_recv(uint8 * type)
# Line 140  rdp_send_data(STREAM s, uint8 data_pdu_t Line 158  rdp_send_data(STREAM s, uint8 data_pdu_t
158  void  void
159  rdp_out_unistr(STREAM s, char *string, int len)  rdp_out_unistr(STREAM s, char *string, int len)
160  {  {
161          int i = 0, j = 0;  #ifdef HAVE_ICONV
162            size_t ibl = strlen(string), obl = len + 2;
163            static iconv_t iconv_h = (iconv_t) - 1;
164            char *pin = string, *pout = s->p;
165    
166          len += 2;          memset(pout, 0, len + 4);
167    
168          while (i < len)          if (g_iconv_works)
169          {          {
170                  s->p[i++] = string[j++];                  if (iconv_h == (iconv_t) - 1)
171                  s->p[i++] = 0;                  {
172                            size_t i = 1, o = 4;
173                            if ((iconv_h = iconv_open(WINDOWS_CODEPAGE, g_codepage)) == (iconv_t) - 1)
174                            {
175                                    warning("rdp_out_unistr: iconv_open[%s -> %s] fail %d\n",
176                                            g_codepage, WINDOWS_CODEPAGE, (int) iconv_h);
177    
178                                    g_iconv_works = False;
179                                    return (rdp_out_unistr(s, string, len));
180                            }
181                            if (iconv(iconv_h, (ICONV_CONST char **) &pin, &i, &pout, &o) ==
182                                (size_t) - 1)
183                            {
184                                    iconv_close(iconv_h);
185                                    iconv_h = (iconv_t) - 1;
186                                    warning("rdp_out_unistr: iconv(1) fail, errno %d\n", errno);
187    
188                                    g_iconv_works = False;
189                                    return (rdp_out_unistr(s, string, len));
190                            }
191                            pin = string;
192                            pout = (char *) s->p;
193                    }
194    
195                    if (iconv(iconv_h, (ICONV_CONST char **) &pin, &ibl, &pout, &obl) == (size_t) - 1)
196                    {
197                            iconv_close(iconv_h);
198                            iconv_h = (iconv_t) - 1;
199                            warning("rdp_out_unistr: iconv(2) fail, errno %d\n", errno);
200    
201                            g_iconv_works = False;
202                            return (rdp_out_unistr(s, string, len));
203                    }
204    
205                    s->p += len + 2;
206    
207          }          }
208            else
209    #endif
210            {
211                    int i = 0, j = 0;
212    
213                    len += 2;
214    
215                    while (i < len)
216                    {
217                            s->p[i++] = string[j++];
218                            s->p[i++] = 0;
219                    }
220    
221          s->p += len;                  s->p += len;
222            }
223  }  }
224    
225  /* Input a string in Unicode  /* Input a string in Unicode
# Line 160  rdp_out_unistr(STREAM s, char *string, i Line 229  rdp_out_unistr(STREAM s, char *string, i
229  int  int
230  rdp_in_unistr(STREAM s, char *string, int uni_len)  rdp_in_unistr(STREAM s, char *string, int uni_len)
231  {  {
232          int i = 0;  #ifdef HAVE_ICONV
233            size_t ibl = uni_len, obl = uni_len;
234            char *pin = s->p, *pout = string;
235            static iconv_t iconv_h = (iconv_t) - 1;
236    
237          while (i < uni_len / 2)          if (g_iconv_works)
238          {          {
239                  in_uint8a(s, &string[i++], 1);                  if (iconv_h == (iconv_t) - 1)
240                  in_uint8s(s, 1);                  {
241                            if ((iconv_h = iconv_open(g_codepage, WINDOWS_CODEPAGE)) == (iconv_t) - 1)
242                            {
243                                    warning("rdp_in_unistr: iconv_open[%s -> %s] fail %d\n",
244                                            WINDOWS_CODEPAGE, g_codepage, (int) iconv_h);
245    
246                                    g_iconv_works = False;
247                                    return rdp_in_unistr(s, string, uni_len);
248                            }
249                    }
250    
251                    if (iconv(iconv_h, (ICONV_CONST char **) &pin, &ibl, &pout, &obl) == (size_t) - 1)
252                    {
253                            iconv_close(iconv_h);
254                            iconv_h = (iconv_t) - 1;
255                            warning("rdp_in_unistr: iconv fail, errno %d\n", errno);
256    
257                            g_iconv_works = False;
258                            return rdp_in_unistr(s, string, uni_len);
259                    }
260                    return pout - string;
261          }          }
262            else
263    #endif
264            {
265                    int i = 0;
266    
267          return i - 1;                  while (i < uni_len / 2)
268                    {
269                            in_uint8a(s, &string[i++], 1);
270                            in_uint8s(s, 1);
271                    }
272    
273                    return i - 1;
274            }
275  }  }
276    
277    
# Line 386  static void Line 489  static void
489  rdp_enum_bmpcache2(void)  rdp_enum_bmpcache2(void)
490  {  {
491          STREAM s;          STREAM s;
492          uint8 idlist[BMPCACHE2_NUM_PSTCELLS * sizeof(BITMAP_ID)];          HASH_KEY keylist[BMPCACHE2_NUM_PSTCELLS];
493          uint32 nids, offset, count, flags;          uint32 num_keys, offset, count, flags;
494    
495          offset = 0;          offset = 0;
496          nids = pstcache_enumerate(2, idlist);          num_keys = pstcache_enumerate(2, keylist);
497    
498          while (offset < nids)          while (offset < num_keys)
499          {          {
500                  count = MIN(nids - offset, 169);                  count = MIN(num_keys - offset, 169);
501    
502                  s = rdp_init_data(24 + count * sizeof(BITMAP_ID));                  s = rdp_init_data(24 + count * sizeof(HASH_KEY));
503    
504                  flags = 0;                  flags = 0;
505                  if (offset == 0)                  if (offset == 0)
506                          flags |= PDU_FLAG_FIRST;                          flags |= PDU_FLAG_FIRST;
507                  if (nids - offset <= 169)                  if (num_keys - offset <= 169)
508                          flags |= PDU_FLAG_LAST;                          flags |= PDU_FLAG_LAST;
509    
510                  /* header */                  /* header */
# Line 411  rdp_enum_bmpcache2(void) Line 514  rdp_enum_bmpcache2(void)
514                  out_uint16_le(s, 0);                  out_uint16_le(s, 0);
515                  out_uint16_le(s, 0);                  out_uint16_le(s, 0);
516                  out_uint16_le(s, 0);                  out_uint16_le(s, 0);
517                  out_uint16_le(s, nids);                  out_uint16_le(s, num_keys);
518                  out_uint32_le(s, 0);                  out_uint32_le(s, 0);
519                  out_uint32_le(s, flags);                  out_uint32_le(s, flags);
520    
521                  /* list */                  /* list */
522                  out_uint8a(s, idlist + offset * sizeof(BITMAP_ID), count * sizeof(BITMAP_ID));                  out_uint8a(s, keylist[offset], count * sizeof(HASH_KEY));
523    
524                  s_mark_end(s);                  s_mark_end(s);
525                  rdp_send_data(s, 0x2b);                  rdp_send_data(s, 0x2b);
# Line 495  rdp_out_order_caps(STREAM s) Line 598  rdp_out_order_caps(STREAM s)
598  {  {
599          uint8 order_caps[32];          uint8 order_caps[32];
600    
   
601          memset(order_caps, 0, 32);          memset(order_caps, 0, 32);
602          order_caps[0] = 1;      /* dest blt */          order_caps[0] = 1;      /* dest blt */
603          order_caps[1] = 1;      /* pat blt */          order_caps[1] = 1;      /* pat blt */
604          order_caps[2] = 1;      /* screen blt */          order_caps[2] = 1;      /* screen blt */
605          order_caps[3] = (g_bitmap_cache ? 1 : 0);       /* memblt */          order_caps[3] = (g_bitmap_cache ? 1 : 0);       /* memblt */
606            order_caps[4] = 0;      /* triblt */
607          order_caps[8] = 1;      /* line */          order_caps[8] = 1;      /* line */
608          order_caps[9] = 1;      /* line */          order_caps[9] = 1;      /* line */
609          order_caps[10] = 1;     /* rect */          order_caps[10] = 1;     /* rect */
610          order_caps[11] = (g_desktop_save == False ? 0 : 1);     /* desksave */          order_caps[11] = (g_desktop_save ? 1 : 0);      /* desksave */
611          order_caps[13] = 1;     /* memblt */          order_caps[13] = 1;     /* memblt */
612          order_caps[14] = 1;     /* triblt */          order_caps[14] = 1;     /* triblt */
613            order_caps[20] = (g_polygon_ellipse_orders ? 1 : 0);    /* polygon */
614            order_caps[21] = (g_polygon_ellipse_orders ? 1 : 0);    /* polygon2 */
615          order_caps[22] = 1;     /* polyline */          order_caps[22] = 1;     /* polyline */
616            order_caps[25] = (g_polygon_ellipse_orders ? 1 : 0);    /* ellipse */
617            order_caps[26] = (g_polygon_ellipse_orders ? 1 : 0);    /* ellipse2 */
618          order_caps[27] = 1;     /* text2 */          order_caps[27] = 1;     /* text2 */
619          out_uint16_le(s, RDP_CAPSET_ORDER);          out_uint16_le(s, RDP_CAPSET_ORDER);
620          out_uint16_le(s, RDP_CAPLEN_ORDER);          out_uint16_le(s, RDP_CAPLEN_ORDER);
# Line 1096  process_data_pdu(STREAM s, uint32 * ext_ Line 1203  process_data_pdu(STREAM s, uint32 * ext_
1203                  if (mppc_expand(s->p, clen, ctype, &roff, &rlen) == -1)                  if (mppc_expand(s->p, clen, ctype, &roff, &rlen) == -1)
1204                          error("error while decompressing packet\n");                          error("error while decompressing packet\n");
1205    
1206                  //len -= 18;                  /* len -= 18; */
1207    
1208                  /* allocate memory and copy the uncompressed data into the temporary stream */                  /* allocate memory and copy the uncompressed data into the temporary stream */
1209                  ns->data = (uint8 *) xrealloc(ns->data, rlen);                  ns->data = (uint8 *) xrealloc(ns->data, rlen);

Legend:
Removed from v.828  
changed lines
  Added in v.865

  ViewVC Help
Powered by ViewVC 1.1.26