diff options
author | Sjoerd Simons <sjoerd.simons@collabora.co.uk> | 2011-03-23 21:09:09 +0800 |
---|---|---|
committer | Emilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk> | 2011-06-09 17:20:07 +0800 |
commit | 1db300a69d039838d68cd4af8fddbc404f31c74c (patch) | |
tree | fcb0f5b65554820ac23613d330e3765eb19ccbba /src | |
parent | eceb49ae9be0555a9d1f5de1f6c4b72c05315cb1 (diff) | |
download | gsoc2013-empathy-1db300a69d039838d68cd4af8fddbc404f31c74c.tar gsoc2013-empathy-1db300a69d039838d68cd4af8fddbc404f31c74c.tar.gz gsoc2013-empathy-1db300a69d039838d68cd4af8fddbc404f31c74c.tar.bz2 gsoc2013-empathy-1db300a69d039838d68cd4af8fddbc404f31c74c.tar.lz gsoc2013-empathy-1db300a69d039838d68cd4af8fddbc404f31c74c.tar.xz gsoc2013-empathy-1db300a69d039838d68cd4af8fddbc404f31c74c.tar.zst gsoc2013-empathy-1db300a69d039838d68cd4af8fddbc404f31c74c.zip |
Wait for the channel to be ready before handling it
Diffstat (limited to 'src')
-rw-r--r-- | 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 135e4e238..191dcab7f 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); |