[Telepathy-commits] [telepathy-salut/master] GibberBytestreamDirect connects to the right host instead of localhost

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


20080805104431-a41c0-705405af062328714141da27198fc4c7c8b9afa4.gz
---
 lib/gibber/gibber-bytestream-direct.c |   76 +++++++++++++++++++++------------
 src/salut-direct-bytestream-manager.c |    3 +-
 src/salut-direct-bytestream-manager.h |    2 +-
 src/salut-tubes-channel.c             |    1 -
 src/tube-stream.c                     |   23 +++++++---
 5 files changed, 68 insertions(+), 37 deletions(-)

diff --git a/lib/gibber/gibber-bytestream-direct.c b/lib/gibber/gibber-bytestream-direct.c
index 52b7522..f014df4 100644
--- a/lib/gibber/gibber-bytestream-direct.c
+++ b/lib/gibber/gibber-bytestream-direct.c
@@ -60,14 +60,14 @@ static guint signals[LAST_SIGNAL] = {0};
 /* properties */
 enum
 {
-  PROP_SELF_ID = 1,
+  PROP_XMPP_CONNECTION = 1,
+  PROP_SELF_ID,
   PROP_PEER_ID,
   PROP_STREAM_ID,
   PROP_STREAM_INIT_ID,
   PROP_STATE,
 
   /* relevent only on recipient side to connect to the initiator */
-  PROP_HOST,
   PROP_PORT,
 
   PROP_PROTOCOL,
@@ -84,7 +84,6 @@ struct _GibberBytestreamDirectPrivate
   gchar *stream_init_id;
   GibberBytestreamState state;
 
-  gchar *host;
   guint portnum;
 
   /* Are we the recipient of this bytestream?
@@ -155,6 +154,9 @@ gibber_bytestream_direct_get_property (GObject *object,
 
   switch (property_id)
     {
+      case PROP_XMPP_CONNECTION:
+        g_value_set_object (value, priv->xmpp_connection);
+        break;
       case PROP_SELF_ID:
         g_value_set_string (value, priv->self_id);
         break;
@@ -170,9 +172,6 @@ gibber_bytestream_direct_get_property (GObject *object,
       case PROP_STATE:
         g_value_set_uint (value, priv->state);
         break;
-      case PROP_HOST:
-        g_value_set_string (value, priv->host);
-        break;
       case PROP_PORT:
         g_value_set_uint (value, priv->portnum);
         break;
@@ -196,6 +195,13 @@ gibber_bytestream_direct_set_property (GObject *object,
 
   switch (property_id)
     {
+      case PROP_XMPP_CONNECTION:
+        if (g_value_get_object (value) != NULL)
+          {
+            priv->xmpp_connection = g_value_get_object (value);
+            g_object_ref (priv->xmpp_connection);
+          }
+        break;
       case PROP_SELF_ID:
         g_free (priv->self_id);
         priv->self_id = g_value_dup_string (value);
@@ -213,18 +219,12 @@ gibber_bytestream_direct_set_property (GObject *object,
         priv->stream_init_id = g_value_dup_string (value);
         break;
       case PROP_STATE:
-        DEBUG ("Set PROP_STATE");
         if (priv->state != g_value_get_uint (value))
             {
               priv->state = g_value_get_uint (value);
-              DEBUG ("Emit STATE_CHANGED");
               g_signal_emit (object, signals[STATE_CHANGED], 0, priv->state);
             }
         break;
-      case PROP_HOST:
-        g_free (priv->host);
-        priv->host = g_value_dup_string (value);
-        break;
       case PROP_PORT:
         priv->portnum = g_value_get_uint (value);
         break;
@@ -282,30 +282,31 @@ gibber_bytestream_direct_class_init (
   g_object_class_override_property (object_class, PROP_PROTOCOL,
       "protocol");
 
-  param_spec = g_param_spec_string (
-      "stream-init-id",
-      "stream init ID",
-      "the iq ID of the SI request, if any",
-      "",
+  param_spec = g_param_spec_object (
+      "xmpp-connection",
+      "GibberXmppConnection object",
+      "Gibber XMPP connection object used to find the IP address to connect "
+      "in this bytestream if it's a private one",
+      GIBBER_TYPE_XMPP_CONNECTION,
       G_PARAM_CONSTRUCT_ONLY |
       G_PARAM_READWRITE |
       G_PARAM_STATIC_NAME |
       G_PARAM_STATIC_NICK |
       G_PARAM_STATIC_BLURB);
-  g_object_class_install_property (object_class, PROP_STREAM_INIT_ID,
+  g_object_class_install_property (object_class, PROP_XMPP_CONNECTION,
       param_spec);
 
   param_spec = g_param_spec_string (
-      "host",
-      "host",
-      "IP address for the recipient to connect on the initiator",
+      "stream-init-id",
+      "stream init ID",
+      "the iq ID of the SI request, if any",
       "",
       G_PARAM_CONSTRUCT_ONLY |
       G_PARAM_READWRITE |
       G_PARAM_STATIC_NAME |
       G_PARAM_STATIC_NICK |
       G_PARAM_STATIC_BLURB);
-  g_object_class_install_property (object_class, PROP_HOST,
+  g_object_class_install_property (object_class, PROP_STREAM_INIT_ID,
       param_spec);
 
   param_spec = g_param_spec_uint (
@@ -655,20 +656,41 @@ gibber_bytestream_direct_initiate (GibberBytestreamIface *bytestream)
 {
   GibberBytestreamDirect *self = GIBBER_BYTESTREAM_DIRECT (bytestream);
   GibberLLTransport *ll_transport;
-  struct sockaddr_in server;
+  /* never cast addr but type-punning to avoid strict-aliasing issues
+   * (see -fstrict-aliasing in man gcc) */
+  union {
+    struct sockaddr_storage storage;
+    struct sockaddr_in6 in6;
+  } addr;
+  socklen_t len;
   GibberBytestreamDirectPrivate *priv =
       GIBBER_BYTESTREAM_DIRECT_GET_PRIVATE (self);
 
   DEBUG ("Called.");
 
-  server.sin_addr.s_addr = inet_addr ("127.0.0.1");
-  server.sin_family = AF_INET;
-  server.sin_port = g_htons ((guint16) priv->portnum);
+  /* FIXME, this is very specific to salut and won't work with a normal xmpp
+   * client */
+  g_assert (priv->xmpp_connection != NULL);
+  g_assert (priv->xmpp_connection->transport != NULL);
+  if (!gibber_transport_get_sockaddr (
+      GIBBER_TRANSPORT (priv->xmpp_connection->transport),
+      &addr.storage, &len))
+    {
+      /* I'm too lazy to create more specific errors for this  as it should
+       * never happen while using salut anyway.. */
+      GError e = { GIBBER_XMPP_ERROR, XMPP_ERROR_ITEM_NOT_FOUND,
+          "Unsable get socket address for the control connection" };
+      DEBUG ("Could not get socket address for the control connection" );
+      gibber_bytestream_iface_close (GIBBER_BYTESTREAM_IFACE (self), &e);
+      return FALSE;
+    }
+
+  addr.in6.sin6_port = g_htons ((guint16) priv->portnum);
 
   ll_transport = gibber_ll_transport_new ();
   set_transport (self, GIBBER_TRANSPORT (ll_transport));
   gibber_ll_transport_open_sockaddr (ll_transport,
-      (struct sockaddr_storage *) &server, NULL);
+      &addr.storage, NULL);
 
   return TRUE;
 }
