/[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 863 by stargo, Mon Mar 14 17:47:46 2005 UTC revision 889 by jdmeijer, Sun Apr 17 23:14:20 2005 UTC
# Line 49  extern int g_width; Line 49  extern int g_width;
49  extern int g_height;  extern int g_height;
50  extern BOOL g_bitmap_cache;  extern BOOL g_bitmap_cache;
51  extern BOOL g_bitmap_cache_persist_enable;  extern BOOL g_bitmap_cache_persist_enable;
52    extern BOOL g_rdp_compression;
53    
54  uint8 *g_next_packet;  uint8 *g_next_packet;
55  uint32 g_rdp_shareid;  uint32 g_rdp_shareid;
# Line 59  extern RDPCOMP g_mppc_dict; Line 60  extern RDPCOMP g_mppc_dict;
60  static uint32 g_packetno;  static uint32 g_packetno;
61  #endif  #endif
62    
63    #ifdef HAVE_ICONV
64    static BOOL g_iconv_works = True;
65    #endif
66    
67  /* Receive an RDP packet */  /* Receive an RDP packet */
68  static STREAM  static STREAM
69  rdp_recv(uint8 * type)  rdp_recv(uint8 * type)
# Line 157  rdp_out_unistr(STREAM s, char *string, i Line 162  rdp_out_unistr(STREAM s, char *string, i
162  #ifdef HAVE_ICONV  #ifdef HAVE_ICONV
163          size_t ibl = strlen(string), obl = len + 2;          size_t ibl = strlen(string), obl = len + 2;
164          static iconv_t iconv_h = (iconv_t) - 1;          static iconv_t iconv_h = (iconv_t) - 1;
165          char *pin = string, *pout = s->p;          char *pin = string, *pout = (char *) s->p;
166    
167          memset(pout, 0, len + 4);          memset(pout, 0, len + 4);
168    
169          if (iconv_h == (iconv_t) - 1)          if (g_iconv_works)
170          {          {
171                  size_t i = 1, o = 4;                  if (iconv_h == (iconv_t) - 1)
                 if ((iconv_h = iconv_open(WINDOWS_CODEPAGE, g_codepage)) == (iconv_t) - 1)  
172                  {                  {
173                          printf("rdp_out_unistr: iconv_open[%s -> %s] fail %d\n",                          size_t i = 1, o = 4;
174                                 g_codepage, WINDOWS_CODEPAGE, (int) iconv_h);                          if ((iconv_h = iconv_open(WINDOWS_CODEPAGE, g_codepage)) == (iconv_t) - 1)
175                          return;                          {
176                                    warning("rdp_out_unistr: iconv_open[%s -> %s] fail %d\n",
177                                            g_codepage, WINDOWS_CODEPAGE, (int) iconv_h);
178    
179                                    g_iconv_works = False;
180                                    rdp_out_unistr(s, string, len);
181                                    return;
182                            }
183                            if (iconv(iconv_h, (ICONV_CONST char **) &pin, &i, &pout, &o) ==
184                                (size_t) - 1)
185                            {
186                                    iconv_close(iconv_h);
187                                    iconv_h = (iconv_t) - 1;
188                                    warning("rdp_out_unistr: iconv(1) fail, errno %d\n", errno);
189    
190                                    g_iconv_works = False;
191                                    rdp_out_unistr(s, string, len);
192                                    return;
193                            }
194                            pin = string;
195                            pout = (char *) s->p;
196                  }                  }
197                  if (iconv(iconv_h, (ICONV_CONST char **) &pin, &i, &pout, &o) == (size_t) - 1)  
198                    if (iconv(iconv_h, (ICONV_CONST char **) &pin, &ibl, &pout, &obl) == (size_t) - 1)
199                  {                  {
200                          iconv_close(iconv_h);                          iconv_close(iconv_h);
201                          iconv_h = (iconv_t) - 1;                          iconv_h = (iconv_t) - 1;
202                          printf("rdp_out_unistr: iconv(1) fail, errno %d\n", errno);                          warning("rdp_out_unistr: iconv(2) fail, errno %d\n", errno);
203    
204                            g_iconv_works = False;
205                            rdp_out_unistr(s, string, len);
206                          return;                          return;
207                  }                  }
                 pin = string;  
                 pout = (char *) s->p;  
         }  
208    
209          if (iconv(iconv_h, (ICONV_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;  
         }  
210    
211          s->p += len + 2;          }
212            else
213    #endif
214            {
215                    int i = 0, j = 0;
216    
217  #else /* HAVE_ICONV undef */                  len += 2;
         int i = 0, j = 0;  
218    
219          len += 2;                  while (i < len)
220                    {
221                            s->p[i++] = string[j++];
222                            s->p[i++] = 0;
223                    }
224    
225          while (i < len)                  s->p += len;
         {  
                 s->p[i++] = string[j++];  
                 s->p[i++] = 0;  
226          }          }
   
         s->p += len;  
 #endif  
227  }  }
228    
229  /* Input a string in Unicode  /* Input a string in Unicode
# Line 215  rdp_in_unistr(STREAM s, char *string, in Line 235  rdp_in_unistr(STREAM s, char *string, in
235  {  {
236  #ifdef HAVE_ICONV  #ifdef HAVE_ICONV
237          size_t ibl = uni_len, obl = uni_len;          size_t ibl = uni_len, obl = uni_len;
238          char *pin = s->p, *pout = string;          char *pin = (char *) s->p, *pout = string;
239          static iconv_t iconv_h = (iconv_t) - 1;          static iconv_t iconv_h = (iconv_t) - 1;
240    
241          if (iconv_h == (iconv_t) - 1)          if (g_iconv_works)
242          {          {
243                  if ((iconv_h = iconv_open(g_codepage, WINDOWS_CODEPAGE)) == (iconv_t) - 1)                  if (iconv_h == (iconv_t) - 1)
244                  {                  {
245                          printf("rdp_in_unistr: iconv_open[%s -> %s] fail %d\n",                          if ((iconv_h = iconv_open(g_codepage, WINDOWS_CODEPAGE)) == (iconv_t) - 1)
246                                 WINDOWS_CODEPAGE, g_codepage, (int) iconv_h);                          {
247                          return 0;                                  warning("rdp_in_unistr: iconv_open[%s -> %s] fail %d\n",
248                                            WINDOWS_CODEPAGE, g_codepage, (int) iconv_h);
249    
250                                    g_iconv_works = False;
251                                    return rdp_in_unistr(s, string, uni_len);
252                            }
253                  }                  }
         }  
254    
255          if (iconv(iconv_h, (ICONV_CONST char **) &pin, &ibl, &pout, &obl) == (size_t) - 1)                  if (iconv(iconv_h, (ICONV_CONST char **) &pin, &ibl, &pout, &obl) == (size_t) - 1)
256          {                  {
257                  iconv_close(iconv_h);                          iconv_close(iconv_h);
258                  iconv_h = (iconv_t) - 1;                          iconv_h = (iconv_t) - 1;
259                  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;  
260    
261          while (i < uni_len / 2)                          g_iconv_works = False;
262          {                          return rdp_in_unistr(s, string, uni_len);
263                  in_uint8a(s, &string[i++], 1);                  }
264                  in_uint8s(s, 1);                  return pout - string;
265          }          }
266            else
         return i - 1;  
267  #endif  #endif
268            {
269                    int i = 0;
270    
271                    while (i < uni_len / 2)
272                    {
273                            in_uint8a(s, &string[i++], 1);
274                            in_uint8s(s, 1);
275                    }
276    
277                    return i - 1;
278            }
279  }  }
280    
281    
# Line 269  rdp_send_logon_info(uint32 flags, char * Line 298  rdp_send_logon_info(uint32 flags, char *
298          time_t t = time(NULL);          time_t t = time(NULL);
299          time_t tzone;          time_t tzone;
300    
 #if 0  
         /* enable rdp compression */  
         /* some problems still exist with rdp5 */  
         flags |= RDP_COMPRESSION;  
 #endif  
   
301          if (!g_use_rdp5 || 1 == g_server_rdp_version)          if (!g_use_rdp5 || 1 == g_server_rdp_version)
302          {          {
303                  DEBUG_RDP5(("Sending RDP4-style Logon packet\n"));                  DEBUG_RDP5(("Sending RDP4-style Logon packet\n"));
# Line 636  rdp_out_bmpcache2_caps(STREAM s) Line 659  rdp_out_bmpcache2_caps(STREAM s)
659    
660          out_uint16_le(s, g_bitmap_cache_persist_enable ? 2 : 0);        /* version */          out_uint16_le(s, g_bitmap_cache_persist_enable ? 2 : 0);        /* version */
661    
662          out_uint16_le(s, 0x0300);       /* flags? number of caches? */          out_uint16_be(s, 3);    /* number of caches in this set */
663    
664            /* max cell size for cache 0 is 16x16, 1 = 32x32, 2 = 64x64, etc */
665          out_uint32_le(s, BMPCACHE2_C0_CELLS);          out_uint32_le(s, BMPCACHE2_C0_CELLS);
666          out_uint32_le(s, BMPCACHE2_C1_CELLS);          out_uint32_le(s, BMPCACHE2_C1_CELLS);
667          if (pstcache_init(2))          if (pstcache_init(2))
# Line 1178  process_data_pdu(STREAM s, uint32 * ext_ Line 1202  process_data_pdu(STREAM s, uint32 * ext_
1202                  if (mppc_expand(s->p, clen, ctype, &roff, &rlen) == -1)                  if (mppc_expand(s->p, clen, ctype, &roff, &rlen) == -1)
1203                          error("error while decompressing packet\n");                          error("error while decompressing packet\n");
1204    
1205                  //len -= 18;                  /* len -= 18; */
1206    
1207                  /* allocate memory and copy the uncompressed data into the temporary stream */                  /* allocate memory and copy the uncompressed data into the temporary stream */
1208                  ns->data = (uint8 *) xrealloc(ns->data, rlen);                  ns->data = (uint8 *) xrealloc(ns->data, rlen);

Legend:
Removed from v.863  
changed lines
  Added in v.889

  ViewVC Help
Powered by ViewVC 1.1.26