[Telepathy-commits] [telepathy-salut/master] SalutTubeStream: use GibberListener instead of SalutDirectBytestreamManager on the initiator side to receive connections from the remote CM

Alban Crequy alban.crequy at collabora.co.uk
Tue Nov 25 03:59:40 PST 2008


- GibberBytestreamDirect: accept a transport instead of a fd.
---
 lib/gibber/gibber-bytestream-direct.c |   47 +++++++++-----------------------
 lib/gibber/gibber-bytestream-direct.h |    3 +-
 src/salut-direct-bytestream-manager.c |    2 +-
 src/salut-tubes-channel.c             |    9 ------
 src/tube-stream.c                     |   37 +++++++++++++++++++++----
 5 files changed, 47 insertions(+), 51 deletions(-)

diff --git a/lib/gibber/gibber-bytestream-direct.c b/lib/gibber/gibber-bytestream-direct.c
index e3e1e17..3bff0e1 100644
--- a/lib/gibber/gibber-bytestream-direct.c
+++ b/lib/gibber/gibber-bytestream-direct.c
@@ -129,6 +129,12 @@ gibber_bytestream_direct_dispose (GObject *object)
       gibber_bytestream_iface_close (GIBBER_BYTESTREAM_IFACE (self), NULL);
     }
 
+  if (priv->transport != NULL)
+    {
+      g_object_unref (priv->transport);
+      priv->transport = NULL;
+    }
+
   G_OBJECT_CLASS (gibber_bytestream_direct_parent_class)->dispose (object);
 }
 
