changeset 845:8263cc35c027

2006-11-2 Brian Masney <masneyb@gftp.org> * lib/gftp.h lib/local.c lib/misc.c lib/protocols.c lib/rfc959.c lib/sshv2.c - added gftp_filename_to_utf8() and gftp_filename_from_utf8(). (gftp_string_from_utf8) - added argument that will force the local encoding to be used.
author masneyb
date Fri, 03 Nov 2006 03:02:51 +0000
parents 1ece208d1357
children 77660334b282
files ChangeLog lib/gftp.h lib/local.c lib/misc.c lib/protocols.c lib/rfc959.c lib/sshv2.c
diffstat 7 files changed, 93 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri Nov 03 02:37:09 2006 +0000
+++ b/ChangeLog	Fri Nov 03 03:02:51 2006 +0000
@@ -1,4 +1,10 @@
 2006-11-2 Brian Masney <masneyb@gftp.org>
+	* lib/gftp.h lib/local.c lib/misc.c lib/protocols.c lib/rfc959.c
+	lib/sshv2.c - added gftp_filename_to_utf8() and
+	gftp_filename_from_utf8().
+	(gftp_string_from_utf8) - added argument that will force the local
+	encoding to be used.
+
 	* src/gtk/bookmarks.c - removed UTF-8 check since the string is already
 	in that format
 
@@ -3683,7 +3689,7 @@
 
 	* cvsclean - added this script
 
-	* *.[ch] - added $Id: ChangeLog,v 1.494 2006/11/03 02:37:09 masneyb Exp $ tags
+	* *.[ch] - added $Id: ChangeLog,v 1.495 2006/11/03 03:02:47 masneyb Exp $ tags
 
 	* debian/* - updated files from Debian maintainer
 
--- a/lib/gftp.h	Fri Nov 03 02:37:09 2006 +0000
+++ b/lib/gftp.h	Fri Nov 03 03:02:51 2006 +0000
@@ -912,6 +912,15 @@
 					  size_t *dest_len );
 
 /*@null@*/ char * gftp_string_from_utf8	( gftp_request * request, 
+					  int force_local,
+					  const char *str,
+					  size_t *dest_len );
+
+/*@null@*/ char * gftp_filename_to_utf8	( gftp_request * request, 
+					  const char *str,
+					  size_t *dest_len );
+
+/*@null@*/ char * gftp_filename_from_utf8 ( gftp_request * request, 
 					  const char *str,
 					  size_t *dest_len );
 
--- a/lib/local.c	Fri Nov 03 02:37:09 2006 +0000
+++ b/lib/local.c	Fri Nov 03 03:02:51 2006 +0000
@@ -69,7 +69,7 @@
       return (GFTP_ERETRYABLE);
     }
 
-  utf8 = gftp_string_to_utf8 (request, tempstr, &destlen);
+  utf8 = gftp_filename_to_utf8 (request, tempstr, &destlen);
   if (utf8 != NULL)
     request->directory = utf8;
   else
@@ -90,7 +90,7 @@
   g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
   g_return_val_if_fail (directory != NULL, GFTP_EFATAL);
 
