[tracker/miner-fs-initable-iface: 6/8] libtracker-miner, miner-flickr: Make TrackerMinerWeb and TrackerMinerFlickr objects initable
- From: Aleksander Morgado <aleksm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/miner-fs-initable-iface: 6/8] libtracker-miner, miner-flickr: Make TrackerMinerWeb and TrackerMinerFlickr objects initable
- Date: Tue, 1 Feb 2011 11:38:07 +0000 (UTC)
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]