diff options
author | Alban Crequy <alban.crequy@collabora.co.uk> | 2008-10-31 13:15:19 +0000 |
---|---|---|
committer | Alban Crequy <alban.crequy@collabora.co.uk> | 2008-10-31 13:15:19 +0000 |
commit | fd6b6b96bde06ec97c4075b58e0b7643aca2cab9 (patch) | |
tree | 71ec5864930291890021f5b3afb25e030968a137 | |
parent | 177bb367a5ebb22b474b720ad54f459335c31368 (diff) | |
download | telepathy-salut-fd6b6b96bde06ec97c4075b58e0b7643aca2cab9.tar.gz |
Avoid to send the close message stanza from both ends in 1-1 stream tubes.
This commit is similar to what was done for telepathy-gabble for its bug #16797.
-rw-r--r-- | docs/tubes.txt | 4 | ||||
-rw-r--r-- | src/salut-tubes-channel.c | 6 | ||||
-rw-r--r-- | src/tube-dbus.c | 6 | ||||
-rw-r--r-- | src/tube-iface.c | 6 | ||||
-rw-r--r-- | src/tube-iface.h | 4 | ||||
-rw-r--r-- | src/tube-stream.c | 14 |
6 files changed, 20 insertions, 20 deletions
diff --git a/docs/tubes.txt b/docs/tubes.txt index 7d5f89e6..5c741587 100644 --- a/docs/tubes.txt +++ b/docs/tubes.txt @@ -57,7 +57,3 @@ Initiator to receptor: acknowledges the close request to="alban_test02@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 2a47061a..d940b390 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 c9a5e7af..65f56e65 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 31237ba1..ad5c98a0 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 d184f4f2..450a2f08 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 86813361..0b51d99f 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); |