[tracker/miner-fs-initable-iface: 6/8] libtracker-miner, miner-flickr: Make TrackerMinerWeb and TrackerMinerFlickr objects initable



commit 96e867555a11221f12ea2f010e59abae10b63f2e
Author: Aleksander Morgado <aleksander lanedo com>
Date:   Mon Jan 31 21:03:49 2011 +0100

    libtracker-miner,miner-flickr: Make TrackerMinerWeb and TrackerMinerFlickr objects initable

 src/libtracker-miner/tracker-miner-web.c    |  221 ++++++++++++---------------
 src/libtracker-miner/tracker-miner-web.h    |    1 +
 src/libtracker-miner/tracker-miner.vapi     |    7 +-
 src/miners/flickr/tracker-miner-flickr.vala |   38 ++++--
 4 files changed, 134 insertions(+), 133 deletions(-)
---
diff --git a/src/libtracker-miner/tracker-miner-web.c b/src/libtracker-miner/tracker-miner-web.c
index 6c3d29e..4fbf5dd 100644
--- a/src/libtracker-miner/tracker-miner-web.c
+++ b/src/libtracker-miner/tracker-miner-web.c
@@ -55,11 +55,8 @@ static const gchar introspection_xml[] =
 
 struct TrackerMinerWebPrivate {
 	gboolean associated;
-	GDBusConnection *d_connection;
 	GDBusNodeInfo *introspection_data;
 	guint registration_id;
-	gchar *full_name;
-	gchar *full_path;
 };
 
 enum {
@@ -67,18 +64,48 @@ enum {
 	PROP_ASSOCIATED
 };
 
-static void miner_web_set_property (GObject      *object,
-                                    guint         param_id,
-                                    const GValue *value,
-                                    GParamSpec   *pspec);
-static void miner_web_get_property (GObject      *object,
-                                    guint         param_id,
-                                    GValue       *value,
-                                    GParamSpec   *pspec);
-static void miner_web_constructed  (GObject      *object);
-static void miner_web_finalize     (GObject      *object);
-
-G_DEFINE_ABSTRACT_TYPE (TrackerMinerWeb, tracker_miner_web, TRACKER_TYPE_MINER)
+static void       miner_web_set_property        (GObject                *object,
+                                                 guint                   param_id,
+                                                 const GValue           *value,
+                                                 GParamSpec             *pspec);
+static void       miner_web_get_property        (GObject                *object,
+                                                 guint                   param_id,
+                                                 GValue                 *value,
+                                                 GParamSpec             *pspec);
+static void       miner_web_initable_iface_init (GInitableIface         *iface);
+static gboolean   miner_web_initable_init       (GInitable              *initable,
+                                                 GCancellable           *cancellable,
+                                                 GError                **error);
+static void       miner_web_finalize            (GObject                *object);
+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);
+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);
+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);
+
+static GInitableIface* miner_web_initable_parent_iface;
+
+G_DEFINE_ABSTRACT_TYPE_WITH_CODE (TrackerMinerWeb, tracker_miner_web, TRACKER_TYPE_MINER,
+                                  G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
+                                                         miner_web_initable_iface_init));
 
 static void
 tracker_miner_web_class_init (TrackerMinerWebClass *klass)
@@ -88,7 +115,6 @@ tracker_miner_web_class_init (TrackerMinerWebClass *klass)
 	object_class->finalize     = miner_web_finalize;
 	object_class->set_property = miner_web_set_property;
 	object_class->get_property = miner_web_get_property;