@@ -462,7 +468,7 @@ set_transport (GibberBytestreamDirect *self,
 
   g_assert (priv->transport == NULL);
 
-  priv->transport = transport;
+  priv->transport = g_object_ref (transport);
   gibber_transport_set_handler (transport, transport_handler, self);
 
   g_signal_connect (transport, "connected",
@@ -475,19 +481,11 @@ set_transport (GibberBytestreamDirect *self,
 
 gboolean
 gibber_bytestream_direct_accept_socket (GibberBytestreamIface *bytestream,
-                                        int listen_fd)
+                                        GibberTransport *transport)
 {
   GibberBytestreamDirect *self = GIBBER_BYTESTREAM_DIRECT (bytestream);
-  GibberBytestreamDirectPrivate *priv;
-  GibberLLTransport *ll_transport;
-  struct sockaddr_storage addr;
-  int fd, ret;
-  char host[NI_MAXHOST];
-  char port[NI_MAXSERV];
-  socklen_t addrlen = sizeof (struct sockaddr_storage);
-
-
-  priv = GIBBER_BYTESTREAM_DIRECT_GET_PRIVATE (self);
+  GibberBytestreamDirectPrivate *priv = 
+    GIBBER_BYTESTREAM_DIRECT_GET_PRIVATE (self);
 
   if (priv->state != GIBBER_BYTESTREAM_STATE_LOCAL_PENDING)
     {
@@ -496,28 +494,9 @@ gibber_bytestream_direct_accept_socket (GibberBytestreamIface *bytestream,
       return FALSE;
     }
 
-  fd = accept (listen_fd, (struct sockaddr *) &addr, &addrlen);
-  gibber_normalize_address (&addr);
-
-  ret = getnameinfo ((struct sockaddr *) &addr, addrlen,
-      host, NI_MAXHOST, port, NI_MAXSERV,
-      NI_NUMERICHOST | NI_NUMERICSERV);
-
-  if (priv->check_addr_func != NULL && !priv->check_addr_func (self,
-        (struct sockaddr *) &addr, addrlen, priv->check_addr_func_data))
-    {
-      DEBUG ("connection from %s refused by the bytestream user", host);
-      return FALSE;
-    }
-
-  if (ret == 0)
-    DEBUG("New connection from %s port %s", host, port);
-  else
-    DEBUG("New connection..");
-
-  ll_transport = gibber_ll_transport_new ();
-  set_transport (self, GIBBER_TRANSPORT (ll_transport));
-  gibber_ll_transport_open_fd (ll_transport, fd);
+  set_transport (self, transport);
+  gibber_transport_set_state (transport, GIBBER_TRANSPORT_CONNECTING);
+  gibber_transport_set_state (transport, GIBBER_TRANSPORT_CONNECTED);
 
   return TRUE;
 }
diff --git a/lib/gibber/gibber-bytestream-direct.h b/lib/gibber/gibber-bytestream-direct.h
index f3abcfb..a5d1cc2 100644
--- a/lib/gibber/gibber-bytestream-direct.h
+++ b/lib/gibber/gibber-bytestream-direct.h
@@ -23,6 +23,7 @@
 #include <glib-object.h>
 #include <netdb.h>
 #include "gibber-bytestream-iface.h"
+#include "gibber-transport.h"
 
 G_BEGIN_DECLS
 
@@ -67,7 +68,7 @@ void gibber_bytestream_direct_set_check_addr_func (
     GibberBytestreamDirectCheckAddrFunc func, gpointer user_data);
 
 gboolean gibber_bytestream_direct_accept_socket (
-    GibberBytestreamIface *bytestream, int listen_fd);
+    GibberBytestreamIface *bytestream, GibberTransport *transport);
 
 G_END_DECLS
 
diff --git a/src/salut-direct-bytestream-manager.c b/src/salut-direct-bytestream-manager.c
index 25349a2..632c159 100644
--- a/src/salut-direct-bytestream-manager.c
+++ b/src/salut-direct-bytestream-manager.c
@@ -335,7 +335,7 @@ listener_io_in_cb (GIOChannel *source,
    * register a callback for the "new-connection" bytestream's signal. */
   data->cb (bytestream, data->user_data);
 
-  gibber_bytestream_direct_accept_socket (bytestream, listen_fd);
+  //gibber_bytestream_direct_accept_socket (bytestream, listen_fd);
 
   return TRUE;
 }
diff --git a/src/salut-tubes-channel.c b/src/salut-tubes-channel.c
index 6635cde..0bf7cb7 100644
--- a/src/salut-tubes-channel.c
+++ b/src/salut-tubes-channel.c
@@ -48,7 +48,6 @@
 #include "salut-contact.h"
 #include "salut-muc-channel.h"
 #include "salut-xmpp-connection-manager.h"
-#include "salut-direct-bytestream-manager.h"
 #include "tube-iface.h"
 #include "tube-dbus.h"
 #include "tube-stream.h"
@@ -1832,14 +1831,6 @@ iq_reply_cb (GibberIqHelper *helper,
 }
 
 static void
-new_connection_cb (GibberBytestreamIface *bytestream, gpointer user_data)
-{
-  SalutTubeIface *tube = user_data;
-
-  salut_tube_iface_add_bytestream (tube, bytestream);
-}
-
-static void
 send_channel_iq_tube (gpointer key,
                        gpointer value,
                        gpointer user_data)
diff --git a/src/tube-stream.c b/src/tube-stream.c
index ddccb06..5989d58 100644
--- a/src/tube-stream.c
+++ b/src/tube-stream.c
@@ -50,7 +50,6 @@
 #include "salut-connection.h"
 #include "tube-iface.h"
 #include "salut-si-bytestream-manager.h"
-#include "salut-direct-bytestream-manager.h"
 #include "salut-contact-manager.h"
 #include "salut-xmpp-connection-manager.h"
 
@@ -179,6 +178,9 @@ static void xmpp_connection_manager_connection_closed_cb (
 
 static void ensure_iq_helper (SalutTubeStream *tube);
 
+static void salut_tube_stream_add_bytestream (SalutTubeIface *tube,
+    GibberBytestreamIface *bytestream);
+
 static void
 generate_ascii_string (guint len,
                        gchar *buf)
@@ -1585,14 +1587,37 @@ contact_new_connection_cb (GibberListener *listener,
   SalutTubeStream *self = SALUT_TUBE_STREAM (user_data);
   SalutTubeStreamPrivate *priv = SALUT_TUBE_STREAM_GET_PRIVATE (self);
   GibberBytestreamIface *bytestream;
-  TpHandleRepoIface *contact_repo;
+  SalutContactManager *contact_mgr;
+  SalutContact *contact;
 
   g_assert (priv->handle_type == TP_HANDLE_TYPE_CONTACT);
 
-  contact_repo = tp_base_connection_get_handles (
-     (TpBaseConnection*) priv->conn, TP_HANDLE_TYPE_CONTACT);
+  g_object_get (priv->conn,
+      "contact-manager", &contact_mgr,
+      NULL);
+  g_assert (contact_mgr != NULL);
 
-  jid = tp_handle_inspect (contact_repo, priv->handle);
+  contact = salut_contact_manager_get_contact (contact_mgr, priv->handle);
+  if (contact == NULL)
+    {
+      DEBUG ("can't find contact with handle %d", priv->handle);
+      g_object_unref (contact_mgr);
+      return;
+    }
+
+  bytestream = g_object_new (GIBBER_TYPE_BYTESTREAM_DIRECT,
+      "state", GIBBER_BYTESTREAM_STATE_LOCAL_PENDING,
+      "self-id", priv->conn->name,
+      "peer-id", contact->name,
+      NULL);
+
+  g_assert (bytestream != NULL);
+
+  salut_tube_stream_add_bytestream (SALUT_TUBE_IFACE (self), bytestream);
+  gibber_bytestream_direct_accept_socket (bytestream, transport);
+
+  g_object_unref (contact);
+  g_object_unref (contact_mgr);
 }
 
 /**
@@ -1610,7 +1635,7 @@ salut_tube_stream_listen (SalutTubeIface *tube)
   g_assert (priv->contact_listener == NULL);
   priv->contact_listener = gibber_listener_new ();
 
-  g_signal_connect (priv->local_listener, "new-connection",
+  g_signal_connect (priv->contact_listener, "new-connection",
       G_CALLBACK (contact_new_connection_cb), self);
 
   ret = gibber_listener_listen_tcp (priv->contact_listener, 0, NULL);
-- 
1.5.6.5




More information about the Telepathy-commits mailing list