Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37044518
en ru br
Репозитории ALT
S:5.4-alt1
5.1: 2.2.9-alt3
4.1: 2.2.4-alt2
4.0: 2.2.0-alt1
3.0: 1.8.11-alt2
www.altlinux.org/Changes

Группа :: Офис
Пакет: gnucash

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: gnucash-2.2.4-utf8-alt.patch
Скачать


diff -ur gnucash-2.2.4.orig/lib/libqof/backend/file/qsf-backend.c gnucash-2.2.4/lib/libqof/backend/file/qsf-backend.c
--- gnucash-2.2.4.orig/lib/libqof/backend/file/qsf-backend.c	2008-03-02 16:26:47 +0300
+++ gnucash-2.2.4/lib/libqof/backend/file/qsf-backend.c	2008-03-31 12:49:39 +0400
@@ -236,9 +236,9 @@
 		return;
 	}
 	if (g_str_has_prefix (book_path, "file:")) {
-		qsf_be->fullpath = g_strdup (book_path + 5);
+		qsf_be->fullpath = filename_from_utf8 (book_path + 5);
 	} else {
-		qsf_be->fullpath = g_strdup (book_path);
+		qsf_be->fullpath = filename_from_utf8 (book_path);
 	}
 	if(create_if_nonexistent)
 	{
diff -ur gnucash-2.2.4.orig/lib/libqof/qof/qofutil.c gnucash-2.2.4/lib/libqof/qof/qofutil.c
--- gnucash-2.2.4.orig/lib/libqof/qof/qofutil.c	2008-03-02 16:26:47 +0300
+++ gnucash-2.2.4/lib/libqof/qof/qofutil.c	2008-03-31 12:49:39 +0400
@@ -80,6 +80,33 @@
     return retval;
 }
 
