diff lib/protocols.c @ 899:f716c8dbeaff

2007-3-22 Brian Masney <masneyb@gftp.org> * lib/gftp.h lib/protocols.c - fixed two remaining codepage related issues: i) The first was a problem parsing the remote_charsets option. ii) The second was the same IConv structure being used for the local and remote side. Each side now has their own IConv structure. (from Alexander Orlov <alxorlov@pochta.ru>)
author masneyb
date Thu, 22 Mar 2007 22:11:27 +0000
parents 4ab11f70a7f4
children 936635b76f02
line wrap: on
line diff
--- a/lib/protocols.c	Thu Mar 22 14:51:10 2007 +0000
+++ b/lib/protocols.c	Thu Mar 22 22:11:27 2007 +0000
@@ -157,13 +157,23 @@
 #endif
 
 #if GLIB_MAJOR_VERSION > 1
-  if (request->iconv_initialized)
+  if (request->iconv_from_initialized)
+    {
+      g_iconv_close (request->iconv_from);
+      request->iconv_from_initialized = 0;
+    }
+
+  if (request->iconv_to_initialized)
     {
-      g_iconv_close (request->iconv);
-      request->iconv_initialized = 0;
-      g_free (request->iconv_charset);
-      request->iconv_charset = NULL;
+      g_iconv_close (request->iconv_to);
+      request->iconv_to_initialized = 0;
     }
+
+  if (request->iconv_charset)
+  {
+    g_free (request->iconv_charset);
+    request->iconv_charset = NULL;
+  }
 #endif
 
   request->cached = 0;
@@ -431,6 +441,7 @@
        (*curpos)[retlen - 1] == ' ' || (*curpos)[retlen - 1] == '\t';
        retlen--);
 
+  retlen++; /* Needed due to the len - 1 above... */
   ret = g_malloc0 (retlen + 1);
   memcpy (ret, *curpos, retlen);
 
@@ -502,14 +513,29 @@
       return (ret);
     }
 
-  if (request->iconv_initialized)
+  if (from_utf8)
     {
-      ret = g_convert_with_iconv (str, -1, request->iconv, &bread, dest_len,
-                                  &error);
-      if (ret == NULL)
-        _do_show_iconv_error (str, request->iconv_charset, from_utf8, error);
-
-      return (ret);
+      if (request->iconv_from_initialized)
+        {
+          ret = g_convert_with_iconv (str, -1, request->iconv_from, &bread, dest_len,
+                                      &error);
+          if (ret == NULL)
+            _do_show_iconv_error (str, request->iconv_charset, from_utf8, error);
+
+          return (ret);
+        }
+    }
+  else
+    {
+      if (request->iconv_to_initialized)
+        {
+          ret = g_convert_with_iconv (str, -1, request->iconv_to, &bread, dest_len,
+                                      &error);
+          if (ret == NULL)
+            _do_show_iconv_error (str, request->iconv_charset, from_utf8, error);
+
+          return (ret);
+        }
     }
 
   stpos = remote_charsets;
@@ -519,30 +545,47 @@
         {
           fromset = "UTF-8";
           toset = cur_charset;
+          if ((request->iconv_from = g_iconv_open (toset, fromset)) == (GIConv) -1)
+            {
+              g_free (cur_charset);
+              continue;
+            }
+
+          error = NULL;
+          if ((ret = g_convert_with_iconv (str, -1, request->iconv_from, &bread,
+                                           dest_len, &error)) == NULL)
+            {
+              g_iconv_close (request->iconv_from);
+              request->iconv_from = NULL;
+              _do_show_iconv_error (str, cur_charset, from_utf8, error);
+              g_free (cur_charset);
+            }
+
+          request->iconv_from_initialized = 1;
         }
       else
         {
           fromset = cur_charset;
           toset = "UTF-8";
-        }
-
-      if ((request->iconv = g_iconv_open (toset, fromset)) == (GIConv) -1)
-        {
-          g_free (cur_charset);
-          continue;
+          if ((request->iconv_to = g_iconv_open (toset, fromset)) == (GIConv) -1)
+            {
+              g_free (cur_charset);
+              continue;
+            }
+
+          error = NULL;
+          if ((ret = g_convert_with_iconv (str, -1, request->iconv_to, &bread,
+                                           dest_len, &error)) == NULL)
+            {
+              g_iconv_close (request->iconv_to);
+              request->iconv_to = NULL;
+              _do_show_iconv_error (str, cur_charset, from_utf8, error);
+              g_free (cur_charset);
+            }
+
+          request->iconv_to_initialized = 1;
         }
 
-      error = NULL;
-      if ((ret = g_convert_with_iconv (str, -1, request->iconv, &bread,
-                                       dest_len, &error)) == NULL)
-        {
-          g_iconv_close (request->iconv);
-          request->iconv = NULL;
-          _do_show_iconv_error (str, cur_charset, from_utf8, error);
-          g_free (cur_charset);
-        }
-
-      request->iconv_initialized = 1;
       request->iconv_charset = cur_charset;
       return (ret);
     }