[telepathy-mission-control/master] McdClient: look up unique name on construction, and emit "ready" when done

Simon McVittie simon.mcvittie at collabora.co.uk
Mon May 25 08:37:28 PDT 2009


---
 src/mcd-client.c |   85 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 84 insertions(+), 1 deletions(-)

diff --git a/src/mcd-client.c b/src/mcd-client.c
index d5615db..35e809a 100644
--- a/src/mcd-client.c
+++ b/src/mcd-client.c
@@ -30,18 +30,93 @@
 #include <telepathy-glib/errors.h>
 #include <telepathy-glib/proxy-subclass.h>
 
+#include "mcd-debug.h"
 #include "_gen/interfaces.h"
 
 G_DEFINE_TYPE (McdClientProxy, _mcd_client_proxy, TP_TYPE_PROXY);
 
+enum
+{
+    S_READY,
+    N_SIGNALS
+};
+
+static guint signals[N_SIGNALS] = { 0 };
+
 struct _McdClientProxyPrivate
 {
-  guint dummy:1;
+    gchar *unique_name;
+    gboolean ready;
 };
 
 static void
 _mcd_client_proxy_init (McdClientProxy *self)
 {
+    self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, MCD_TYPE_CLIENT_PROXY,
+                                              McdClientProxyPrivate);
+}
+
+static gboolean
+mcd_client_proxy_emit_ready (gpointer data)
+{
+    McdClientProxy *self = data;
+
+    if (self->priv->ready)
+        return FALSE;
+
+    self->priv->ready = TRUE;
+
+    g_signal_emit (self, signals[S_READY], 0);
+
+    return FALSE;
+}
+
+static void
+mcd_client_proxy_unique_name_cb (TpDBusDaemon *dbus_daemon,
+                                 const gchar *unique_name,
+                                 const GError *error,
+                                 gpointer unused G_GNUC_UNUSED,
+                                 GObject *weak_object)
+{
+    McdClientProxy *self = MCD_CLIENT_PROXY (weak_object);
+
+    if (error != NULL)
+    {
+        DEBUG ("Error getting unique name, assuming not active: %s %d: %s",
+               g_quark_to_string (error->domain), error->code, error->message);
+        unique_name = "";
+    }
+
+    self->priv->unique_name = g_strdup (unique_name);
+
+    mcd_client_proxy_emit_ready (self);
+}
+
+static void
+mcd_client_proxy_constructed (GObject *object)
+{
+    McdClientProxy *self = MCD_CLIENT_PROXY (object);
+    void (*chain_up) (GObject *) =
+        ((GObjectClass *) _mcd_client_proxy_parent_class)->constructed;
+
+    if (chain_up != NULL)
+    {
+        chain_up (object);
+    }
+
+    if (self->priv->unique_name == NULL)
+    {
+        tp_cli_dbus_daemon_call_get_name_owner (tp_proxy_get_dbus_daemon (self),
+                                                -1,
+                                                tp_proxy_get_bus_name (self),
+                                                mcd_client_proxy_unique_name_cb,
+                                                NULL, NULL, (GObject *) self);
+    }
+    else
+    {
+        g_idle_add_full (G_PRIORITY_HIGH, mcd_client_proxy_emit_ready,
+                         g_object_ref (self), g_object_unref);
+    }
 }
 
 static void
@@ -50,6 +125,14 @@ _mcd_client_proxy_class_init (McdClientProxyClass *klass)
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
     g_type_class_add_private (object_class, sizeof (McdClientProxyPrivate));
+
+    object_class->constructed = mcd_client_proxy_constructed;
+
+    signals[S_READY] = g_signal_new ("ready", G_OBJECT_CLASS_TYPE (klass),
+                                     G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+                                     0, NULL, NULL,
+                                     g_cclosure_marshal_VOID__VOID,
+                                     G_TYPE_NONE, 0);
 }
 
 gboolean
-- 
1.5.6.5




More information about the telepathy-commits mailing list