[Xfce4-commits] <tumbler:jannis/specialized> Squashme: Start cleaning up and documenting the TumblerManager changes.

Jannis Pohlmann noreply at xfce.org
Wed Nov 11 01:52:06 CET 2009


Updating branch refs/heads/jannis/specialized
         to 22aa5ff8777f161d8ec1c0e2efe75b41a2a3399e (commit)
       from 5431fa7da0b51b33c4b82eaf02b59455ae318420 (commit)

commit 22aa5ff8777f161d8ec1c0e2efe75b41a2a3399e
Author: Jannis Pohlmann <jannis at xfce.org>
Date:   Wed Nov 11 01:50:54 2009 +0100

    Squashme: Start cleaning up and documenting the TumblerManager changes.

 tumblerd/tumbler-manager.c |  570 ++++++++++++++++++++++++++++----------------
 1 files changed, 366 insertions(+), 204 deletions(-)

diff --git a/tumblerd/tumbler-manager.c b/tumblerd/tumbler-manager.c
index 9b592c6..d86d7dd 100644
--- a/tumblerd/tumbler-manager.c
+++ b/tumblerd/tumbler-manager.c
@@ -62,22 +62,36 @@ typedef struct _ThumbnailerInfo ThumbnailerInfo;
 
 
 
-static void tumbler_manager_finalize          (GObject          *object);
-static void tumbler_manager_get_property      (GObject          *object,
-                                               guint             prop_id,
-                                               GValue           *value,
-                                               GParamSpec       *pspec);
-static void tumbler_manager_set_property      (GObject          *object,
-                                               guint             prop_id,
-                                               const GValue     *value,
-                                               GParamSpec       *pspec);
-static void tumbler_manager_load_thumbnailers (TumblerManager   *manager,
-                                               GFile            *directory);
-static void tumbler_manager_directory_changed (TumblerManager   *manager,
-                                               GFile            *file,
-                                               GFile            *other_file,
-                                               GFileMonitorEvent event_type,
-                                               GFileMonitor     *monitor);
+static void             tumbler_manager_finalize          (GObject          *object);
+static void             tumbler_manager_get_property      (GObject          *object,
+                                                           guint             prop_id,
+                                                           GValue           *value,
+                                                           GParamSpec       *pspec);
+static void             tumbler_manager_set_property      (GObject          *object,
+                                                           guint             prop_id,
+                                                           const GValue     *value,
+                                                           GParamSpec       *pspec);
+static void             tumbler_manager_monitor_unref     (GFileMonitor     *monitor,
+                                                           TumblerManager   *manager);
+static void             tumbler_manager_load_thumbnailers (TumblerManager   *manager,
+                                                           GFile            *directory);
+static void             tumbler_manager_directory_changed (TumblerManager   *manager,
+                                                           GFile            *file,
+                                                           GFile            *other_file,
+                                                           GFileMonitorEvent event_type,
+                                                           GFileMonitor     *monitor);
+
+static OverrideInfo    *override_info_new                 (void);
+static void             override_info_free                (gpointer          pointer);
+static void             override_info_list_free           (gpointer          pointer);
+static ThumbnailerInfo *thumbnailer_info_new              (void);
+static void             thumbnailer_info_free             (ThumbnailerInfo  *info);
+static void             thumbnailer_info_list_free        (gpointer          pointer);
+
+#ifdef DEBUG
+static void             dump_overrides                    (TumblerManager   *manager);
+static void             dump_thumbnailers                 (TumblerManager   *manager);
+#endif
 
 
 
@@ -96,7 +110,17 @@ struct _TumblerManager
   GList           *directories;
   GList           *monitors;
 
+  /* hash table for override information, mapping hash keys to lists
+   * of override infos. in each of these lists the infos are sorted by 
+   * the directory index, with higher priority directories (smaller 
+   * directory index) coming first */
   GHashTable      *overrides;
+
+  /* hash table for thumbnailer service information, mapping .service 
+   * basenames to lists of thumbnailer infos installed into the
+   * system with these basenames. in each of these lists the infos are
+   * sorted by the directory index, with higher priority directories 
+   * (smaller directory index) coming first */
   GHashTable      *thumbnailers;
 
   GMutex          *mutex;
