[gimp/metadata-browser] app: gimp_data_factory_load_data(): fix handling of obsolete and writable
- From: Roman Joost <romanofski src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/metadata-browser] app: gimp_data_factory_load_data(): fix handling of obsolete and writable
- Date: Wed, 12 Sep 2012 22:40:19 +0000 (UTC)
commit 1ebce95b6bcf291bbbb2591e8414524e5e0df25d
Author: Michael Natterer <mitch gimp org>
Date: Sat Jan 14 20:49:41 2012 +0100
app: gimp_data_factory_load_data(): fix handling of obsolete and writable
Make sure obsolete files are immutable, and propagate a folder's
"writable" state into its subfolders. Also clean up the function's
control flow to not fry the reader's brain.
app/core/gimpdatafactory.c | 174 ++++++++++++++++++++++++-------------------
1 files changed, 97 insertions(+), 77 deletions(-)
---
diff --git a/app/core/gimpdatafactory.c b/app/core/gimpdatafactory.c
index cbcc3b6..ae1668a 100644
--- a/app/core/gimpdatafactory.c
+++ b/app/core/gimpdatafactory.c
@@ -778,6 +778,21 @@ gimp_data_factory_get_save_dir (GimpDataFactory *factory,
return writable_dir;
}
+static gboolean
+gimp_data_factory_is_dir_writable (const gchar *dirname,
+ GList *writable_path)
+{
+ GList *list;
+
+ for (list = writable_path; list; list = g_list_next (list))
+ {
+ if (g_str_has_prefix (dirname, list->data))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static void
gimp_data_factory_load_data_recursive (const GimpDatafileData *file_data,
gpointer data)
@@ -799,13 +814,19 @@ gimp_data_factory_load_data (const GimpDatafileData *file_data,
GimpDataLoadContext *context = data;
GimpDataFactory *factory = context->factory;
GHashTable *cache = context->cache;
- const GimpDataFactoryLoaderEntry *loader;
+ const GimpDataFactoryLoaderEntry *loader = NULL;
+ GError *error = NULL;
+ GList *data_list;
gint i;
for (i = 0; i < factory->priv->n_loader_entries; i++)
{
loader = &factory->priv->loader_entries[i];
+ /* a loder matches if its extension matches, or if it doesn't
+ * have an extension, which is the case for the fallback loader,
+ * which must be last in the loader array
+ */
if (! loader->extension ||
gimp_datafiles_check_extension (file_data->filename,
loader->extension))
@@ -815,80 +836,79 @@ gimp_data_factory_load_data (const GimpDatafileData *file_data,
return;
insert:
- {
- GList *cached_data;
- gboolean load_from_disk = TRUE;
-
- if (cache &&
- (cached_data = g_hash_table_lookup (cache, file_data->filename)))
- {
- GimpData *data = cached_data->data;
-
- load_from_disk = (gimp_data_get_mtime (data) == 0 ||
- gimp_data_get_mtime (data) != file_data->mtime);
-
- if (! load_from_disk)
- {
- GList *list;
-
- for (list = cached_data; list; list = g_list_next (list))
- gimp_container_add (factory->priv->container, list->data);
- }
- }
-
- if (load_from_disk)
- {
- GList *data_list;
- GError *error = NULL;
-
- data_list = loader->load_func (context->context,
- file_data->filename, &error);
-
- if (G_LIKELY (data_list))
- {
- GList *writable_list;
- GList *list;
- gboolean writable;
- gboolean deletable;
-
- writable_list = g_object_get_data (G_OBJECT (factory),
- WRITABLE_PATH_KEY);
-
- deletable = (g_list_length (data_list) == 1 &&
- g_list_find_custom (writable_list, file_data->dirname,
- (GCompareFunc) strcmp) != NULL);
-
- writable = (deletable && loader->writable);
-
- for (list = data_list; list; list = g_list_next (list))
- {
- GimpData *data = list->data;
-
- gimp_data_set_filename (data, file_data->filename,
- writable, deletable);
- gimp_data_set_mtime (data, file_data->mtime);
-
- gimp_data_clean (data);
-
- if (strstr (file_data->dirname, GIMP_OBSOLETE_DATA_DIR_NAME))
- gimp_container_add (factory->priv->container_obsolete,
- GIMP_OBJECT (data));
- else
- gimp_container_add (factory->priv->container,
- GIMP_OBJECT (data));
-
- g_object_unref (data);
- }
-
- g_list_free (data_list);
- }
-
- if (G_UNLIKELY (error))
- {
- gimp_message (factory->priv->gimp, NULL, GIMP_MESSAGE_ERROR,
- _("Failed to load data:\n\n%s"), error->message);
- g_clear_error (&error);
- }
- }
- }
+ if (cache)
+ {
+ GList *cached_data;
+
+ cached_data = g_hash_table_lookup (cache, file_data->filename);
+
+ if (cached_data &&
+ gimp_data_get_mtime (cached_data->data) != 0 &&
+ gimp_data_get_mtime (cached_data->data) == file_data->mtime)
+ {
+ GList *list;
+
+ for (list = cached_data; list; list = g_list_next (list))
+ gimp_container_add (factory->priv->container, list->data);
+
+ return;
+ }
+ }
+
+ data_list = loader->load_func (context->context, file_data->filename, &error);
+
+ if (G_LIKELY (data_list))
+ {
+ GList *list;
+ gboolean obsolete;
+ gboolean writable = FALSE;
+ gboolean deletable = FALSE;
+
+ obsolete = (strstr (file_data->dirname,
+ GIMP_OBSOLETE_DATA_DIR_NAME) != 0);
+
+ /* obsolete files are immutable, don't check their writability */
+ if (! obsolete)
+ {
+ GList *writable_list;
+
+ writable_list = g_object_get_data (G_OBJECT (factory),
+ WRITABLE_PATH_KEY);
+
+ deletable = (g_list_length (data_list) == 1 &&
+ gimp_data_factory_is_dir_writable (file_data->dirname,
+ writable_list));
+
+ writable = (deletable && loader->writable);
+ }
+
+ for (list = data_list; list; list = g_list_next (list))
+ {
+ GimpData *data = list->data;
+
+ gimp_data_set_filename (data, file_data->filename,
+ writable, deletable);
+ gimp_data_set_mtime (data, file_data->mtime);
+
+ gimp_data_clean (data);
+
+ if (obsolete)
+ gimp_container_add (factory->priv->container_obsolete,
+ GIMP_OBJECT (data));
+ else
+ gimp_container_add (factory->priv->container,
+ GIMP_OBJECT (data));
+
+ g_object_unref (data);
+ }
+
+ g_list_free (data_list);
+ }
+
+ if (G_UNLIKELY (error))
+ {
+ gimp_message (factory->priv->gimp, NULL, GIMP_MESSAGE_ERROR,
+ _("Failed to load data:\n\n%s"), error->message);
+ g_clear_error (&error);
+ }
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]