[gimp] app: port GimpInterpreterDB and GimpEnvironTable loading to GFileEnumerator



commit 3ab1084df7942f0447b0fa52bf5d2132ca771ac0
Author: Michael Natterer <mitch gimp org>
Date:   Sun Jul 20 19:24:06 2014 +0200

    app: port GimpInterpreterDB and GimpEnvironTable loading to GFileEnumerator

 app/plug-in/gimpenvirontable.c  |   64 ++++++++++++++++-----
 app/plug-in/gimpenvirontable.h  |    2 +-
 app/plug-in/gimpinterpreterdb.c |  118 ++++++++++++++++++++++++++-------------
 app/plug-in/gimpinterpreterdb.h |    2 +-
 app/plug-in/gimppluginmanager.c |   15 +++--
 5 files changed, 138 insertions(+), 63 deletions(-)
---
diff --git a/app/plug-in/gimpenvirontable.c b/app/plug-in/gimpenvirontable.c
index b32d659..e234a66 100644
--- a/app/plug-in/gimpenvirontable.c
+++ b/app/plug-in/gimpenvirontable.c
@@ -47,8 +47,8 @@ struct _GimpEnvironValue
 
 static void     gimp_environ_table_finalize       (GObject               *object);
 
-static void     gimp_environ_table_load_env_file  (const GimpDatafileData *file_data,
-                                                   gpointer                user_data);
+static void     gimp_environ_table_load_env_file  (GimpEnvironTable      *environ_table,
+                                                   GFile                 *file);
 static gboolean gimp_environ_table_legal_name     (gchar                 *name);
 
 static void     gimp_environ_table_populate       (GimpEnvironTable      *environ_table);
@@ -138,8 +138,10 @@ gimp_environ_table_str_equal (gconstpointer v1,
 
 void
 gimp_environ_table_load (GimpEnvironTable *environ_table,
-                         const gchar      *env_path)
+                         GList            *path)
 {
+  GList *list;
+
   g_return_if_fail (GIMP_IS_ENVIRON_TABLE (environ_table));
 
   gimp_environ_table_clear (environ_table);
@@ -150,10 +152,41 @@ gimp_environ_table_load (GimpEnvironTable *environ_table,
                            g_free,
                            (GDestroyNotify) gimp_environ_table_free_value);
 
-  gimp_datafiles_read_directories (env_path,
-                                   G_FILE_TEST_EXISTS,
-                                   gimp_environ_table_load_env_file,
-                                   environ_table);
+  for (list = path; list; list = g_list_next (list))
+    {
+      GFile           *dir = list->data;
+      GFileEnumerator *enumerator;
+
+      enumerator =
+       g_file_enumerate_children (dir,
+                                  G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN ","
+                                  G_FILE_ATTRIBUTE_STANDARD_TYPE,
+                                  G_FILE_QUERY_INFO_NONE,
+                                  NULL, NULL);
+
+      if (enumerator)
+       {
+         GFileInfo *info;
+
+         while ((info = g_file_enumerator_next_file (enumerator,
+                                                     NULL, NULL)))
+           {
+             if (! g_file_info_get_is_hidden (info) &&
+                 g_file_info_get_file_type (info) == G_FILE_TYPE_REGULAR)
+               {
+                 GFile *file = g_file_enumerator_get_child (enumerator, info);
+
+                 gimp_environ_table_load_env_file (environ_table, file);
+
+                 g_object_unref (file);
+               }
+
+             g_object_unref (info);
+           }
+
+         g_object_unref (enumerator);
+       }
+    }
 }
 
 void
@@ -239,20 +272,23 @@ gimp_environ_table_get_envp (GimpEnvironTable *environ_table)
 /* private */
 
 static void
