/[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 858 by stargo, Sun Mar 13 13:58:23 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 140  rdp_send_data(STREAM s, uint8 data_pdu_t Line 154  rdp_send_data(STREAM s, uint8 data_pdu_t
154  void  void
155  rdp_out_unistr(STREAM s, char *string, int len)  rdp_out_unistr(STREAM s, char *string, int len)
156  {  {
157    #ifdef HAVE_ICONV
158            size_t ibl = strlen(string), obl = len + 2;
159            static iconv_t iconv_h = (iconv_t)-1;
160            char   *pin = string, *pout;
161    #ifdef B_ENDIAN
162            char ss[4096];  // FIXME: global MAX_BUF_SIZE macro need
163    
164            pout = ss;
165    #else
166            pout = s->p;
167    #endif
168    
169            memset(pout, 0, len + 4);
170    
171            if (iconv_h == (iconv_t)-1)
172            {
173                    size_t i = 1, o = 4;
174                    if ((iconv_h = iconv_open(WINDOWS_CODEPAGE, g_codepage)) == (iconv_t)-1)
175                    {
176                            printf("rdp_out_unistr: iconv_open[%s -> %s] fail %d\n",
177                                    g_codepage, WINDOWS_CODEPAGE, (int)iconv_h);
178                            return;
179                    }
180                    if (iconv(iconv_h, (ICONV_CONST char**)&pin, &i, &pout, &o) == (size_t)-1)
181                    {
182                            iconv_close(iconv_h);
183                            iconv_h = (iconv_t)-1;
184                            printf("rdp_out_unistr: iconv(1) fail, errno %d\n", errno);
185                            return;
186                    }
187                    pin = string; pout = s->p;
188            }
189    
190            if (iconv(iconv_h, (ICONV_CONST char**)&pin, &ibl, &pout, &obl) == (size_t)-1)
191            {
192                    iconv_close(iconv_h);
193                    iconv_h = (iconv_t)-1;
194                    printf("rdp_out_unistr: iconv(2) fail, errno %d\n", errno);
195                    return;
196            }
197    
198    #ifdef B_ENDIAN
199            swab(ss, s->p, len + 4);
200    #endif
201    
202            s->p += len + 2;
203    
204    #else /*HAVE_ICONV undef*/
205          int i = 0, j = 0;          int i = 0, j = 0;
206    
207          len += 2;          len += 2;
# Line 149  rdp_out_unistr(STREAM s, char *string, i Line 211  rdp_out_unistr(STREAM s, char *string, i
211                  s->p[i++] = string[j++];                  s->p[i++] = string[j++];
212                  s->p[i++] = 0;                  s->p[i++] = 0;
213          }          }
214            
215          s->p += len;          s->p += len;
216    #endif
217  }  }
218    
219  /* Input a string in Unicode  /* Input a string in Unicode
# Line 160  rdp_out_unistr(STREAM s, char *string, i Line 223  rdp_out_unistr(STREAM s, char *string, i
223  int  int
224  rdp_in_unistr(STREAM s, char *string, int uni_len)  rdp_in_unistr(STREAM s, char *string, int uni_len)
225  {  {
226    #ifdef HAVE_ICONV
227            size_t ibl = uni_len, obl = uni_len;
228            char *pin, *pout = string;
229            static iconv_t iconv_h = (iconv_t)-1;
230    #ifdef B_ENDIAN
231            char ss[4096];  // FIXME: global MAX_BUF_SIZE macro need
232    
233            swab(s->p, ss, uni_len);
234            pin = ss;
235    #else
236            pin = s->p;
237    #endif
238    
239            if (iconv_h == (iconv_t)-1)
240            {
241                    if ((iconv_h = iconv_open(g_codepage, WINDOWS_CODEPAGE)) == (iconv_t)-1)
242                    {
243                            printf("rdp_in_unistr: iconv_open[%s -> %s] fail %d\n",
244                                    WINDOWS_CODEPAGE, g_codepage, (int)iconv_h);
245                            return 0;
246                    }
247            }
248    
249            if (iconv(iconv_h, (ICONV_CONST char**)&pin, &ibl, &pout, &obl) == (size_t)-1)
250            {
251                    iconv_close(iconv_h);
252                    iconv_h = (iconv_t)-1;
253                    printf("rdp_in_unistr: iconv fail, errno %d\n", errno);
254                    return 0;
255            }
256            return pout - string;
257    #else /* HAVE_ICONV undef */
258          int i = 0;          int i = 0;
259    
260          while (i < uni_len / 2)          while (i < uni_len / 2)
# Line 169  rdp_in_unistr(STREAM s, char *string, in Line 264  rdp_in_unistr(STREAM s, char *string, in
264          }          }
265    
266          return i - 1;          return i - 1;
267    #endif
268  }  }
269    
270    
# Line 386  static void Line 482  static void
482  rdp_enum_bmpcache2(void)  rdp_enum_bmpcache2(void)
483  {  {
484          STREAM s;          STREAM s;
485          uint8 idlist[BMPCACHE2_NUM_PSTCELLS * sizeof(BITMAP_ID)];          HASH_KEY keylist[BMPCACHE2_NUM_PSTCELLS];
486          uint32 nids, offset, count, flags;          uint32 num_keys, offset, count, flags;
487    
488          offset = 0;          offset = 0;
489          nids = pstcache_enumerate(2, idlist);          num_keys = pstcache_enumerate(2, keylist);
490    
491          while (offset < nids)          while (offset < num_keys)
492          {          {
493                  count = MIN(nids - offset, 169);                  count = MIN(num_keys - offset, 169);
494    
495                  s = rdp_init_data(24 + count * sizeof(BITMAP_ID));                  s = rdp_init_data(24 + count * sizeof(HASH_KEY));
496    
497                  flags = 0;                  flags = 0;
498                  if (offset == 0)                  if (offset == 0)
499                          flags |= PDU_FLAG_FIRST;                          flags |= PDU_FLAG_FIRST;
500                  if (nids - offset <= 169)                  if (num_keys - offset <= 169)
501                          flags |= PDU_FLAG_LAST;                          flags |= PDU_FLAG_LAST;
502    
503                  /* header */                  /* header */
# Line 411  rdp_enum_bmpcache2(void) Line 507  rdp_enum_bmpcache2(void)
507                  out_uint16_le(s, 0);                  out_uint16_le(s, 0);
508                  out_uint16_le(s, 0);                  out_uint16_le(s, 0);
509                  out_uint16_le(s, 0);                  out_uint16_le(s, 0);
510                  out_uint16_le(s, nids);                  out_uint16_le(s, num_keys);
511                  out_uint32_le(s, 0);                  out_uint32_le(s, 0);
512                  out_uint32_le(s, flags);                  out_uint32_le(s, flags);
513    
514                  /* list */                  /* list */
515                  out_uint8a(s, idlist + offset * sizeof(BITMAP_ID), count * sizeof(BITMAP_ID));                  out_uint8a(s, keylist[offset], count * sizeof(HASH_KEY));
516    
517                  s_mark_end(s);                  s_mark_end(s);
518                  rdp_send_data(s, 0x2b);                  rdp_send_data(s, 0x2b);
# Line 495  rdp_out_order_caps(STREAM s) Line 591  rdp_out_order_caps(STREAM s)
591  {  {
592          uint8 order_caps[32];          uint8 order_caps[32];
593    
   
594          memset(order_caps, 0, 32);          memset(order_caps, 0, 32);
595          order_caps[0] = 1;      /* dest blt */          order_caps[0] = 1;      /* dest blt */
596          order_caps[1] = 1;      /* pat blt */          order_caps[1] = 1;      /* pat blt */
597          order_caps[2] = 1;      /* screen blt */          order_caps[2] = 1;      /* screen blt */
598          order_caps[3] = (g_bitmap_cache ? 1 : 0);       /* memblt */          order_caps[3] = (g_bitmap_cache ? 1 : 0);       /* memblt */
599            order_caps[4] = 0;      /* triblt */
600          order_caps[8] = 1;      /* line */          order_caps[8] = 1;      /* line */
601          order_caps[9] = 1;      /* line */          order_caps[9] = 1;      /* line */
602          order_caps[10] = 1;     /* rect */          order_caps[10] = 1;     /* rect */
603          order_caps[11] = (g_desktop_save == False ? 0 : 1);     /* desksave */          order_caps[11] = (g_desktop_save ? 1 : 0);      /* desksave */
604          order_caps[13] = 1;     /* memblt */          order_caps[13] = 1;     /* memblt */
605          order_caps[14] = 1;     /* triblt */          order_caps[14] = 1;     /* triblt */
606            order_caps[20] = (g_polygon_ellipse_orders ? 1 : 0);    /* polygon */
607            order_caps[21] = (g_polygon_ellipse_orders ? 1 : 0);    /* polygon2 */
608          order_caps[22] = 1;     /* polyline */          order_caps[22] = 1;     /* polyline */
609            order_caps[25] = (g_polygon_ellipse_orders ? 1 : 0);    /* ellipse */
610            order_caps[26] = (g_polygon_ellipse_orders ? 1 : 0);    /* ellipse2 */
611          order_caps[27] = 1;     /* text2 */          order_caps[27] = 1;     /* text2 */
612          out_uint16_le(s, RDP_CAPSET_ORDER);          out_uint16_le(s, RDP_CAPSET_ORDER);
613          out_uint16_le(s, RDP_CAPLEN_ORDER);          out_uint16_le(s, RDP_CAPLEN_ORDER);

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

  ViewVC Help
Powered by ViewVC 1.1.26