diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2015-08-15 00:08:11 +0200 |
---|---|---|
committer | Sam Thursfield <sam@afuera.me.uk> | 2015-08-18 21:22:48 +0100 |
commit | 7f6b036c7136366a9533b8482bdedfb8958d83a3 (patch) | |
tree | debaa9438410ac5c08d82ebd8a85e44639c3e74d /src/miners/fs/tracker-miner-files-index.c | |
parent | 10552043a6025dc1f33261b4a9398e3c1c3e4552 (diff) | |
download | tracker-7f6b036c7136366a9533b8482bdedfb8958d83a3.tar.gz |
tracker-miner-fs: Keep cache of IndexFile requesters on directories
The senders for all DBus requests to the IndexFile method on directories
will be now watched, the dbus presence of the senders will control the
lifetime of the directory on the indexed directories tree.
There may be multiple requests on a same directory, in such case the
directory will be indexed/monitored for as long as there is alive requesters
on it. Requests on already indexed directories (or children of recursively
indexed ones) will be silently ignored. Unmounts will also silently drop
the IndexFile listeners, applications should issue new requests on volume
mounts if desired.
The patch is loosely based on initial work from Felipe Borges.
https://bugzilla.gnome.org/show_bug.cgi?id=680834
Diffstat (limited to 'src/miners/fs/tracker-miner-files-index.c')
-rw-r--r-- | src/miners/fs/tracker-miner-files-index.c | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/src/miners/fs/tracker-miner-files-index.c b/src/miners/fs/tracker-miner-files-index.c index b507e3239..a4270415d 100644 --- a/src/miners/fs/tracker-miner-files-index.c +++ b/src/miners/fs/tracker-miner-files-index.c @@ -24,6 +24,7 @@ #include <libtracker-miner/tracker-miner.h> #include "tracker-miner-files-index.h" +#include "tracker-miner-files-peer-listener.h" static const gchar introspection_xml[] = @@ -54,6 +55,7 @@ typedef struct { typedef struct { TrackerMinerFiles *files_miner; + TrackerMinerFilesPeerListener *peer_listener; GDBusConnection *d_connection; GDBusNodeInfo *introspection_data; guint registration_id; @@ -161,6 +163,7 @@ index_finalize (GObject *object) g_object_unref (priv->d_connection); } + g_clear_object (&priv->peer_listener); g_free (priv->full_name); g_free (priv->full_path); @@ -365,7 +368,29 @@ handle_method_call_index_file (TrackerMinerFilesIndex *miner, #endif /* REQUIRE_LOCATION_IN_CONFIG */ if (is_dir) { - tracker_miner_fs_check_directory (TRACKER_MINER_FS (priv->files_miner), file, do_checks); + TrackerIndexingTree *indexing_tree; + TrackerDirectoryFlags flags; + gboolean is_watched, needs_watch = FALSE; + GFile *root; + + indexing_tree = tracker_miner_fs_get_indexing_tree (TRACKER_MINER_FS (priv->files_miner)); + root = tracker_indexing_tree_get_root (indexing_tree, file, &flags); + is_watched = tracker_miner_files_peer_listener_is_file_watched (priv->peer_listener, file); + + if (!root || !(flags & TRACKER_DIRECTORY_FLAG_RECURSE)) { + tracker_indexing_tree_add (indexing_tree, file, + TRACKER_DIRECTORY_FLAG_RECURSE | + TRACKER_DIRECTORY_FLAG_PRIORITY | + TRACKER_DIRECTORY_FLAG_CHECK_MTIME | + TRACKER_DIRECTORY_FLAG_MONITOR); + needs_watch = TRUE; + } + + if (is_watched || needs_watch) { + tracker_miner_files_peer_listener_add_watch (priv->peer_listener, + g_dbus_method_invocation_get_sender (invocation), + file); + } } else { tracker_miner_fs_check_file (TRACKER_MINER_FS (priv->files_miner), file, do_checks); } @@ -400,6 +425,30 @@ handle_method_call (GDBusConnection *connection, } } +static void +peer_listener_unwatch_file (TrackerMinerFilesPeerListener *listener, + GFile *file, + gpointer user_data) +{ + TrackerMinerFilesIndexPrivate *priv; + TrackerIndexingTree *indexing_tree; + + priv = TRACKER_MINER_FILES_INDEX_GET_PRIVATE (user_data); + indexing_tree = tracker_miner_fs_get_indexing_tree (TRACKER_MINER_FS (priv->files_miner)); + tracker_indexing_tree_remove (indexing_tree, file); +} + +static void +indexing_tree_directory_remove (TrackerIndexingTree *indexing_tree, + GFile *file, + gpointer user_data) +{ + TrackerMinerFilesIndexPrivate *priv; + + priv = TRACKER_MINER_FILES_INDEX_GET_PRIVATE (user_data); + tracker_miner_files_peer_listener_remove_file (priv->peer_listener, file); +} + static GVariant * handle_get_property (GDBusConnection *connection, const gchar *sender, @@ -441,6 +490,7 @@ tracker_miner_files_index_new (TrackerMinerFiles *miner_files) GVariant *reply; guint32 rval; GError *error = NULL; + TrackerIndexingTree *indexing_tree; GDBusInterfaceVTable interface_vtable = { handle_method_call, handle_get_property, @@ -530,5 +580,13 @@ tracker_miner_files_index_new (TrackerMinerFiles *miner_files) priv->full_path = full_path; + priv->peer_listener = tracker_miner_files_peer_listener_new (priv->d_connection); + g_signal_connect (priv->peer_listener, "unwatch-file", + G_CALLBACK (peer_listener_unwatch_file), miner); + + indexing_tree = tracker_miner_fs_get_indexing_tree (TRACKER_MINER_FS (miner_files)); + g_signal_connect (indexing_tree, "directory-removed", + G_CALLBACK (indexing_tree_directory_remove), miner); + return (TrackerMinerFilesIndex *) miner; } |