-gimp_environ_table_load_env_file (const GimpDatafileData *file_data,
-                                  gpointer                user_data)
+gimp_environ_table_load_env_file (GimpEnvironTable *environ_table,
+                                 GFile            *file)
 {
-  GimpEnvironTable *environ_table = GIMP_ENVIRON_TABLE (user_data);
   FILE             *env;
+  gchar            *path;
   gchar             buffer[4096];
   gsize             len;
   gchar            *name, *value, *separator, *p, *q;
   GimpEnvironValue *val;
 
   if (environ_table->verbose)
-    g_print ("Parsing '%s'\n", gimp_filename_to_utf8 (file_data->filename));
+    g_print ("Parsing '%s'\n", gimp_file_get_utf8_name (file));
+
+  path = g_file_get_path (file);
+  env = g_fopen (path, "r");
+  g_free (path);
 
-  env = g_fopen (file_data->filename, "r");
   if (! env)
     return;
 
@@ -282,7 +318,7 @@ gimp_environ_table_load_env_file (const GimpDatafileData *file_data,
       if (name[0] == '\0')
         {
           g_message (_("Empty variable name in environment file %s"),
-                     gimp_filename_to_utf8 (file_data->filename));
+                     gimp_file_get_utf8_name (file));
           continue;
         }
 
@@ -300,7 +336,7 @@ gimp_environ_table_load_env_file (const GimpDatafileData *file_data,
       if (! gimp_environ_table_legal_name (name))
         {
           g_message (_("Illegal variable name in environment file %s: %s"),
-                     gimp_filename_to_utf8 (file_data->filename), name);
+                     gimp_file_get_utf8_name (file), name);
           continue;
         }
 
diff --git a/app/plug-in/gimpenvirontable.h b/app/plug-in/gimpenvirontable.h
index 2051404..0c6d97c 100644
--- a/app/plug-in/gimpenvirontable.h
+++ b/app/plug-in/gimpenvirontable.h
@@ -54,7 +54,7 @@ GType               gimp_environ_table_get_type  (void) G_GNUC_CONST;
 GimpEnvironTable  * gimp_environ_table_new       (gboolean          verbose);
 
 void                gimp_environ_table_load      (GimpEnvironTable *environ_table,
-                                                  const gchar      *env_path);
+                                                  GList            *path);
 
 void                gimp_environ_table_add       (GimpEnvironTable *environ_table,
                                                   const gchar      *name,
diff --git a/app/plug-in/gimpinterpreterdb.c b/app/plug-in/gimpinterpreterdb.c
index b60ca29..7e73d8f 100644
--- a/app/plug-in/gimpinterpreterdb.c
+++ b/app/plug-in/gimpinterpreterdb.c
@@ -79,26 +79,26 @@ struct _GimpInterpreterMagic
 };
 
 
-static void     gimp_interpreter_db_finalize         (GObject                 *object);
+static void     gimp_interpreter_db_finalize         (GObject            *object);
 
-static void     gimp_interpreter_db_load_interp_file (const GimpDatafileData  *file_data,
-                                                      gpointer                 user_data);
+static void     gimp_interpreter_db_load_interp_file (GimpInterpreterDB  *db,
+                                                      GFile              *file);
 
-static void     gimp_interpreter_db_add_program      (GimpInterpreterDB       *db,
-                                                      const GimpDatafileData  *file_data,
-                                                      gchar                   *buffer);
-static void     gimp_interpreter_db_add_binfmt_misc  (GimpInterpreterDB       *db,
-                                                      const GimpDatafileData  *file_data,
-                                                      gchar                   *buffer);
+static void     gimp_interpreter_db_add_program      (GimpInterpreterDB  *db,
+                                                      GFile              *file,
+                                                      gchar              *buffer);
+static void     gimp_interpreter_db_add_binfmt_misc  (GimpInterpreterDB  *db,
+                                                      GFile              *file,
+                                                      gchar              *buffer);
 
-static gboolean gimp_interpreter_db_add_extension    (GimpInterpreterDB       *db,
-                                                      gchar                  **tokens);
-static gboolean gimp_interpreter_db_add_magic        (GimpInterpreterDB       *db,
-                                                      gchar                  **tokens);
+static gboolean gimp_interpreter_db_add_extension    (GimpInterpreterDB  *db,
+                                                      gchar             **tokens);
+static gboolean gimp_interpreter_db_add_magic        (GimpInterpreterDB  *db,
+                                                      gchar             **tokens);
 
-static void     gimp_interpreter_db_clear_magics     (GimpInterpreterDB       *db);
+static void     gimp_interpreter_db_clear_magics     (GimpInterpreterDB  *db);
 
