[gimp] libgimpmodule, app: port GimpModuleDB to GFileEnumerator



commit a0b9e5c702ce4317c465b9480c3b5505db1c382d
Author: Michael Natterer <mitch gimp org>
Date:   Sun Aug 3 18:30:02 2014 +0200

    libgimpmodule, app: port GimpModuleDB to GFileEnumerator
    
    this implies passing the UTF-8 encoded raw module path from gimprc to
    gimp_module_db_load() and gimp_module_db_refresh(), which is strictly
    speaking an API break, but I seriously doubt that anyone but GIMP is
    actually using libgimpmodule.

 app/core/gimp-modules.c      |   11 +----
 libgimpmodule/Makefile.am    |    2 +
 libgimpmodule/gimpmoduledb.c |  102 ++++++++++++++++++++++++++++++++---------
 3 files changed, 83 insertions(+), 32 deletions(-)
---
diff --git a/app/core/gimp-modules.c b/app/core/gimp-modules.c
index 47012aa..23df89b 100644
--- a/app/core/gimp-modules.c
+++ b/app/core/gimp-modules.c
@@ -64,7 +64,6 @@ void
 gimp_modules_load (Gimp *gimp)
 {
   GFile    *file;
-  gchar    *path;
   GScanner *scanner;
   gchar    *module_load_inhibit = NULL;
 
@@ -153,9 +152,7 @@ gimp_modules_load (Gimp *gimp)
       g_free (module_load_inhibit);
     }
 
-  path = gimp_config_path_expand (gimp->config->module_path, TRUE, NULL);
-  gimp_module_db_load (gimp->module_db, path);
-  g_free (path);
+  gimp_module_db_load (gimp->module_db, gimp->config->module_path);
 }
 
 static void
@@ -229,10 +226,6 @@ gimp_modules_refresh (Gimp *gimp)
 
   if (! gimp->no_interface)
     {
-      gchar *path;
-
-      path = gimp_config_path_expand (gimp->config->module_path, TRUE, NULL);
-      gimp_module_db_refresh (gimp->module_db, path);
-      g_free (path);
+      gimp_module_db_refresh (gimp->module_db, gimp->config->module_path);
     }
 }
diff --git a/libgimpmodule/Makefile.am b/libgimpmodule/Makefile.am
index a76526b..52671d7 100644
--- a/libgimpmodule/Makefile.am
+++ b/libgimpmodule/Makefile.am
@@ -1,6 +1,7 @@
 ## Process this file with automake to produce Makefile.in
 
 libgimpbase = $(top_builddir)/libgimpbase/libgimpbase-$(GIMP_API_VERSION).la
+libgimpconfig = $(top_builddir)/libgimpconfig/libgimpconfig-$(GIMP_API_VERSION).la
 
 if PLATFORM_WIN32
 no_undefined = -no-undefined
@@ -75,6 +76,7 @@ EXTRA_libgimpmodule_ GIMP_API_VERSION@_la_DEPENDENCIES = $(gimpmodule_def)
 
 libgimpmodule_ GIMP_API_VERSION@_la_LIBADD = \
        $(libgimpbase)                  \
+       $(libgimpconfig)                \
        $(GMODULE_NO_EXPORT_LIBS)       \
        $(GLIB_LIBS)
 
diff --git a/libgimpmodule/gimpmoduledb.c b/libgimpmodule/gimpmoduledb.c
index 44ba296..22121a0 100644
--- a/libgimpmodule/gimpmoduledb.c
+++ b/libgimpmodule/gimpmoduledb.c
@@ -23,6 +23,7 @@
 #include <gio/gio.h>
 
 #include "libgimpbase/gimpbase.h"
+#include "libgimpconfig/gimpconfig.h"
 
 #include "gimpmoduletypes.h"
 
@@ -54,8 +55,10 @@ enum
 
 static void         gimp_module_db_finalize            (GObject      *object);
 
-static void         gimp_module_db_module_initialize   (const GimpDatafileData *file_data,
-                                                        gpointer                user_data);
+static void         gimp_module_db_load_directory      (GimpModuleDB *db,
+                                                        GFile        *directory);
+static void         gimp_module_db_load_module         (GimpModuleDB *db,
+                                                        GFile        *file);
 
 static GimpModule * gimp_module_db_module_find_by_path (GimpModuleDB *db,
                                                         const char   *fullpath);
@@ -271,10 +274,19 @@ gimp_module_db_load (GimpModuleDB *db,
   g_return_if_fail (module_path != NULL);
 
   if (g_module_supported ())
-    gimp_datafiles_read_directories (module_path,
-                                     G_FILE_TEST_EXISTS,
-                                     gimp_module_db_module_initialize,
-                                     db);
+    {
+      GList *path;
+      GList *list;
+
+      path = gimp_config_path_expand_to_files (module_path, NULL);
+
+      for (list = path; list; list = g_list_next (list))
+        {
+          gimp_module_db_load_directory (db, list->data);
+        }
+
+      g_list_free_full (path, (GDestroyNotify) g_object_unref);
+    }
 
   if (DUMP_DB)
     g_list_foreach (db->modules, gimp_module_db_module_dump_func, NULL);
@@ -312,40 +324,84 @@ gimp_module_db_refresh (GimpModuleDB *db,
   g_list_free (kill_list);
 
   /* walk filesystem and add new things we find */
-  gimp_datafiles_read_directories (module_path,
-                                   G_FILE_TEST_EXISTS,
-                                   gimp_module_db_module_initialize,
-                                   db);
+  gimp_module_db_load (db, module_path);
+}
+
+static void
+gimp_module_db_load_directory (GimpModuleDB *db,
+                               GFile        *directory)
+{
+  GFileEnumerator *enumerator;
+
+  enumerator = g_file_enumerate_children (directory,
+                                          G_FILE_ATTRIBUTE_STANDARD_NAME ","
+                                          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)))
+        {
+          GFileType file_type = g_file_info_get_file_type (info);
+
+         if (file_type == G_FILE_TYPE_REGULAR &&
+             ! g_file_info_get_is_hidden (info))
+            {
+              GFile *child = g_file_enumerator_get_child (enumerator, info);
+
+              gimp_module_db_load_module (db, child);
+
+              g_object_unref (child);
+            }
+
+          g_object_unref (info);
+        }
+
+      g_object_unref (enumerator);
+    }
 }
 
 static void
-gimp_module_db_module_initialize (const GimpDatafileData *file_data,
-                                  gpointer                user_data)
+gimp_module_db_load_module (GimpModuleDB *db,
+                            GFile        *file)
 {
-  GimpModuleDB *db = GIMP_MODULE_DB (user_data);
-  GimpModule   *module;
-  gboolean      load_inhibit;
+  GimpModule *module;
+  gchar      *path;
+  gboolean    load_inhibit;
 
-  if (! gimp_datafiles_check_extension (file_data->filename,
-                                        "." G_MODULE_SUFFIX))
-    return;
+  path = g_file_get_path (file);
+
+  if (! gimp_datafiles_check_extension (path, "." G_MODULE_SUFFIX))
+    {
+      g_free (path);
+      return;
+    }
 
   /* don't load if we already know about it */
-  if (gimp_module_db_module_find_by_path (db, file_data->filename))
-    return;
+  if (gimp_module_db_module_find_by_path (db, path))
+    {
+      g_free (path);
+      return;
+    }
 
-  load_inhibit = is_in_inhibit_list (file_data->filename,
-                                     db->load_inhibit);
+  load_inhibit = is_in_inhibit_list (path, db->load_inhibit);
 
-  module = gimp_module_new (file_data->filename,
+  module = gimp_module_new (path,
                             load_inhibit,
                             db->verbose);
 
+  g_free (path);
+
   g_signal_connect (module, "modified",
                     G_CALLBACK (gimp_module_db_module_modified),
                     db);
 
   db->modules = g_list_append (db->modules, module);
+
   g_signal_emit (db, db_signals[ADD], 0, module);
 }
 


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