[telepathy-gabble/master] Bug #22629: stream tubes: block the Bytestream if GibberTransport is not connected

Alban Crequy alban.crequy at collabora.co.uk
Thu Jul 9 10:38:16 PDT 2009


---
 src/tube-stream.c |   27 ++++++++++++++++++++-------
 1 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/src/tube-stream.c b/src/tube-stream.c
index 7dc4a16..7104592 100644
--- a/src/tube-stream.c
+++ b/src/tube-stream.c
@@ -176,7 +176,7 @@ struct _GabbleTubeStreamPrivate
 
   /* (GibberTransport *) -> (GabbleBytestreamIface *)
    *
-   * The (t->b) is inserted when the bytestream is open.
+   * The (t->b) is also inserted as soon as they are created.
    */
   GHashTable *transport_to_bytestream;
 
@@ -318,10 +318,7 @@ remove_transport (GabbleTubeStream *self,
   fire_connection_closed (self, transport, TP_ERROR_STR_CONNECTION_LOST,
       "bytestream has been broken");
 
-  /* the transport may not be in transport_to_bytestream if the bytestream was
-   * not fully open */
   g_hash_table_remove (priv->transport_to_bytestream, transport);
-
   g_hash_table_remove (priv->bytestream_to_transport, bytestream);
   g_hash_table_remove (priv->transport_to_id, transport);
 }
@@ -359,9 +356,6 @@ add_transport (GabbleTubeStream *self,
 
   gibber_transport_set_handler (transport, transport_handler, self);
 
-  g_hash_table_insert (priv->transport_to_bytestream,
-      g_object_ref (transport), g_object_ref (bytestream));
-
   g_signal_connect (transport, "disconnected",
       G_CALLBACK (transport_disconnected_cb), self);
   g_signal_connect (transport, "buffer-empty",
@@ -469,8 +463,13 @@ extra_bytestream_negotiate_cb (GabbleBytestreamIface *bytestream,
   DEBUG ("extra bytestream accepted");
 
   /* transport has been refed in start_stream_initiation () */
+  g_assert (gibber_transport_get_state (transport) ==
+      GIBBER_TRANSPORT_CONNECTED);
   g_hash_table_insert (priv->bytestream_to_transport, g_object_ref (bytestream),
       transport);
+  g_hash_table_insert (priv->transport_to_bytestream,
+      g_object_ref (transport), g_object_ref (bytestream));
+
 
   g_signal_connect (bytestream, "state-changed",
                 G_CALLBACK (extra_bytestream_state_changed_cb), self);
@@ -920,7 +919,16 @@ static void
 transport_connected_cb (GibberTransport *transport,
     transport_connected_data *data)
 {
+  GabbleTubeStreamPrivate *priv = GABBLE_TUBE_STREAM_GET_PRIVATE (data->self);
+  GabbleBytestreamIface *bytestream;
+
   fire_new_remote_connection (data->self, transport, data->contact);
+
+  bytestream = g_hash_table_lookup (priv->transport_to_bytestream, transport);
+  if (bytestream == NULL)
+    return;
+
+  gabble_bytestream_iface_block_reading (bytestream, FALSE);
 }
 
 static GibberTransport *
@@ -976,8 +984,12 @@ new_connection_to_socket (GabbleTubeStream *self,
 
   generate_connection_id (self, transport);
 
+  gabble_bytestream_iface_block_reading (bytestream, TRUE);
   g_hash_table_insert (priv->bytestream_to_transport, g_object_ref (bytestream),
       g_object_ref (transport));
+  g_hash_table_insert (priv->transport_to_bytestream,
+      g_object_ref (transport), g_object_ref (bytestream));
+
 
   g_signal_connect (bytestream, "state-changed",
       G_CALLBACK (extra_bytestream_state_changed_cb), self);
@@ -1994,6 +2006,7 @@ gabble_tube_stream_add_bytestream (GabbleTubeIface *tube,
 
       if (gibber_transport_get_state (transport) == GIBBER_TRANSPORT_CONNECTED)
         {
+          gabble_bytestream_iface_block_reading (bytestream, FALSE);
           fire_new_remote_connection (self, transport, contact);
         }
       else
-- 
1.5.6.5




More information about the telepathy-commits mailing list