[Telepathy-commits] [telepathy-salut/master] Avoid to send the close message stanza from both ends in 1-1 stream tubes.

Alban Crequy alban.crequy at collabora.co.uk
Tue Nov 25 03:59:38 PST 2008


This commit is similar to what was done for telepathy-gabble for its bug #16797.
---
 docs/tubes.txt            |    4 ----
 src/salut-tubes-channel.c |    6 +++---
 src/tube-dbus.c           |    6 +++---
 src/tube-iface.c          |    6 +++---
 src/tube-iface.h          |    4 ++--
 src/tube-stream.c         |   14 +++++++++-----
 6 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/docs/tubes.txt b/docs/tubes.txt
index 7d5f89e..5c74158 100644
--- a/docs/tubes.txt
+++ b/docs/tubes.txt
@@ -57,7 +57,3 @@ Initiator to receptor: acknowledges the close request
       to="alban_test02 at alban-hp"
       id="67843"/>
 
-Note that the close message is sent twice. This must be fixed. Gabble has the
-same bug:
-https://bugs.freedesktop.org/show_bug.cgi?id=16797
-
diff --git a/src/salut-tubes-channel.c b/src/salut-tubes-channel.c
index 2a47061..d940b39 100644
--- a/src/salut-tubes-channel.c
+++ b/src/salut-tubes-channel.c
@@ -962,7 +962,7 @@ salut_tubes_channel_message_close_received (SalutTubesChannel *self,
   if (tube)
     {
       DEBUG ("received a tube close message");
-      salut_tube_iface_close (tube);
+      salut_tube_iface_close (tube, TRUE);
     }
   else
     {
@@ -1633,7 +1633,7 @@ salut_tubes_channel_close_tube (TpSvcChannelTypeTubes *iface,
       return;
     }
 
-  salut_tube_iface_close (tube);
+  salut_tube_iface_close (tube, FALSE);
 
   tp_svc_channel_type_tubes_return_from_close_tube (context);
 }
@@ -1820,7 +1820,7 @@ iq_reply_cb (GibberIqHelper *helper,
   if (sub_type != GIBBER_STANZA_SUB_TYPE_RESULT)
     {
       DEBUG ("tube offer declined declined");
-      salut_tube_iface_close (tube);
+      salut_tube_iface_close (tube, TRUE);
       return;
     }
 
diff --git a/src/tube-dbus.c b/src/tube-dbus.c
index c9a5e7a..65f56e6 100644
--- a/src/tube-dbus.c
+++ b/src/tube-dbus.c
@@ -1051,7 +1051,7 @@ data_received_cb (GibberBytestreamIface *stream,
             {
               DEBUG ("D-Bus message has unknown endianness byte 0x%x, "
                   "closing tube", (unsigned int) buf->str[0]);
-              salut_tube_iface_close (SALUT_TUBE_IFACE (tube));
+              salut_tube_iface_close (SALUT_TUBE_IFACE (tube), FALSE);
               return;
             }
 
@@ -1072,7 +1072,7 @@ data_received_cb (GibberBytestreamIface *stream,
               priv->reassembly_bytes_needed > DBUS_MAXIMUM_MESSAGE_LENGTH)
             {
               DEBUG ("D-Bus message is too large to be valid, closing tube");
-              salut_tube_iface_close (SALUT_TUBE_IFACE (tube));
+              salut_tube_iface_close (SALUT_TUBE_IFACE (tube), FALSE);
               return;
             }
 
@@ -1160,7 +1160,7 @@ salut_tube_dbus_accept (SalutTubeIface *tube,
  * Implements salut_tube_iface_close on SalutTubeIface
  */
 static void
-salut_tube_dbus_close (SalutTubeIface *tube)
+salut_tube_dbus_close (SalutTubeIface *tube, gboolean closed_remotely)
 {
   SalutTubeDBus *self = SALUT_TUBE_DBUS (tube);
   SalutTubeDBusPrivate *priv = SALUT_TUBE_DBUS_GET_PRIVATE (self);
diff --git a/src/tube-iface.c b/src/tube-iface.c
index 31237ba..ad5c98a 100644
--- a/src/tube-iface.c
+++ b/src/tube-iface.c
@@ -43,12 +43,12 @@ salut_tube_iface_offer_needed (SalutTubeIface *self)
 }
 
 void
-salut_tube_iface_close (SalutTubeIface *self)
+salut_tube_iface_close (SalutTubeIface *self, gboolean closed_remotely)
 {
-  void (*virtual_method)(SalutTubeIface *) =
+  void (*virtual_method)(SalutTubeIface *, gboolean) =
     SALUT_TUBE_IFACE_GET_CLASS (self)->close;
   g_assert (virtual_method != NULL);
-  virtual_method (self);
+  virtual_method (self, closed_remotely);
 }
 
 void
diff --git a/src/tube-iface.h b/src/tube-iface.h
index d184f4f..450a2f0 100644
--- a/src/tube-iface.h
+++ b/src/tube-iface.h
@@ -34,7 +34,7 @@ struct _SalutTubeIfaceClass {
 
   gboolean (*accept) (SalutTubeIface *tube, GError **error);
   gboolean (*offer_needed) (SalutTubeIface *tube);
-  void (*close) (SalutTubeIface *tube);
+  void (*close) (SalutTubeIface *tube, gboolean local);
   void (*add_bytestream) (SalutTubeIface *tube,
       GibberBytestreamIface *bytestream);
 };
@@ -57,7 +57,7 @@ gboolean salut_tube_iface_offer_needed (SalutTubeIface *tube);
 
 gboolean salut_tube_iface_accept (SalutTubeIface *tube, GError **error);
 
-void salut_tube_iface_close (SalutTubeIface *tube);
+void salut_tube_iface_close (SalutTubeIface *tube, gboolean closed_remotely);
 
 void salut_tube_iface_add_bytestream (SalutTubeIface *tube,
     GibberBytestreamIface *bytestream);
diff --git a/src/tube-stream.c b/src/tube-stream.c
index 8681336..0b51d99 100644
--- a/src/tube-stream.c
+++ b/src/tube-stream.c
@@ -1040,7 +1040,7 @@ salut_tube_stream_dispose (GObject *object)
   if (priv->dispose_has_run)
     return;
 
-  salut_tube_iface_close (SALUT_TUBE_IFACE (self));
+  salut_tube_iface_close (SALUT_TUBE_IFACE (self), FALSE);
 
   if (priv->initiator != priv->self_handle &&
       priv->address_type == TP_SOCKET_ADDRESS_TYPE_UNIX &&
@@ -1678,7 +1678,7 @@ salut_tube_stream_accept (SalutTubeIface *tube,
 
   if (!tube_stream_open (self, error))
     {
-      salut_tube_iface_close (SALUT_TUBE_IFACE (self));
+      salut_tube_iface_close (SALUT_TUBE_IFACE (self), FALSE);
       return FALSE;
     }
 
@@ -1729,7 +1729,7 @@ iq_close_reply_cb (GibberIqHelper *helper,
  * Implements salut_tube_iface_close on SalutTubeIface
  */
 static void
-salut_tube_stream_close (SalutTubeIface *tube)
+salut_tube_stream_close (SalutTubeIface *tube, gboolean closed_remotely)
 {
   SalutTubeStream *self = SALUT_TUBE_STREAM (tube);
   SalutTubeStreamPrivate *priv = SALUT_TUBE_STREAM_GET_PRIVATE (self);
@@ -1741,7 +1741,9 @@ salut_tube_stream_close (SalutTubeIface *tube)
   g_hash_table_foreach_remove (priv->transport_to_bytestream,
       close_each_extra_bytestream, self);
 
-  if (priv->handle_type == TP_HANDLE_TYPE_CONTACT)
+  /* do not send the close stanza if the tube was closed due to the remote
+   * contact */
+  if (!closed_remotely && priv->handle_type == TP_HANDLE_TYPE_CONTACT)
     {
       GibberXmppStanza *stanza;
       const gchar *jid_from, *jid_to;
@@ -1779,7 +1781,10 @@ salut_tube_stream_close (SalutTubeIface *tube)
       g_free (tube_id_str);
 
       g_object_unref (stanza);
+    }
 
+  if (priv->handle_type == TP_HANDLE_TYPE_CONTACT)
+    {
       if (priv->initiator == priv->self_handle)
         {
           SalutDirectBytestreamManager *direct_bytestream_mgr;
@@ -1792,7 +1797,6 @@ salut_tube_stream_close (SalutTubeIface *tube)
           salut_direct_bytestream_manager_stop_listen (direct_bytestream_mgr, tube);
           g_object_unref (direct_bytestream_mgr);
         }
-
     }
 
   g_signal_emit (G_OBJECT (self), signals[CLOSED], 0);
-- 
1.5.6.5




More information about the Telepathy-commits mailing list