[telepathy-gabble/master] add IPv6 sockets support

Guillaume Desmottes guillaume.desmottes at collabora.co.uk
Fri Apr 3 09:26:28 PDT 2009


---
 src/ft-channel.c                                   |   32 ++++++++++++++++++++
 .../twisted/file-transfer/file_transfer_helper.py  |   11 +++++--
 2 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/src/ft-channel.c b/src/ft-channel.c
index 0dec244..b747f8a 100644
--- a/src/ft-channel.c
+++ b/src/ft-channel.c
@@ -468,6 +468,14 @@ gabble_file_transfer_channel_constructor (GType type,
   g_hash_table_insert (self->priv->available_socket_types,
       GUINT_TO_POINTER (TP_SOCKET_ADDRESS_TYPE_IPV4), socket_access);
 
+  /* Socket_Address_Type_IPv6 */
+  socket_access = g_array_sized_new (FALSE, FALSE,
+      sizeof (TpSocketAccessControl), 1);
+  access_control = TP_SOCKET_ACCESS_CONTROL_LOCALHOST;
+  g_array_append_val (socket_access, access_control);
+  g_hash_table_insert (self->priv->available_socket_types,
+      GUINT_TO_POINTER (TP_SOCKET_ADDRESS_TYPE_IPV6), socket_access);
+
   gabble_signal_connect_weak (self->priv->connection->presence_cache,
       "presences-updated", G_CALLBACK (connection_presences_updated_cb), obj);
 
@@ -1687,6 +1695,30 @@ setup_local_socket (GabbleFileTransferChannel *self,
           1, gibber_listener_get_port (self->priv->listener),
           G_MAXUINT);
     }
+  else if (address_type == TP_SOCKET_ADDRESS_TYPE_IPV6)
+    {
+      int ret;
+
+      ret = gibber_listener_listen_tcp_loopback_af (self->priv->listener, 0,
+          GIBBER_AF_IPV6, &error);
+      if (!ret)
+        {
+          DEBUG ("Error listening on socket: %s", error->message);
+          g_error_free (error);
+          return FALSE;
+        }
+
+      self->priv->socket_address = tp_g_value_slice_new (
+          TP_STRUCT_TYPE_SOCKET_ADDRESS_IPV6);
+      g_value_take_boxed (self->priv->socket_address,
+          dbus_g_type_specialized_construct (
+            TP_STRUCT_TYPE_SOCKET_ADDRESS_IPV6));
+
+      dbus_g_type_struct_set (self->priv->socket_address,
+          0, "::1",
+          1, gibber_listener_get_port (self->priv->listener),
+          G_MAXUINT);
+    }
   else
     {
       g_assert_not_reached ();
diff --git a/tests/twisted/file-transfer/file_transfer_helper.py b/tests/twisted/file-transfer/file_transfer_helper.py
index ba73584..d66f3aa 100644
--- a/tests/twisted/file-transfer/file_transfer_helper.py
+++ b/tests/twisted/file-transfer/file_transfer_helper.py
@@ -133,6 +133,8 @@ class FileTransferTest(object):
             return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
         elif self.address_type == cs.SOCKET_ADDRESS_TYPE_IPV4:
             return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        elif self.address_type == cs.SOCKET_ADDRESS_TYPE_IPV6:
+            return socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
         else:
             assert False
 
@@ -191,7 +193,8 @@ class ReceiveFileTest(FileTransferTest):
         assert props[cs.FT_DATE] == self.file.date
         assert props[cs.FT_AVAILABLE_SOCKET_TYPES] == \
             {cs.SOCKET_ADDRESS_TYPE_UNIX: [cs.SOCKET_ACCESS_CONTROL_LOCALHOST],
-            cs.SOCKET_ADDRESS_TYPE_IPV4: [cs.SOCKET_ACCESS_CONTROL_LOCALHOST]}, \
+            cs.SOCKET_ADDRESS_TYPE_IPV4: [cs.SOCKET_ACCESS_CONTROL_LOCALHOST],
+            cs.SOCKET_ADDRESS_TYPE_IPV6: [cs.SOCKET_ACCESS_CONTROL_LOCALHOST]}, \
             props[cs.FT_AVAILABLE_SOCKET_TYPES]
         assert props[cs.FT_TRANSFERRED_BYTES] == 0
         assert props[cs.FT_INITIAL_OFFSET] == 0
@@ -331,7 +334,8 @@ class SendFileTest(FileTransferTest):
         assert props[cs.FT_DATE] == self.file.date
         assert props[cs.FT_AVAILABLE_SOCKET_TYPES] == \
             {cs.SOCKET_ADDRESS_TYPE_UNIX: [cs.SOCKET_ACCESS_CONTROL_LOCALHOST],
-            cs.SOCKET_ADDRESS_TYPE_IPV4: [cs.SOCKET_ACCESS_CONTROL_LOCALHOST]}, \
+            cs.SOCKET_ADDRESS_TYPE_IPV4: [cs.SOCKET_ACCESS_CONTROL_LOCALHOST],
+            cs.SOCKET_ADDRESS_TYPE_IPV6: [cs.SOCKET_ACCESS_CONTROL_LOCALHOST]}, \
             props[cs.FT_AVAILABLE_SOCKET_TYPES]
         assert props[cs.FT_TRANSFERRED_BYTES] == 0
         assert props[cs.FT_INITIAL_OFFSET] == 0
@@ -413,6 +417,7 @@ def exec_file_transfer_test(test_cls):
             BytestreamSIFallbackS5WrongHash]:
         for addr_type, access_control, access_control_param in [
                 (cs.SOCKET_ADDRESS_TYPE_UNIX, cs.SOCKET_ACCESS_CONTROL_LOCALHOST, ""),
-                (cs.SOCKET_ADDRESS_TYPE_IPV4, cs.SOCKET_ACCESS_CONTROL_LOCALHOST, "")]:
+                (cs.SOCKET_ADDRESS_TYPE_IPV4, cs.SOCKET_ACCESS_CONTROL_LOCALHOST, ""),
+                (cs.SOCKET_ADDRESS_TYPE_IPV6, cs.SOCKET_ACCESS_CONTROL_LOCALHOST, "")]:
             test = test_cls(bytestream_cls, addr_type, access_control, access_control_param)
             exec_test(test.test)
-- 
1.5.6.5




More information about the telepathy-commits mailing list