-	object_class->constructed  = miner_web_constructed;
 
 	g_object_class_install_property (object_class,
 	                                 PROP_ASSOCIATED,
@@ -104,6 +130,64 @@ tracker_miner_web_class_init (TrackerMinerWebClass *klass)
 static void
 tracker_miner_web_init (TrackerMinerWeb *miner)
 {
+	miner->private = TRACKER_MINER_WEB_GET_PRIVATE (miner);
+}
+
+static void
+miner_web_initable_iface_init (GInitableIface *iface)
+{
+	miner_web_initable_parent_iface = g_type_interface_peek_parent (iface);
+	iface->init = miner_web_initable_init;
+}
+
+static gboolean
+miner_web_initable_init (GInitable     *initable,
+                         GCancellable  *cancellable,
+                         GError       **error)
+{
+	TrackerMiner *miner;
+	TrackerMinerWeb *mw;
+	GError *inner_error = NULL;
+	GDBusInterfaceVTable interface_vtable = {
+		handle_method_call,
+		handle_get_property,
+		handle_set_property
+	};
+
+	miner = TRACKER_MINER (initable);
+	mw = TRACKER_MINER_WEB (initable);
+
+	/* Chain up parent's initable callback before calling child's one */
+	if (!miner_web_initable_parent_iface->init (initable, cancellable, error)) {
+		return FALSE;
+	}
+
+	/* Setup web-interface introspection data */
+	mw->private->introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
+
+	g_message ("Registering Web interface in D-Bus object...");
+	g_message ("  Path:'%s'", tracker_miner_get_dbus_full_path (miner));
+	g_message ("  Object Type:'%s'", G_OBJECT_TYPE_NAME (initable));
+
+	mw->private->registration_id =
+		g_dbus_connection_register_object (tracker_miner_get_dbus_connection (miner),
+		                                   tracker_miner_get_dbus_full_path (miner),
+		                                   mw->private->introspection_data->interfaces[0],
+		                                   &interface_vtable,
+		                                   mw,
+		                                   NULL,
+		                                   &inner_error);
+	if (inner_error) {
+		g_propagate_error (error, inner_error);
+		g_prefix_error (error,
+		                "Could not register the D-Bus object %s. ",
+		                tracker_miner_get_dbus_full_path (miner));
+		return FALSE;
+	}
+
+	/* No need to RequestName again as already done by the parent TrackerMiner object */
+
+	return TRUE;
 }
 
 static void
@@ -155,7 +239,7 @@ miner_web_finalize (GObject *object)
 	priv = TRACKER_MINER_WEB_GET_PRIVATE (object);
 
 	if (priv->registration_id != 0) {
-		g_dbus_connection_unregister_object (priv->d_connection,
+		g_dbus_connection_unregister_object (tracker_miner_get_dbus_connection (TRACKER_MINER (object)),
 		                                     priv->registration_id);
 	}
 
@@ -163,13 +247,6 @@ miner_web_finalize (GObject *object)
 		g_dbus_node_info_unref (priv->introspection_data);
 	}
 
-	if (priv->d_connection) {
-		g_object_unref (priv->d_connection);
-	}
-
-	g_free (priv->full_name);
-	g_free (priv->full_path);
-
 	G_OBJECT_CLASS (tracker_miner_web_parent_class)->finalize (object);
 }
 
@@ -389,102 +466,6 @@ handle_set_property (GDBusConnection  *connection,
 	return TRUE;
 }
 
-static void
-miner_web_constructed (GObject *miner)
-{
-	TrackerMinerWebPrivate *priv;
-	gchar *name, *full_path, *full_name;
-	GVariant *reply;
-	guint32 rval;
-	GError *error = NULL;
-	GDBusInterfaceVTable interface_vtable = {
-		handle_method_call,
-		handle_get_property,
-		handle_set_property
-	};
-
-	priv = TRACKER_MINER_WEB_GET_PRIVATE (miner);
-
-	priv->d_connection = g_bus_get_sync (G_BUS_TYPE_SESSION, 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);
-		return;
-	}
-
-	priv->introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
-
-	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 ();
-	}
-
-	full_name = g_strconcat (TRACKER_MINER_DBUS_NAME_PREFIX, name, NULL);
-	priv->full_name = full_name;
-
-	/* Register the service name for the miner */
-	full_path = g_strconcat (TRACKER_MINER_DBUS_PATH_PREFIX, name, 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);
-		return;
-	}
-
-	reply = g_dbus_connection_call_sync (priv->d_connection,
-	                                     "org.freedesktop.DBus",
-	                                     "/org/freedesktop/DBus",
-	                                     "org.freedesktop.DBus",
-	                                     "RequestName",
-	                                     g_variant_new ("(su)", full_name, 0x4 /* DBUS_NAME_FLAG_DO_NOT_QUEUE */),
-	                                     G_VARIANT_TYPE ("(u)"),
-	                                     0, -1, NULL, &error);
-
-	if (error) {
-		g_critical ("Could not acquire name:'%s', %s",
-		            full_name,
-		            error->message);
-		g_clear_error (&error);
-		return;
-	}
-
-	g_variant_get (reply, "(u)", &rval);
-	g_variant_unref (reply);
-
-	if (rval != 1 /* DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER */) {
-		g_critical ("D-Bus service name:'%s' is already taken, "
-		            "perhaps the application is already running?",
-		            full_name);
-		return;
-	}
-
-	g_free (name);
-
-	priv->full_path = full_path;
-
-	G_OBJECT_CLASS (tracker_miner_web_parent_class)->constructed (miner);
-}
-
 /**
  * tracker_miner_web_error_quark:
  *
diff --git a/src/libtracker-miner/tracker-miner-web.h b/src/libtracker-miner/tracker-miner-web.h
index fc07029..ff1404c 100644
--- a/src/libtracker-miner/tracker-miner-web.h
+++ b/src/libtracker-miner/tracker-miner-web.h
@@ -72,6 +72,7 @@ typedef enum {
 
 struct TrackerMinerWeb {
 	TrackerMiner            parent_instance;
+	TrackerMinerWebPrivate *private;
 };
 
 /**
diff --git a/src/libtracker-miner/tracker-miner.vapi b/src/libtracker-miner/tracker-miner.vapi
index f53c769..6983423 100644
--- a/src/libtracker-miner/tracker-miner.vapi
+++ b/src/libtracker-miner/tracker-miner.vapi
@@ -20,7 +20,7 @@
 [CCode (cprefix = "Tracker", lower_case_cprefix = "tracker_")]
 namespace Tracker {
 	[CCode (cheader_filename = "libtracker-miner/tracker-miner.h")]
-	public class Miner : GLib.Object {
+	public class Miner : GLib.Object, GLib.Initable {
 		[CCode (has_construct_function = false)]
 		public Miner ();
 		[NoAccessorMethod]
@@ -42,6 +42,9 @@ namespace Tracker {
 		public virtual void stopped ();
 		public signal void error (GLib.Error e);
 		public unowned Tracker.Sparql.Connection? get_connection ();
+		public unowned GLib.DBusConnection? get_dbus_connection ();
+		public unowned string get_dbus_full_name ();
+		public unowned string get_dbus_full_path ();
 	}
 	[CCode (ref_function = "tracker_miner_fs_ref", unref_function = "tracker_miner_fs_unref", cheader_filename = "libtracker-miner/tracker-miner.h")]
 	public class MinerFS {
@@ -80,7 +83,7 @@ namespace Tracker {
 		public virtual void miner_progress (string miner_name, string status, double progress);
 	}
 	[CCode (cheader_filename = "libtracker-miner/tracker-miner.h")]
-	public class MinerWeb : Tracker.Miner {
+	public class MinerWeb : Tracker.Miner, GLib.Initable {
 		[CCode (has_construct_function = false)]
 		public MinerWeb ();
 		[NoAccessorMethod]
diff --git a/src/miners/flickr/tracker-miner-flickr.vala b/src/miners/flickr/tracker-miner-flickr.vala
index f15ca4f..8bec62c 100644
--- a/src/miners/flickr/tracker-miner-flickr.vala
+++ b/src/miners/flickr/tracker-miner-flickr.vala
@@ -32,7 +32,7 @@ private errordomain RestCallError {
 	CALL_ERROR        /* Call failed */
 }
 
