[gimp] app: gimp_data_factory_load_data(): fix handling of obsolete and writable



commit 23ed56d75d89766663e78fbdeb9f8108d5aa28b5
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]