diff options
Diffstat (limited to 'src/miners/fs/tracker-writeback-dispatcher.c')
-rw-r--r-- | src/miners/fs/tracker-writeback-dispatcher.c | 400 |
1 files changed, 0 insertions, 400 deletions
diff --git a/src/miners/fs/tracker-writeback-dispatcher.c b/src/miners/fs/tracker-writeback-dispatcher.c deleted file mode 100644 index 980ccceb6..000000000 --- a/src/miners/fs/tracker-writeback-dispatcher.c +++ /dev/null @@ -1,400 +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 "tracker-writeback-dispatcher.h" -#include "tracker-miner-files.h" - -#define TRACKER_WRITEBACK_SERVICE "org.freedesktop.Tracker1.Writeback" -#define TRACKER_WRITEBACK_PATH "/org/freedesktop/Tracker1/Writeback" -#define TRACKER_WRITEBACK_INTERFACE "org.freedesktop.Tracker1.Writeback" - -typedef struct { - GFile *file; - TrackerMinerFiles *fs; - GPtrArray *results; - GStrv rdf_types; - TrackerWritebackDispatcher *self; /* weak */ - GCancellable *cancellable; - guint cancel_id; - guint retry_timeout; - guint retries; -} WritebackFileData; - -typedef struct { - TrackerMinerFiles *files_miner; - GDBusConnection *d_connection; - TrackerSparqlConnection *connection; -} TrackerWritebackDispatcherPrivate; - -enum { - PROP_0, - PROP_FILES_MINER -}; - -#define TRACKER_WRITEBACK_DISPATCHER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRACKER_TYPE_WRITEBACK_DISPATCHER, TrackerWritebackDispatcherPrivate)) - -static void writeback_dispatcher_set_property (GObject *object, - guint param_id, - const GValue *value, - GParamSpec *pspec); -static void writeback_dispatcher_get_property (GObject *object, - guint param_id, - GValue *value, - GParamSpec *pspec); -static void writeback_dispatcher_finalize (GObject *object); -static gboolean writeback_dispatcher_initable_init (GInitable *initable, - GCancellable *cancellable, - GError **error); -static void writeback_dispatcher_writeback_file (TrackerMinerFS *fs, - GFile *file, - GStrv rdf_types, - GPtrArray *results, - GCancellable *cancellable, - gpointer user_data); -static void self_weak_notify (gpointer data, - GObject *where_the_object_was); - -static void -writeback_dispatcher_initable_iface_init (GInitableIface *iface) -{ - iface->init = writeback_dispatcher_initable_init; -} - -G_DEFINE_TYPE_WITH_CODE (TrackerWritebackDispatcher, tracker_writeback_dispatcher, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, - writeback_dispatcher_initable_iface_init)); - -static void -tracker_writeback_dispatcher_class_init (TrackerWritebackDispatcherClass *klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - - object_class->finalize = writeback_dispatcher_finalize; - object_class->set_property = writeback_dispatcher_set_property; - object_class->get_property = writeback_dispatcher_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 (TrackerWritebackDispatcherPrivate)); -} - -static void -writeback_dispatcher_set_property (GObject *object, - guint param_id, - const GValue *value, - GParamSpec *pspec) -{ - TrackerWritebackDispatcherPrivate *priv; - - priv = TRACKER_WRITEBACK_DISPATCHER_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 -writeback_dispatcher_get_property (GObject *object, - guint param_id, - GValue *value, - GParamSpec *pspec) -{ - TrackerWritebackDispatcherPrivate *priv; - - priv = TRACKER_WRITEBACK_DISPATCHER_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 -writeback_dispatcher_finalize (GObject *object) -{ - TrackerWritebackDispatcherPrivate *priv = TRACKER_WRITEBACK_DISPATCHER_GET_PRIVATE (object); - - if (priv->connection) { - g_object_unref (priv->connection); - } - - if (priv->d_connection) { - g_object_unref (priv->d_connection); - } - - if (priv->files_miner) { - g_object_unref (priv->files_miner); - } -} - -static void -tracker_writeback_dispatcher_init (TrackerWritebackDispatcher *object) -{ -} - -static gboolean -writeback_dispatcher_initable_init (GInitable *initable, - GCancellable *cancellable, - GError **error) -{ - TrackerWritebackDispatcherPrivate *priv; - GError *internal_error = NULL; - - priv = TRACKER_WRITEBACK_DISPATCHER_GET_PRIVATE (initable); - - priv->connection = tracker_sparql_connection_get (NULL, &internal_error); - - if (internal_error) { - g_propagate_error (error, internal_error); - return FALSE; - } - - priv->d_connection = g_bus_get_sync (TRACKER_IPC_BUS, NULL, &internal_error); - - if (internal_error) { - g_propagate_error (error, internal_error); - return FALSE; - } - - g_signal_connect_object (priv->files_miner, - "writeback", - G_CALLBACK (writeback_dispatcher_writeback_file), - initable, - G_CONNECT_AFTER); - - return TRUE; -} - -TrackerWritebackDispatcher * -tracker_writeback_dispatcher_new (TrackerMinerFiles *miner_files, - GError **error) -{ - GObject *miner; - GError *internal_error = NULL; - - miner = g_initable_new (TRACKER_TYPE_WRITEBACK_DISPATCHER, - NULL, - &internal_error, - "files-miner", miner_files, - NULL); - - if (internal_error) { - g_propagate_error (error, internal_error); - return NULL; - } - - return (TrackerWritebackDispatcher *) miner; -} - -static void -writeback_file_data_free (WritebackFileData *data) -{ - if (data->self) { - g_object_weak_unref (G_OBJECT (data->self), self_weak_notify, data); - } - - g_object_unref (data->fs); - g_object_unref (data->file); - g_strfreev (data->rdf_types); - g_ptr_array_unref (data->results); - g_cancellable_disconnect (data->cancellable, data->cancel_id); - g_object_unref (data->cancellable); - g_free (data); -} - -static void -self_weak_notify (gpointer data, GObject *where_the_object_was) -{ - WritebackFileData *udata = data; - - /* Shut down while retrying writeback */ - g_debug ("Shutdown occurred while retrying write-back (after unmount), not retrying anymore"); - - if (udata->retry_timeout != 0) { - g_source_remove (udata->retry_timeout); - } - - udata->self = NULL; - writeback_file_data_free (udata); -} - -static gboolean -retry_idle (gpointer user_data) -{ - WritebackFileData *data = user_data; - - tracker_miner_files_writeback_file (data->fs, - data->file, - data->rdf_types, - data->results); - - writeback_file_data_free (data); - - return FALSE; -} - -static void -writeback_file_finished (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - WritebackFileData *data = user_data; - GError *error = NULL; - - g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object), - res, &error); - - if (error && error->code == G_DBUS_ERROR_NO_REPLY && data->retries < 5) { - /* This happens in case of exit() of the tracker-writeback binary, which - * happens on unmount of the FS event, for example */ - - g_debug ("Retrying write-back after unmount (timeout in 5 seconds)"); - tracker_miner_files_writeback_notify (data->fs, data->file, NULL); - - data->retry_timeout = g_timeout_add_seconds (5, retry_idle, data); - data->retries++; - - } else { - tracker_miner_files_writeback_notify (data->fs, data->file, error); - writeback_file_data_free (data); - } -} - -static void -writeback_cancel_remote_operation (GCancellable *cancellable, - WritebackFileData *data) -{ - TrackerWritebackDispatcherPrivate *priv; - GDBusMessage *message; - gchar *uris[2]; - - priv = TRACKER_WRITEBACK_DISPATCHER_GET_PRIVATE (data->self); - - uris[0] = g_file_get_uri (data->file); - uris[1] = NULL; - - message = g_dbus_message_new_method_call (TRACKER_WRITEBACK_SERVICE, - TRACKER_WRITEBACK_PATH, - TRACKER_WRITEBACK_INTERFACE, - "CancelTasks"); - - g_dbus_message_set_body (message, g_variant_new ("(^as)", uris)); - g_dbus_connection_send_message (priv->d_connection, message, - G_DBUS_SEND_MESSAGE_FLAGS_NONE, - NULL, NULL); - g_free (uris[0]); -} - -static void -writeback_dispatcher_writeback_file (TrackerMinerFS *fs, - GFile *file, - GStrv rdf_types, - GPtrArray *results, - GCancellable *cancellable, - gpointer user_data) -{ - TrackerWritebackDispatcher *self = user_data; - TrackerWritebackDispatcherPrivate *priv; - gchar *uri; - guint i; - GVariantBuilder builder; - WritebackFileData *data = g_new (WritebackFileData, 1); - - priv = TRACKER_WRITEBACK_DISPATCHER_GET_PRIVATE (self); - - uri = g_file_get_uri (file); - g_debug ("Performing write-back for '%s'", uri); - - g_variant_builder_init (&builder, G_VARIANT_TYPE ("(sasaas)")); - - g_variant_builder_add (&builder, "s", uri); - - g_variant_builder_open (&builder, G_VARIANT_TYPE ("as")); - for (i = 0; rdf_types[i] != NULL; i++) { - g_variant_builder_add (&builder, "s", rdf_types[i]); - } - g_variant_builder_close (&builder); - - g_variant_builder_open (&builder, G_VARIANT_TYPE ("aas")); - - for (i = 0; i< results->len; i++) { - GStrv row = g_ptr_array_index (results, i); - guint y; - - g_variant_builder_open (&builder, G_VARIANT_TYPE ("as")); - for (y = 0; row[y] != NULL; y++) { - g_variant_builder_add (&builder, "s", row[y]); - } - - g_variant_builder_close (&builder); - } - - g_variant_builder_close (&builder); - - data->retries = 0; - data->retry_timeout = 0; - data->self = self; - g_object_weak_ref (G_OBJECT (data->self), self_weak_notify, data); - data->fs = g_object_ref (fs); - data->file = g_object_ref (file); - data->results = g_ptr_array_ref (results); - data->rdf_types = g_strdupv (rdf_types); - data->cancellable = g_object_ref (cancellable); - data->cancel_id = g_cancellable_connect (data->cancellable, - G_CALLBACK (writeback_cancel_remote_operation), - data, NULL); - - g_dbus_connection_call (priv->d_connection, - TRACKER_WRITEBACK_SERVICE, - TRACKER_WRITEBACK_PATH, - TRACKER_WRITEBACK_INTERFACE, - "PerformWriteback", - g_variant_builder_end (&builder), - NULL, - G_DBUS_CALL_FLAGS_NONE, - -1, - cancellable, - (GAsyncReadyCallback) writeback_file_finished, - data); - - g_free (uri); -} |