[tracker/miner-web: 22/26] TrackerMiner: Take DBus initialization away to tracker-dbus.[ch]



commit b0187691dc01e26e43e8e0f745460f777a67f4b0
Author: Carlos Garnacho <carlos lanedo com>
Date:   Fri Nov 6 15:25:19 2009 +0100

    TrackerMiner: Take DBus initialization away to tracker-dbus.[ch]
    
    This way, other miner base object implementation will be able to define
    extra interfaces by doing initialization themselves, the Miner DBus interface
    will need to be there in order to have things working though.

 src/libtracker-miner/Makefile.am     |    2 +
 src/libtracker-miner/tracker-dbus.c  |  274 ++++++++++++++++++++++++++++++++++
 src/libtracker-miner/tracker-dbus.h  |   38 +++++
 src/libtracker-miner/tracker-miner.c |  216 ++-------------------------
 4 files changed, 326 insertions(+), 204 deletions(-)
---
diff --git a/src/libtracker-miner/Makefile.am b/src/libtracker-miner/Makefile.am
index e46fa49..5ffd317 100644
--- a/src/libtracker-miner/Makefile.am
+++ b/src/libtracker-miner/Makefile.am
@@ -34,6 +34,8 @@ libtracker_miner_la_VALASOURCES=     \
 libtracker_miner_la_SOURCES = 				\
 	tracker-crawler.c				\
 	tracker-crawler.h				\
+	tracker-dbus.c					\
+	tracker-dbus.h					\
 	tracker-marshal.c				\
 	tracker-marshal.h				\
 	tracker-miner.c					\
