[empathy/gnome-2-34] Wait for the channel to be ready before handling it
- From: Sjoerd Simons <sjoerds src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [empathy/gnome-2-34] Wait for the channel to be ready before handling it
- Date: Wed, 23 Mar 2011 15:12:43 +0000 (UTC)
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]