-  utf8 = gftp_string_from_utf8 (request, directory, &destlen);
+  utf8 = gftp_filename_from_utf8 (request, directory, &destlen);
   if (utf8 != NULL)
     {
       ret = chdir (utf8);
@@ -168,7 +168,7 @@
       flags |= O_LARGEFILE;
 #endif
 
-      utf8 = gftp_string_from_utf8 (request, filename, &destlen);
+      utf8 = gftp_filename_from_utf8 (request, filename, &destlen);
       if (utf8 != NULL)
         {
           request->datafd = gftp_fd_open (request, utf8, flags, 0);
@@ -227,7 +227,7 @@
 #endif
 
       perms = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
-      utf8 = gftp_string_from_utf8 (request, filename, &destlen);
+      utf8 = gftp_filename_from_utf8 (request, filename, &destlen);
       if (utf8 != NULL)
         {
           request->datafd = gftp_fd_open (request, utf8, flags, perms);
@@ -298,7 +298,7 @@
   char *utf8;
   int ret;
 
-  utf8 = gftp_string_from_utf8 (request, filename, &destlen);
+  utf8 = gftp_filename_from_utf8 (request, filename, &destlen);
   if (utf8 != NULL)
     {
       ret = stat (utf8, &st);
@@ -415,7 +415,7 @@
   else
     dir = request->directory;
 
-  utf8 = gftp_string_from_utf8 (request, dir, &destlen);
+  utf8 = gftp_filename_from_utf8 (request, dir, &destlen);
   if (utf8 != NULL)
     {
       lpd->dir = opendir (utf8);
@@ -447,7 +447,7 @@
   char *utf8;
   int ret;
 
-  utf8 = gftp_string_from_utf8 (request, filename, &destlen);
+  utf8 = gftp_filename_from_utf8 (request, filename, &destlen);
   if (utf8 != NULL)
     {
       ret = stat (utf8, &st);
@@ -474,7 +474,7 @@
   g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
   g_return_val_if_fail (directory != NULL, GFTP_EFATAL);
 
-  utf8 = gftp_string_from_utf8 (request, directory, &destlen);
+  utf8 = gftp_filename_from_utf8 (request, directory, &destlen);
   if (utf8 != NULL)
     {
       ret = rmdir (utf8);
@@ -510,7 +510,7 @@
   g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
   g_return_val_if_fail (file != NULL, GFTP_EFATAL);
 
-  utf8 = gftp_string_from_utf8 (request, file, &destlen);
+  utf8 = gftp_filename_from_utf8 (request, file, &destlen);
   if (utf8 != NULL)
     {
       ret = unlink (utf8);
@@ -548,7 +548,7 @@
 
   perms = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
 
-  utf8 = gftp_string_from_utf8 (request, directory, &destlen);
+  utf8 = gftp_filename_from_utf8 (request, directory, &destlen);
   if (utf8 != NULL)
     {
       ret = mkdir (utf8, perms);
@@ -588,9 +588,9 @@
   g_return_val_if_fail (oldname != NULL, GFTP_EFATAL);
   g_return_val_if_fail (newname != NULL, GFTP_EFATAL);
 
-  old_utf8 = gftp_string_from_utf8 (request, oldname, &destlen);
+  old_utf8 = gftp_filename_from_utf8 (request, oldname, &destlen);
   conv_oldname = old_utf8 != NULL ? old_utf8 : oldname;
-  new_utf8 = gftp_string_from_utf8 (request, newname, &destlen);
+  new_utf8 = gftp_filename_from_utf8 (request, newname, &destlen);
   conv_newname = new_utf8 != NULL ? new_utf8 : newname;
 
   if (rename (conv_oldname, conv_newname) == 0)
@@ -628,7 +628,7 @@
   g_return_val_if_fail (request->protonum == GFTP_LOCAL_NUM, GFTP_EFATAL);
   g_return_val_if_fail (file != NULL, GFTP_EFATAL);
 
-  utf8 = gftp_string_from_utf8 (request, file, &destlen);
+  utf8 = gftp_filename_from_utf8 (request, file, &destlen);
   if (utf8 != NULL)
     {
       ret = chmod (utf8, mode);
@@ -670,7 +670,7 @@
   time_buf.modtime = datetime;
   time_buf.actime = datetime;
 
-  utf8 = gftp_string_from_utf8 (request, file, &destlen);
+  utf8 = gftp_filename_from_utf8 (request, file, &destlen);
   if (utf8 != NULL)
     {
       ret = utime (utf8, &time_buf);
--- a/lib/misc.c	Fri Nov 03 02:37:09 2006 +0000
+++ b/lib/misc.c	Fri Nov 03 03:02:51 2006 +0000
@@ -874,7 +874,6 @@
                     char *file_prefixstr, char *file_suffixstr)
 {
   char *tempstr1, *tempstr2, *ret, tstr[50], *attribs, *utf8;
-  int old_encoding;
   size_t destlen;
   struct tm *lt;
   time_t t;
@@ -902,10 +901,7 @@
   if (file_suffixstr == NULL)
     file_suffixstr = "";
 
-  old_encoding = request->use_local_encoding;
-  utf8 = gftp_string_from_utf8 (request, fle->file, &destlen);
-  request->use_local_encoding = old_encoding;
-
+  utf8 = gftp_string_from_utf8 (request, 1, fle->file, &destlen);
   if (utf8 != NULL)
     {
       ret = g_strdup_printf ("%s %s %s %s%s%s", tempstr1, tempstr2, tstr,
--- a/lib/protocols.c	Fri Nov 03 02:37:09 2006 +0000
+++ b/lib/protocols.c	Fri Nov 03 03:02:51 2006 +0000
@@ -464,8 +464,8 @@
 
 
 /*@null@*/ char *
-_do_convert_string (gftp_request * request, const char *str,
-                    size_t *dest_len, int from_utf8)
+_do_convert_string (gftp_request * request, int is_filename, int force_local,
+                    const char *str, size_t *dest_len, int from_utf8)
 {
   char *remote_charsets, *ret, *fromset, *toset, *stpos, *cur_charset;
   GError * error;
@@ -479,12 +479,23 @@
 
   error = NULL;
   gftp_lookup_request_option (request, "remote_charsets", &remote_charsets);
-  if (*remote_charsets == '\0' || request->use_local_encoding)
+  if (*remote_charsets == '\0' || request->use_local_encoding ||
+      force_local == 1)
     {
       if (from_utf8)
-        ret = g_locale_from_utf8 (str, -1, &bread, dest_len, &error);
+        {
+          if (is_filename)
+            ret = g_filename_from_utf8 (str, -1, &bread, dest_len, &error);
+          else
+            ret = g_locale_from_utf8 (str, -1, &bread, dest_len, &error);
+        }
       else
-        ret = g_locale_to_utf8 (str, -1, &bread, dest_len, &error);
+        {
+          if (is_filename)
+            ret = g_filename_to_utf8 (str, -1, &bread, dest_len, &error);
+          else
+            ret = g_locale_to_utf8 (str, -1, &bread, dest_len, &error);
+        }
 
       if (ret == NULL)
         _do_show_iconv_error (str, request->iconv_charset, from_utf8, error);
@@ -540,18 +551,34 @@
   return (NULL);
 }
 
-/*@null@*/ char *
+char *
 gftp_string_to_utf8 (gftp_request * request, const char *str, size_t *dest_len)
 {
-  return (_do_convert_string (request, str, dest_len, 0));
+  return (_do_convert_string (request, 0, 0, str, dest_len, 0));
 }
 
 
 char *
-gftp_string_from_utf8 (gftp_request * request, const char *str,
+gftp_string_from_utf8 (gftp_request * request, int force_local, const char *str,
                        size_t *dest_len)
 {
-  return (_do_convert_string (request, str, dest_len, 1));
+  return (_do_convert_string (request, 0, force_local, str, dest_len, 1));
+}
+
+
+char *
+gftp_filename_to_utf8 (gftp_request * request, const char *str,
+                       size_t *dest_len)
+{
+  return (_do_convert_string (request, 1, 0, str, dest_len, 0));
+}
+
+
+char *
+gftp_filename_from_utf8 (gftp_request * request, const char *str,
+                         size_t *dest_len)
+{
+  return (_do_convert_string (request, 1, 0, str, dest_len, 1));
 }
 
 #else
@@ -564,7 +591,23 @@
 
 
 char *
-gftp_string_from_utf8 (gftp_request * request, const char *str, size_t dest_len)
+gftp_string_from_utf8 (gftp_request * request, int force_local, const char *str,
+                       size_t dest_len)
+{
+  return (NULL);
+}
+
+
+char *
+gftp_filename_to_utf8 (gftp_request * request, const char *str, size_t dest_len)
+{
+  return (NULL);
+}
+
+
+char *
+gftp_filename_from_utf8 (gftp_request * request, int force_local,
+                         const char *str, size_t dest_len)
 {
   return (NULL);
 }
@@ -618,7 +661,7 @@
 
       if (ret >= 0 && fle->file != NULL)
         {
-          utf8 = gftp_string_to_utf8 (request, fle->file, &destlen);
+          utf8 = gftp_filename_to_utf8 (request, fle->file, &destlen);
           if (utf8 != NULL)
             {
               tmpfile = fle->file;
--- a/lib/rfc959.c	Fri Nov 03 02:37:09 2006 +0000
+++ b/lib/rfc959.c	Fri Nov 03 03:02:51 2006 +0000
@@ -203,7 +203,7 @@
 
   if (argument != NULL)
     {
-      utf8 = gftp_string_from_utf8 (request, argument, &destlen);
+      utf8 = gftp_filename_from_utf8 (request, argument, &destlen);
       if (utf8 != NULL)
         {
           tempstr = g_strconcat (command, " ", utf8, "\r\n", NULL);
@@ -320,7 +320,7 @@
         }
       else
         {
-          utf8 = gftp_string_from_utf8 (request, newval, &destlen);
+          utf8 = gftp_string_from_utf8 (request, -1, newval, &destlen);
           if (utf8 != NULL)
             len += strlen (utf8);
           else
@@ -391,7 +391,7 @@
   if (request->directory)
     g_free (request->directory);
 
-  utf8 = gftp_string_to_utf8 (request, dir, &destlen);
+  utf8 = gftp_filename_to_utf8 (request, dir, &destlen);
   if (utf8 != NULL)
     request->directory = utf8;
   else
@@ -1727,7 +1727,7 @@
   g_return_val_if_fail (file != NULL, GFTP_EFATAL);
   g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL);
 
-  utf8 = gftp_string_from_utf8 (request, file, &destlen);
+  utf8 = gftp_filename_from_utf8 (request, file, &destlen);
   if (utf8 != NULL)
     {
       tempstr = g_strdup_printf ("SITE CHMOD %o %s\r\n", mode, utf8);
@@ -1759,7 +1759,7 @@
   g_return_val_if_fail (command != NULL, GFTP_EFATAL);
   g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL);
 
-  utf8 = gftp_string_from_utf8 (request, command, &destlen);
+  utf8 = gftp_string_from_utf8 (request, -1, command, &destlen);
   if (utf8 != NULL)
     {
       if (specify_site)
--- a/lib/sshv2.c	Fri Nov 03 02:37:09 2006 +0000
+++ b/lib/sshv2.c	Fri Nov 03 03:02:51 2006 +0000
@@ -175,7 +175,7 @@
   char *utf8, *ret;
   size_t pathlen;
 
-  utf8 = gftp_string_from_utf8 (request, str, &pathlen);
+  utf8 = gftp_filename_from_utf8 (request, str, &pathlen);
   if (utf8 != NULL)
     addstr = utf8;
   else
@@ -205,7 +205,7 @@
   else
     path = gftp_build_path (request, request->directory, str, NULL);
 
-  utf8 = gftp_string_from_utf8 (request, path, len);
+  utf8 = gftp_filename_from_utf8 (request, path, len);
   if (utf8 != NULL)
     {
       g_free (path);
@@ -1062,7 +1062,7 @@
   if ((dir = sshv2_buffer_get_string (request, &message, 1)) == NULL)
     return (GFTP_EFATAL);
 
-  utf8 = gftp_string_to_utf8 (request, dir, &len);
+  utf8 = gftp_filename_to_utf8 (request, dir, &len);
   if (utf8 != NULL)
     {
       request->directory = utf8;