-static void     gimp_interpreter_db_resolve_programs (GimpInterpreterDB       *db);
+static void     gimp_interpreter_db_resolve_programs (GimpInterpreterDB  *db);
 
 
 G_DEFINE_TYPE (GimpInterpreterDB, gimp_interpreter_db, G_TYPE_OBJECT)
@@ -141,8 +141,10 @@ gimp_interpreter_db_new (gboolean verbose)
 
 void
 gimp_interpreter_db_load (GimpInterpreterDB *db,
-                          const gchar       *interp_path)
+                          GList             *path)
 {
+  GList *list;
+
   g_return_if_fail (GIMP_IS_INTERPRETER_DB (db));
 
   gimp_interpreter_db_clear (db);
@@ -159,10 +161,41 @@ gimp_interpreter_db_load (GimpInterpreterDB *db,
   db->extension_names = g_hash_table_new_full (g_str_hash, g_str_equal,
                                                g_free, NULL);
 
-  gimp_datafiles_read_directories (interp_path,
-                                   G_FILE_TEST_EXISTS,
-                                   gimp_interpreter_db_load_interp_file,
-                                   db);
+  for (list = path; list; list = g_list_next (list))
+    {
+      GFile           *dir = list->data;
+      GFileEnumerator *enumerator;
+
+      enumerator =
+       g_file_enumerate_children (dir,
+                                  G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN ","
+                                  G_FILE_ATTRIBUTE_STANDARD_TYPE,
+                                  G_FILE_QUERY_INFO_NONE,
+                                  NULL, NULL);
+
+      if (enumerator)
+       {
+         GFileInfo *info;
+
+         while ((info = g_file_enumerator_next_file (enumerator,
+                                                     NULL, NULL)))
+           {
+             if (! g_file_info_get_is_hidden (info) &&
+                 g_file_info_get_file_type (info) == G_FILE_TYPE_REGULAR)
+               {
+                 GFile *file = g_file_enumerator_get_child (enumerator, info);
+
+                 gimp_interpreter_db_load_interp_file (db, file);
+
+                 g_object_unref (file);
+               }
+
+             g_object_unref (info);
+           }
+
+         g_object_unref (enumerator);
+       }
+    }
 
   gimp_interpreter_db_resolve_programs (db);
 }
@@ -200,20 +233,21 @@ gimp_interpreter_db_clear (GimpInterpreterDB *db)
 }
 
 static void
-gimp_interpreter_db_load_interp_file (const GimpDatafileData *file_data,
-                                      gpointer                user_data)
+gimp_interpreter_db_load_interp_file (GimpInterpreterDB *db,
+                                     GFile             *file)
 {
-  GimpInterpreterDB *db;
-  FILE              *interp_file;
-  gchar              buffer[4096];
-  gsize              len;
-
-  db = GIMP_INTERPRETER_DB (user_data);
+  FILE  *interp_file;
+  gchar *path;
+  gchar  buffer[4096];
+  gsize  len;
 
   if (db->verbose)
-    g_print ("Parsing '%s'\n", gimp_filename_to_utf8 (file_data->filename));
+    g_print ("Parsing '%s'\n", gimp_file_get_utf8_name (file));
+
+  path = g_file_get_path (file);
+  interp_file = g_fopen (path, "r");
+  g_free (path);
 
-  interp_file = g_fopen (file_data->filename, "r");
   if (! interp_file)
     return;
 
@@ -232,18 +266,22 @@ gimp_interpreter_db_load_interp_file (const GimpDatafileData *file_data,
       buffer[len] = '\0';
 
       if (g_ascii_isalnum (buffer[0]) || (buffer[0] == '/'))
-        gimp_interpreter_db_add_program (db, file_data, buffer);
+       {
+         gimp_interpreter_db_add_program (db, file, buffer);
+       }
       else if (! g_ascii_isspace (buffer[0]) && (buffer[0] != '\0'))
-        gimp_interpreter_db_add_binfmt_misc (db, file_data, buffer);
+       {
+         gimp_interpreter_db_add_binfmt_misc (db, file, buffer);
+       }
     }
 
   fclose (interp_file);
 }
 
 static void
