/[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 857 by stargo, Sun Mar 13 13:36:04 2005 UTC revision 945 by astrand, Tue Aug 2 09:29:41 2005 UTC
# Line 27  Line 27 
27  #ifdef HAVE_ICONV_H  #ifdef HAVE_ICONV_H
28  #include <iconv.h>  #include <iconv.h>
29  #endif  #endif
30    
31    #ifndef ICONV_CONST
32    #define ICONV_CONST ""
33    #endif
34  #endif  #endif
35    
36  extern uint16 g_mcs_userid;  extern uint16 g_mcs_userid;
# Line 55  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 152  rdp_out_unistr(STREAM s, char *string, i Line 160  rdp_out_unistr(STREAM s, char *string, i
160  {  {
161  #ifdef HAVE_ICONV  #ifdef HAVE_ICONV
162          size_t ibl = strlen(string), obl = len + 2;          size_t ibl = strlen(string), obl = len + 2;
163          static iconv_t iconv_h = (iconv_t)-1;          static iconv_t iconv_h = (iconv_t) - 1;
164          char   *pin = string, *pout;          char *pin = string, *pout = (char *) s->p;
 #ifdef B_ENDIAN  
         char ss[4096];  // FIXME: global MAX_BUF_SIZE macro need  
   
         pout = ss;  
 #else  
         pout = s->p;  
 #endif  
165    
166          memset(pout, 0, len + 4);          memset(pout, 0, len + 4);
167    
168          if (iconv_h == (iconv_t)-1)          if (g_iconv_works)
169          {          {
170                  size_t i = 1, o = 4;                  if (iconv_h == (iconv_t) - 1)
                 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",                          size_t i = 1, o = 4;
173                                  g_codepage, WINDOWS_CODEPAGE, (int)iconv_h);                          if ((iconv_h = iconv_open(WINDOWS_CODEPAGE, g_codepage)) == (iconv_t) - 1)
174                          return;                          {
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                                    rdp_out_unistr(s, string, len);
180                                    return;
181                            }
182                            if (iconv(iconv_h, (ICONV_CONST char **) &pin, &i, &pout, &o) ==
183                                (size_t) - 1)
184                            {
185                                    iconv_close(iconv_h);
186                                    iconv_h = (iconv_t) - 1;
187                                    warning("rdp_out_unistr: iconv(1) fail, errno %d\n", errno);
188    
189                                    g_iconv_works = False;
190                                    rdp_out_unistr(s, string, len);
191                                    return;
192                            }
193                            pin = string;
194                            pout = (char *) s->p;
195                  }                  }
196                  if (iconv(iconv_h, (const char**)&pin, &i, &pout, &o) == (size_t)-1)  
197                    if (iconv(iconv_h, (ICONV_CONST char **) &pin, &ibl, &pout, &obl) == (size_t) - 1)
198                  {                  {
199                          iconv_close(iconv_h);                          iconv_close(iconv_h);
200                          iconv_h = (iconv_t)-1;                          iconv_h = (iconv_t) - 1;
201                          printf("rdp_out_unistr: iconv(1) fail, errno %d\n", errno);                          warning("rdp_out_unistr: iconv(2) fail, errno %d\n", errno);
202    
203                            g_iconv_works = False;
204                            rdp_out_unistr(s, string, len);
205                          return;                          return;
206                  }                  }
                 pin = string; pout = s->p;  
         }  
207    
208          if (iconv(iconv_h, (const char**)&pin, &ibl, &pout, &obl) == (size_t)-1)                  s->p += len + 2;
         {  
                 iconv_close(iconv_h);  
                 iconv_h = (iconv_t)-1;  
                 printf("rdp_out_unistr: iconv(2) fail, errno %d\n", errno);  
                 return;  
         }  
209    
210  #ifdef B_ENDIAN          }
211          swab(ss, s->p, len + 4);          else
212  #endif  #endif
213            {
214                    int i = 0, j = 0;
215    
216          s->p += len + 2;                  len += 2;
   
 #else /*HAVE_ICONV undef*/  
         int i = 0, j = 0;  
217    
218          len += 2;                  while (i < len)
219                    {
220                            s->p[i++] = string[j++];
221                            s->p[i++] = 0;
222                    }
223    
224          while (i < len)                  s->p += len;
         {  
                 s->p[i++] = string[j++];  
                 s->p[i++] = 0;  
225          }          }
           
         s->p += len;  
 #endif  
226  }  }
227    
228  /* Input a string in Unicode  /* Input a string in Unicode
# Line 221  rdp_in_unistr(STREAM s, char *string, in Line 234  rdp_in_unistr(STREAM s, char *string, in
234  {  {
235  #ifdef HAVE_ICONV  #ifdef HAVE_ICONV
236          size_t ibl = uni_len, obl = uni_len;          size_t ibl = uni_len, obl = uni_len;
237          char *pin, *pout = string;          char *pin = (char *) s->p, *pout = string;
238          static iconv_t iconv_h = (iconv_t)-1;          static iconv_t iconv_h = (iconv_t) - 1;
 #ifdef B_ENDIAN  
         char ss[4096];  // FIXME: global MAX_BUF_SIZE macro need  
   
         swab(s->p, ss, uni_len);  
         pin = ss;  
 #else  
         pin = s->p;  
 #endif  
239    
240          if (iconv_h == (iconv_t)-1)          if (g_iconv_works)
241          {          {
242                  if ((iconv_h = iconv_open(g_codepage, WINDOWS_CODEPAGE)) == (iconv_t)-1)                  if (iconv_h == (iconv_t) - 1)
243                  {                  {
244                          printf("rdp_in_unistr: iconv_open[%s -> %s] fail %d\n",                          if ((iconv_h = iconv_open(g_codepage, WINDOWS_CODEPAGE)) == (iconv_t) - 1)
245                                  WINDOWS_CODEPAGE, g_codepage, (int)iconv_h);                          {
246                          return 0;                                  warning("rdp_in_unistr: iconv_open[%s -> %s] fail %d\n",
247                                            WINDOWS_CODEPAGE, g_codepage, (int) iconv_h);
248    
249                                    g_iconv_works = False;
250                                    return rdp_in_unistr(s, string, uni_len);
251                            }
252                  }                  }
         }  
253    
254          if (iconv(iconv_h, (const char**)&pin, &ibl, &pout, &obl) == (size_t)-1)                  if (iconv(iconv_h, (ICONV_CONST char **) &pin, &ibl, &pout, &obl) == (size_t) - 1)
255          {                  {
256                  iconv_close(iconv_h);                          iconv_close(iconv_h);
257                  iconv_h = (iconv_t)-1;                          iconv_h = (iconv_t) - 1;
258                  printf("rdp_in_unistr: iconv fail, errno %d\n", errno);                          warning("rdp_in_unistr: iconv fail, errno %d\n", errno);
                 return 0;  
         }  
         return pout - string;  
 #else /* HAVE_ICONV undef */  
         int i = 0;  
