]> git.0d.be Git - empathy.git/commitdiff
Wait for the channel to be ready before handling it
authorSjoerd Simons <sjoerd.simons@collabora.co.uk>
Wed, 23 Mar 2011 13:09:09 +0000 (13:09 +0000)
committerEmilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk>
Thu, 9 Jun 2011 09:20:07 +0000 (10:20 +0100)
src/empathy-call-factory.c

index 135e4e238ba383198019bb1b95b796c87d7993e6..191dcab7fb4ef52dc8dba2267b279fcf14b4a389 100644 (file)
@@ -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);