summaryrefslogtreecommitdiff
path: root/src/miners/fs/tracker-miner-files-index.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/miners/fs/tracker-miner-files-index.c')
-rw-r--r--src/miners/fs/tracker-miner-files-index.c584
1 files changed, 0 insertions, 584 deletions
diff --git a/src/miners/fs/tracker-miner-files-index.c b/src/miners/fs/tracker-miner-files-index.c
deleted file mode 100644
index 5497c780f..000000000
--- a/src/miners/fs/tracker-miner-files-index.c
+++ /dev/null
@@ -1,584 +0,0 @@
-/*
- * Copyright (C) 2010, Nokia <ivan.frade@nokia.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include "config.h"
-
-#include <libtracker-common/tracker-dbus.h>
-#include <libtracker-sparql/tracker-sparql.h>
-#include <libtracker-miner/tracker-miner.h>
-
-#include "tracker-miner-files-index.h"
-#include "tracker-miner-files-peer-listener.h"
-
-
-static const gchar introspection_xml[] =
- "<node>"
- " <interface name='org.freedesktop.Tracker1.Miner.Files.Index'>"
- " <method name='ReindexMimeTypes'>"
- " <arg type='as' name='mime_types' direction='in' />"
- " </method>"
- " <method name='IndexFile'>"
- " <arg type='s' name='file_uri' direction='in' />"
- " </method>"
- " <method name='IndexFileForProcess'>"
- " <arg type='s' name='file_uri' direction='in' />"
- " </method>"
- " </interface>"
- "</node>";
-
-/* If defined, then a file provided to be indexed MUST be a child in
- * an configured path. if undefined, any file can be indexed, however
- * it is up to applications to maintain files outside the configured
- * locations.
- */
-#undef REQUIRE_LOCATION_IN_CONFIG
-
-typedef struct {
- TrackerDBusRequest *request;
- GDBusMethodInvocation *invocation;
- TrackerSparqlConnection *connection;
- TrackerMinerFiles *miner_files;
-} MimeTypesData;
-
-typedef struct {
- TrackerMinerFiles *files_miner;
- TrackerMinerFilesPeerListener *peer_listener;
- GDBusConnection *d_connection;
- GDBusNodeInfo *introspection_data;
- guint registration_id;
- gchar *full_name;
- gchar *full_path;
-} TrackerMinerFilesIndexPrivate;
-
-enum {
- PROP_0,
- PROP_FILES_MINER
-};
-
-#define TRACKER_MINER_FILES_INDEX_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRACKER_TYPE_MINER_FILES_INDEX, TrackerMinerFilesIndexPrivate))
-
-static void index_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec);
-static void index_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec);
-static void index_finalize (GObject *object);
-
-G_DEFINE_TYPE(TrackerMinerFilesIndex, tracker_miner_files_index, G_TYPE_OBJECT)
-
-static void
-tracker_miner_files_index_class_init (TrackerMinerFilesIndexClass *klass)
-{
- GObjectClass *object_class;
-
- object_class = G_OBJECT_CLASS (klass);
-
- object_class->finalize = index_finalize;
- object_class->set_property = index_set_property;
- object_class->get_property = index_get_property;
-
- g_object_class_install_property (object_class,
- PROP_FILES_MINER,
- g_param_spec_object ("files_miner",
- "files_miner",
- "The FS Miner",
- TRACKER_TYPE_MINER_FILES,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-
- g_type_class_add_private (klass, sizeof (TrackerMinerFilesIndexPrivate));
-}
-
-static void
-index_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- TrackerMinerFilesIndexPrivate *priv;
-
- priv = TRACKER_MINER_FILES_INDEX_GET_PRIVATE (object);
-
- switch (param_id) {
- case PROP_FILES_MINER:
- priv->files_miner = g_value_dup_object (value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-
-static void
-index_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec)
-{
- TrackerMinerFilesIndexPrivate *priv;
-
- priv = TRACKER_MINER_FILES_INDEX_GET_PRIVATE (object);
-
- switch (param_id) {
- case PROP_FILES_MINER:
- g_value_set_object (value, priv->files_miner);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-static void
-index_finalize (GObject *object)
-{
- TrackerMinerFilesIndexPrivate *priv = TRACKER_MINER_FILES_INDEX_GET_PRIVATE (object);
-
- if (priv->registration_id != 0) {
- g_dbus_connection_unregister_object (priv->d_connection,
- priv->registration_id);
- }
-
- if (priv->introspection_data) {
- g_dbus_node_info_unref (priv->introspection_data);
- }
-
- if (priv->d_connection) {
- g_object_unref (priv->d_connection);
- }
-
- g_clear_object (&priv->peer_listener);
- g_free (priv->full_name);
- g_free (priv->full_path);
-
- g_object_unref (priv->files_miner);
-}
-
-static MimeTypesData *
-mime_types_data_new (TrackerDBusRequest *request,
- GDBusMethodInvocation *invocation,
- TrackerSparqlConnection *connection,
- TrackerMinerFiles *miner_files)
-{
- MimeTypesData *mtd;
-
- mtd = g_slice_new0 (MimeTypesData);
-
- mtd->miner_files = g_object_ref (miner_files);
- mtd->request = request;
- mtd->invocation = invocation;
- mtd->connection = g_object_ref (connection);
-
- return mtd;
-}
-
-static void
-mime_types_data_destroy (gpointer data)
-{
- MimeTypesData *mtd;
-
- mtd = data;
-
- g_object_unref (mtd->miner_files);
- g_object_unref (mtd->connection);
-
- g_slice_free (MimeTypesData, mtd);
-}
-
-static void
-mime_types_cb (GObject *object,
- GAsyncResult *result,
- gpointer user_data)
-{
- MimeTypesData *mtd = user_data;
- TrackerSparqlCursor *cursor;
- GError *error = NULL;
-
- cursor = tracker_sparql_connection_query_finish (TRACKER_SPARQL_CONNECTION (object),
- result,
- &error);
-
- if (cursor) {
- tracker_dbus_request_comment (mtd->request,
- "Found files that will need reindexing");
-
- while (tracker_sparql_cursor_next (cursor, NULL, NULL)) {
- GFile *file;
- const gchar *url;
-
- url = tracker_sparql_cursor_get_string (cursor, 0, NULL);
- file = g_file_new_for_uri (url);
- tracker_miner_fs_check_file (TRACKER_MINER_FS (mtd->miner_files),
- file, G_PRIORITY_HIGH, FALSE);
- g_object_unref (file);
- }
-
- tracker_dbus_request_end (mtd->request, NULL);
- g_dbus_method_invocation_return_value (mtd->invocation, NULL);
- } else {
- tracker_dbus_request_end (mtd->request, error);
- g_dbus_method_invocation_return_gerror (mtd->invocation, error);
- }
-
- mime_types_data_destroy (user_data);
-}
-
-static void
-tracker_miner_files_index_reindex_mime_types (TrackerMinerFilesIndex *miner,
- GDBusMethodInvocation *invocation,
- GVariant *parameters)
-{
- TrackerMinerFilesIndexPrivate *priv;
- GString *query;
- GError *inner_error = NULL;
- TrackerSparqlConnection *connection;
- TrackerDBusRequest *request;
- gint len, i;
- GStrv mime_types = NULL;
-
- priv = TRACKER_MINER_FILES_INDEX_GET_PRIVATE (miner);
-
- g_variant_get (parameters, "(^a&s)", &mime_types);
-
- len = mime_types ? g_strv_length (mime_types) : 0;
-
- tracker_gdbus_async_return_if_fail (len > 0, invocation);
-
- request = tracker_g_dbus_request_begin (invocation, "%s(%d mime types)",
- __FUNCTION__,
- len);
-
- connection = tracker_sparql_connection_get (NULL, &inner_error);
-
- if (!connection) {
- g_free (mime_types);
- tracker_dbus_request_end (request, inner_error);
- g_dbus_method_invocation_return_gerror (invocation, inner_error);
- g_error_free (inner_error);
- return;
- }
-
- tracker_dbus_request_comment (request,
- "Attempting to reindex the following mime types:");
-
- query = g_string_new ("SELECT ?url "
- "WHERE {"
- " ?resource nie:url ?url ;"
- " nie:mimeType ?mime ."
- " FILTER(");
-
- for (i = 0; i < len; i++) {
- tracker_dbus_request_comment (request, " %s", mime_types[i]);
- g_string_append_printf (query, "?mime = '%s'", mime_types[i]);
-
- if (i < len - 1) {
- g_string_append (query, " || ");
- }
- }
-
- g_string_append (query, ") }");
-
- /* FIXME: save last call id */
- tracker_sparql_connection_query_async (connection,
- query->str,
- NULL,
- mime_types_cb,
- mime_types_data_new (request,
- invocation,
- connection,
- priv->files_miner));
-
- g_string_free (query, TRUE);
- g_object_unref (connection);
- g_free (mime_types);
-}
-
-static void
-handle_method_call_index_file (TrackerMinerFilesIndex *miner,
- GDBusMethodInvocation *invocation,
- GVariant *parameters,
- gboolean watch_source)
-{
- TrackerMinerFilesIndexPrivate *priv;
- TrackerDBusRequest *request;
- GFile *file;
- GFileInfo *file_info;
- gboolean is_dir;
- gboolean do_checks = FALSE;
- GError *internal_error;
- const gchar *file_uri;
-
- priv = TRACKER_MINER_FILES_INDEX_GET_PRIVATE (miner);
-
- g_variant_get (parameters, "(&s)", &file_uri);
-
- tracker_gdbus_async_return_if_fail (file_uri != NULL, invocation);
-
- request = tracker_g_dbus_request_begin (invocation, "%s(uri:'%s')", __FUNCTION__, file_uri);
-
- file = g_file_new_for_uri (file_uri);
-
- file_info = g_file_query_info (file,
- G_FILE_ATTRIBUTE_STANDARD_TYPE,
- G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
- NULL, NULL);
-
- if (!file_info) {
- internal_error = g_error_new_literal (1, 0, "File does not exist");
- tracker_dbus_request_end (request, internal_error);
- g_dbus_method_invocation_return_gerror (invocation, internal_error);
-
- g_error_free (internal_error);
-
- g_object_unref (file);
-
- return;
- }
-
- is_dir = (g_file_info_get_file_type (file_info) == G_FILE_TYPE_DIRECTORY);
- g_object_unref (file_info);
-
-#ifdef REQUIRE_LOCATION_IN_CONFIG
- do_checks = TRUE;
- if (!tracker_miner_files_is_file_eligible (priv->files_miner, file)) {
- internal_error = g_error_new_literal (1, 0, "File is not eligible to be indexed");
- tracker_dbus_request_end (request, internal_error);
- g_dbus_method_invocation_return_gerror (invocation, internal_error);
-
- g_error_free (internal_error);
-
- g_object_unref (file);
-
- return;
- }
-#endif /* REQUIRE_LOCATION_IN_CONFIG */
-
- if (is_dir) {
- 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);
-
- /* If the directory had already subscribers, we want to add all
- * further watches, so the directory survives as long as there's
- * watchers.
- */
- is_watched = tracker_miner_files_peer_listener_is_file_watched (priv->peer_listener, file);
-
- /* Check whether the requested dir is not over a (recursively)
- * watched directory already, in that case we don't add the
- * directory (nor add a watch if we're positive it comes from
- * config).
- */
- if (!root ||
- (!(flags & TRACKER_DIRECTORY_FLAG_RECURSE) &&
- !g_file_equal (root, file) &&
- !g_file_has_parent (file, root))) {
- 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;
- } else {
- tracker_indexing_tree_notify_update (indexing_tree, file, TRUE);
- }
-
- if (watch_source && (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, G_PRIORITY_HIGH, do_checks);
- }
-
- tracker_dbus_request_end (request, NULL);
- g_dbus_method_invocation_return_value (invocation, NULL);
-
- g_object_unref (file);
-}
-
-static void
-handle_method_call (GDBusConnection *connection,
- const gchar *sender,
- const gchar *object_path,
- const gchar *interface_name,
- const gchar *method_name,
- GVariant *parameters,
- GDBusMethodInvocation *invocation,
- gpointer user_data)
-{
- TrackerMinerFilesIndex *miner = user_data;
-
- tracker_gdbus_async_return_if_fail (miner != NULL, invocation);
- tracker_gdbus_async_return_if_fail (TRACKER_IS_MINER_FILES_INDEX (miner), invocation);
-
- if (g_strcmp0 (method_name, "ReindexMimeTypes") == 0) {
- tracker_miner_files_index_reindex_mime_types (miner, invocation, parameters);
- } else if (g_strcmp0 (method_name, "IndexFile") == 0) {
- handle_method_call_index_file (miner, invocation, parameters, FALSE);
- } else if (g_strcmp0 (method_name, "IndexFileForProcess") == 0) {
- handle_method_call_index_file (miner, invocation, parameters, TRUE);
- } else {
- g_assert_not_reached ();
- }
-}
-
-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,
- const gchar *object_path,
- const gchar *interface_name,
- const gchar *property_name,
- GError **error,
- gpointer user_data)
-{
- g_assert_not_reached ();
- return NULL;
-}
-
-static gboolean
-handle_set_property (GDBusConnection *connection,
- const gchar *sender,
- const gchar *object_path,
- const gchar *interface_name,
- const gchar *property_name,
- GVariant *value,
- GError **error,
- gpointer user_data)
-{
- g_assert_not_reached ();
- return TRUE;
-}
-
-static void
-tracker_miner_files_index_init (TrackerMinerFilesIndex *object)
-{
-}
-
-TrackerMinerFilesIndex *
-tracker_miner_files_index_new (TrackerMinerFiles *miner_files)
-{
- GObject *miner;
- TrackerMinerFilesIndexPrivate *priv;
- gchar *full_path, *full_name;
- GError *error = NULL;
- TrackerIndexingTree *indexing_tree;
- GDBusInterfaceVTable interface_vtable = {
- handle_method_call,
- handle_get_property,
- handle_set_property
- };
-
- miner = g_object_new (TRACKER_TYPE_MINER_FILES_INDEX,
- "files-miner", miner_files,
- NULL);
-
- priv = TRACKER_MINER_FILES_INDEX_GET_PRIVATE (miner);
-
- priv->d_connection = g_bus_get_sync (TRACKER_IPC_BUS, NULL, &error);
-
- if (!priv->d_connection) {
- g_critical ("Could not connect to the D-Bus session bus, %s",
- error ? error->message : "no error given.");
- g_clear_error (&error);
- g_object_unref (miner);
- return NULL;
- }
-
- priv->introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, &error);
- if (!priv->introspection_data) {
- g_critical ("Could not create node info from introspection XML, %s",
- error ? error->message : "no error given.");
- g_clear_error (&error);
- return NULL;
- }
-
- full_name = g_strconcat (TRACKER_MINER_DBUS_NAME_PREFIX, "Files.Index", NULL);
- priv->full_name = full_name;
-
- /* Register the service name for the miner */
- full_path = g_strconcat (TRACKER_MINER_DBUS_PATH_PREFIX, "Files/Index", NULL);
-
- g_message ("Registering D-Bus object...");
- g_message (" Path:'%s'", full_path);
- g_message (" Object Type:'%s'", G_OBJECT_TYPE_NAME (miner));
-
- priv->registration_id =
- g_dbus_connection_register_object (priv->d_connection,
- full_path,
- priv->introspection_data->interfaces[0],
- &interface_vtable,
- miner,
- NULL,
- &error);
-
- if (error) {
- g_critical ("Could not register the D-Bus object %s, %s",
- full_path,
- error ? error->message : "no error given.");
- g_clear_error (&error);
- g_object_unref (miner);
- return NULL;
- }
-
- 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;
-}