-gimp_interpreter_db_add_program (GimpInterpreterDB      *db,
-                                 const GimpDatafileData *file_data,
-                                 gchar                  *buffer)
+gimp_interpreter_db_add_program (GimpInterpreterDB  *db,
+                                 GFile              *file,
+                                 gchar              *buffer)
 {
   gchar *name;
   gchar *program;
@@ -261,7 +299,7 @@ gimp_interpreter_db_add_program (GimpInterpreterDB      *db,
   if (! g_file_test (program, G_FILE_TEST_IS_EXECUTABLE))
     {
       g_message (_("Bad interpreter referenced in interpreter file %s: %s"),
-                 gimp_filename_to_utf8 (file_data->filename),
+                 gimp_file_get_utf8_name (file),
                  gimp_filename_to_utf8 (program));
       return;
     }
@@ -271,9 +309,9 @@ gimp_interpreter_db_add_program (GimpInterpreterDB      *db,
 }
 
 static void
-gimp_interpreter_db_add_binfmt_misc (GimpInterpreterDB      *db,
-                                     const GimpDatafileData *file_data,
-                                     gchar                  *buffer)
+gimp_interpreter_db_add_binfmt_misc (GimpInterpreterDB *db,
+                                     GFile             *file,
+                                     gchar             *buffer)
 {
   gchar **tokens = NULL;
   gchar  *name, *type, *program;
@@ -320,7 +358,7 @@ gimp_interpreter_db_add_binfmt_misc (GimpInterpreterDB      *db,
 
 bail:
   g_message (_("Bad binary format string in interpreter file %s"),
-             gimp_filename_to_utf8 (file_data->filename));
+             gimp_file_get_utf8_name (file));
 
 out:
   g_strfreev (tokens);
diff --git a/app/plug-in/gimpinterpreterdb.h b/app/plug-in/gimpinterpreterdb.h
index 209859a..3778b3f 100644
--- a/app/plug-in/gimpinterpreterdb.h
+++ b/app/plug-in/gimpinterpreterdb.h
@@ -57,7 +57,7 @@ GType               gimp_interpreter_db_get_type (void) G_GNUC_CONST;
 GimpInterpreterDB * gimp_interpreter_db_new      (gboolean            verbose);
 
 void                gimp_interpreter_db_load     (GimpInterpreterDB  *db,
-                                                  const gchar        *interp_path);
+                                                  GList              *path);
 
 void                gimp_interpreter_db_clear    (GimpInterpreterDB  *db);
 
diff --git a/app/plug-in/gimppluginmanager.c b/app/plug-in/gimppluginmanager.c
index 72ae83a..f9b587d 100644
--- a/app/plug-in/gimppluginmanager.c
+++ b/app/plug-in/gimppluginmanager.c
@@ -271,24 +271,25 @@ void
 gimp_plug_in_manager_initialize (GimpPlugInManager  *manager,
                                  GimpInitStatusFunc  status_callback)
 {
-  gchar *path;
+  GimpCoreConfig *config;
+  GList          *path;
 
   g_return_if_fail (GIMP_IS_PLUG_IN_MANAGER (manager));
   g_return_if_fail (status_callback != NULL);
 
+  config = manager->gimp->config;
+
   status_callback (NULL, _("Plug-In Interpreters"), 0.8);
 
-  path = gimp_config_path_expand (manager->gimp->config->interpreter_path,
-                                  TRUE, NULL);
+  path = gimp_config_path_expand_to_files (config->interpreter_path, NULL);
   gimp_interpreter_db_load (manager->interpreter_db, path);
-  g_free (path);
+  g_list_free_full (path, (GDestroyNotify) g_object_unref);
 
   status_callback (NULL, _("Plug-In Environment"), 0.9);
 
-  path = gimp_config_path_expand (manager->gimp->config->environ_path,
-                                  TRUE, NULL);
+  path = gimp_config_path_expand_to_files (config->environ_path, NULL);
   gimp_environ_table_load (manager->environ_table, path);
-  g_free (path);
+  g_list_free_full (path, (GDestroyNotify) g_object_unref);
 
   /*  allocate a piece of shared memory for use in transporting tiles
    *  to plug-ins. if we can't allocate a piece of shared memory then


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]