/[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 830 by jdmeijer, Tue Mar 8 00:23:02 2005 UTC revision 857 by stargo, Sun Mar 13 13:36:04 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    #endif
31    
32  extern uint16 g_mcs_userid;  extern uint16 g_mcs_userid;
33  extern char g_username[16];  extern char g_username[64];
34    extern char g_codepage[16];
35  extern BOOL g_bitmap_compression;  extern BOOL g_bitmap_compression;
36  extern BOOL g_orders;  extern BOOL g_orders;
37  extern BOOL g_encryption;  extern BOOL g_encryption;
38  extern BOOL g_desktop_save;  extern BOOL g_desktop_save;
39    extern BOOL g_polygon_ellipse_orders;
40  extern BOOL g_use_rdp5;  extern BOOL g_use_rdp5;
41  extern uint16 g_server_rdp_version;  extern uint16 g_server_rdp_version;
42  extern uint32 g_rdp5_performanceflags;  extern uint32 g_rdp5_performanceflags;
# Line 140  rdp_send_data(STREAM s, uint8 data_pdu_t Line 150  rdp_send_data(STREAM s, uint8 data_pdu_t
150  void  void
151  rdp_out_unistr(STREAM s, char *string, int len)  rdp_out_unistr(STREAM s, char *string, int len)
152  {  {
153    #ifdef HAVE_ICONV
154            size_t ibl = strlen(string), obl = len + 2;
155            static iconv_t iconv_h = (iconv_t)-1;
156            char   *pin = string, *pout;
157    #ifdef B_ENDIAN
158            char ss[4096];  // FIXME: global MAX_BUF_SIZE macro need
159    
160            pout = ss;
161    #else
162            pout = s->p;
163    #endif
164    
165            memset(pout, 0, len + 4);
166    
167            if (iconv_h == (iconv_t)-1)
168            {
169                    size_t i = 1, o = 4;
170                    if ((iconv_h = iconv_open(WINDOWS_CODEPAGE, g_codepage)) == (iconv_t)-1)
171                    {
172                            printf("rdp_out_unistr: iconv_open[%s -> %s] fail %d\n",
173                                    g_codepage, WINDOWS_CODEPAGE, (int)iconv_h);
174                            return;
175                    }
176                    if (iconv(iconv_h, (const char**)&pin, &i, &pout, &o) == (size_t)-1)
177                    {
178                            iconv_close(iconv_h);
179                            iconv_h = (iconv_t)-1;
180                            printf("rdp_out_unistr: iconv(1) fail, errno %d\n", errno);
181                            return;
182                    }
183                    pin = string; pout = s->p;
184            }
185    
186            if (iconv(iconv_h, (const char**)&pin, &ibl, &pout, &obl) == (size_t)-1)
187            {
188                    iconv_close(iconv_h);
189                    iconv_h = (iconv_t)-1;
190                    printf("rdp_out_unistr: iconv(2) fail, errno %d\n", errno);
191                    return;
192            }
193    
194    #ifdef B_ENDIAN
195            swab(ss, s->p, len + 4);
196    #endif
197    
198            s->p += len + 2;
199    
200    #else /*HAVE_ICONV undef*/
201          int i = 0, j = 0;          int i = 0, j = 0;
202    
203          len += 2;          len += 2;
# Line 149  rdp_out_unistr(STREAM s, char *string, i Line 207  rdp_out_unistr(STREAM s, char *string, i
207                  s->p[i++] = string[j++];                  s->p[i++] = string[j++];
208                  s->p[i++] = 0;                  s->p[i++] = 0;
209          }          }
210            
211          s->p += len;          s->p += len;
212    #endif
213  }  }
214    
215  /* Input a string in Unicode  /* Input a string in Unicode
# Line 160  rdp_out_unistr(STREAM s, char *string, i Line 219  rdp_out_unistr(STREAM s, char *string, i
219  int  int
220  rdp_in_unistr(STREAM s, char *string, int uni_len)  rdp_in_unistr(STREAM s, char *string, int uni_len)
221  {  {
222    #ifdef HAVE_ICONV
223            size_t ibl = uni_len, obl = uni_len;
224            char *pin, *pout = string;
225            static iconv_t iconv_h = (iconv_t)-1;
226    #ifdef B_ENDIAN
227            char ss[4096];  // FIXME: global MAX_BUF_SIZE macro need
228    
229            swab(s->p, ss, uni_len);
230            pin = ss;
231    #else
232            pin = s->p;
233    #endif
234    
235            if (iconv_h == (iconv_t)-1)
236            {
237                    if ((iconv_h = iconv_open(g_codepage, WINDOWS_CODEPAGE)) == (iconv_t)-1)
238                    {
239                            printf("rdp_in_unistr: iconv_open[%s -> %s] fail %d\n",
240                                    WINDOWS_CODEPAGE, g_codepage, (int)iconv_h);
241                            return 0;
242                    }
243            }
244    
245            if (iconv(iconv_h, (const char**)&pin, &ibl, &pout, &obl) == (size_t)-1)
246            {
247                    iconv_close(iconv_h);
248                    iconv_h = (iconv_t)-1;
249                    printf("rdp_in_unistr: iconv fail, errno %d\n", errno);
250                    return 0;
251            }
252            return pout - string;
253    #else /* HAVE_ICONV undef */
254          int i = 0;          int i = 0;
255    
256          while (i < uni_len / 2)          while (i < uni_len / 2)
# Line 169  rdp_in_unistr(STREAM s, char *string, in Line 260  rdp_in_unistr(STREAM s, char *string, in
260          }          }
261    
262          return i - 1;          return i - 1;
263    #endif
264  }  }
265    
266    
# Line 495  rdp_out_order_caps(STREAM s) Line 587  rdp_out_order_caps(STREAM s)
587  {  {
588          uint8 order_caps[32];          uint8 order_caps[32];
589    
   
590          memset(order_caps, 0, 32);          memset(order_caps, 0, 32);
591          order_caps[0] = 1;      /* dest blt */          order_caps[0] = 1;      /* dest blt */
592          order_caps[1] = 1;      /* pat blt */          order_caps[1] = 1;      /* pat blt */
593          order_caps[2] = 1;      /* screen blt */          order_caps[2] = 1;      /* screen blt */
594          order_caps[3] = (g_bitmap_cache ? 1 : 0);       /* memblt */          order_caps[3] = (g_bitmap_cache ? 1 : 0);       /* memblt */
595            order_caps[4] = 0;      /* triblt */
596          order_caps[8] = 1;      /* line */          order_caps[8] = 1;      /* line */
597          order_caps[9] = 1;      /* line */          order_caps[9] = 1;      /* line */
598          order_caps[10] = 1;     /* rect */          order_caps[10] = 1;     /* rect */
599          order_caps[11] = (g_desktop_save == False ? 0 : 1);     /* desksave */          order_caps[11] = (g_desktop_save ? 1 : 0);      /* desksave */
600          order_caps[13] = 1;     /* memblt */          order_caps[13] = 1;     /* memblt */
601          order_caps[14] = 1;     /* triblt */          order_caps[14] = 1;     /* triblt */
602            order_caps[20] = (g_polygon_ellipse_orders ? 1 : 0);    /* polygon */
603            order_caps[21] = (g_polygon_ellipse_orders ? 1 : 0);    /* polygon2 */
604          order_caps[22] = 1;     /* polyline */          order_caps[22] = 1;     /* polyline */
605            order_caps[25] = (g_polygon_ellipse_orders ? 1 : 0);    /* ellipse */
606            order_caps[26] = (g_polygon_ellipse_orders ? 1 : 0);    /* ellipse2 */
607          order_caps[27] = 1;     /* text2 */          order_caps[27] = 1;     /* text2 */
608          out_uint16_le(s, RDP_CAPSET_ORDER);          out_uint16_le(s, RDP_CAPSET_ORDER);
609          out_uint16_le(s, RDP_CAPLEN_ORDER);          out_uint16_le(s, RDP_CAPLEN_ORDER);

Legend:
Removed from v.830  
changed lines
  Added in v.857

  ViewVC Help
Powered by ViewVC 1.1.26