[empathy: 80/148] Wait for channel close before closing the socket



commit ca4022f7e479bf282db649c15860f41b1d281020
Author: Cosimo Cecchi <cosimo cecchi collabora co uk>
Date:   Fri May 15 14:50:17 2009 +0200

    Wait for channel close before closing the socket
    
    So that we can better handle cancellations of the transfer.
---
 libempathy/empathy-tp-file.c |   38 ++++++++++++++++++++++++--------------
 1 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/libempathy/empathy-tp-file.c b/libempathy/empathy-tp-file.c
index 1ca6858..61cb22e 100644
--- a/libempathy/empathy-tp-file.c
+++ b/libempathy/empathy-tp-file.c
@@ -136,10 +136,10 @@ tp_file_get_state_cb (TpProxy *proxy,
 
 static void
 tp_file_invalidated_cb (TpProxy       *proxy,
-			guint          domain,
-			gint           code,
-			gchar         *message,
-			EmpathyTpFile *tp_file)
+                        guint          domain,
+                        gint           code,
+                        gchar         *message,
+                        EmpathyTpFile *tp_file)
 {
   EmpathyTpFilePriv *priv = GET_PRIV (tp_file);
 
@@ -523,22 +523,32 @@ file_replace_async_cb (GObject *source,
 }
 
 static void
+channel_closed_cb (TpChannel *proxy,
+                   const GError *error,
+                   gpointer user_data,
+                   GObject *weak_object)
+{
+  EmpathyTpFile *tp_file = EMPATHY_TP_FILE (weak_object);
+  EmpathyTpFilePriv *priv = GET_PRIV (tp_file);
+  gboolean *cancel = user_data;
+
+  DEBUG ("Channel is closed");
+
+  if (priv->cancellable != NULL &&
+      !g_cancellable_is_cancelled (priv->cancellable) && *cancel)
+    g_cancellable_cancel (priv->cancellable);  
+}
+
+static void
 close_channel_internal (EmpathyTpFile *tp_file,
                         gboolean cancel)
 {
-  EmpathyTpFilePriv *priv;
-
-  g_return_if_fail (EMPATHY_IS_TP_FILE (tp_file));
-  
-  priv = GET_PRIV (tp_file);
+  EmpathyTpFilePriv *priv = GET_PRIV (tp_file);
 
   DEBUG ("Closing channel..");
-  tp_cli_channel_call_close (priv->channel, -1,
-    NULL, NULL, NULL, NULL);
 
-  if (priv->cancellable != NULL &&
-      !g_cancellable_is_cancelled (priv->cancellable) && cancel)
-    g_cancellable_cancel (priv->cancellable);
+  tp_cli_channel_call_close (priv->channel, -1,
+    channel_closed_cb, &cancel, NULL, G_OBJECT (tp_file));
 }
 
 /* GObject methods */



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