[empathy/gnome-2-34] Wait for the channel to be ready before handling it



commit e3849f0476977eac243b5baafd10b3075f1ceee1
Author: Sjoerd Simons <sjoerd simons collabora co uk>
Date:   Wed Mar 23 13:09:09 2011 +0000

    Wait for the channel to be ready before handling it

 src/empathy-call-factory.c |   51 +++++++++++++++++++++++++++++++++++++-------
 1 files changed, 43 insertions(+), 8 deletions(-)
---
diff --git a/src/empathy-call-factory.c b/src/empathy-call-factory.c
index 48b711b..5d14ad5 100644
--- a/src/empathy-call-factory.c
+++ b/src/empathy-call-factory.c
@@ -285,6 +285,39 @@ call_channel_got_contact (TpConnection *connection,
   g_object_unref (handler);
 }
 
+static void
+call_channel_ready (EmpathyCallFactory *factory,
+  TpyCallChannel *call)
+{
+  TpChannel *channel = TP_CHANNEL (call);
+  const gchar *id;
+
+  id = tp_channel_get_identifier (channel);
+
+  /* The ready callback has a reference, so pass that on */
+  empathy_tp_contact_factory_get_from_id (
+    tp_channel_borrow_connection (channel),
+    id,
+    call_channel_got_contact,
+    channel,
+    g_object_unref,
+    (GObject *) factory);
+}
+
+static void
+call_channel_ready_cb (TpyCallChannel *call,
+  GParamSpec *spec,
+  EmpathyCallFactory *factory)
+{
+  gboolean ready;
+
+  g_object_get (call, "ready", &ready, NULL);
+  if (!ready)
+    return;
+
+  call_channel_ready (factory, call);
+}
+
 
 static void
 handle_channels_cb (TpSimpleHandler *handler,
@@ -303,7 +336,7 @@ handle_channels_cb (TpSimpleHandler *handler,
     {
       TpChannel *channel = l->data;
       TpyCallChannel *call;
-      const gchar *id;
+      gboolean ready;
 
       if (tp_proxy_get_invalidated (channel) != NULL)
         continue;
@@ -317,13 +350,15 @@ handle_channels_cb (TpSimpleHandler *handler,
 
       call = TPY_CALL_CHANNEL (channel);
 
-      id = tp_channel_get_identifier (channel);
-      empathy_tp_contact_factory_get_from_id (connection,
-        id,
-        call_channel_got_contact,
-        g_object_ref (channel),
-        g_object_unref,
-        (GObject *) self);
+      /* Take a ref to keep while hopping through the async callbacks */
+      g_object_ref (call);
+      g_object_get (call, "ready", &ready, NULL);
+
+      if (!ready)
+        tp_g_signal_connect_object (call, "notify::ready",
+          G_CALLBACK (call_channel_ready_cb), self, 0);
+      else
+        call_channel_ready (self, call);
     }
 
   tp_handle_channels_context_accept (context);



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