259    
260          while (i < uni_len / 2)                          g_iconv_works = False;
261          {                          return rdp_in_unistr(s, string, uni_len);
262                  in_uint8a(s, &string[i++], 1);                  }
263                  in_uint8s(s, 1);                  return pout - string;
264          }          }
265            else
         return i - 1;  
266  #endif  #endif
267            {
268                    int i = 0;
269    
270                    while (i < uni_len / 2)
271                    {
272                            in_uint8a(s, &string[i++], 1);
273                            in_uint8s(s, 1);
274                    }
275    
276                    return i - 1;
277            }
278  }  }
279    
280    
# Line 283  rdp_send_logon_info(uint32 flags, char * Line 297  rdp_send_logon_info(uint32 flags, char *
297          time_t t = time(NULL);          time_t t = time(NULL);
298          time_t tzone;          time_t tzone;
299    
 #if 0  
         /* enable rdp compression */  
         /* some problems still exist with rdp5 */  
         flags |= RDP_COMPRESSION;  
 #endif  
   
300          if (!g_use_rdp5 || 1 == g_server_rdp_version)          if (!g_use_rdp5 || 1 == g_server_rdp_version)
301          {          {
302                  DEBUG_RDP5(("Sending RDP4-style Logon packet\n"));                  DEBUG_RDP5(("Sending RDP4-style Logon packet\n"));
# Line 473  rdp_send_input(uint32 time, uint16 messa Line 481  rdp_send_input(uint32 time, uint16 messa
481          rdp_send_data(s, RDP_DATA_PDU_INPUT);          rdp_send_data(s, RDP_DATA_PDU_INPUT);
482  }  }
483    
484  /* Inform the server on the contents of the persistent bitmap cache */  /* Send a client window information PDU */
485    void
486    rdp_send_client_window_status(int status)
487    {
488            STREAM s;
489            static int current_status = 1;
490    
491            if (current_status == status)
492                    return;
493    
494            s = rdp_init_data(12);
495    
496            out_uint32_le(s, status);
497    
498            switch (status)
499            {
500                    case 0: /* shut the server up */
501                            break;
502    
503                    case 1: /* receive data again */
504                            out_uint32_le(s, 0);    /* unknown */
505                            out_uint16_le(s, g_width);
506                            out_uint16_le(s, g_height);
507                            break;
508            }
509    
510            s_mark_end(s);
511            rdp_send_data(s, RDP_DATA_PDU_CLIENT_WINDOW_STATUS);
512            current_status = status;
513    }
514    
515    /* Send persistent bitmap cache enumeration PDU's */
516  static void  static void
517  rdp_enum_bmpcache2(void)  rdp_enum_bmpcache2(void)
518  {  {
# Line 650  rdp_out_bmpcache2_caps(STREAM s) Line 689  rdp_out_bmpcache2_caps(STREAM s)
689    
690          out_uint16_le(s, g_bitmap_cache_persist_enable ? 2 : 0);        /* version */          out_uint16_le(s, g_bitmap_cache_persist_enable ? 2 : 0);        /* version */
691    
692          out_uint16_le(s, 0x0300);       /* flags? number of caches? */          out_uint16_be(s, 3);    /* number of caches in this set */
693    
694            /* max cell size for cache 0 is 16x16, 1 = 32x32, 2 = 64x64, etc */
695          out_uint32_le(s, BMPCACHE2_C0_CELLS);          out_uint32_le(s, BMPCACHE2_C0_CELLS);
696          out_uint32_le(s, BMPCACHE2_C1_CELLS);          out_uint32_le(s, BMPCACHE2_C1_CELLS);
697          if (pstcache_init(2))          if (pstcache_init(2))
# Line 857  rdp_process_bitmap_caps(STREAM s) Line 897  rdp_process_bitmap_caps(STREAM s)
897  }  }
898    
899  /* Process server capabilities */  /* Process server capabilities */
900  void  static void
901  rdp_process_server_caps(STREAM s, uint16 length)  rdp_process_server_caps(STREAM s, uint16 length)
902  {  {
903          int n;          int n;
# Line 1192  process_data_pdu(STREAM s, uint32 * ext_ Line 1232  process_data_pdu(STREAM s, uint32 * ext_
1232                  if (mppc_expand(s->p, clen, ctype, &roff, &rlen) == -1)                  if (mppc_expand(s->p, clen, ctype, &roff, &rlen) == -1)
1233                          error("error while decompressing packet\n");                          error("error while decompressing packet\n");
1234    
1235                  //len -= 18;                  /* len -= 18; */
1236    
1237                  /* allocate memory and copy the uncompressed data into the temporary stream */                  /* allocate memory and copy the uncompressed data into the temporary stream */
1238                  ns->data = (uint8 *) xrealloc(ns->data, rlen);                  ns->data = (uint8 *) xrealloc(ns->data, rlen);

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

  ViewVC Help
Powered by ViewVC 1.1.26