[tracker] TrackerMiner: Listen to tracker-store availability, pause if necessary.



commit 54fa1092b551b8e3cfb80563fc41eaa540e9d073
Author: Carlos Garnacho <carlos lanedo com>
Date:   Wed Sep 23 12:47:02 2009 +0200

    TrackerMiner: Listen to tracker-store availability, pause if necessary.

 src/libtracker-miner/tracker-miner.c |   66 ++++++++++++++++++++++++++++++++++
 1 files changed, 66 insertions(+), 0 deletions(-)
---
diff --git a/src/libtracker-miner/tracker-miner.c b/src/libtracker-miner/tracker-miner.c
index 7a3edf3..aee9138 100644
--- a/src/libtracker-miner/tracker-miner.c
+++ b/src/libtracker-miner/tracker-miner.c
@@ -43,6 +43,8 @@ struct TrackerMinerPrivate {
 	gchar *description;
 	gchar *status;
 	gdouble progress;
+
+	gint availability_cookie;
 };
 
 typedef struct {
@@ -420,6 +422,68 @@ dbus_register_object (GObject		    *object,
 }
 
 static void
+name_owner_changed_cb (DBusGProxy *proxy,
+		       gchar	  *name,
+		       gchar	  *old_owner,
+		       gchar	  *new_owner,
+		       gpointer    user_data)
+{
+	TrackerMiner *miner;
+	gboolean available;
+	GError *error = NULL;
+
+	if (!name || !*name ||
+	    strcmp (name, "org.freedesktop.Tracker1") != 0) {
+		return;
+	}
+
+	miner = user_data;
+	available = (new_owner && *new_owner);
+
+	g_debug ("Tracker-store availability has changed to %d", available);
+
+	if (available && miner->private->availability_cookie != 0) {
+		tracker_miner_resume (miner,
+				      miner->private->availability_cookie,
+				      &error);
+
+		if (error) {
+			g_warning ("Error happened resuming miner: %s\n", error->message);
+			g_error_free (error);
+		}
+
+		miner->private->availability_cookie = 0;
+	} else if (!available && miner->private->availability_cookie == 0) {
+		gint cookie_id;
+
+		cookie_id = tracker_miner_pause (miner,
+						 g_get_application_name (),
+						 _("Data store is not available"),
+						 &error);
+
+		if (error) {
+			g_warning ("Could not pause: %s", error->message);
+			g_error_free (error);
+		} else {
+			miner->private->availability_cookie = cookie_id;
+		}
+	}
+}
+
+static void
+dbus_set_name_monitor (TrackerMiner *miner,
+		       DBusGProxy   *proxy)
+{
+	dbus_g_proxy_add_signal (proxy, "NameOwnerChanged",
+				 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
+				 G_TYPE_INVALID);
+
+	dbus_g_proxy_connect_signal (proxy, "NameOwnerChanged",
+				     G_CALLBACK (name_owner_changed_cb),
+				     miner, NULL);
+}
+
+static void
 dbus_data_destroy (gpointer data)
 {
 	DBusData *dd;
@@ -487,6 +551,8 @@ dbus_data_create (TrackerMiner *miner,
 		return NULL;
 	}
 
+	dbus_set_name_monitor (miner, gproxy);
+
 	g_free (full_path);
 
 	/* Now we're successfully connected and registered, create the data */



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