@@ -113,132 +137,14 @@ struct _OverrideInfo
 struct _ThumbnailerInfo
 {
   TumblerThumbnailer *thumbnailer;
+#ifdef DEBUG
   GFile              *file;
+#endif
   gint                dir_index;
 };
 
 
 
-static OverrideInfo *
-override_info_new (void)
-{
-  return g_slice_new0 (OverrideInfo);
-}
-
-
-
-static void
-override_info_free (gpointer pointer)
-{
-  OverrideInfo *info = pointer;
-
-  if (info == NULL)
-    return;
-
-  g_free (info->name);
-  g_free (info->uri_scheme);
-  g_free (info->mime_type);
-
-  g_slice_free (OverrideInfo, info);
-}
-
-
-
-static void
-override_info_list_free (gpointer pointer)
-{
-  GList **infos = pointer;
-  GList  *iter;
-
-  for (iter = *infos; iter != NULL; iter = iter->next)
-    override_info_free (iter->data);
-
-  g_list_free (*infos);
-}
-
-
-
-static ThumbnailerInfo *
-thumbnailer_info_new (void)
-{
-  return g_slice_new0 (ThumbnailerInfo);
-}
-
-
-
-static void
-thumbnailer_info_free (ThumbnailerInfo *info)
-{
-  if (info == NULL)
-    return;
-
-  g_object_unref (info->file);
-  g_object_unref (info->thumbnailer);
-  g_slice_free (ThumbnailerInfo, info);
-}
-
-
-
-static void
-thumbnailer_info_list_free (gpointer pointer)
-{
-  GList **infos = pointer;
-  GList  *iter;
-
-  for (iter = *infos; iter != NULL; iter = iter->next)
-    thumbnailer_info_free (iter->data);
-
-  g_list_free (*infos);
-}
-
-
-
-static void
-dump_overrides (TumblerManager *manager)
-{
-  GHashTableIter table_iter;
-  const gchar   *hash_key;
-  GList        **list;
-  GList         *iter;
-
-  g_print ("\nOverrides:\n");
-
-  g_hash_table_iter_init (&table_iter, manager->overrides);
-  while (g_hash_table_iter_next (&table_iter, (gpointer) &hash_key, (gpointer) &list))
-    {
-      g_print ("  %s:\n", hash_key);
-      for (iter = *list; iter != NULL; iter = iter->next)
-        g_print ("    %s\n", ((OverrideInfo *)iter->data)->name);
-    }
-
-  g_print ("\n");
-}
-
-
-
-static void
-dump_thumbnailers (TumblerManager *manager)
-{
-  GHashTableIter table_iter;
-  const gchar   *base_name;
-  GList        **list;
-  GList         *iter;
-
-  g_print ("\nThumbnailers:\n");
-
-  g_hash_table_iter_init (&table_iter, manager->thumbnailers);
-  while (g_hash_table_iter_next (&table_iter, (gpointer) &base_name, (gpointer) &list))
-    {
-      g_print ("  %s:\n", base_name);
-      for (iter = *list; iter != NULL; iter = iter->next)
-        g_print ("    %s\n", g_file_get_path (((ThumbnailerInfo *)iter->data)->file));
-    }
-
-  g_print ("\n");
-}
-
-
-
 G_DEFINE_TYPE (TumblerManager, tumbler_manager, G_TYPE_OBJECT);
 
 
@@ -277,8 +183,12 @@ tumbler_manager_init (TumblerManager *manager)
   manager->directories = NULL;
   manager->monitors = NULL;
   manager->mutex = g_mutex_new ();
+
+  /* create the overrides info hash table */
   manager->overrides = g_hash_table_new_full (g_str_hash, g_str_equal,
                                               g_free, override_info_list_free);
+
+  /* create the thumbnailer info hash table */
   manager->thumbnailers = g_hash_table_new_full (g_str_hash, g_str_equal,
                                                  g_free, thumbnailer_info_list_free);
 }
@@ -286,40 +196,33 @@ tumbler_manager_init (TumblerManager *manager)
 
 
 static void
