[Telepathy-commits] [telepathy-gabble/master] Fix bug #16797: do not send the tube close stanza from both ends. Only send it when the tube is closed due to the local user.

Alban Crequy alban.crequy at collabora.co.uk
Thu Oct 30 14:22:34 PDT 2008


---
 src/tube-dbus.c     |    8 ++++----
 src/tube-iface.c    |    6 +++---
 src/tube-iface.h    |    4 ++--
 src/tube-stream.c   |    8 ++++----
 src/tubes-channel.c |   12 ++++++------
 5 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/src/tube-dbus.c b/src/tube-dbus.c
index 9a92496..ec81f3a 100644
--- a/src/tube-dbus.c
+++ b/src/tube-dbus.c
@@ -134,7 +134,7 @@ struct _GabbleTubeDBusPrivate
 static void data_received_cb (GabbleBytestreamIface *stream, TpHandle sender,
     GString *data, gpointer user_data);
 
-static void gabble_tube_dbus_close (GabbleTubeIface *tube);
+static void gabble_tube_dbus_close (GabbleTubeIface *tube, gboolean local);
 
 /*
  * Characters used are permissible both in filenames and in D-Bus names. (See
@@ -1036,7 +1036,7 @@ data_received_cb (GabbleBytestreamIface *stream,
             {
               DEBUG ("D-Bus message has unknown endianness byte 0x%x, "
                   "closing tube", (unsigned int) buf->str[0]);
-              gabble_tube_dbus_close ((GabbleTubeIface *) tube);
+              gabble_tube_dbus_close ((GabbleTubeIface *) tube, TRUE);
               return;
             }
 
@@ -1057,7 +1057,7 @@ data_received_cb (GabbleBytestreamIface *stream,
               priv->reassembly_bytes_needed > DBUS_MAXIMUM_MESSAGE_LENGTH)
             {
               DEBUG ("D-Bus message is too large to be valid, closing tube");
-              gabble_tube_dbus_close ((GabbleTubeIface *) tube);
+              gabble_tube_dbus_close ((GabbleTubeIface *) tube, TRUE);
               return;
             }
 
@@ -1165,7 +1165,7 @@ gabble_tube_dbus_accept (GabbleTubeIface *tube,
  * Implements gabble_tube_iface_close on GabbleTubeIface
  */
 static void