-public class MinerFlickr : Tracker.MinerWeb {
+public class MinerFlickr : Tracker.MinerWeb, GLib.Initable {
 	private static const string MINER_NAME = "Flickr";
 	private static const string MINER_DESCRIPTION = "Tracker miner for Flickr";
 	/* The API_KEY and SECRET constants identify the application on Flickr */
@@ -95,14 +95,21 @@ public class MinerFlickr : Tracker.MinerWeb {
 		progress = 1.0;
 
 		rest = new Rest.Proxy (FLICKR_REST_URL, false);
+	}
+
+    public bool init (GLib.Cancellable? cancellable) throws GLib.Error {
+	    //Chain up parent's initable callback
+	    base.init (cancellable);
+
+	    tracker_writeback_init ();
+	    tracker_writeback_connect (writeback, null);
 
-		tracker_writeback_init ();
-		tracker_writeback_connect (writeback, null);
+	    init_datasource ();
+	    load_nmm_photo_id ();
 
-		init_datasource ();
-		load_nmm_photo_id ();
+	    this.notify["associated"].connect (association_status_changed);
 
-		this.notify["associated"].connect (association_status_changed);
+	    return true;
 	}
 
 	public void shutdown () {
@@ -831,9 +838,9 @@ public class MinerFlickr : Tracker.MinerWeb {
 
 			VariantIter iter1, iter2, iter3;
 			string key = null, val = null;
-			
+
 			iter1 = v.iterator ();
-			
+
 			while (iter1.next ("aa{ss}", out iter2)) {
 				while (iter2.next ("a{ss}", out iter3)) {
 					while (iter3.next ("{ss}", out key, out val)) {
@@ -842,7 +849,7 @@ public class MinerFlickr : Tracker.MinerWeb {
 					}
 				}
 			}
-			
+
 			return val;
 		} catch (Error tracker_error) {
 			throw tracker_error;
@@ -940,9 +947,17 @@ public class MinerFlickr : Tracker.MinerWeb {
 #endif
 	}
 
-	public static void main (string[] args) {
+	public static int main (string[] args) {
 		Environment.set_application_name ("Flickr tracker miner");
-		MinerFlickr flickr_miner = Object.new (typeof (MinerFlickr)) as MinerFlickr;
+		MinerFlickr flickr_miner;
+
+		try {
+			flickr_miner = Initable.new (typeof (MinerFlickr), null) as MinerFlickr;
+		} catch (Error e) {
+			printerr ("Couldn't create new Flickr Miner: '%s', exiting...\n",
+			          e.message);
+			return -1;
+		}
 
 		init_signals ();
 
@@ -950,6 +965,7 @@ public class MinerFlickr : Tracker.MinerWeb {
 		main_loop.run ();
 
 		flickr_miner.shutdown ();
+		return 0;
 	}
 }
 



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