diff --git a/src/libtracker-miner/tracker-dbus.c b/src/libtracker-miner/tracker-dbus.c
new file mode 100644
index 0000000..2099e7c
--- /dev/null
+++ b/src/libtracker-miner/tracker-dbus.c
@@ -0,0 +1,274 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2009, Nokia (urho konttori nokia com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser 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 <stdlib.h>
+
+#include "tracker-dbus.h"
+#include "tracker-miner-dbus.h"
+
+typedef struct {
+        DBusGConnection *connection;
+        DBusGProxy *gproxy;
+        GHashTable *name_monitors;
+} DBusData;
+
+static GQuark dbus_data = 0;
+
+static gboolean
+dbus_register_service (DBusGProxy  *proxy,
+		       const gchar *name)
+{
+	GError *error = NULL;
+	guint	result;
+
+	g_message ("Registering D-Bus service...\n"
+		   "  Name:'%s'",
+		   name);
+
+	if (!org_freedesktop_DBus_request_name (proxy,
+						name,
+						DBUS_NAME_FLAG_DO_NOT_QUEUE,
+						&result, &error)) {
+		g_critical ("Could not acquire name:'%s', %s",
+			    name,
+			    error ? error->message : "no error given");
+		g_error_free (error);
+
+		return FALSE;
+	}
+
+	if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
+		g_critical ("D-Bus service name:'%s' is already taken, "
+			    "perhaps the application is already running?",
+			    name);
+		return FALSE;
+	}
+
+	return TRUE;
+}
+
+static gboolean
+dbus_register_object (GObject		    *object,
+		      DBusGConnection	    *connection,
+		      DBusGProxy	    *proxy,
+		      const DBusGObjectInfo *info,
+		      const gchar	    *path)
+{
+	g_message ("Registering D-Bus object...");
+	g_message ("  Path:'%s'", path);
+	g_message ("  Object Type:'%s'", G_OBJECT_TYPE_NAME (object));
+
+	dbus_g_object_type_install_info (G_OBJECT_TYPE (object), info);
+	dbus_g_connection_register_g_object (connection, path, object);
+
+	return TRUE;
+}
+
+static void
+name_owner_changed_cb (DBusGProxy *proxy,
+		       gchar	  *name,
+		       gchar	  *old_owner,
+		       gchar	  *new_owner,
+		       gpointer    user_data)
+{
+	TrackerMinerDBusNameFunc func;
+        TrackerMiner *miner;
+        gboolean available;
+        DBusData *data;
+
+        miner = user_data;
+
+        if (!name || !*name) {
+                return;
+        }
+
+	data = g_object_get_qdata (G_OBJECT (miner), dbus_data);
+
+        if (!data) {
+                return;
+        }
+
+        func = g_hash_table_lookup (data->name_monitors, name);
+
+        if (!func) {
+                return;
+        }
+
+	available = (new_owner && *new_owner);
+        (func) (miner, name, available);
+}
+
+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;
+
+	dd = data;
+
+	if (dd->gproxy) {
+		g_object_unref (dd->gproxy);
+	}
+
+	if (dd->connection) {
+		dbus_g_connection_unref (dd->connection);
+	}
+
+	if (dd->name_monitors) {
+		g_hash_table_unref (dd->name_monitors);
+	}
+
+	g_slice_free (DBusData, dd);
+}
+
+static DBusData *
+dbus_data_create (TrackerMiner          *miner,
+		  const gchar           *name,
+                  const DBusGObjectInfo *info)
+{
+	DBusData *data;
+	DBusGConnection *connection;
+	DBusGProxy *gproxy;
+	GError *error = NULL;
+	gchar *full_name, *full_path;
+
+	connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+
+	if (!connection) {
+		g_critical ("Could not connect to the D-Bus session bus, %s",
+			    error ? error->message : "no error given.");
+		g_error_free (error);
+		return NULL;
+	}
+
+	gproxy = dbus_g_proxy_new_for_name (connection,
+					    DBUS_SERVICE_DBUS,
+					    DBUS_PATH_DBUS,
+					    DBUS_INTERFACE_DBUS);
+
+	/* Register the service name for the miner */
+	full_name = g_strconcat (TRACKER_MINER_DBUS_NAME_PREFIX, name, NULL);
+
+	if (!dbus_register_service (gproxy, full_name)) {
+		g_object_unref (gproxy);
+		g_free (full_name);
+		return NULL;
+	}
+
+	g_free (full_name);
+
+	full_path = g_strconcat (TRACKER_MINER_DBUS_PATH_PREFIX, name, NULL);
+
+	if (!dbus_register_object (G_OBJECT (miner),
+				   connection, gproxy,
+                                   info,
+				   full_path)) {
+		g_object_unref (gproxy);
+		g_free (full_path);
+		return NULL;
+	}
+
+        dbus_set_name_monitor (miner, gproxy);
+
+	g_free (full_path);
+
+	/* Now we're successfully connected and registered, create the data */
+	data = g_slice_new0 (DBusData);
+	data->connection = dbus_g_connection_ref (connection);
+	data->gproxy = g_object_ref (gproxy);
+        data->name_monitors = g_hash_table_new_full (g_str_hash,
+                                                     g_str_equal,
+                                                     (GDestroyNotify) g_free,
+                                                     NULL);
+
+	return data;
+}
+
+void
+tracker_miner_dbus_init (TrackerMiner          *miner,
+                         const DBusGObjectInfo *info)
+{
+	DBusData *data;
+        gchar *name;
+
+	if (G_UNLIKELY (dbus_data == 0)) {
+		dbus_data = g_quark_from_static_string ("tracker-miner-dbus-data");
+	}
+
+	data = g_object_get_qdata (G_OBJECT (miner), dbus_data);
+
+        if (data) {
+                return;
+        }
+
+        g_object_get (miner, "name", &name, NULL);
+
+	if (!name) {
+		g_critical ("Miner '%s' should have been given a name, bailing out",
+                            G_OBJECT_TYPE_NAME (miner));
+		g_assert_not_reached ();
+	}
+
+        data = dbus_data_create (miner, name, info);
+
+	if (G_UNLIKELY (!data)) {
+		g_critical ("Miner could not register object on D-Bus session");
+		exit (EXIT_FAILURE);
+		return;
+	}
+
+	g_object_set_qdata_full (G_OBJECT (miner),
+				 dbus_data,
+				 data,
+				 dbus_data_destroy);
+}
+
+void
+tracker_miner_dbus_add_name_watch (TrackerMiner             *miner,
+                                   const gchar              *name,
+                                   TrackerMinerDBusNameFunc  func)
+{
+        DBusData *data;
+
+	data = g_object_get_qdata (G_OBJECT (miner), dbus_data);
+
+        if (!data) {
+                g_critical ("Miner '%s' was not registered on "
+                            "DBus, can watch for owner changes",
+                            G_OBJECT_TYPE_NAME (miner));
+                return;
+        }
+
+        g_hash_table_insert (data->name_monitors,
+                             g_strdup (name),
+                             func);
+}
diff --git a/src/libtracker-miner/tracker-dbus.h b/src/libtracker-miner/tracker-dbus.h
new file mode 100644
index 0000000..d163aaf
--- /dev/null
+++ b/src/libtracker-miner/tracker-dbus.h
@@ -0,0 +1,38 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2009, Nokia (urho konttori nokia com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser 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.
+ */
+
+#ifndef __TRACKER_MINER_DBUS_HELPER_H__
+#define __TRACKER_MINER_DBUS_HELPER_H__
+
+#include <libtracker-common/tracker-dbus.h>
+#include "tracker-miner.h"
+
+typedef void (* TrackerMinerDBusNameFunc) (TrackerMiner *miner,
+                                           const gchar  *name,
+                                           gboolean      available);
+
+void  tracker_miner_dbus_init (TrackerMiner          *miner,
+                               const DBusGObjectInfo *info);
+
+void  tracker_miner_dbus_add_name_watch (TrackerMiner             *miner,
+                                         const gchar              *name,
+                                         TrackerMinerDBusNameFunc  func);
+
+#endif /* __TRACKER_MINER_DBUS_HELPER_H__ */
diff --git a/src/libtracker-miner/tracker-miner.c b/src/libtracker-miner/tracker-miner.c
index 5d02e46..c807cd8 100644
--- a/src/libtracker-miner/tracker-miner.c
+++ b/src/libtracker-miner/tracker-miner.c
@@ -20,8 +20,6 @@
 
 #include "config.h"
 
-#include <stdlib.h>
-
 #include <libtracker-common/tracker-dbus.h>
 #include <libtracker-common/tracker-type-utils.h>
 
@@ -29,6 +27,7 @@
 #include "tracker-miner.h"
 #include "tracker-miner-dbus.h"
 #include "tracker-miner-glue.h"
+#include "tracker-dbus.h"
 
 /**
  * SECTION:tracker-miner
@@ -63,12 +62,6 @@ struct TrackerMinerPrivate {
 };
 
 typedef struct {
-	DBusGConnection *connection;
-	DBusGProxy *gproxy;
-	GHashTable *name_monitors;
-} DBusData;
-
-typedef struct {
 	gint cookie;
 	gchar *application;
 	gchar *reason;	
@@ -103,8 +96,6 @@ enum {
 	LAST_SIGNAL
 };
 
-static GQuark dbus_data = 0;
-
 static guint signals[LAST_SIGNAL] = { 0 };
 
 static void       miner_set_property (GObject      *object,
@@ -117,9 +108,7 @@ static void       miner_get_property (GObject      *object,
 				      GParamSpec   *pspec);
 static void       miner_finalize     (GObject      *object);
 static void       miner_constructed  (GObject      *object);
-static void       dbus_data_destroy  (gpointer      data);
-static DBusData * dbus_data_create   (TrackerMiner *miner,
-				      const gchar  *name);
+
 static void       pause_data_destroy (gpointer      data);
 static PauseData *pause_data_new     (const gchar  *application,
 				      const gchar  *reason);
@@ -130,6 +119,9 @@ static void       async_call_notify_error (AsyncCallData *data,
 static void       async_call_data_destroy (AsyncCallData *data,
 					   gboolean       remove);
 
+static void       store_name_monitor_cb (TrackerMiner *miner,
+					 const gchar  *name,
+					 gboolean      available);
 
 G_DEFINE_ABSTRACT_TYPE (TrackerMiner, tracker_miner, G_TYPE_OBJECT)
 
@@ -394,10 +386,6 @@ miner_finalize (GObject *object)
 		tracker_disconnect (miner->private->client);
 	}
 
-	if (dbus_data != 0) {
-		g_object_set_qdata (G_OBJECT (miner), dbus_data, NULL);
-	}
-
 	g_hash_table_unref (miner->private->pauses);
 
 	g_ptr_array_foreach (miner->private->async_calls,
@@ -411,36 +399,11 @@ miner_finalize (GObject *object)
 static void
 miner_constructed (GObject *object)
 {
-	TrackerMiner *miner;
-	DBusData *data;
-
-	miner = TRACKER_MINER (object);
-
-	if (!miner->private->name) {
-		g_critical ("Miner should have been given a name, bailing out");
-		g_assert_not_reached ();
-	}
-
-	if (G_UNLIKELY (dbus_data == 0)) {
-		dbus_data = g_quark_from_static_string ("tracker-miner-dbus-data");
-	}
-
-	data = g_object_get_qdata (G_OBJECT (miner), dbus_data);
-
-	if (G_LIKELY (!data)) {
-		data = dbus_data_create (miner, miner->private->name);
-	}
-
-	if (G_UNLIKELY (!data)) {
-		g_critical ("Miner could not register object on D-Bus session");
-		exit (EXIT_FAILURE);
-		return;
-	}
+	TrackerMiner *miner = TRACKER_MINER (object);
 
-	g_object_set_qdata_full (G_OBJECT (miner), 
-				 dbus_data, 
-				 data,
-				 dbus_data_destroy);
+	tracker_miner_dbus_init (miner, &dbus_glib_tracker_miner_object_info);
+	tracker_miner_dbus_add_name_watch (miner, "org.freedesktop.Tracker1",
+					   store_name_monitor_cb);
 }
 
 /**
@@ -456,75 +419,13 @@ tracker_miner_error_quark (void)
 	return g_quark_from_static_string (TRACKER_MINER_ERROR_DOMAIN);
 }
 
-static gboolean
-dbus_register_service (DBusGProxy  *proxy,
-		       const gchar *name)
-{
-	GError *error = NULL;
-	guint	result;
-
-	g_message ("Registering D-Bus service...\n"
-		   "  Name:'%s'",
-		   name);
-
-	if (!org_freedesktop_DBus_request_name (proxy,
-						name,
-						DBUS_NAME_FLAG_DO_NOT_QUEUE,
-						&result, &error)) {
-		g_critical ("Could not acquire name:'%s', %s",
-			    name,
-			    error ? error->message : "no error given");
-		g_error_free (error);
-
-		return FALSE;
-	}
-
-	if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
-		g_critical ("D-Bus service name:'%s' is already taken, "
-			    "perhaps the application is already running?",
-			    name);
-		return FALSE;
-	}
-
-	return TRUE;
-}
-
-static gboolean
-dbus_register_object (GObject		    *object,
-		      DBusGConnection	    *connection,
-		      DBusGProxy	    *proxy,
-		      const DBusGObjectInfo *info,
-		      const gchar	    *path)
-{
-	g_message ("Registering D-Bus object...");
-	g_message ("  Path:'%s'", path);
-	g_message ("  Object Type:'%s'", G_OBJECT_TYPE_NAME (object));
-
-	dbus_g_object_type_install_info (G_OBJECT_TYPE (object), info);
-	dbus_g_connection_register_g_object (connection, path, object);
-
-	return TRUE;
-}
-
 static void
-name_owner_changed_cb (DBusGProxy *proxy,
-		       gchar	  *name,
-		       gchar	  *old_owner,
-		       gchar	  *new_owner,
-		       gpointer    user_data)
+store_name_monitor_cb (TrackerMiner *miner,
+		       const gchar  *name,
+		       gboolean      available)
 {
-	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) {
@@ -554,99 +455,6 @@ name_owner_changed_cb (DBusGProxy *proxy,
 	}
 }
 
-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;
-
-	dd = data;
-
-	if (dd->gproxy) {
-		g_object_unref (dd->gproxy);
-	}
-
-	if (dd->connection) {
-		dbus_g_connection_unref (dd->connection);
-	}
-
-	if (dd->name_monitors) {
-		g_hash_table_unref (dd->name_monitors);
-	}
-
-	g_slice_free (DBusData, dd);
-}
-
-static DBusData *
-dbus_data_create (TrackerMiner *miner,
-		  const gchar  *name)
-{
-	DBusData *data;
-	DBusGConnection *connection;
-	DBusGProxy *gproxy;
-	GError *error = NULL;
-	gchar *full_name, *full_path;
-
-	connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
-
-	if (!connection) {
-		g_critical ("Could not connect to the D-Bus session bus, %s",
-			    error ? error->message : "no error given.");
-		g_error_free (error);
-		return NULL;
-	}
-
-	gproxy = dbus_g_proxy_new_for_name (connection,
-					    DBUS_SERVICE_DBUS,
-					    DBUS_PATH_DBUS,
-					    DBUS_INTERFACE_DBUS);
-
-	/* Register the service name for the miner */
-	full_name = g_strconcat (TRACKER_MINER_DBUS_NAME_PREFIX, name, NULL);
-
-	if (!dbus_register_service (gproxy, full_name)) {
-		g_object_unref (gproxy);
-		g_free (full_name);
-		return NULL;
-	}
-
-	g_free (full_name);
-
-	full_path = g_strconcat (TRACKER_MINER_DBUS_PATH_PREFIX, name, NULL);
-
-	if (!dbus_register_object (G_OBJECT (miner),
-				   connection, gproxy,
-				   &dbus_glib_tracker_miner_object_info,
-				   full_path)) {
-		g_object_unref (gproxy);
-		g_free (full_path);
-		return NULL;
-	}
-
-	dbus_set_name_monitor (miner, gproxy);
-
-	g_free (full_path);
-
-	/* Now we're successfully connected and registered, create the data */
-	data = g_slice_new0 (DBusData);
-	data->connection = dbus_g_connection_ref (connection);
-	data->gproxy = g_object_ref (gproxy);
-
-	return data;
-}
-
 static PauseData *
 pause_data_new (const gchar *application,
 		const gchar *reason)



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