[empathy] empathy-dispatch-operation: ensure that the operation stays alive while tp_channel_call_when_ready i



commit 941457df386b447ba7ecfb928f1184c6c8eb25d3
Author: Guillaume Desmottes <guillaume desmottes collabora co uk>
Date:   Tue Nov 3 16:41:25 2009 +0000

    empathy-dispatch-operation: ensure that the operation stays alive while tp_channel_call_when_ready is running

 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 11ad523..7eda94d 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 *



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