-monitor_unref (GFileMonitor   *monitor,
-               TumblerManager *manager)
-{
-  if (monitor != NULL)
-    {
-      g_signal_handlers_disconnect_matched (monitor, G_SIGNAL_MATCH_DATA,
-                                            0, 0, NULL, NULL, manager);
-      g_object_unref (monitor);
-    }
-}
-
-
-
-static void
 tumbler_manager_finalize (GObject *object)
 {
   TumblerManager *manager = TUMBLER_MANAGER (object);
 
   g_mutex_lock (manager->mutex);
 
+  /* release all thumbnailer directory monitors */
+  g_list_foreach (manager->monitors, (GFunc) tumbler_manager_monitor_unref, manager);
+  g_list_free (manager->monitors);
+
+  /* release all directory objects */
   g_list_foreach (manager->directories, (GFunc) g_object_unref, NULL);
   g_list_free (manager->directories);
 
-  g_list_foreach (manager->monitors, (GFunc) monitor_unref, manager);
-  g_list_free (manager->monitors);
-
+  /* destroy the hash tables */
   g_hash_table_unref (manager->thumbnailers);
   g_hash_table_unref (manager->overrides);
 
+  /* release the registry */
   g_object_unref (manager->registry);
 
+  /* release the D-Bus connection object */
   dbus_g_connection_unref (manager->connection);
 
   g_mutex_unlock (manager->mutex);
+
+  /* destroy the mutex */
   g_mutex_free (manager->mutex);
 
   (*G_OBJECT_CLASS (tumbler_manager_parent_class)->finalize) (object);
@@ -372,6 +275,20 @@ tumbler_manager_set_property (GObject      *object,
       break;
     }
 }
+ 
+ 
+ 
+static void
+tumbler_manager_monitor_unref (GFileMonitor   *monitor,
+                               TumblerManager *manager)
+{
+  if (monitor != NULL)
+    {
+      g_signal_handlers_disconnect_matched (monitor, G_SIGNAL_MATCH_DATA,
+                                            0, 0, NULL, NULL, manager);
+      g_object_unref (monitor);
+    }
+}
 
 
 
@@ -379,18 +296,20 @@ static gint
 tumbler_manager_get_dir_index (TumblerManager *manager,
                                GFile          *directory)
 {
-  GList *iter;
+  GList *lp;
   gint   dir_index = -1;
   gint   n;
 
-  for (iter = manager->directories, n = 0; 
-       dir_index < 0 && iter != NULL; 
-       iter = iter->next, ++n)
+  /* iterate over all thumbnailer directories */
+  for (lp = manager->directories, n = 0; dir_index < 0 && lp != NULL; lp = lp->next, ++n)
     {
-      if (g_file_equal (iter->data, directory))
+      /* remember the directory index if the directories match */
+      if (g_file_equal (lp->data, directory))
         dir_index = n;
     }
 
+  /* return the index of the first thumbnailer directory that matches 
+   * the input directory or -1 if there is no such directory */
   return n;
 }
 
@@ -411,42 +330,55 @@ tumbler_manager_update_preferred (TumblerManager *manager,
   g_return_if_fail (TUMBLER_IS_MANAGER (manager));
   g_return_if_fail (hash_key != NULL && *hash_key != '\0');
 
-  g_debug ("update_preferred: %s", hash_key);
-
+  /* fetch all override infos for this hash key */
   overrides = g_hash_table_lookup (manager->overrides, hash_key);
-
   if (overrides != NULL)
     {
-      g_assert (*overrides != NULL);
+      /* if there is a value for the hash key it has to be a valid pointer
+       * to a non-empty override info list, otherwise there is a bug */
+      g_assert (overrides != NULL && *overrides != NULL);
 
+      /* determine the name of the active (= the first) override info 
+       * for this hash key */
       name = ((OverrideInfo *)(*overrides)->data)->name;
       
+      /* iterate over all thumbnailer info lists we have. stop as soon as we
+       * have one matching thumbnailer info that has the correct name and
+       * supports the hash key */
       g_hash_table_iter_init (&iter, manager->thumbnailers);
-      while (g_hash_table_iter_next (&iter, NULL, (gpointer) &thumbnailers))
+      while (thumbnailer == NULL 
+             && g_hash_table_iter_next (&iter, NULL, (gpointer) &thumbnailers))
         {
-          g_assert (thumbnailers != NULL);
-          g_assert (*thumbnailers != NULL);
+          /* each value in the thumbnailer info hash table has to be a 
+           * valid pointer to a non-empty thumbnailer info list, otherwise
+           * there is a bug */
+          g_assert (thumbnailers != NULL && *thumbnailers != NULL);
 
+          /* get the active (= the first) thumbnailer info in the list */
           info = (ThumbnailerInfo *)(*thumbnailers)->data;
 
+          /* each element in the thumbnailer info list has to be a valid
+           * thumbnailer info with a specialized thumbnailer object */
           g_assert (info != NULL);
           g_assert (TUMBLER_IS_SPECIALIZED_THUMBNAILER (info->thumbnailer));
 
+          /* determine the name of the thumbnailer */
           current_name = tumbler_specialized_thumbnailer_get_name (
             TUMBLER_SPECIALIZED_THUMBNAILER (info->thumbnailer));
 
+          /* check if the current thumbnailer matches the override info name */
           if (g_strcmp0 (name, current_name) == 0)
-            thumbnailer = info->thumbnailer;
+            {
+              /* check if the thumbnailer supports the hash key at all */
+              if (tumbler_thumbnailer_supports_hash_key (info->thumbnailer, hash_key))
+                thumbnailer = info->thumbnailer;
+            }
         }
     }
 
-  if (thumbnailer != NULL)
-    {
-      g_debug ("preferring %s for %s", 
-               tumbler_specialized_thumbnailer_get_name (TUMBLER_SPECIALIZED_THUMBNAILER (thumbnailer)),
-               hash_key);
-    }
-
+  /* update the preferred information of the registry. if no 
+   * thumbnailer was found, this will reset the preferred information
+   * for this hash key */
   tumbler_registry_set_preferred (manager->registry, hash_key, thumbnailer);
 }
 
