]> git.0d.be Git - empathy.git/commitdiff
Wait for channel close before closing the socket
authorCosimo Cecchi <cosimo.cecchi@collabora.co.uk>
Fri, 15 May 2009 12:50:17 +0000 (14:50 +0200)
committerCosimo Cecchi <cosimoc@gnome.org>
Mon, 1 Jun 2009 15:53:17 +0000 (17:53 +0200)
So that we can better handle cancellations of the transfer.

libempathy/empathy-tp-file.c

index 1ca6858efda54aac978b108f3ca67c65c725e01d..61cb22e667290e3e3c2ac2739e4eea912a5213be 100644 (file)
@@ -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);
 
@@ -522,23 +522,33 @@ file_replace_async_cb (GObject *source,
       ft_operation_provide_or_accept_file_cb, NULL, NULL, G_OBJECT (tp_file));
 }
 
+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 */