+gchar*
+filename_from_utf8 (const gchar *filename)
+{
+    gchar *fn;
+
+    if(g_utf8_validate(filename, -1, NULL))
+	fn = g_filename_from_utf8(filename, -1, NULL, NULL, NULL);
+    else
+	fn = g_strdup(filename);
+
+    return fn;
+}
+
+gchar *
+filename_to_utf8 (const gchar *oldname)
+{
+    gchar *file_name = NULL; // need to be freed after use
+
+    if (!g_utf8_validate(oldname, -1, NULL)) { 
+	file_name = g_filename_to_utf8(oldname, -1, NULL, NULL, NULL); 
+	if(!file_name) 
+	    g_warning("Some characters in the filename is neither UTF-8 nor your local encoding\n"); 
+	} 
+    if(!file_name) 
+	file_name = g_strdup(oldname); 
+}
+
 gint 
 safe_strcmp (const gchar * da, const gchar * db)
 {
diff -ur gnucash-2.2.4.orig/lib/libqof/qof/qofutil.h gnucash-2.2.4/lib/libqof/qof/qofutil.h
--- gnucash-2.2.4.orig/lib/libqof/qof/qofutil.h	2008-03-02 16:26:47 +0300
+++ gnucash-2.2.4/lib/libqof/qof/qofutil.h	2008-03-31 12:49:39 +0400
@@ -176,6 +176,9 @@
  * equal, > 0 if da compares after db. */
 gint qof_utf8_strcasecmp (const gchar *da, const gchar *db);
 
+gchar* filename_from_utf8 (const gchar *filename);
+gchar* filename_to_utf8 (const gchar *filename);
+
 /** The safe_strcmp compares strings da and db the same way that strcmp()
  does, except that either may be null.  This routine assumes that
  a non-null string is always greater than a null string.
diff -ur gnucash-2.2.4.orig/src/backend/file/gnc-backend-file.c gnucash-2.2.4/src/backend/file/gnc-backend-file.c
--- gnucash-2.2.4.orig/src/backend/file/gnc-backend-file.c	2008-03-02 16:24:27 +0300
+++ gnucash-2.2.4/src/backend/file/gnc-backend-file.c	2008-03-31 12:49:39 +0400
@@ -202,11 +202,14 @@
                    gboolean ignore_lock, gboolean create_if_nonexistent)
 {
     FileBackend *be = (FileBackend*) be_start;
+    gchar *tmpfile;
 
     ENTER (" ");
 
     /* Make sure the directory is there */
-    be->fullpath = xaccResolveFilePath(book_id);
+    tmpfile = xaccResolveFilePath(book_id);
+    be->fullpath = filename_from_utf8(tmpfile);
+    g_free(tmpfile);
     if (NULL == be->fullpath)
     {
         qof_backend_set_error (be_start, ERR_FILEIO_FILE_NOT_FOUND);
diff -ur gnucash-2.2.4.orig/src/bin/gnucash-bin.c gnucash-2.2.4/src/bin/gnucash-bin.c
--- gnucash-2.2.4.orig/src/bin/gnucash-bin.c	2008-03-02 16:24:51 +0300
+++ gnucash-2.2.4/src/bin/gnucash-bin.c	2008-03-31 12:49:39 +0400
@@ -426,7 +426,7 @@
 get_file_to_load()
 {
     if (file_to_load)
-        return g_strdup(file_to_load);
+        return filename_to_utf8(file_to_load);
     else
         return gnc_history_get_last();
 }
diff -ur gnucash-2.2.4.orig/src/core-utils/gnc-gkeyfile-utils.c gnucash-2.2.4/src/core-utils/gnc-gkeyfile-utils.c
--- gnucash-2.2.4.orig/src/core-utils/gnc-gkeyfile-utils.c	2008-03-02 16:24:24 +0300
+++ gnucash-2.2.4/src/core-utils/gnc-gkeyfile-utils.c	2008-03-31 12:49:39 +0400
@@ -262,6 +262,33 @@
 #endif
 
 
+static inline gchar*
+filename_from_utf8 (const gchar *filename)
+{
+    gchar *fn;
+
+    if(g_utf8_validate(filename, -1, NULL))
+	fn = g_filename_from_utf8(filename, -1, NULL, NULL, NULL);
+    else
+	fn = g_strdup(filename);
+
+    return fn;
+}
+
+static inline gchar *
+filename_to_utf8 (const gchar *oldname)
+{
+    gchar *file_name = NULL; // need to be freed after use
+
+    if (!g_utf8_validate(oldname, -1, NULL)) { 
+	file_name = g_filename_to_utf8(oldname, -1, NULL, NULL, NULL); 
+	if(!file_name) 
+	    g_warning("Some characters in the filename is neither UTF-8 nor your local encoding\n"); 
+	} 
+    if(!file_name) 
+	file_name = g_strdup(oldname); 
+}
+
 GKeyFile *
 gnc_key_file_load_from_file (const gchar *filename,
 			     gboolean ignore_error,
@@ -289,8 +316,12 @@
     key_file = NULL;
   }
 
-  if (!ignore_error)
-    g_warning("Unable to read file %s: %s\n", filename, error->message);
+  if (!ignore_error) {
+    gchar *fname_utf8 = filename_to_utf8(filename); 
+
+    g_warning("Unable to read file %s: %s\n", fname_utf8, error->message);
+    g_free(fname_utf8);
+  }
   g_propagate_error(caller_error, error);
   return key_file;
 }
@@ -301,7 +332,7 @@
 			   GKeyFile *key_file,
 			   GError **error)
 {
-  gchar *contents;
+  gchar *contents, *fname_local;
   gint fd;
   extern int errno;
   gint length;
@@ -315,7 +346,9 @@
 
   contents = g_key_file_to_data(key_file, NULL, NULL);
   length = strlen(contents);
-  fd = g_open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+  fname_local = filename_from_utf8(filename);
+  fd = g_open(fname_local, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+  g_free(fname_local);
   if (fd == -1) {
     if (error) {
       *error = g_error_new(G_FILE_ERROR, g_file_error_from_errno(errno), 
diff -ur gnucash-2.2.4.orig/src/engine/gnc-filepath-utils.c gnucash-2.2.4/src/engine/gnc-filepath-utils.c
--- gnucash-2.2.4.orig/src/engine/gnc-filepath-utils.c	2008-03-02 16:26:08 +0300
+++ gnucash-2.2.4/src/engine/gnc-filepath-utils.c	2008-03-31 12:49:39 +0400
@@ -60,14 +60,16 @@
 MakeHomeDir (void) 
 {
   const gchar *home;
-  char *path;
+  char *path, *utfpath;
   char *data;
 
   /* Punt. Can't figure out where home is. */
   home = g_get_home_dir();
   if (!home) return;
 
-  path = g_build_filename(home, ".gnucash", (gchar *)NULL);
+  utfpath = g_build_filename(home, ".gnucash", (gchar *)NULL);
+  path = filename_from_utf8(utfpath);
+  g_free(utfpath);
 
   if (!g_file_test(path, G_FILE_TEST_EXISTS))
   {
@@ -220,14 +222,17 @@
       int j;
       for(j = 0; gens[i](pathbuf, j) ; j++)
       {
-	  gchar *fullpath = g_build_filename(pathbuf, filefrag, (gchar *)NULL);
+	  gchar *utfpath = g_build_filename(pathbuf, filefrag, (gchar *)NULL);
+	  gchar *fullpath = filename_from_utf8(utfpath);
 
 	  if (g_file_test(fullpath, G_FILE_TEST_IS_REGULAR))
 	  {
 	      LEAVE("found %s", fullpath);
-	      return fullpath;
+	      g_free (fullpath);
+	      return utfpath;
           }
 	  g_free (fullpath);
+	  g_free (utfpath);
       }
   }
   /* OK, we didn't find the file. */
@@ -422,7 +427,12 @@
 gchar *
 gnc_build_book_path (const gchar *filename)
 {
-  return g_build_filename(gnc_dotgnucash_dir(), "books", filename, (gchar *)NULL);
+  gchar *fn, *fname;
+
+  fn = g_build_filename(gnc_dotgnucash_dir(), "books", filename, (gchar *)NULL);
+  fname = filename_from_utf8(fn);
+  g_free(fn);
+  return fname;
 }
 
 /* =============================== END OF FILE ========================== */
diff -ur gnucash-2.2.4.orig/src/engine/TransLog.c gnucash-2.2.4/src/engine/TransLog.c
--- gnucash-2.2.4.orig/src/engine/TransLog.c	2008-03-02 16:26:12 +0300
+++ gnucash-2.2.4/src/engine/TransLog.c	2008-03-31 12:49:39 +0400
@@ -107,7 +107,7 @@
    if (!basepath) return;
 
    g_free (log_base_name);
-   log_base_name = g_strdup (basepath);
+   log_base_name = filename_from_utf8 (basepath);
 
    if (trans_log) {
       xaccCloseLog();
diff -ur gnucash-2.2.4.orig/src/gnome-utils/gnc-file.c gnucash-2.2.4/src/gnome-utils/gnc-file.c
--- gnucash-2.2.4.orig/src/gnome-utils/gnc-file.c	2008-03-02 16:25:54 +0300
+++ gnucash-2.2.4/src/gnome-utils/gnc-file.c	2008-03-31 12:49:39 +0400
@@ -129,9 +129,12 @@
     gtk_dialog_add_button(GTK_DIALOG(file_box),
 			  okbutton, GTK_RESPONSE_ACCEPT);
 
-  if (starting_dir)
+  if (starting_dir) {
+    char *local_starting_dir = g_filename_from_utf8(starting_dir, -1, NULL, NULL, NULL);
     gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (file_box),
-					starting_dir);
+					local_starting_dir);
+    g_free(local_starting_dir);
+  }
 
   gtk_window_set_modal(GTK_WINDOW(file_box), TRUE);
   /*
@@ -172,7 +175,7 @@
       /* nope, a local file name */
       internal_name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER (file_box));
     }
-    file_name = g_strdup(internal_name);
+    file_name = filename_to_utf8(internal_name);
   }
   gtk_widget_destroy(GTK_WIDGET(file_box));
   LEAVE("%s", file_name ? file_name : "(null)");
--- gnucash-2.2.4/src/gnome/gnc-plugin-basic-commands.c.orig	2008-03-02 16:26:02 +0300
+++ gnucash-2.2.4/src/gnome/gnc-plugin-basic-commands.c	2008-03-31 13:17:52 +0400
@@ -370,12 +370,13 @@
 
   ENTER (" ");
   qof_event_suspend();
-  filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION (fs));
+  filename = filename_to_utf8(gtk_file_selection_get_filename(GTK_FILE_SELECTION (fs)));
   gtk_widget_destroy((GtkWidget*) fs);
   first_session = gnc_get_current_session();
   original = qof_session_get_book(first_session);
   qsf_session = qof_session_new();
   qof_session_begin(qsf_session, filename, TRUE, FALSE);
+  g_free(filename);
   qof_session_load(qsf_session, NULL);
   err = qof_session_get_error(qsf_session);
   if (err != ERR_BACKEND_NO_ERR) {
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin