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.
This commit is contained in:
Michael Natterer 2014-08-03 18:30:02 +02:00
parent 9e265e7855
commit a0b9e5c702
3 changed files with 83 additions and 32 deletions

View File

@ -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);
}
}

View File

@ -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)

View File

@ -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_module_initialize (const GimpDatafileData *file_data,
gpointer user_data)
gimp_module_db_load_directory (GimpModuleDB *db,
GFile *directory)
{
GimpModuleDB *db = GIMP_MODULE_DB (user_data);
GimpModule *module;
gboolean load_inhibit;
GFileEnumerator *enumerator;
if (! gimp_datafiles_check_extension (file_data->filename,
"." G_MODULE_SUFFIX))
return;
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_load_module (GimpModuleDB *db,
GFile *file)
{
GimpModule *module;
gchar *path;
gboolean load_inhibit;
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);
}