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



commit 3bf72b1dddc93f40549577adeb8dda5cd90c5d6d
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 1cf3c61..d8e5449 100644
--- a/src/libtracker-miner/Makefile.am
+++ b/src/libtracker-miner/Makefile.am
@@ -28,6 +28,8 @@ libtracker_miner_LTLIBRARIES = libtracker-miner.la
 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 80d301c..45bced9 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]