summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlban Crequy <alban.crequy@collabora.co.uk>2008-10-31 13:15:19 +0000
committerAlban Crequy <alban.crequy@collabora.co.uk>2008-10-31 13:15:19 +0000
commitfd6b6b96bde06ec97c4075b58e0b7643aca2cab9 (patch)
tree71ec5864930291890021f5b3afb25e030968a137
parent177bb367a5ebb22b474b720ad54f459335c31368 (diff)
downloadtelepathy-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.txt4
-rw-r--r--src/salut-tubes-channel.c6
-rw-r--r--src/tube-dbus.c6
-rw-r--r--src/tube-iface.c6
-rw-r--r--src/tube-iface.h4
-rw-r--r--src/tube-stream.c14
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);