@@ -476,8 +408,6 @@ tumbler_manager_parse_overrides (TumblerManager *manager,
       return NULL;
     }
 
-  g_debug ("parse_overrides: %s", filename);
-
   /* allocate the key file */
   key_file = g_key_file_new ();
 
@@ -560,6 +490,8 @@ tumbler_manager_parse_overrides (TumblerManager *manager,
       g_object_unref (directory);
 
       overrides = g_list_prepend (overrides, info);
+
+      g_free (sections[n]);
     }
 
   g_free (sections);
@@ -590,8 +522,6 @@ tumbler_manager_load_overrides_file (TumblerManager *manager,
   g_return_if_fail (TUMBLER_MANAGER (manager));
   g_return_if_fail (G_IS_FILE (file));
 
-  g_debug ("load_overrides_file %s", g_file_get_path (file));
-
   directory = g_file_get_parent (file);
   dir_index = tumbler_manager_get_dir_index (manager, directory);
   g_object_unref (directory);
@@ -612,12 +542,8 @@ tumbler_manager_load_overrides_file (TumblerManager *manager,
 
       if (list == NULL)
         {
-          g_debug ("  creating %s for %s", info->name, hash_key);
-
-          list = g_slice_alloc0 (sizeof (GList *));
-
+          list = g_slice_alloc0 (sizeof (GList **));
           *list = g_list_prepend (*list, info);
-
           g_hash_table_insert (manager->overrides, g_strdup (hash_key), list);
 
           first = TRUE;
@@ -639,8 +565,6 @@ tumbler_manager_load_overrides_file (TumblerManager *manager,
 
                   *list = g_list_insert_before (*list, lp, info);
 
-                  g_debug ("  inserting %s in %s", info->name, hash_key);
-
                   inserted = TRUE;
                 }
             }
@@ -651,7 +575,6 @@ tumbler_manager_load_overrides_file (TumblerManager *manager,
 
       if (first)
         {
-          g_debug ("  first");
           tumbler_manager_update_preferred (manager, hash_key);
         }
 
@@ -683,7 +606,9 @@ tumbler_manager_load_overrides (TumblerManager *manager)
       g_object_unref (file);
     }
 
+#ifdef DEBUG
   dump_overrides (manager);
+#endif
 }
 
 
@@ -705,8 +630,6 @@ tumbler_manager_unload_overrides_file (TumblerManager *manager,
   g_return_if_fail (TUMBLER_IS_MANAGER (manager));
   g_return_if_fail (G_IS_FILE (file));
 
-  g_debug ("unload_overrides_file: %s", g_file_get_path (file));
-  
   directory = g_file_get_parent (file);
   dir_index = tumbler_manager_get_dir_index (manager, directory);
   g_object_unref (directory);
@@ -733,7 +656,6 @@ tumbler_manager_unload_overrides_file (TumblerManager *manager,
               if (lp == *overrides)
                 first = TRUE;
 
-              g_debug ("  deleting info %s", info->name);
               override_info_free (info);
               *overrides = g_list_delete_link (*overrides, lp);
 
@@ -750,7 +672,6 @@ tumbler_manager_unload_overrides_file (TumblerManager *manager,
 
   for (lp = delete_keys; lp != NULL; lp = lp->next)
     {
-      g_debug ("  deleting key %s", (const gchar *)lp->data);
       g_hash_table_remove (manager->overrides, (const gchar *)lp->data);
     }
 
@@ -785,8 +706,6 @@ tumbler_manager_load_thumbnailer (TumblerManager *manager,
   g_return_if_fail (TUMBLER_IS_MANAGER (manager));
   g_return_if_fail (G_IS_FILE (file));
 
-  g_debug ("load_thumbnailer: %s", g_file_get_path (file));
-
   filename = g_file_get_path (file);
 
   key_file = g_key_file_new ();
@@ -866,7 +785,9 @@ tumbler_manager_load_thumbnailer (TumblerManager *manager,
     }
 
   info = thumbnailer_info_new ();
+#ifdef DEBUG
   info->file = g_object_ref (file);
+#endif
 
   directory = g_file_get_parent (file);
   info->dir_index = tumbler_manager_get_dir_index (manager, directory);
@@ -897,7 +818,7 @@ tumbler_manager_load_thumbnailer (TumblerManager *manager,
 
   if (list == NULL)
     {
-      list = g_slice_alloc0 (sizeof (GList *));
+      list = g_slice_alloc0 (sizeof (GList **));
       *list = g_list_prepend (*list, info);
       g_hash_table_insert (manager->thumbnailers, g_strdup (base_name), list);
 
@@ -969,8 +890,6 @@ tumbler_manager_load_thumbnailers (TumblerManager *manager,
 
   dirname = g_file_get_path (directory);
 
-  g_debug ("load_thumbnailers %s", dirname);
-
   dir = g_dir_open (dirname, 0, NULL);
 
   if (dir == NULL)
@@ -1057,7 +976,9 @@ tumbler_manager_load (TumblerManager *manager)
   for (iter = manager->directories; iter != NULL; iter = iter->next)
     tumbler_manager_load_thumbnailers (manager, iter->data);
 
+#ifdef DEBUG
   dump_thumbnailers (manager);
+#endif
 
   /* update the overrides cache */
   tumbler_manager_load_overrides (manager);
@@ -1097,8 +1018,6 @@ tumbler_manager_thumbnailer_file_deleted (TumblerManager *manager,
   g_return_if_fail (TUMBLER_IS_MANAGER (manager));
   g_return_if_fail (G_IS_FILE (file));
 
-  g_debug ("file_deleted: %s", g_file_get_path (file));
-              
   directory = g_file_get_parent (file);
   dir_index = tumbler_manager_get_dir_index (manager, directory);
   g_object_unref (directory);
@@ -1154,6 +1073,97 @@ tumbler_manager_thumbnailer_file_deleted (TumblerManager *manager,
 
 
 static void
+tumbler_manager_directory_created (TumblerManager *manager,
+                                   GFile          *directory,
+                                   gint            dir_index)
+{
+  GFile *file;
+
+  g_return_if_fail (TUMBLER_IS_MANAGER (manager));
+  g_return_if_fail (G_IS_FILE (directory));
+  g_return_if_fail (dir_index >= 0);
+
+  tumbler_manager_load_thumbnailers (manager, directory);
+
+  file = g_file_get_child (directory, "overrides");
+  tumbler_manager_load_overrides_file (manager, file);
+  g_object_unref (file);
+}
+
+
+
+static void
+tumbler_manager_directory_deleted (TumblerManager *manager,
+                                   GFile          *directory,
+                                   gint            dir_index)
+{
+  ThumbnailerInfo *info;
+  ThumbnailerInfo *info2;
+  GHashTableIter   iter;
+  GFile           *file;
+  GList          **list;
+  GList           *lp;
+  GStrv            hash_keys;
+  guint            n;
+
+  g_return_if_fail (TUMBLER_IS_MANAGER (manager));
+  g_return_if_fail (G_IS_FILE (directory));
+  g_return_if_fail (dir_index >= 0);
+
+  file = g_file_get_child (directory, "overrides");
+  tumbler_manager_unload_overrides_file (manager, file);
+  g_object_unref (file);
+
+  g_hash_table_iter_init (&iter, manager->thumbnailers);
+  while (g_hash_table_iter_next (&iter, NULL, (gpointer) &list))
+    {
+      g_assert (list != NULL);
+
+      for (lp = *list; lp != NULL; lp = lp->next)
+        {
+          info = lp->data;
+
+          if (info->dir_index == dir_index)
+            {
+              if (lp == *list)
+                {
+                  *list = g_list_delete_link (*list, lp);
+
+                  tumbler_registry_remove (manager->registry, info->thumbnailer);
+
+                  if (*list != NULL)
+                    {
+                      info2 = (*list)->data;
+
+                      g_assert (info2 != NULL);
+
+                      tumbler_registry_add (manager->registry, info2->thumbnailer);
+                    }
+
+                  hash_keys = tumbler_thumbnailer_get_hash_keys (info->thumbnailer);
+
+                  for (n = 0; hash_keys != NULL && hash_keys[n] != NULL; ++n)
+                    {
+                      /* TODO we could check if an update is needed here */
+                      tumbler_manager_update_preferred (manager, hash_keys[n]);
+                    }
+
+                  g_strfreev (hash_keys);
+                }
+              else
+                {
+                  *list = g_list_delete_link (*list, lp);
+                }
+                  
+              thumbnailer_info_free (info);
+            }
+        }
+    }
+}
+
+
+
+static void
 tumbler_manager_directory_changed (TumblerManager   *manager,
                                    GFile            *file,
                                    GFile            *other_file,
@@ -1168,6 +1178,10 @@ tumbler_manager_directory_changed (TumblerManager   *manager,
   g_return_if_fail (G_IS_FILE (file));
   g_return_if_fail (G_IS_FILE_MONITOR (monitor));
 
+#ifdef DEBUG
+  g_print ("Directory (contents) changed\n\n");
+#endif
+
   if (event_type == G_FILE_MONITOR_EVENT_DELETED)
     {
       base_name = g_file_get_basename (file);
@@ -1176,16 +1190,18 @@ tumbler_manager_directory_changed (TumblerManager   *manager,
         {
           g_mutex_lock (manager->mutex);
           tumbler_manager_unload_overrides_file (manager, file);
+#ifdef DEBUG
           dump_overrides (manager);
+#endif
           g_mutex_unlock (manager->mutex);
         }
       else if (g_str_has_suffix (base_name, ".service"))
         {
-          g_debug ("service file %s deleted", g_file_get_path (file));
-
           g_mutex_lock (manager->mutex);
           tumbler_manager_thumbnailer_file_deleted (manager, file);
+#ifdef DEBUG
           dump_thumbnailers (manager);
+#endif
           g_mutex_unlock (manager->mutex);
         }
       else
@@ -1196,11 +1212,13 @@ tumbler_manager_directory_changed (TumblerManager   *manager,
 
           if (dir_index >= 0)
             {
-#if 0
               g_mutex_lock (manager->mutex);
-              tumbler_manager_thumbnailer_dir_deleted (manager, dir_index);
-              g_mutex_unlock (manager->mutex);
+              tumbler_manager_directory_deleted (manager, file, dir_index);
+#ifdef DEBUG
+              dump_overrides (manager);
+              dump_thumbnailers (manager);
 #endif
+              g_mutex_unlock (manager->mutex);
             }
         }
     }
@@ -1216,10 +1234,11 @@ tumbler_manager_directory_changed (TumblerManager   *manager,
             {
               if (event_type == G_FILE_MONITOR_EVENT_CREATED)
                 {
-                  g_debug ("override file %s created", g_file_get_path (file));
                   g_mutex_lock (manager->mutex);
                   tumbler_manager_load_overrides_file (manager, file);
+#ifdef DEBUG
                   dump_overrides (manager);
+#endif
                   g_mutex_unlock (manager->mutex);
                 }
             }
@@ -1227,19 +1246,163 @@ tumbler_manager_directory_changed (TumblerManager   *manager,
             {
               if (event_type == G_FILE_MONITOR_EVENT_CREATED)
                 {
-                  g_debug ("service file %s created", g_file_get_path (file));
                   g_mutex_lock (manager->mutex);
                   tumbler_manager_load_thumbnailer (manager, file);
+#ifdef DEBUG
                   dump_thumbnailers (manager);
+#endif
                   g_mutex_unlock (manager->mutex);
                 }
             }
         }
+      else
+        {
+          g_mutex_lock (manager->mutex);
+          dir_index = tumbler_manager_get_dir_index (manager, file);
+          g_mutex_unlock (manager->mutex);
+
+          if (dir_index >= 0)
+            {
+              g_mutex_lock (manager->mutex);
+              tumbler_manager_directory_created (manager, file, dir_index);
+#ifdef DEBUG
+              dump_overrides (manager);
+              dump_thumbnailers (manager);
+#endif
+              g_mutex_unlock (manager->mutex);
+            }
+        }
     }
 }
 
 
 
+static OverrideInfo *
+override_info_new (void)
+{
+  return g_slice_new0 (OverrideInfo);
+}
+
+
+
+static void
+override_info_free (gpointer pointer)
+{
+  OverrideInfo *info = pointer;
+
+  if (info == NULL)
+    return;
+
+  g_free (info->name);
+  g_free (info->uri_scheme);
+  g_free (info->mime_type);
+
+  g_slice_free (OverrideInfo, info);
+}
+
+
+
+static void
+override_info_list_free (gpointer pointer)
+{
+  GList **infos = pointer;
+  GList  *iter;
+
+  for (iter = *infos; iter != NULL; iter = iter->next)
+    override_info_free (iter->data);
+
+  g_list_free (*infos);
+  g_slice_free1 (sizeof (GList **), infos);
+}
+
+
+
+static ThumbnailerInfo *
+thumbnailer_info_new (void)
+{
+  return g_slice_new0 (ThumbnailerInfo);
+}
+
+
+
+static void
+thumbnailer_info_free (ThumbnailerInfo *info)
+{
+  if (info == NULL)
+    return;
+
+#ifdef DEBUG
+  g_object_unref (info->file);
+#endif
+  g_object_unref (info->thumbnailer);
+  g_slice_free (ThumbnailerInfo, info);
+}
+
+
+
+static void
+thumbnailer_info_list_free (gpointer pointer)
+{
+  GList **infos = pointer;
+  GList  *iter;
+
+  for (iter = *infos; iter != NULL; iter = iter->next)
+    thumbnailer_info_free (iter->data);
+
+  g_list_free (*infos);
+  g_slice_free1 (sizeof (GList **), infos);
+}
+
+
+
+#ifdef DEBUG
+static void
+dump_overrides (TumblerManager *manager)
+{
+  GHashTableIter table_iter;
+  const gchar   *hash_key;
+  GList        **list;
+  GList         *iter;
+
+  g_print ("Overrides:\n");
+
+  g_hash_table_iter_init (&table_iter, manager->overrides);
+  while (g_hash_table_iter_next (&table_iter, (gpointer) &hash_key, (gpointer) &list))
+    {
+      g_print ("  %s:\n", hash_key);
+      for (iter = *list; iter != NULL; iter = iter->next)
+        g_print ("    %s\n", ((OverrideInfo *)iter->data)->name);
+    }
+
+  g_print ("\n");
+}
+
+
+
+static void
+dump_thumbnailers (TumblerManager *manager)
+{
+  GHashTableIter table_iter;
+  const gchar   *base_name;
+  GList        **list;
+  GList         *iter;
+
+  g_print ("Thumbnailers:\n");
+
+  g_hash_table_iter_init (&table_iter, manager->thumbnailers);
+  while (g_hash_table_iter_next (&table_iter, (gpointer) &base_name, (gpointer) &list))
+    {
+      g_print ("  %s:\n", base_name);
+      for (iter = *list; iter != NULL; iter = iter->next)
+        g_print ("    %s\n", g_file_get_path (((ThumbnailerInfo *)iter->data)->file));
+    }
+
+  g_print ("\n");
+}
+#endif /* DEBUG */
+
+
+
 TumblerManager *
 tumbler_manager_new (DBusGConnection *connection,
                      TumblerRegistry *registry)
@@ -1347,4 +1510,3 @@ tumbler_manager_register (TumblerManager        *manager,
 
   dbus_g_method_return (context);
 }
-



More information about the Xfce4-commits mailing list