diff options
author | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2009-11-04 00:41:25 +0800 |
---|---|---|
committer | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2009-11-04 00:58:03 +0800 |
commit | 941457df386b447ba7ecfb928f1184c6c8eb25d3 (patch) | |
tree | 0e8e21af1056d18a12d715af934bf7e103f8c554 | |
parent | 33a2f0c2162dfd7ba4e3b77f579c43d5eeb5c8bd (diff) | |
download | gsoc2013-empathy-941457df386b447ba7ecfb928f1184c6c8eb25d3.tar gsoc2013-empathy-941457df386b447ba7ecfb928f1184c6c8eb25d3.tar.gz gsoc2013-empathy-941457df386b447ba7ecfb928f1184c6c8eb25d3.tar.bz2 gsoc2013-empathy-941457df386b447ba7ecfb928f1184c6c8eb25d3.tar.lz gsoc2013-empathy-941457df386b447ba7ecfb928f1184c6c8eb25d3.tar.xz gsoc2013-empathy-941457df386b447ba7ecfb928f1184c6c8eb25d3.tar.zst gsoc2013-empathy-941457df386b447ba7ecfb928f1184c6c8eb25d3.zip |
empathy-dispatch-operation: ensure that the operation stays alive while tp_channel_call_when_ready is running
-rw-r--r-- | libempathy/empathy-dispatch-operation.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/libempathy/empathy-dispatch-operation.c b/libempathy/empathy-dispatch-operation.c index 11ad52302..7eda94d35 100644 --- a/libempathy/empathy-dispatch-operation.c +++ b/libempathy/empathy-dispatch-operation.c @@ -196,6 +196,9 @@ dispatcher_operation_got_contact_cb (EmpathyTpContactFactory *factory, priv->contact = g_object_ref (contact); g_object_notify (G_OBJECT (self), "contact"); + /* Ensure to keep the self object alive while the call_when_ready is + * running */ + g_object_ref (self); tp_channel_call_when_ready (priv->channel, empathy_dispatch_operation_channel_ready_cb, self); } @@ -256,6 +259,7 @@ empathy_dispatch_operation_constructed (GObject *object) return; } + g_object_ref (self); tp_channel_call_when_ready (priv->channel, empathy_dispatch_operation_channel_ready_cb, self); } @@ -445,10 +449,14 @@ empathy_dispatch_operation_channel_ready_cb (TpChannel *channel, /* The error will be handled in empathy_dispatch_operation_invalidated */ if (error != NULL) - return; + goto out; g_assert (channel == priv->channel); + if (priv->status >= EMPATHY_DISPATCHER_OPERATION_STATE_CLAIMED) + /* no point to get more information */ + goto out; + /* If the channel wrapper is defined, we assume it's ready */ if (priv->channel_wrapper != NULL) goto ready; @@ -464,7 +472,7 @@ empathy_dispatch_operation_channel_ready_cb (TpChannel *channel, { priv->ready_handler = g_signal_connect (chat, "notify::ready", G_CALLBACK (empathy_dispatcher_operation_tp_chat_ready_cb), self); - return; + goto out; } } else if (channel_type == TP_IFACE_QUARK_CHANNEL_TYPE_STREAMED_MEDIA) @@ -481,6 +489,8 @@ empathy_dispatch_operation_channel_ready_cb (TpChannel *channel, ready: empathy_dispatch_operation_set_status (self, EMPATHY_DISPATCHER_OPERATION_STATE_PENDING); +out: + g_object_unref (self); } EmpathyDispatchOperation * |