Merge commit 'origin/master' into charset
authorJohn Darrington <john@darrington.wattle.id.au>
Wed, 1 Apr 2009 01:58:49 +0000 (09:58 +0800)
committerJohn Darrington <john@darrington.wattle.id.au>
Wed, 1 Apr 2009 01:58:49 +0000 (09:58 +0800)
1  2 
src/ui/gui/psppire.c

diff --combined src/ui/gui/psppire.c
index 405e135024870f8348e7de84c78e70c4e12ebeee,599d8108ddb7d8b91897eb6f16bf0cf27003ec1b..a1f48e7b64d016f1cee8c5fb4b13c2be0bcf6af4
@@@ -16,7 -16,7 +16,7 @@@
  
  #include <config.h>
  
 -#include <locale.h>
 +#include <libpspp/i18n.h>
  #include <assert.h>
  #include <libintl.h>
  #include <gsl/gsl_errno.h>
@@@ -89,8 -89,12 +89,8 @@@ initialize (struct command_line_process
  {
    PsppireDict *dictionary = 0;
  
 -  /* gtk_init messes with the locale.
 -     So unset the bits we want to control ourselves */
 -  setlocale (LC_NUMERIC, "C");
 -
 -  bindtextdomain (PACKAGE, locale_dir);
  
 +  i18n_init ();
  
    preregister_widgets ();
  
@@@ -167,7 -171,6 +167,7 @@@ de_initialize (void
    message_dialog_done ();
    settings_done ();
    outp_done ();
 +  i18n_done ();
  }
  
  
@@@ -276,7 -279,59 +276,59 @@@ parse_non_options (int key, char *arg, 
      {
      case ARGP_KEY_ARG:
        {
-       psppire_window_load (PSPPIRE_WINDOW (the_data_window), arg);
+       gchar *filename = NULL;
+       gchar *utf8 = NULL;
+       const gchar *local_encoding = NULL;
+       gsize written = -1;
+       const gboolean local_is_utf8 = g_get_charset (&local_encoding);
+       /* There seems to be no Glib function to convert from local encoding
+          to filename encoding.  Therefore it has to be done in two steps:
+          the intermediate encoding is UTF8.
+          Either step could fail.  However, in many cases the file can still
+          be loaded even if the conversion fails. So in those cases, after showing
+          a warning, we simply copy the locally encoded filename to the destination
+          and hope for the best.
+       */
+       if ( local_is_utf8)
+         {
+           utf8 = strdup (arg);
+         }
+       else
+         {
+           GError *err = NULL;
+           utf8 = g_locale_to_utf8 (arg, -1, NULL, &written, &err);
+           if ( NULL == utf8)
+             {
+               g_warning ("Cannot convert filename from local encoding \"%s\" to UTF-8: %s",
+                          local_encoding,
+                          err->message);
+               g_clear_error (&err);
+             }
+         }
+       if ( NULL != utf8)
+         {
+           GError *err = NULL;
+           filename = g_filename_from_utf8 (utf8, written, NULL, NULL, &err);
+           if ( NULL == filename)
+             {
+               g_warning ("Cannot convert filename from UTF8 to filename encoding: %s",
+                          err->message);
+               g_clear_error (&err);
+             }
+         }
+       g_free (utf8);
+       if ( filename == NULL)
+         filename = strdup (arg);
+       psppire_window_load (PSPPIRE_WINDOW (the_data_window), filename);
+       g_free (filename);
        break;
        }
      default: