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