diff --git a/src/salut-direct-bytestream-manager.c b/src/salut-direct-bytestream-manager.c
index 4aeaeb7..f29851c 100644
--- a/src/salut-direct-bytestream-manager.c
+++ b/src/salut-direct-bytestream-manager.c
@@ -471,6 +471,7 @@ void salut_direct_bytestream_manager_stop_listen (
 
 GibberBytestreamIface *
 salut_direct_bytestream_manager_new_stream (SalutDirectBytestreamManager *self,
+                                            GibberXmppConnection *connection,
                                             SalutContact *contact,
                                             int portnum)
 {
@@ -480,10 +481,10 @@ salut_direct_bytestream_manager_new_stream (SalutDirectBytestreamManager *self,
   priv = SALUT_DIRECT_BYTESTREAM_MANAGER_GET_PRIVATE (self);
 
   bytestream = g_object_new (GIBBER_TYPE_BYTESTREAM_DIRECT,
+      "xmpp-connection", connection,
       "state", GIBBER_BYTESTREAM_STATE_LOCAL_PENDING,
       "self-id", priv->connection->name,
       "peer-id", contact->name,
-      "host", "127.0.0.1", /* FIXME! */
       "port", portnum,
       NULL);
 
diff --git a/src/salut-direct-bytestream-manager.h b/src/salut-direct-bytestream-manager.h
index 87f0e84..0309520 100644
--- a/src/salut-direct-bytestream-manager.h
+++ b/src/salut-direct-bytestream-manager.h
@@ -81,6 +81,6 @@ void salut_direct_bytestream_manager_stop_listen (
 /* To be used on the CM-receptor side, to make a new connection */
 GibberBytestreamIface *
 salut_direct_bytestream_manager_new_stream (SalutDirectBytestreamManager *self,
-    SalutContact *contact, int portnum);
+    GibberXmppConnection *connection, SalutContact *contact, int portnum);
 
 #endif /* #ifndef __SALUT_DIRECT_BYTESTREAM_MANAGER_H__*/
diff --git a/src/salut-tubes-channel.c b/src/salut-tubes-channel.c
index 203f053..0b97833 100644
--- a/src/salut-tubes-channel.c
+++ b/src/salut-tubes-channel.c
@@ -1854,7 +1854,6 @@ _send_channel_iq_tube (gpointer key,
             GIBBER_NODE_ATTRIBUTE, "service", service,
             GIBBER_NODE_ATTRIBUTE, "id", tube_id_str,
             GIBBER_NODE, "transport",
-              GIBBER_NODE_ATTRIBUTE, "ip", "127.0.0.1", /* FIXME */
               GIBBER_NODE_ATTRIBUTE, "port", port_str,
             GIBBER_NODE_END,
           GIBBER_NODE_END,
diff --git a/src/tube-stream.c b/src/tube-stream.c
index 365cdf7..111bb7d 100644
--- a/src/tube-stream.c
+++ b/src/tube-stream.c
@@ -544,7 +544,7 @@ start_stream_direct (SalutTubeStream *self,
   SalutTubeStreamPrivate *priv = SALUT_TUBE_STREAM_GET_PRIVATE (self);
   TpHandleRepoIface *contact_repo;
   const gchar *jid;
-  gboolean result;
+  gboolean ret;
   struct _extra_bytestream_negotiate_cb_data *data;
   SalutContact *contact;
   SalutContactManager *contact_mgr;
@@ -573,28 +573,37 @@ start_stream_direct (SalutTubeStream *self,
   contact = salut_contact_manager_get_contact (contact_mgr, priv->initiator);
   if (contact == NULL)
     {
-      result = FALSE;
+      ret = FALSE;
       g_set_error (error, TP_ERRORS, TP_ERROR_NETWORK_ERROR,
           "can't find contact with handle %d", priv->initiator);
     }
   else
     {
       GibberBytestreamIface *bytestream;
+      GibberXmppConnection *xmpp_connection = NULL;
+      SalutXmppConnectionManagerRequestConnectionResult result;
+
+      DEBUG ("Called, will request a connection");
+      result = salut_xmpp_connection_manager_request_connection (
+          priv->xmpp_connection_manager, contact, &xmpp_connection, NULL);
+      g_assert (result ==
+          SALUT_XMPP_CONNECTION_MANAGER_REQUEST_CONNECTION_RESULT_DONE);
+
       bytestream = salut_direct_bytestream_manager_new_stream (
-          direct_bytestream_mgr,
+          direct_bytestream_mgr, xmpp_connection,
           contact, priv->port);
 
       if (bytestream == NULL)
         {
           DEBUG ("initiator refused new bytestream");
-          result = FALSE;
+          ret = FALSE;
 
           close (fd);
         }
       else
         {
           DEBUG ("extra bytestream accepted");
-          result = TRUE;
+          ret = TRUE;
 
           g_hash_table_insert (priv->bytestream_to_fd,
               g_object_ref (bytestream), GUINT_TO_POINTER (fd));
@@ -607,7 +616,7 @@ start_stream_direct (SalutTubeStream *self,
             {
               /* Initiation failed. */
               gibber_bytestream_iface_close (bytestream, NULL);
-              result = FALSE;
+              ret = FALSE;
               close (fd);
             }
 
@@ -619,7 +628,7 @@ start_stream_direct (SalutTubeStream *self,
   g_object_unref (direct_bytestream_mgr);
   g_object_unref (contact_mgr);
 
-  return result;
+  return ret;
 }
 
 /* callback for listening connections from the local application */
-- 
1.5.6.5




More information about the Telepathy-commits mailing list