From 2e5d12fff7df644a94734280ce2c2afa6c67c057 Mon Sep 17 00:00:00 2001 From: John Darrington Date: Sat, 28 Mar 2009 12:24:34 +0900 Subject: [PATCH] Convert files named on the command line to filename encoding. Files specified on the command line must be converted to the "filename" encoding (whatever it may be) otherwise some systems will not know they exist. Tested by Michel Boaventura. Partially fixes bug #26023 --- src/ui/gui/psppire.c | 54 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/src/ui/gui/psppire.c b/src/ui/gui/psppire.c index 3d0d8649..599d8108 100644 --- a/src/ui/gui/psppire.c +++ b/src/ui/gui/psppire.c @@ -279,7 +279,59 @@ parse_non_options (int key, char *arg, struct argp_state *state) { 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: -- 2.30.2