rpms/telepathy-salut/OLPC-2 salut-stream-tube-fix.patch, NONE, 1.1 telepathy-salut.spec, 1.33, 1.34
Morgan Collett (morgan)
fedora-extras-commits at redhat.com
Thu Feb 21 11:25:02 UTC 2008
Author: morgan
Update of /cvs/pkgs/rpms/telepathy-salut/OLPC-2
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv31118
Modified Files:
telepathy-salut.spec
Added Files:
salut-stream-tube-fix.patch
Log Message:
Apply patch for stream tubes fix
salut-stream-tube-fix.patch:
--- NEW FILE salut-stream-tube-fix.patch ---
diff -rN -u -p old-tmpa8xxot/lib/gibber/gibber-bytestream-iface.h new-tmpa8xxot/lib/gibber/gibber-bytestream-iface.h
--- old-tmpa8xxot/lib/gibber/gibber-bytestream-iface.h 2008-02-21 09:47:02.106754510 +0000
+++ new-tmpa8xxot/lib/gibber/gibber-bytestream-iface.h 2008-02-21 09:47:02.366770760 +0000
@@ -38,6 +38,7 @@ typedef enum
GIBBER_BYTESTREAM_STATE_INITIATING,
/* Bytestream open */
GIBBER_BYTESTREAM_STATE_OPEN,
+ GIBBER_BYTESTREAM_STATE_CLOSING,
GIBBER_BYTESTREAM_STATE_CLOSED,
NUM_GIBBER_BYTESTREAM_STATES,
} GibberBytestreamState;
diff -rN -u -p old-tmpa8xxot/lib/gibber/gibber-bytestream-oob.c new-tmpa8xxot/lib/gibber/gibber-bytestream-oob.c
--- old-tmpa8xxot/lib/gibber/gibber-bytestream-oob.c 2008-02-21 09:47:02.106754510 +0000
+++ new-tmpa8xxot/lib/gibber/gibber-bytestream-oob.c 2008-02-21 09:47:02.374771260 +0000
@@ -109,6 +109,10 @@ struct _GibberBytestreamIBBPrivate
#define GIBBER_BYTESTREAM_OOB_GET_PRIVATE(obj) \
((GibberBytestreamOOBPrivate *) (GibberBytestreamOOB *)obj->priv)
+static void gibber_bytestream_oob_do_close (GibberBytestreamOOB *self,
+ GError *error, gboolean can_wait);
+static void bytestream_closed (GibberBytestreamOOB *self);
+
static void
gibber_bytestream_oob_init (GibberBytestreamOOB *self)
{
@@ -365,7 +369,8 @@ xmpp_connection_stream_closed_cb (Gibber
{
GibberBytestreamOOB *self = GIBBER_BYTESTREAM_OOB (userdata);
DEBUG ("XMPP connection: stream closed. Close the OOB bytestream");
- g_object_set (self, "state", GIBBER_BYTESTREAM_STATE_CLOSED, NULL);
+ g_object_set (self, "state", GIBBER_BYTESTREAM_STATE_CLOSING, NULL);
+ bytestream_closed (self);
}
static void
@@ -374,7 +379,8 @@ xmpp_connection_transport_disconnected_c
{
GibberBytestreamOOB *self = GIBBER_BYTESTREAM_OOB (userdata);
DEBUG ("XMPP connection transport closed. Close the OOB bytestream");
- g_object_set (self, "state", GIBBER_BYTESTREAM_STATE_CLOSED, NULL);
+ g_object_set (self, "state", GIBBER_BYTESTREAM_STATE_CLOSING, NULL);
+ bytestream_closed (self);
}
static void
@@ -383,7 +389,8 @@ xmpp_connection_parse_error_cb (GibberXm
{
GibberBytestreamOOB *self = GIBBER_BYTESTREAM_OOB (userdata);
DEBUG ("XMPP connection: parse error. Close the OOB bytestream");
- g_object_set (self, "state", GIBBER_BYTESTREAM_STATE_CLOSED, NULL);
+ g_object_set (self, "state", GIBBER_BYTESTREAM_STATE_CLOSING, NULL);
+ bytestream_closed (self);
}
static void
@@ -399,7 +406,14 @@ gibber_bytestream_oob_dispose (GObject *
if (priv->state != GIBBER_BYTESTREAM_STATE_CLOSED)
{
- gibber_bytestream_iface_close (GIBBER_BYTESTREAM_IFACE (self), NULL);
+ if (priv->state == GIBBER_BYTESTREAM_STATE_CLOSING)
+ {
+ bytestream_closed (self);
+ }
+ else
+ {
+ gibber_bytestream_oob_do_close (self, NULL, FALSE);
+ }
}
if (priv->listener != NULL)
@@ -409,12 +423,6 @@ gibber_bytestream_oob_dispose (GObject *
g_source_remove (priv->listener_watch);
}
- if (priv->transport != NULL)
- {
- gibber_transport_disconnect (priv->transport);
- g_object_unref (priv->transport);
- }
-
if (priv->xmpp_connection != NULL)
{
g_signal_handlers_disconnect_matched (priv->xmpp_connection->transport,
@@ -749,9 +757,63 @@ gibber_bytestream_oob_accept (GibberByte
}
static void
+bytestream_closed (GibberBytestreamOOB *self)
+{
+ GibberBytestreamOOBPrivate *priv = GIBBER_BYTESTREAM_OOB_GET_PRIVATE (self);
+
+ if (priv->recipient)
+ {
+ /* We are the recipient and so have to send the reply
+ * to the OOB opening IQ */
+ if (priv->xmpp_connection->stream_flags ==
+ GIBBER_XMPP_CONNECTION_STREAM_FULLY_OPEN)
+ {
+ GibberXmppStanza *stanza;
+
+ /* As described in the XEP, we send result IQ when we have
+ * finished to use the OOB */
+ stanza = make_iq_oob_sucess_response (priv->self_id,
+ priv->peer_id, priv->stream_open_id);
+
+ DEBUG ("send OOB close stanza");
+
+ gibber_xmpp_connection_send (priv->xmpp_connection, stanza, NULL);
+ g_object_unref (stanza);
+ }
+ else
+ {
+ DEBUG ("XMPP connection is closed. Don't send OOB close stanza");
+ }
+ }
+ else
+ {
+ /* We are the sender. Don't have to send anything */
+ }
+
+ if (priv->transport != NULL)
+ {
+ g_signal_handlers_disconnect_matched (priv->transport,
+ G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self);
+ gibber_transport_disconnect (priv->transport);
+ g_object_unref (priv->transport);
+ priv->transport = NULL;
+ }
+
+ g_object_set (self, "state", GIBBER_BYTESTREAM_STATE_CLOSED, NULL);
+}
+
+static void
+transport_buffer_empty_cb (GibberTransport *transport,
+ GibberBytestreamOOB *self)
+{
+ DEBUG ("buffer is now empty. Bytestream can be closed");
+ bytestream_closed (self);
+}
+
+static void
gibber_bytestream_oob_decline (GibberBytestreamOOB *self,
GError *error)
-{
+ {
GibberBytestreamOOBPrivate *priv = GIBBER_BYTESTREAM_OOB_GET_PRIVATE (self);
GibberXmppStanza *stanza;
@@ -778,16 +840,11 @@ gibber_bytestream_oob_decline (GibberByt
g_object_unref (stanza);
}
-/*
- * gibber_bytestream_oob_close
- *
- * Implements gibber_bytestream_iface_close on GibberBytestreamIface
- */
static void
-gibber_bytestream_oob_close (GibberBytestreamIface *bytestream,
- GError *error)
+gibber_bytestream_oob_do_close (GibberBytestreamOOB *self,
+ GError *error,
+ gboolean can_wait)
{
- GibberBytestreamOOB *self = GIBBER_BYTESTREAM_OOB (bytestream);
GibberBytestreamOOBPrivate *priv = GIBBER_BYTESTREAM_OOB_GET_PRIVATE (self);
if (priv->state == GIBBER_BYTESTREAM_STATE_CLOSED)
@@ -800,36 +857,32 @@ gibber_bytestream_oob_close (GibberBytes
gibber_bytestream_oob_decline (self, error);
}
- if (priv->recipient)
- {
- /* We are the recipient and so have to send the reply
- * to the OOB opening IQ */
- if (priv->xmpp_connection->stream_flags ==
- GIBBER_XMPP_CONNECTION_STREAM_FULLY_OPEN)
- {
- GibberXmppStanza *stanza;
-
- /* As described in the XEP, we send result IQ when we have
- * finished to use the OOB */
- stanza = make_iq_oob_sucess_response (priv->self_id,
- priv->peer_id, priv->stream_open_id);
-
- DEBUG ("send OOB close stanza");
-
- gibber_xmpp_connection_send (priv->xmpp_connection, stanza, NULL);
- g_object_unref (stanza);
- }
- else
- {
- DEBUG ("XMPP connection is closed. Don't send OOB close stanza");
- }
+ g_object_set (self, "state", GIBBER_BYTESTREAM_STATE_CLOSING, NULL);
+ if (can_wait && priv->transport != NULL &&
+ !gibber_transport_buffer_is_empty (priv->transport))
+ {
+ DEBUG ("Wait transport buffer is empty before close the bytestream");
+ g_signal_connect (priv->transport, "buffer-empty",
+ G_CALLBACK (transport_buffer_empty_cb), self);
}
else
{
- /* We are the sender. Don't have to send anything */
+ DEBUG ("Transport buffer is empty, we can close the bytestream");
+ bytestream_closed (self);
}
+}
- g_object_set (self, "state", GIBBER_BYTESTREAM_STATE_CLOSED, NULL);
+/*
+ * gibber_bytestream_oob_close
+ *
+ * Implements gibber_bytestream_iface_close on GibberBytestreamIface
+ */
+static void
+gibber_bytestream_oob_close (GibberBytestreamIface *bytestream,
+ GError *error)
+{
+ gibber_bytestream_oob_do_close (GIBBER_BYTESTREAM_OOB (bytestream), error,
+ TRUE);
}
static GibberXmppStanza *
diff -rN -u -p old-tmpa8xxot/lib/gibber/gibber-fd-transport.c new-tmpa8xxot/lib/gibber/gibber-fd-transport.c
--- old-tmpa8xxot/lib/gibber/gibber-fd-transport.c 2008-02-21 09:47:02.118755260 +0000
+++ new-tmpa8xxot/lib/gibber/gibber-fd-transport.c 2008-02-21 09:47:02.362770510 +0000
@@ -47,6 +47,9 @@ gibber_fd_transport_get_sockaddr (Gibber
static void _do_disconnect(GibberFdTransport *self);
+static gboolean gibber_fd_transport_buffer_is_empty (
+ GibberTransport *transport);
+
G_DEFINE_TYPE(GibberFdTransport, gibber_fd_transport, GIBBER_TYPE_TRANSPORT)
/* private structure */
@@ -104,6 +107,7 @@ gibber_fd_transport_class_init (GibberFd
transport_class->send = gibber_fd_transport_send;
transport_class->disconnect = gibber_fd_transport_disconnect;
transport_class->get_sockaddr = gibber_fd_transport_get_sockaddr;
+ transport_class->buffer_is_empty = gibber_fd_transport_buffer_is_empty;
gibber_fd_transport_class->read = gibber_fd_transport_read;
gibber_fd_transport_class->write = gibber_fd_transport_write;
@@ -202,6 +206,7 @@ _writeout(GibberFdTransport *self, const
}
}
if (written == len) {
+ gibber_transport_emit_buffer_empty (GIBBER_TRANSPORT (self));
return;
}
@@ -260,6 +265,7 @@ _channel_io_out(GIOChannel *source, GIOC
}
if (priv->output_buffer->len == 0) {
priv->watch_out = 0;
+ gibber_transport_emit_buffer_empty (GIBBER_TRANSPORT (self));
return FALSE;
}
@@ -373,3 +379,13 @@ gibber_fd_transport_get_sockaddr (Gibber
return (getpeername (self->fd, (struct sockaddr *)addr, len) == 0);
}
+
+static gboolean
+gibber_fd_transport_buffer_is_empty (GibberTransport *transport)
+{
+ GibberFdTransport *self = GIBBER_FD_TRANSPORT (transport);
+ GibberFdTransportPrivate *priv =
+ GIBBER_FD_TRANSPORT_GET_PRIVATE (self);
+
+ return (priv->output_buffer == NULL || priv->output_buffer->len == 0);
+}
diff -rN -u -p old-tmpa8xxot/lib/gibber/gibber-transport.c new-tmpa8xxot/lib/gibber/gibber-transport.c
--- old-tmpa8xxot/lib/gibber/gibber-transport.c 2008-02-21 09:47:02.118755260 +0000
+++ new-tmpa8xxot/lib/gibber/gibber-transport.c 2008-02-21 09:47:02.358770260 +0000
@@ -38,6 +38,7 @@ enum
DISCONNECTED,
DISCONNECTING,
ERROR,
+ BUFFER_EMPTY,
LAST_SIGNAL
};
@@ -72,6 +73,16 @@ gibber_transport_class_init (GibberTrans
object_class->dispose = gibber_transport_dispose;
object_class->finalize = gibber_transport_finalize;
+
+ signals[BUFFER_EMPTY] =
+ g_signal_new ("buffer-empty",
+ G_OBJECT_CLASS_TYPE (gibber_transport_class),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
signals[CONNECTED] =
g_signal_new ("connected",
G_OBJECT_CLASS_TYPE (gibber_transport_class),
@@ -233,3 +244,18 @@ gibber_transport_get_sockaddr (GibberTra
return FALSE;
}
+
+gboolean
+gibber_transport_buffer_is_empty (GibberTransport *transport)
+{
+ GibberTransportClass *cls = GIBBER_TRANSPORT_GET_CLASS (transport);
+
+ g_assert (cls->buffer_is_empty != NULL);
+ return cls->buffer_is_empty (transport);
+}
+
+void
+gibber_transport_emit_buffer_empty (GibberTransport *transport)
+{
+ g_signal_emit (transport, signals[BUFFER_EMPTY], 0);
+}
diff -rN -u -p old-tmpa8xxot/lib/gibber/gibber-transport.h new-tmpa8xxot/lib/gibber/gibber-transport.h
--- old-tmpa8xxot/lib/gibber/gibber-transport.h 2008-02-21 09:47:02.118755260 +0000
+++ new-tmpa8xxot/lib/gibber/gibber-transport.h 2008-02-21 09:47:02.362770510 +0000
@@ -54,6 +54,7 @@ struct _GibberTransportClass {
void (*disconnect) (GibberTransport *transport);
gboolean (*get_sockaddr) (GibberTransport *transport,
struct sockaddr_storage *addr, socklen_t *len);
+ gboolean (*buffer_is_empty) (GibberTransport *transport);
};
struct _GibberTransport {
@@ -113,6 +114,12 @@ void gibber_transport_set_handler(Gibber
gboolean gibber_transport_get_sockaddr (GibberTransport *transport,
struct sockaddr_storage *addr, socklen_t *len);
+gboolean
+gibber_transport_buffer_is_empty (GibberTransport *transport);
+
+void
+gibber_transport_emit_buffer_empty (GibberTransport *transport);
+
G_END_DECLS
#endif /* #ifndef __GIBBER_TRANSPORT_H__*/
diff -rN -u -p old-tmpa8xxot/src/tube-stream.c new-tmpa8xxot/src/tube-stream.c
--- old-tmpa8xxot/src/tube-stream.c 2008-02-21 09:47:02.118755260 +0000
+++ new-tmpa8xxot/src/tube-stream.c 2008-02-21 09:47:02.158757760 +0000
@@ -212,6 +212,35 @@ add_transport (SalutTubeStream *self,
}
static void
+remove_transport (SalutTubeStream *self,
+ GibberTransport *transport)
+{
+ SalutTubeStreamPrivate *priv = SALUT_TUBE_STREAM_GET_PRIVATE (self);
+ GibberBytestreamIface *bytestream;
+
+ bytestream = g_hash_table_lookup (priv->transport_to_bytestream, transport);
+ g_assert (bytestream != NULL);
+
+ DEBUG ("disconnect and remove transport");
+ g_signal_handlers_disconnect_matched (transport, G_SIGNAL_MATCH_DATA,
+ 0, 0, NULL, NULL, self);
+
+ gibber_transport_disconnect (transport);
+ g_hash_table_remove (priv->transport_to_bytestream, transport);
+
+ g_hash_table_remove (priv->bytestream_to_transport, bytestream);
+ g_hash_table_remove (priv->bytestream_to_fd, bytestream);
+}
+
+static void
+transport_buffer_empty_cb (GibberTransport *transport,
+ SalutTubeStream *self)
+{
+ DEBUG ("buffer is now empty. Transport can be removed");
+ remove_transport (self, transport);
+}
+
+static void
extra_bytestream_state_changed_cb (GibberBytestreamIface *bytestream,
GibberBytestreamState state,
gpointer user_data)
@@ -246,15 +275,18 @@ extra_bytestream_state_changed_cb (Gibbe
bytestream);
if (transport != NULL)
{
- g_signal_handlers_disconnect_matched (transport, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL, self);
-
- gibber_transport_disconnect (transport);
- g_hash_table_remove (priv->transport_to_bytestream, transport);
+ if (gibber_transport_buffer_is_empty (transport))
+ {
+ DEBUG ("Buffer is empty, we can remove the transport");
+ remove_transport (self, transport);
+ }
+ else
+ {
+ DEBUG ("Wait buffer is empty before disconnect the transport");
+ g_signal_connect (transport, "buffer-empty",
+ G_CALLBACK (transport_buffer_empty_cb), self);
+ }
}
-
- g_hash_table_remove (priv->bytestream_to_transport, bytestream);
- g_hash_table_remove (priv->bytestream_to_fd, bytestream);
}
}
Index: telepathy-salut.spec
===================================================================
RCS file: /cvs/pkgs/rpms/telepathy-salut/OLPC-2/telepathy-salut.spec,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- telepathy-salut.spec 30 Jan 2008 21:05:27 -0000 1.33
+++ telepathy-salut.spec 21 Feb 2008 11:24:22 -0000 1.34
@@ -1,6 +1,6 @@
Name: telepathy-salut
Version: 0.2.2
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: Link-local XMPP telepathy connection manager
Group: Applications/Communications
@@ -9,6 +9,7 @@
Source0: http://telepathy.freedesktop.org/releases/%{name}/%{name}-%{version}.tar.gz
Patch0: salut-olpc-no-dbus-uid-check.patch
Patch1: salut-chmod-unix-socket.patch
+Patch2: salut-stream-tube-fix.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: dbus-devel >= 1.1.0
@@ -60,6 +61,9 @@
%{_mandir}/man8/%{name}.8.gz
%changelog
+* Thu Feb 21 2008 Morgan Collett <morgan.collett at collabora.co.uk> - 0.2.2-2.olpc2
+- dev.laptop.org #6483 for stream tube flushing (patch applied)
+
* Wed Jan 30 2008 Morgan Collett <morgan.collett at collabora.co.uk> - 0.2.2-1.olpc2
- dev.laptop.org #6067: crash when you create and leave a muc fast
- dev.laptop.org #6200: assertion failed: (priv->state == STATE_JOINING)
More information about the fedora-extras-commits
mailing list