-gabble_tube_dbus_close (GabbleTubeIface *tube)
+gabble_tube_dbus_close (GabbleTubeIface *tube, gboolean local)
 {
   GabbleTubeDBus *self = GABBLE_TUBE_DBUS (tube);
 
diff --git a/src/tube-iface.c b/src/tube-iface.c
index 1c5b1f0..e1c3cf0 100644
--- a/src/tube-iface.c
+++ b/src/tube-iface.c
@@ -33,12 +33,12 @@ gabble_tube_iface_accept (GabbleTubeIface *self,
 }
 
 void
-gabble_tube_iface_close (GabbleTubeIface *self)
+gabble_tube_iface_close (GabbleTubeIface *self, gboolean local)
 {
-  void (*virtual_method)(GabbleTubeIface *) =
+  void (*virtual_method)(GabbleTubeIface *, gboolean) =
     GABBLE_TUBE_IFACE_GET_CLASS (self)->close;
   g_assert (virtual_method != NULL);
-  virtual_method (self);
+  virtual_method (self, local);
 }
 
 void
diff --git a/src/tube-iface.h b/src/tube-iface.h
index 97d203c..b4496a6 100644
--- a/src/tube-iface.h
+++ b/src/tube-iface.h
@@ -33,7 +33,7 @@ struct _GabbleTubeIfaceClass {
   GTypeInterface parent;
 
   gboolean (*accept) (GabbleTubeIface *tube, GError **error);
-  void (*close) (GabbleTubeIface *tube);
+  void (*close) (GabbleTubeIface *tube, gboolean local);
   void (*add_bytestream) (GabbleTubeIface *tube,
       GabbleBytestreamIface *bytestream);
 };
@@ -53,7 +53,7 @@ GType gabble_tube_iface_get_type (void);
 
 gboolean gabble_tube_iface_accept (GabbleTubeIface *tube, GError **error);
 
-void gabble_tube_iface_close (GabbleTubeIface *tube);
+void gabble_tube_iface_close (GabbleTubeIface *tube, gboolean local);
 
 void gabble_tube_iface_add_bytestream (GabbleTubeIface *tube,
     GabbleBytestreamIface *bytestream);
diff --git a/src/tube-stream.c b/src/tube-stream.c
index 852130a..297b205 100644
--- a/src/tube-stream.c
+++ b/src/tube-stream.c
@@ -842,7 +842,7 @@ gabble_tube_stream_dispose (GObject *object)
   if (priv->dispose_has_run)
     return;
 
-  gabble_tube_iface_close (GABBLE_TUBE_IFACE (self));
+  gabble_tube_iface_close (GABBLE_TUBE_IFACE (self), TRUE);
 
   if (priv->initiator != priv->self_handle &&
       priv->address_type == TP_SOCKET_ADDRESS_TYPE_UNIX &&
@@ -1289,7 +1289,7 @@ gabble_tube_stream_accept (GabbleTubeIface *tube,
 
   if (!tube_stream_open (self, error))
     {
-      gabble_tube_iface_close (GABBLE_TUBE_IFACE (self));
+      gabble_tube_iface_close (GABBLE_TUBE_IFACE (self), TRUE);
       return FALSE;
     }
 
@@ -1304,7 +1304,7 @@ gabble_tube_stream_accept (GabbleTubeIface *tube,
  * Implements gabble_tube_iface_close on GabbleTubeIface
  */
 static void
-gabble_tube_stream_close (GabbleTubeIface *tube)
+gabble_tube_stream_close (GabbleTubeIface *tube, gboolean local)
 {
   GabbleTubeStream *self = GABBLE_TUBE_STREAM (tube);
   GabbleTubeStreamPrivate *priv = GABBLE_TUBE_STREAM_GET_PRIVATE (self);
@@ -1316,7 +1316,7 @@ gabble_tube_stream_close (GabbleTubeIface *tube)
   g_hash_table_foreach_remove (priv->fd_to_bytestreams,
       close_each_extra_bytestream, self);
 
-  if (priv->handle_type == TP_HANDLE_TYPE_CONTACT)
+  if (local &&priv->handle_type == TP_HANDLE_TYPE_CONTACT)
     {
       LmMessage *msg;
       const gchar *jid;
diff --git a/src/tubes-channel.c b/src/tubes-channel.c
index 927c127..7b1205c 100644
--- a/src/tubes-channel.c
+++ b/src/tubes-channel.c
@@ -1182,7 +1182,7 @@ bytestream_negotiate_cb (GabbleBytestreamIface *bytestream,
   if (bytestream == NULL)
     {
       /* Tube was declined by remote user. Close it */
-      gabble_tube_iface_close (tube);
+      gabble_tube_iface_close (tube, FALSE);
       return;
     }
 
@@ -1575,7 +1575,7 @@ tube_msg_offered (GabbleTubesChannel *self,
   if (tube != NULL)
     {
       DEBUG ("tube ID already in use. Close both tubes");
-      gabble_tube_iface_close (tube);
+      gabble_tube_iface_close (tube, TRUE);
       return;
     }
 
@@ -1645,7 +1645,7 @@ tube_msg_close (GabbleTubesChannel *self,
 
   DEBUG ("tube %u was closed by remote peer", tube_id);
   /* FIXME: we shouldn't re-send the close message */
-  gabble_tube_iface_close (tube);
+  gabble_tube_iface_close (tube, FALSE);
 }
 
 void
@@ -1722,7 +1722,7 @@ gabble_tubes_channel_offer_d_bus_tube (TpSvcChannelTypeTubes *iface,
 
       if (!start_stream_initiation (self, tube, stream_id, &error))
         {
-          gabble_tube_iface_close (tube);
+          gabble_tube_iface_close (tube, FALSE);
 
           dbus_g_method_return_error (context, error);
 
@@ -1823,7 +1823,7 @@ gabble_tubes_channel_offer_stream_tube (TpSvcChannelTypeTubes *iface,
       /* Stream initiation */
       if (!send_new_stream_tube_msg (self, tube, stream_id, &error))
         {
-          gabble_tube_iface_close (tube);
+          gabble_tube_iface_close (tube, FALSE);
 
           dbus_g_method_return_error (context, error);
 
@@ -2053,7 +2053,7 @@ gabble_tubes_channel_close_tube (TpSvcChannelTypeTubes *iface,
       return;
     }
 
-  gabble_tube_iface_close (tube);
+  gabble_tube_iface_close (tube, TRUE);
 
   tp_svc_channel_type_tubes_return_from_close_tube (context);
 }
-- 
1.5.6.5




More information about the Telepathy-commits mailing list