[tracker/data-provider-monitor-interface: 3/3] libtracker-miner: Removed TrackerIndexingTree property everywhere



commit 36b148f954278284cc2d5669dff3f7ac2abd5891
Author: Martyn Russell <martyn lanedo com>
Date:   Mon Dec 22 17:33:04 2014 +0000

    libtracker-miner: Removed TrackerIndexingTree property everywhere
    
    It's now a property of a TrackerDataProvider

 src/libtracker-miner/tracker-data-provider.c      |   72 ++++++++
 src/libtracker-miner/tracker-data-provider.h      |   21 ++-
 src/libtracker-miner/tracker-file-data-provider.c |   40 +++++
 src/libtracker-miner/tracker-file-notifier.c      |  183 ++++++++++-----------
 src/libtracker-miner/tracker-file-notifier.h      |    3 +-
 src/libtracker-miner/tracker-miner-fs.c           |  116 +++++++++-----
 src/libtracker-miner/tracker-miner-fs.h           |    2 +-
 7 files changed, 298 insertions(+), 139 deletions(-)
---
diff --git a/src/libtracker-miner/tracker-data-provider.c b/src/libtracker-miner/tracker-data-provider.c
index 58cf630..8f7fa90 100644
--- a/src/libtracker-miner/tracker-data-provider.c
+++ b/src/libtracker-miner/tracker-data-provider.c
@@ -493,3 +493,75 @@ tracker_data_provider_monitor_remove (TrackerDataProvider  *data_provider,
 
        return (* iface->monitor_remove) (data_provider, container, recursively, error);
 }
+
+/**
+ * tracker_data_provider_set_indexing_tree:
+ * @data_provider: a #TrackerDataProvider
+ * @indexing_tree: a #TrackerIndexingTree
+ * @error: location to store the error occurring, or %NULL to ignore
+ *
+ * Tells @data_provider to use @indexing_tree. This is used by
+ * implementations to know what the rules are for ignoring content
+ * (among other things).
+ *
+ * Returns: %TRUE on success, otherwise %FALSE and @error is set.
+ *
+ * Since: 1.4
+ **/
+gboolean
+tracker_data_provider_set_indexing_tree (TrackerDataProvider  *data_provider,
+                                         TrackerIndexingTree  *indexing_tree,
+                                         GError              **error)
+{
+       TrackerDataProviderIface *iface;
+
+       g_return_val_if_fail (TRACKER_IS_DATA_PROVIDER (data_provider), FALSE);
+       g_return_val_if_fail (TRACKER_IS_INDEXING_TREE (indexing_tree), FALSE);
+
+       iface = TRACKER_DATA_PROVIDER_GET_IFACE (data_provider);
+
+       if (iface->set_indexing_tree == NULL) {
+               g_set_error_literal (error,
+                                    G_IO_ERROR,
+                                    G_IO_ERROR_NOT_SUPPORTED,
+                                    _("Operation not supported"));
+               return FALSE;
+       }
+
+       return (* iface->set_indexing_tree) (data_provider, indexing_tree, error);
+}
+
+/**
+ * tracker_data_provider_get_indexing_tree:
+ * @data_provider: a #TrackerDataProvider
+ * @error: location to store the error occurring, or %NULL to ignore
+ *
+ * Return the #TrackerIndexingTree that @data_provider is using. For
+ * details about why this is needed by @data_provider, see
+ * tracker_data_provider_set_indexing_tree().
+ *
+ * Returns: (transfer none): A #TrackerIndexingTree, otherwise %NULL and
+ * @error is set.
+ *
+ * Since: 1.4
+ **/
+TrackerIndexingTree *
+tracker_data_provider_get_indexing_tree (TrackerDataProvider  *data_provider,
+                                         GError              **error)
+{
+       TrackerDataProviderIface *iface;
+
+       g_return_val_if_fail (TRACKER_IS_DATA_PROVIDER (data_provider), NULL);
+
+       iface = TRACKER_DATA_PROVIDER_GET_IFACE (data_provider);
+
+       if (iface->get_indexing_tree == NULL) {
+               g_set_error_literal (error,
+                                    G_IO_ERROR,
+                                    G_IO_ERROR_NOT_SUPPORTED,
+                                    _("Operation not supported"));
+               return NULL;
+       }
+
+       return (* iface->get_indexing_tree) (data_provider, error);
+}
diff --git a/src/libtracker-miner/tracker-data-provider.h b/src/libtracker-miner/tracker-data-provider.h
index bcd4204..d2fbd1f 100644
--- a/src/libtracker-miner/tracker-data-provider.h
+++ b/src/libtracker-miner/tracker-data-provider.h
@@ -29,6 +29,7 @@
 #include <gio/gio.h>
 
 #include "tracker-enumerator.h"
+#include "tracker-indexing-tree.h"
 #include "tracker-miner-enums.h"
 
 G_BEGIN_DECLS
@@ -156,12 +157,19 @@ struct _TrackerDataProviderIface {
                                                      GFile                  *other_file,
                                                      gboolean                is_container);
 
+       /* Indexing tree to know what we can monitor */
+       gboolean              (* set_indexing_tree)  (TrackerDataProvider    *data_provider,
+                                                     TrackerIndexingTree    *indexing_tree,
+                                                     GError                **error);
+       TrackerIndexingTree * (* get_indexing_tree)  (TrackerDataProvider    *data_provider,
+                                                     GError                **error);
+
        /*< private >*/
-       /* Padding for future expansion */
-       void (*_tracker_reserved1) (void);
+       /* Already +1 past padding :/ */
 };
 
 GType              tracker_data_provider_get_type        (void) G_GNUC_CONST;
+
 TrackerEnumerator *tracker_data_provider_begin           (TrackerDataProvider   *data_provider,
                                                           GFile                 *url,
                                                           const gchar           *attributes,
@@ -201,6 +209,15 @@ gboolean           tracker_data_provider_monitor_remove  (TrackerDataProvider  *
                                                           gboolean              recursively,
                                                           GError              **error);
 
+gboolean           tracker_data_provider_set_indexing_tree
+                                                         (TrackerDataProvider  *data_provider,
+                                                          TrackerIndexingTree  *indexing_tree,
+                                                          GError              **error);
+TrackerIndexingTree *
+                   tracker_data_provider_get_indexing_tree
+                                                         (TrackerDataProvider  *data_provider,
+                                                          GError              **error);
+
 G_END_DECLS
 
 #endif /* __LIBTRACKER_MINER_DATA_PROVIDER_H__ */
diff --git a/src/libtracker-miner/tracker-file-data-provider.c 
b/src/libtracker-miner/tracker-file-data-provider.c
index d9b2bdc..1a68725 100644
--- a/src/libtracker-miner/tracker-file-data-provider.c
+++ b/src/libtracker-miner/tracker-file-data-provider.c
@@ -29,6 +29,7 @@ static void tracker_file_data_provider_file_iface_init (TrackerDataProviderIface
 
 struct _TrackerFileDataProvider {
        GObject parent_instance;
+       TrackerIndexingTree *indexing_tree;
        TrackerMonitor *monitor;
 };
 
@@ -315,6 +316,43 @@ file_data_provider_monitor_remove (TrackerDataProvider  *data_provider,
        }
 }
 
+static gboolean
+file_data_provider_set_indexing_tree (TrackerDataProvider  *data_provider,
+                                      TrackerIndexingTree  *indexing_tree,
+                                      GError              **error)
+{
+       TrackerFileDataProvider *fdp;
+
+       g_return_val_if_fail (TRACKER_IS_FILE_DATA_PROVIDER (data_provider), NULL);
+
+       fdp = TRACKER_FILE_DATA_PROVIDER (data_provider);
+
+       if (indexing_tree) {
+               g_object_ref (indexing_tree);
+       }
+
+       if (fdp->indexing_tree) {
+               g_object_unref (fdp->indexing_tree);
+       }
+
+       fdp->indexing_tree = indexing_tree;
+
+       return TRUE;
+}
+
+static TrackerIndexingTree *
+file_data_provider_get_indexing_tree (TrackerDataProvider  *data_provider,
+                                      GError              **error)
+{
+       TrackerFileDataProvider *fdp;
+
+       g_return_val_if_fail (TRACKER_IS_FILE_DATA_PROVIDER (data_provider), NULL);
+
+       fdp = TRACKER_FILE_DATA_PROVIDER (data_provider);
+
+       return fdp->indexing_tree;
+}
+
 static void
 tracker_file_data_provider_file_iface_init (TrackerDataProviderIface *iface)
 {
@@ -326,6 +364,8 @@ tracker_file_data_provider_file_iface_init (TrackerDataProviderIface *iface)
        iface->end_finish = file_data_provider_end_finish;
        iface->monitor_add = file_data_provider_monitor_add;
        iface->monitor_remove = file_data_provider_monitor_remove;
+       iface->set_indexing_tree = file_data_provider_set_indexing_tree;
+       iface->get_indexing_tree = file_data_provider_get_indexing_tree;
 }
 
 /**
diff --git a/src/libtracker-miner/tracker-file-notifier.c b/src/libtracker-miner/tracker-file-notifier.c
index c91468d..fd86a2d 100644
--- a/src/libtracker-miner/tracker-file-notifier.c
+++ b/src/libtracker-miner/tracker-file-notifier.c
@@ -28,7 +28,6 @@
 #include "tracker-file-data-provider.h"
 #include "tracker-file-system.h"
 #include "tracker-crawler.h"
-#include "tracker-monitor.h"
 
 static GQuark quark_property_iri = 0;
 static GQuark quark_property_store_mtime = 0;
@@ -38,7 +37,6 @@ static GQuark quark_property_filesystem_mtime = 0;
 
 enum {
        PROP_0,
-       PROP_INDEXING_TREE,
        PROP_DATA_PROVIDER
 };
 
@@ -68,7 +66,6 @@ typedef struct {
 } RootData;
 
 typedef struct {
-       TrackerIndexingTree *indexing_tree;
        TrackerFileSystem *file_system;
 
        TrackerSparqlConnection *connection;
@@ -116,11 +113,6 @@ tracker_file_notifier_set_property (GObject      *object,
        priv = TRACKER_FILE_NOTIFIER (object)->priv;
 
        switch (prop_id) {
-       case PROP_INDEXING_TREE:
-               priv->indexing_tree = g_value_dup_object (value);
-               tracker_monitor_set_indexing_tree (priv->data_provider,
-                                                  priv->indexing_tree);
-               break;
        case PROP_DATA_PROVIDER:
                priv->data_provider = g_value_dup_object (value);
                break;
@@ -141,9 +133,6 @@ tracker_file_notifier_get_property (GObject    *object,
        priv = TRACKER_FILE_NOTIFIER (object)->priv;
 
        switch (prop_id) {
-       case PROP_INDEXING_TREE:
-               g_value_set_object (value, priv->indexing_tree);
-               break;
        case PROP_DATA_PROVIDER:
                g_value_set_object (value, priv->data_provider);
                break;
@@ -182,17 +171,29 @@ root_data_free (RootData *data)
        g_free (data);
 }
 
+static inline TrackerIndexingTree *
+get_indexing_tree (gpointer user_data)
+{
+       TrackerFileNotifier *notifier;
+       TrackerFileNotifierPrivate *priv;
+
+       notifier = TRACKER_FILE_NOTIFIER (user_data);
+       if (!notifier) {
+               return NULL;
+       }
+
+       priv = notifier->priv;
+
+       return tracker_data_provider_get_indexing_tree (priv->data_provider, NULL);
+}
+
 /* Crawler signal handlers */
 static gboolean
 crawler_check_file_cb (TrackerCrawler *crawler,
                        GFile          *file,
                        gpointer        user_data)
 {
-       TrackerFileNotifierPrivate *priv;
-
-       priv = TRACKER_FILE_NOTIFIER (user_data)->priv;
-
-       return tracker_indexing_tree_file_is_indexable (priv->indexing_tree,
+       return tracker_indexing_tree_file_is_indexable (get_indexing_tree (user_data),
                                                        file,
                                                        G_FILE_TYPE_REGULAR);
 }
@@ -203,13 +204,15 @@ crawler_check_directory_cb (TrackerCrawler *crawler,
                             gpointer        user_data)
 {
        TrackerFileNotifierPrivate *priv;
+       TrackerIndexingTree *indexing_tree;
        GFile *root, *canonical;
 
        priv = TRACKER_FILE_NOTIFIER (user_data)->priv;
        g_assert (priv->current_index_root != NULL);
 
        canonical = tracker_file_system_peek_file (priv->file_system, directory);
-       root = tracker_indexing_tree_get_root (priv->indexing_tree, directory, NULL);
+       indexing_tree = get_indexing_tree (user_data);
+       root = tracker_indexing_tree_get_root (indexing_tree, directory, NULL);
 
        /* If it's a config root itself, other than the one
         * currently processed, bypass it, it will be processed
@@ -220,7 +223,7 @@ crawler_check_directory_cb (TrackerCrawler *crawler,
                return FALSE;
        }
 
-       return tracker_indexing_tree_file_is_indexable (priv->indexing_tree,
+       return tracker_indexing_tree_file_is_indexable (indexing_tree,
                                                        directory,
                                                        G_FILE_TYPE_DIRECTORY);
 }
@@ -232,11 +235,13 @@ crawler_check_directory_contents_cb (TrackerCrawler *crawler,
                                      gpointer        user_data)
 {
        TrackerFileNotifierPrivate *priv;
+       TrackerIndexingTree *indexing_tree;
        gboolean process;
 
        priv = TRACKER_FILE_NOTIFIER (user_data)->priv;
-       process = tracker_indexing_tree_parent_is_indexable (priv->indexing_tree,
-                                                            parent, children);
+       indexing_tree = get_indexing_tree (user_data);
+       process = tracker_indexing_tree_parent_is_indexable (indexing_tree, parent, children);
+
        if (process) {
                TrackerDirectoryFlags parent_flags;
                GFile *canonical;
@@ -246,8 +251,7 @@ crawler_check_directory_contents_cb (TrackerCrawler *crawler,
                                                          parent,
                                                          G_FILE_TYPE_DIRECTORY,
                                                          NULL);
-               tracker_indexing_tree_get_root (priv->indexing_tree,
-                                               canonical, &parent_flags);
+               tracker_indexing_tree_get_root (indexing_tree, canonical, &parent_flags);
 
                add_monitor = (parent_flags & TRACKER_DIRECTORY_FLAG_MONITOR) != 0;
 
@@ -312,12 +316,16 @@ file_notifier_traverse_tree_foreach (GFile    *file,
                                         file);
                }
        } else if (!store_mtime && !disk_mtime) {
+               TrackerIndexingTree *indexing_tree;
+
                /* what are we doing with such file? should happen rarely,
                 * only with files that we've queried, but we decided not
                 * to crawl (i.e. embedded root directories, that would
                 * be processed when that root is being crawled).
                 */
-               if (!tracker_indexing_tree_file_is_root (priv->indexing_tree, file)) {
+               indexing_tree = get_indexing_tree (user_data);
+
+               if (!tracker_indexing_tree_file_is_root (indexing_tree, file)) {
                        gchar *uri;
 
                        uri = g_file_get_uri (file);
@@ -357,7 +365,7 @@ file_notifier_traverse_tree (TrackerFileNotifier *notifier, gint max_depth)
        g_assert (priv->current_index_root != NULL);
 
        directory = g_queue_peek_head (priv->current_index_root->pending_dirs);
-       config_root = tracker_indexing_tree_get_root (priv->indexing_tree,
+       config_root = tracker_indexing_tree_get_root (get_indexing_tree (notifier),
                                                      directory, &flags);
 
        if (config_root != directory ||
@@ -512,7 +520,7 @@ sparql_files_query_populate (TrackerFileNotifier *notifier,
                         * when the time arrives.
                         */
                        canonical = tracker_file_system_peek_file (priv->file_system, file);
-                       root = tracker_indexing_tree_get_root (priv->indexing_tree, file, NULL);
+                       root = tracker_indexing_tree_get_root (get_indexing_tree (notifier), file, NULL);
 
                        if (canonical && root == file && priv->current_index_root &&
                            root != priv->current_index_root->root) {
@@ -920,20 +928,21 @@ notifier_queue_file (TrackerFileNotifier   *notifier,
 
 /* Monitor signal handlers */
 static void
-monitor_item_created_cb (TrackerMonitor *monitor,
-                         GFile          *file,
-                         gboolean        is_directory,
-                         gpointer        user_data)
+monitor_item_created_cb (TrackerDataProvider *data_provider,
+                         GFile               *file,
+                         gboolean             is_directory,
+                         gpointer             user_data)
 {
        TrackerFileNotifier *notifier = user_data;
        TrackerFileNotifierPrivate *priv = notifier->priv;
+       TrackerIndexingTree *indexing_tree;
        GFileType file_type;
        GFile *canonical;
 
        file_type = (is_directory) ? G_FILE_TYPE_DIRECTORY : G_FILE_TYPE_REGULAR;
+       indexing_tree = get_indexing_tree (user_data);
 
-       if (!tracker_indexing_tree_file_is_indexable (priv->indexing_tree,
-                                                     file, file_type)) {
+       if (!tracker_indexing_tree_file_is_indexable (indexing_tree, file, file_type)) {
                /* File should not be indexed */
                return ;
        }
@@ -947,7 +956,7 @@ monitor_item_created_cb (TrackerMonitor *monitor,
 
                if (parent) {
                        children = g_list_prepend (NULL, file);
-                       indexable = tracker_indexing_tree_parent_is_indexable (priv->indexing_tree,
+                       indexable = tracker_indexing_tree_parent_is_indexable (indexing_tree,
                                                                               parent,
                                                                               children);
                        g_list_free (children);
@@ -969,8 +978,7 @@ monitor_item_created_cb (TrackerMonitor *monitor,
                /* If config for the directory is recursive,
                 * Crawl new entire directory and add monitors
                 */
-               tracker_indexing_tree_get_root (priv->indexing_tree,
-                                               file, &flags);
+               tracker_indexing_tree_get_root (indexing_tree, file, &flags);
 
                if (flags & TRACKER_DIRECTORY_FLAG_RECURSE) {
                        canonical = tracker_file_system_get_file (priv->file_system,
@@ -996,10 +1004,10 @@ monitor_item_created_cb (TrackerMonitor *monitor,
 }
 
 static void
-monitor_item_updated_cb (TrackerMonitor *monitor,
-                         GFile          *file,
-                         gboolean        is_directory,
-                         gpointer        user_data)
+monitor_item_updated_cb (TrackerDataProvider *data_provider,
+                         GFile               *file,
+                         gboolean             is_directory,
+                         gpointer             user_data)
 {
        TrackerFileNotifier *notifier = user_data;
        TrackerFileNotifierPrivate *priv = notifier->priv;
@@ -1008,8 +1016,7 @@ monitor_item_updated_cb (TrackerMonitor *monitor,
 
        file_type = (is_directory) ? G_FILE_TYPE_DIRECTORY : G_FILE_TYPE_REGULAR;
 
-       if (!tracker_indexing_tree_file_is_indexable (priv->indexing_tree,
-                                                     file, file_type)) {
+       if (!tracker_indexing_tree_file_is_indexable (get_indexing_tree (user_data), file, file_type)) {
                /* File should not be indexed */
                return;
        }
@@ -1026,10 +1033,10 @@ monitor_item_updated_cb (TrackerMonitor *monitor,
 }
 
 static void
-monitor_item_attribute_updated_cb (TrackerMonitor *monitor,
-                                   GFile          *file,
-                                   gboolean        is_directory,
-                                   gpointer        user_data)
+monitor_item_attribute_updated_cb (TrackerDataProvider *data_provider,
+                                   GFile               *file,
+                                   gboolean             is_directory,
+                                   gpointer             user_data)
 {
        TrackerFileNotifier *notifier = user_data;
        TrackerFileNotifierPrivate *priv = notifier->priv;
@@ -1038,8 +1045,7 @@ monitor_item_attribute_updated_cb (TrackerMonitor *monitor,
 
        file_type = (is_directory) ? G_FILE_TYPE_DIRECTORY : G_FILE_TYPE_REGULAR;
 
-       if (!tracker_indexing_tree_file_is_indexable (priv->indexing_tree,
-                                                     file, file_type)) {
+       if (!tracker_indexing_tree_file_is_indexable (get_indexing_tree (user_data), file, file_type)) {
                /* File should not be indexed */
                return;
        }
@@ -1056,20 +1062,21 @@ monitor_item_attribute_updated_cb (TrackerMonitor *monitor,
 }
 
 static void
-monitor_item_deleted_cb (TrackerMonitor *monitor,
-                         GFile          *file,
-                         gboolean        is_directory,
-                         gpointer        user_data)
+monitor_item_deleted_cb (TrackerDataProvider *data_provider,
+                         GFile               *file,
+                         gboolean             is_directory,
+                         gpointer             user_data)
 {
        TrackerFileNotifier *notifier = user_data;
        TrackerFileNotifierPrivate *priv = notifier->priv;
+       TrackerIndexingTree *indexing_tree;
        GFile *canonical;
        GFileType file_type;
 
        file_type = (is_directory) ? G_FILE_TYPE_DIRECTORY : G_FILE_TYPE_REGULAR;
+       indexing_tree = get_indexing_tree (user_data);
 
-       if (!tracker_indexing_tree_file_is_indexable (priv->indexing_tree,
-                                                     file, file_type)) {
+       if (!tracker_indexing_tree_file_is_indexable (indexing_tree, file, file_type)) {
                /* File was not indexed */
                return ;
        }
@@ -1083,8 +1090,7 @@ monitor_item_deleted_cb (TrackerMonitor *monitor,
                children = g_list_prepend (NULL, file);
                parent = g_file_get_parent (file);
 
-               indexable = tracker_indexing_tree_parent_is_indexable (priv->indexing_tree,
-                                                                      parent, children);
+               indexable = tracker_indexing_tree_parent_is_indexable (indexing_tree, parent, children);
                g_object_unref (parent);
                g_list_free (children);
 
@@ -1101,8 +1107,7 @@ monitor_item_deleted_cb (TrackerMonitor *monitor,
                                                             file,
                                                             G_FILE_TYPE_DIRECTORY,
                                                             NULL);
-                       tracker_indexing_tree_get_root (priv->indexing_tree,
-                                                       file, &flags);
+                       tracker_indexing_tree_get_root (indexing_tree, file, &flags);
                        notifier_queue_file (notifier, file, flags);
                        crawl_directories_start (notifier);
                        return;
@@ -1121,20 +1126,23 @@ monitor_item_deleted_cb (TrackerMonitor *monitor,
 }
 
 static void
-monitor_item_moved_cb (TrackerMonitor *monitor,
-                       GFile          *file,
-                       GFile          *other_file,
-                       gboolean        is_directory,
-                       gboolean        is_source_monitored,
-                       gpointer        user_data)
+monitor_item_moved_cb (TrackerDataProvider *data_provider,
+                       GFile               *file,
+                       GFile               *other_file,
+                       gboolean             is_directory,
+                       gboolean             is_source_monitored,
+                       gpointer             user_data)
 {
        TrackerFileNotifier *notifier;
        TrackerFileNotifierPrivate *priv;
+       TrackerIndexingTree *indexing_tree;
        TrackerDirectoryFlags flags;
 
        notifier = user_data;
        priv = notifier->priv;
-       tracker_indexing_tree_get_root (priv->indexing_tree, other_file, &flags);
+
+       indexing_tree = get_indexing_tree (user_data);
+       tracker_indexing_tree_get_root (indexing_tree, other_file, &flags);
 
        if (!is_source_monitored) {
                if (is_directory) {
@@ -1168,7 +1176,7 @@ monitor_item_moved_cb (TrackerMonitor *monitor,
                 */
                source_stored = (tracker_file_system_peek_file (priv->file_system,
                                                                check_file) != NULL);
-               should_process_other = tracker_indexing_tree_file_is_indexable (priv->indexing_tree,
+               should_process_other = tracker_indexing_tree_file_is_indexable (indexing_tree,
                                                                                other_file,
                                                                                file_type);
                g_object_unref (check_file);
@@ -1187,7 +1195,7 @@ monitor_item_moved_cb (TrackerMonitor *monitor,
                                gboolean dest_is_recursive;
                                TrackerDirectoryFlags flags;
 
-                               tracker_indexing_tree_get_root (priv->indexing_tree, other_file, &flags);
+                               tracker_indexing_tree_get_root (indexing_tree, other_file, &flags);
                                dest_is_recursive = (flags & TRACKER_DIRECTORY_FLAG_RECURSE) != 0;
 
                                /* Source file was not stored, check dest file as new */
@@ -1225,8 +1233,7 @@ monitor_item_moved_cb (TrackerMonitor *monitor,
                                                      other_file,
                                                      NULL);
 
-                               tracker_indexing_tree_get_root (priv->indexing_tree,
-                                                               file, &source_flags);
+                               tracker_indexing_tree_get_root (indexing_tree, file, &source_flags);
                                source_is_recursive = (source_flags & TRACKER_DIRECTORY_FLAG_RECURSE) != 0;
                                dest_is_recursive = (flags & TRACKER_DIRECTORY_FLAG_RECURSE) != 0;
 
@@ -1369,10 +1376,6 @@ tracker_file_notifier_finalize (GObject *object)
 
        priv = TRACKER_FILE_NOTIFIER (object)->priv;
 
-       if (priv->indexing_tree) {
-               g_object_unref (priv->indexing_tree);
-       }
-
        if (priv->data_provider) {
                g_object_unref (priv->data_provider);
        }
@@ -1396,30 +1399,32 @@ static void
 tracker_file_notifier_constructed (GObject *object)
 {
        TrackerFileNotifierPrivate *priv;
+       TrackerIndexingTree *indexing_tree;
        GFile *root;
+       GError *error = NULL;
 
        G_OBJECT_CLASS (tracker_file_notifier_parent_class)->constructed (object);
 
        priv = TRACKER_FILE_NOTIFIER (object)->priv;
-       g_assert (priv->indexing_tree);
+
+       /* Sanity check, make sure we have a data provider and indexing tree */
+       g_assert_nonnull (priv->data_provider);
+
+       indexing_tree = tracker_data_provider_get_indexing_tree (priv->data_provider, &error);
+       g_assert_no_error (error);
+       g_assert_nonnull (indexing_tree);
 
        /* Initialize filesystem and register properties */
-       root = tracker_indexing_tree_get_master_root (priv->indexing_tree);
+       root = tracker_indexing_tree_get_master_root (indexing_tree);
        priv->file_system = tracker_file_system_new (root);
 
-       g_signal_connect (priv->indexing_tree, "directory-added",
+       g_signal_connect (indexing_tree, "directory-added",
                          G_CALLBACK (indexing_tree_directory_added), object);
-       g_signal_connect (priv->indexing_tree, "directory-updated",
+       g_signal_connect (indexing_tree, "directory-updated",
                          G_CALLBACK (indexing_tree_directory_added), object);
-       g_signal_connect (priv->indexing_tree, "directory-removed",
+       g_signal_connect (indexing_tree, "directory-removed",
                          G_CALLBACK (indexing_tree_directory_removed), object);
 
-       /* Make sure we have a data provider, either provided or fallback */
-       if (G_LIKELY (!priv->data_provider)) {
-               /* Default to the file data_provider if none is passed */
-               priv->data_provider = (TrackerDataProvider*) tracker_file_data_provider_new ();
-       }
-
        /* Set up monitor */
        g_signal_connect (priv->data_provider, "item-created",
                          G_CALLBACK (monitor_item_created_cb),
@@ -1542,14 +1547,6 @@ tracker_file_notifier_class_init (TrackerFileNotifierClass *klass)
                              G_TYPE_NONE, 0, G_TYPE_NONE);
 
        g_object_class_install_property (object_class,
-                                        PROP_INDEXING_TREE,
-                                        g_param_spec_object ("indexing-tree",
-                                                             "Indexing tree",
-                                                             "Indexing tree",
-                                                             TRACKER_TYPE_INDEXING_TREE,
-                                                             G_PARAM_READWRITE |
-                                                             G_PARAM_CONSTRUCT_ONLY));
-       g_object_class_install_property (object_class,
                                         PROP_DATA_PROVIDER,
                                         g_param_spec_object ("data-provider",
                                                              "Data provider",
@@ -1601,13 +1598,11 @@ tracker_file_notifier_init (TrackerFileNotifier *notifier)
 }
 
 TrackerFileNotifier *
-tracker_file_notifier_new (TrackerIndexingTree  *indexing_tree,
-                           TrackerDataProvider  *data_provider)
+tracker_file_notifier_new (TrackerDataProvider *data_provider)
 {
-       g_return_val_if_fail (TRACKER_IS_INDEXING_TREE (indexing_tree), NULL);
+       g_return_val_if_fail (TRACKER_IS_DATA_PROVIDER (data_provider), NULL);
 
        return g_object_new (TRACKER_TYPE_FILE_NOTIFIER,
-                            "indexing-tree", indexing_tree,
                             "data-provider", data_provider,
                             NULL);
 }
diff --git a/src/libtracker-miner/tracker-file-notifier.h b/src/libtracker-miner/tracker-file-notifier.h
index f1c86a5..87c6577 100644
--- a/src/libtracker-miner/tracker-file-notifier.h
+++ b/src/libtracker-miner/tracker-file-notifier.h
@@ -79,8 +79,7 @@ struct _TrackerFileNotifierClass {
 GType         tracker_file_notifier_get_type     (void) G_GNUC_CONST;
 
 TrackerFileNotifier *
-              tracker_file_notifier_new          (TrackerIndexingTree     *indexing_tree,
-                                                  TrackerDataProvider     *data_provider);
+              tracker_file_notifier_new          (TrackerDataProvider     *data_provider);
 
 gboolean      tracker_file_notifier_start        (TrackerFileNotifier     *notifier);
 void          tracker_file_notifier_stop         (TrackerFileNotifier     *notifier);
diff --git a/src/libtracker-miner/tracker-miner-fs.c b/src/libtracker-miner/tracker-miner-fs.c
index 069f869..6154550 100644
--- a/src/libtracker-miner/tracker-miner-fs.c
+++ b/src/libtracker-miner/tracker-miner-fs.c
@@ -31,6 +31,7 @@
 #include "tracker-task-pool.h"
 #include "tracker-sparql-buffer.h"
 #include "tracker-file-notifier.h"
+#include "tracker-file-data-provider.h"
 
 /* If defined will print the tree from GNode while running */
 #ifdef CRAWLED_TREE_ENABLE_TRACE
@@ -193,7 +194,6 @@ struct _TrackerMinerFSPrivate {
 
        /* Root / tree / index */
        GFile *root;
-       TrackerIndexingTree *indexing_tree;
        TrackerFileNotifier *file_notifier;
        TrackerDataProvider *data_provider;
 
@@ -356,6 +356,22 @@ static GQuark quark_file_iri = 0;
 static GInitableIface* miner_fs_initable_parent_iface;
 static guint signals[LAST_SIGNAL] = { 0, };
 
+static inline TrackerIndexingTree *
+get_indexing_tree (gpointer user_data)
+{
+       TrackerMinerFS *miner_fs;
+       TrackerMinerFSPrivate *priv;
+
+       miner_fs = TRACKER_MINER_FS (user_data);
+       if (!miner_fs) {
+               return NULL;
+       }
+
+       priv = miner_fs->priv;
+
+       return tracker_data_provider_get_indexing_tree (priv->data_provider, NULL);
+}
+
 /**
  * tracker_miner_fs_error_quark:
  *
@@ -694,6 +710,7 @@ miner_fs_initable_init (GInitable     *initable,
                         GError       **error)
 {
        TrackerMinerFSPrivate *priv;
+       TrackerIndexingTree *indexing_tree;
        guint limit;
 
        if (!miner_fs_initable_parent_iface->init (initable, cancellable, error)) {
@@ -718,7 +735,9 @@ miner_fs_initable_init (GInitable     *initable,
                          G_CALLBACK (task_pool_limit_reached_notify_cb),
                          initable);
 
-       if (!priv->indexing_tree) {
+       indexing_tree = get_indexing_tree (initable);
+
+       if (!indexing_tree) {
                g_set_error (error,
                             tracker_miner_fs_error_quark (),
                             TRACKER_MINER_FS_ERROR_INIT,
@@ -726,13 +745,12 @@ miner_fs_initable_init (GInitable     *initable,
                return FALSE;
        }
 
-       g_signal_connect (priv->indexing_tree, "directory-removed",
+       g_signal_connect (indexing_tree, "directory-removed",
                          G_CALLBACK (indexing_tree_directory_removed),
                          initable);
 
        /* Create the file notifier */
-       priv->file_notifier = tracker_file_notifier_new (priv->indexing_tree,
-                                                        priv->data_provider);
+       priv->file_notifier = tracker_file_notifier_new (priv->data_provider);
 
        if (!priv->file_notifier) {
                g_set_error (error,
@@ -838,10 +856,6 @@ fs_finalize (GObject *object)
 
        g_hash_table_unref (priv->items_ignore_next_update);
 
-       if (priv->indexing_tree) {
-               g_object_unref (priv->indexing_tree);
-       }
-
        if (priv->file_notifier) {
                g_object_unref (priv->file_notifier);
        }
@@ -869,6 +883,8 @@ static void
 fs_constructed (GObject *object)
 {
        TrackerMinerFSPrivate *priv;
+       TrackerIndexingTree *indexing_tree;
+       GError *error = NULL;
 
        /* NOTE: We have to do this in this order because initables
         * are called _AFTER_ constructed and for subclasses that are
@@ -884,14 +900,38 @@ fs_constructed (GObject *object)
 
        priv = TRACKER_MINER_FS_GET_PRIVATE (object);
 
-       /* Create root if one didn't exist */
-       if (priv->root == NULL) {
-               /* We default to file:/// */
-               priv->root = g_file_new_for_uri ("file:///");
-       }
+       /* If we already have a data provider passed when we created
+        * the object, we can use the indexing_tree associated with it
+        * and hence the root.
+        *
+        * This is mainly about ensuring we have everything we need at
+        * this point, which is 'root', 'data_provider' and and
+        * 'indexing_tree'.
+        */
+       if (G_LIKELY (priv->data_provider == NULL)) {
+               /* We default to file:/// - this can be overridden by
+                * setting it when we create the object
+                */
+               if (priv->root == NULL) {
+                       priv->root = g_file_new_for_uri ("file:///");
+               }
+
+               /* Create indexing tree */
+               indexing_tree = tracker_indexing_tree_new_with_root (priv->root);
+
+               /* Default to the file data_provider if none is passed */
+               priv->data_provider = (TrackerDataProvider*) tracker_file_data_provider_new ();
+               tracker_data_provider_set_indexing_tree (priv->data_provider, indexing_tree, &error);
 
-       /* Create indexing tree */
-       priv->indexing_tree = tracker_indexing_tree_new_with_root (priv->root);
+               g_assert_no_error (error);
+       } else {
+               /* So we have a data provider, let's ensure it is set
+                * up correctly.
+                */
+               indexing_tree = tracker_data_provider_get_indexing_tree (priv->data_provider, &error);
+               g_assert_no_error (error);
+               g_assert_nonnull (indexing_tree);
+       }
 }
 
 static void
@@ -1518,7 +1558,7 @@ item_add_or_update (TrackerMinerFS *fs,
         * we have to UPDATE, not INSERT. */
        urn = lookup_file_urn (fs, file, FALSE);
 
-       if (!tracker_indexing_tree_file_is_root (fs->priv->indexing_tree, file)) {
+       if (!tracker_indexing_tree_file_is_root (get_indexing_tree (fs), file)) {
                parent = g_file_get_parent (file);
                parent_urn = lookup_file_urn (fs, parent, TRUE);
                g_object_unref (parent);
@@ -1966,12 +2006,11 @@ item_move (TrackerMinerFS *fs,
                g_object_unref (new_parent);
        g_free (display_name);
 
-       tracker_indexing_tree_get_root (fs->priv->indexing_tree, source_file, &source_flags);
+       tracker_indexing_tree_get_root (get_indexing_tree (fs), source_file, &source_flags);
 
        if ((source_flags & TRACKER_DIRECTORY_FLAG_RECURSE) != 0 &&
            g_file_info_get_file_type (file_info) == G_FILE_TYPE_DIRECTORY) {
-               tracker_indexing_tree_get_root (fs->priv->indexing_tree,
-                                               file, &flags);
+               tracker_indexing_tree_get_root (get_indexing_tree (fs), file, &flags);
 
                if ((flags & TRACKER_DIRECTORY_FLAG_RECURSE) != 0) {
                        /* Update children uris */
@@ -2549,7 +2588,7 @@ item_queue_handlers_cb (gpointer user_data)
                parent = g_file_get_parent (file);
 
                if (!parent ||
-                   tracker_indexing_tree_file_is_root (fs->priv->indexing_tree, file) ||
+                   tracker_indexing_tree_file_is_root (get_indexing_tree (fs), file) ||
                    lookup_file_urn (fs, parent, TRUE)) {
                        keep_processing = item_add_or_update (fs, file, priority);
                } else {
@@ -2695,8 +2734,7 @@ should_check_file (TrackerMinerFS *fs,
        GFileType file_type;
 
        file_type = (is_dir) ? G_FILE_TYPE_DIRECTORY : G_FILE_TYPE_REGULAR;
-       return tracker_indexing_tree_file_is_indexable (fs->priv->indexing_tree,
-                                                       file, file_type);
+       return tracker_indexing_tree_file_is_indexable (get_indexing_tree (fs), file, file_type);
 }
 
 static gboolean
@@ -2769,8 +2807,7 @@ miner_fs_get_queue_priority (TrackerMinerFS *fs,
 {
        TrackerDirectoryFlags flags;
 
-       tracker_indexing_tree_get_root (fs->priv->indexing_tree,
-                                       file, &flags);
+       tracker_indexing_tree_get_root (get_indexing_tree (fs), file, &flags);
 
        return (flags & TRACKER_DIRECTORY_FLAG_PRIORITY) ?
                G_PRIORITY_HIGH : G_PRIORITY_DEFAULT;
@@ -3041,8 +3078,7 @@ file_notifier_directory_started (TrackerFileNotifier *notifier,
        gchar *str, *uri;
 
        uri = g_file_get_uri (directory);
-       tracker_indexing_tree_get_root (fs->priv->indexing_tree,
-                                       directory, &flags);
+       tracker_indexing_tree_get_root (get_indexing_tree (fs), directory, &flags);
 
        if ((flags & TRACKER_DIRECTORY_FLAG_RECURSE) != 0) {
                 str = g_strdup_printf ("Crawling recursively directory '%s'", uri);
@@ -3199,7 +3235,7 @@ tracker_miner_fs_directory_add (TrackerMinerFS *fs,
                flags |= TRACKER_DIRECTORY_FLAG_CHECK_MTIME;
        }
 
-       tracker_indexing_tree_add (fs->priv->indexing_tree,
+       tracker_indexing_tree_add (get_indexing_tree (fs),
                                   file,
                                   flags);
 }
@@ -3303,19 +3339,19 @@ gboolean
 tracker_miner_fs_directory_remove (TrackerMinerFS *fs,
                                    GFile          *file)
 {
-       TrackerMinerFSPrivate *priv;
+       TrackerIndexingTree *indexing_tree;
 
        g_return_val_if_fail (TRACKER_IS_MINER_FS (fs), FALSE);
        g_return_val_if_fail (G_IS_FILE (file), FALSE);
 
-       priv = fs->priv;
+       indexing_tree = get_indexing_tree (fs);
 
-       if (!tracker_indexing_tree_file_is_root (priv->indexing_tree, file)) {
+       if (!tracker_indexing_tree_file_is_root (indexing_tree, file)) {
                return FALSE;
        }
 
        g_debug ("Removing directory");
-       tracker_indexing_tree_remove (priv->indexing_tree, file);
+       tracker_indexing_tree_remove (indexing_tree, file);
 
        return TRUE;
 }
@@ -3343,7 +3379,7 @@ tracker_miner_fs_directory_remove_full (TrackerMinerFS *fs,
        g_return_val_if_fail (TRACKER_IS_MINER_FS (fs), FALSE);
        g_return_val_if_fail (G_IS_FILE (file), FALSE);
 
-       tracker_indexing_tree_get_root (fs->priv->indexing_tree, file, &flags);
+       tracker_indexing_tree_get_root (get_indexing_tree (fs), file, &flags);
 
        if (tracker_miner_fs_directory_remove (fs, file)) {
                if ((flags & TRACKER_DIRECTORY_FLAG_PRESERVE) != 0) {
@@ -3376,8 +3412,7 @@ check_file_parents (TrackerMinerFS *fs,
                return FALSE;
        }
 
-       root = tracker_indexing_tree_get_root (fs->priv->indexing_tree,
-                                              parent, NULL);
+       root = tracker_indexing_tree_get_root (get_indexing_tree (fs), parent, NULL);
        if (!root) {
                g_object_unref (parent);
                return FALSE;
@@ -3640,8 +3675,7 @@ tracker_miner_fs_check_directory_with_priority (TrackerMinerFS *fs,
                if (priority < G_PRIORITY_DEFAULT)
                        flags |= TRACKER_DIRECTORY_FLAG_PRIORITY;
 
-               tracker_indexing_tree_add (fs->priv->indexing_tree,
-                                          file, flags);
+               tracker_indexing_tree_add (get_indexing_tree (fs), file, flags);
        }
 
        g_free (uri);
@@ -4026,7 +4060,7 @@ tracker_miner_fs_force_mtime_checking (TrackerMinerFS *fs,
                flags |= TRACKER_DIRECTORY_FLAG_MONITOR;
        }
 
-       tracker_indexing_tree_add (fs->priv->indexing_tree,
+       tracker_indexing_tree_add (get_indexing_tree (fs),
                                   directory,
                                   flags);
 }
@@ -4147,7 +4181,7 @@ tracker_miner_fs_add_directory_without_parent (TrackerMinerFS *fs,
                flags |= TRACKER_DIRECTORY_FLAG_MONITOR;
        }
 
-       tracker_indexing_tree_add (fs->priv->indexing_tree,
+       tracker_indexing_tree_add (get_indexing_tree (fs),
                                   file,
                                   flags);
 }
@@ -4161,13 +4195,15 @@ tracker_miner_fs_add_directory_without_parent (TrackerMinerFS *fs,
  *
  * Returns: (transfer none): The #TrackerIndexingTree
  *          holding the indexing configuration
+ *
+ * Deprecated: 1.2: Use tracker_data_provider_get_indexing_tree() instead.
  **/
 TrackerIndexingTree *
 tracker_miner_fs_get_indexing_tree (TrackerMinerFS *fs)
 {
        g_return_val_if_fail (TRACKER_IS_MINER_FS (fs), NULL);
 
-       return fs->priv->indexing_tree;
+       return get_indexing_tree (fs);
 }
 
 /**
diff --git a/src/libtracker-miner/tracker-miner-fs.h b/src/libtracker-miner/tracker-miner-fs.h
index ae23ff8..a35b666 100644
--- a/src/libtracker-miner/tracker-miner-fs.h
+++ b/src/libtracker-miner/tracker-miner-fs.h
@@ -128,7 +128,7 @@ GType                 tracker_miner_fs_get_type              (void) G_GNUC_CONST
 GQuark                tracker_miner_fs_error_quark           (void);
 
 /* Properties */
-TrackerIndexingTree * tracker_miner_fs_get_indexing_tree     (TrackerMinerFS  *fs);
+TrackerIndexingTree * tracker_miner_fs_get_indexing_tree     (TrackerMinerFS  *fs) G_GNUC_DEPRECATED;
 TrackerDataProvider * tracker_miner_fs_get_data_provider     (TrackerMinerFS  *fs);
 gdouble               tracker_miner_fs_get_throttle          (TrackerMinerFS  *fs);
 gboolean              tracker_miner_fs_get_mtime_checking    (TrackerMinerFS  *fs);



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