[Telepathy-commits] [telepathy-salut/master] WiP
Alban Crequy
alban.crequy at collabora.co.uk
Tue Nov 25 03:59:40 PST 2008
---
src/salut-tubes-channel.c | 13 +-----
src/tube-iface.c | 9 ++++
src/tube-iface.h | 3 +
src/tube-stream.c | 102 ++++++++++++++++++++++++++++++++++-----------
4 files changed, 91 insertions(+), 36 deletions(-)
diff --git a/src/salut-tubes-channel.c b/src/salut-tubes-channel.c
index d940b39..6635cde 100644
--- a/src/salut-tubes-channel.c
+++ b/src/salut-tubes-channel.c
@@ -1880,17 +1880,8 @@ send_channel_iq_tube (gpointer key,
/* listen for future connections from the remote CM before sending the
* iq */
- SalutDirectBytestreamManager *direct_bytestream_mgr;
- g_assert (priv->conn != NULL);
- g_object_get (priv->conn,
- "direct-bytestream-manager", &direct_bytestream_mgr,
- NULL);
- g_assert (direct_bytestream_mgr != NULL);
-
- port = salut_direct_bytestream_manager_listen (direct_bytestream_mgr,
- priv->contact, new_connection_cb, tube);
- g_object_unref (direct_bytestream_mgr);
-
+ port = salut_tube_iface_listen (tube);
+ g_assert (port > 0);
contact_repo = tp_base_connection_get_handles (
(TpBaseConnection*) priv->conn, TP_HANDLE_TYPE_CONTACT);
diff --git a/src/tube-iface.c b/src/tube-iface.c
index ad5c98a..0d293a2 100644
--- a/src/tube-iface.c
+++ b/src/tube-iface.c
@@ -42,6 +42,15 @@ salut_tube_iface_offer_needed (SalutTubeIface *self)
return virtual_method (self);
}
+int
+salut_tube_iface_listen (SalutTubeIface *self)
+{
+ gboolean (*virtual_method)(SalutTubeIface *) =
+ SALUT_TUBE_IFACE_GET_CLASS (self)->listen;
+ g_assert (virtual_method != NULL);
+ return virtual_method (self);
+}
+
void
salut_tube_iface_close (SalutTubeIface *self, gboolean closed_remotely)
{
diff --git a/src/tube-iface.h b/src/tube-iface.h
index 450a2f0..19f291f 100644
--- a/src/tube-iface.h
+++ b/src/tube-iface.h
@@ -34,6 +34,7 @@ struct _SalutTubeIfaceClass {
gboolean (*accept) (SalutTubeIface *tube, GError **error);
gboolean (*offer_needed) (SalutTubeIface *tube);
+ int (*listen) (SalutTubeIface *tube);
void (*close) (SalutTubeIface *tube, gboolean local);
void (*add_bytestream) (SalutTubeIface *tube,
GibberBytestreamIface *bytestream);
@@ -55,6 +56,8 @@ GType salut_tube_iface_get_type (void);
/* return TRUE if the <iq> to offer the tube has never been sent */
gboolean salut_tube_iface_offer_needed (SalutTubeIface *tube);
+int salut_tube_iface_listen (SalutTubeIface *tube);
+
gboolean salut_tube_iface_accept (SalutTubeIface *tube, GError **error);
void salut_tube_iface_close (SalutTubeIface *tube, gboolean closed_remotely);
diff --git a/src/tube-stream.c b/src/tube-stream.c
index 7d06c1f..0bafa42 100644
--- a/src/tube-stream.c
+++ b/src/tube-stream.c
@@ -144,10 +144,14 @@ struct _SalutTubeStreamPrivate
TpSocketAccessControl access_control;
GValue *access_control_param;
- GibberListener *listener;
+ /* listen for connections from local applications */
+ GibberListener *local_listener;
GIOChannel *listen_io_channel;
guint listen_io_channel_source_id;
+ /* listen for connections from the remote CM */
+ GibberListener *contact_listener;
+
gboolean closed;
/* we need to send an iq stanza to close the tube on 1-1 tube */
@@ -583,11 +587,11 @@ start_stream_direct (SalutTubeStream *self,
/* callback for listening connections from the local application */
static void
-new_connection_cb (GibberListener *listener,
- GibberTransport *transport,
- struct sockaddr_storage *addr,
- guint size,
- gpointer user_data)
+local_new_connection_cb (GibberListener *listener,
+ GibberTransport *transport,
+ struct sockaddr_storage *addr,
+ guint size,
+ gpointer user_data)
{
SalutTubeStream *self = SALUT_TUBE_STREAM (user_data);
SalutTubeStreamPrivate *priv = SALUT_TUBE_STREAM_GET_PRIVATE (self);
@@ -748,11 +752,11 @@ tube_stream_open (SalutTubeStream *self,
/* We didn't create this tube so it doesn't have
* a socket associated with it. Let's create one */
g_assert (priv->address == NULL);
- g_assert (priv->listener == NULL);
- priv->listener = gibber_listener_new ();
+ g_assert (priv->local_listener == NULL);
+ priv->local_listener = gibber_listener_new ();
- g_signal_connect (priv->listener, "new-connection",
- G_CALLBACK (new_connection_cb), self);
+ g_signal_connect (priv->local_listener, "new-connection",
+ G_CALLBACK (local_new_connection_cb), self);
if (priv->address_type == TP_SOCKET_ADDRESS_TYPE_UNIX)
{
@@ -775,7 +779,7 @@ tube_stream_open (SalutTubeStream *self,
g_array_free (array, TRUE);
g_free (path);
- ret = gibber_listener_listen_socket (priv->listener, path, FALSE,
+ ret = gibber_listener_listen_socket (priv->local_listener, path, FALSE,
error);
if (ret != TRUE)
{
@@ -788,7 +792,7 @@ tube_stream_open (SalutTubeStream *self,
{
int port;
- port = gibber_listener_listen_tcp_loopback_af (priv->listener, 0,
+ port = gibber_listener_listen_tcp_loopback_af (priv->local_listener, 0,
GIBBER_AF_IPV4, error);
if (port <= 0)
{
@@ -810,7 +814,7 @@ tube_stream_open (SalutTubeStream *self,
{
int port;
- port = gibber_listener_listen_tcp_loopback_af (priv->listener, 0,
+ port = gibber_listener_listen_tcp_loopback_af (priv->local_listener, 0,
GIBBER_AF_IPV6, error);
if (port <= 0)
{
@@ -950,10 +954,16 @@ salut_tube_stream_dispose (GObject *object)
priv->listen_io_channel = NULL;
}
- if (priv->listener != NULL)
+ if (priv->local_listener != NULL)
{
- g_object_unref (priv->listener);
- priv->listener = NULL;
+ g_object_unref (priv->local_listener);
+ priv->local_listener = NULL;
+ }
+
+ if (priv->contact_listener != NULL)
+ {
+ g_object_unref (priv->contact_listener);
+ priv->contact_listener = NULL;
}
if (priv->iq_helper != NULL)
@@ -1576,6 +1586,51 @@ salut_tube_stream_offer_needed (SalutTubeIface *tube)
return priv->offer_needed;
}
+/* callback for listening connections from the contact's CM */
+static void
+contact_new_connection_cb (GibberListener *listener,
+ GibberTransport *transport,
+ struct sockaddr_storage *addr,
+ guint size,
+ gpointer user_data)
+{
+ SalutTubeStream *self = SALUT_TUBE_STREAM (user_data);
+ SalutTubeStreamPrivate *priv = SALUT_TUBE_STREAM_GET_PRIVATE (self);
+ GibberBytestreamIface *bytestream;
+ TpHandleRepoIface *contact_repo;
+
+ g_assert (priv->handle_type == TP_HANDLE_TYPE_CONTACT);
+
+ contact_repo = tp_base_connection_get_handles (
+ (TpBaseConnection*) priv->conn, TP_HANDLE_TYPE_CONTACT);
+
+ jid = tp_handle_inspect (contact_repo, priv->handle);
+}
+
+/**
+ * salut_tube_stream_listem
+ *
+ * Implements salut_tube_iface_listen on SalutTubeIface
+ */
+static int
+salut_tube_stream_listen (SalutTubeIface *tube)
+{
+ SalutTubeStream *self = SALUT_TUBE_STREAM (tube);
+ SalutTubeStreamPrivate *priv = SALUT_TUBE_STREAM_GET_PRIVATE (self);
+ int ret;
+
+ g_assert (priv->contact_listener == NULL);
+ priv->contact_listener = gibber_listener_new ();
+
+ g_signal_connect (priv->local_listener, "new-connection",
+ G_CALLBACK (contact_new_connection_cb), self);
+
+ ret = gibber_listener_listen_tcp (priv->contact_listener, 0, NULL);
+ if (ret == TRUE)
+ return gibber_listener_get_port (priv->contact_listener);
+ return -1;
+}
+
static void
iq_close_reply_cb (GibberIqHelper *helper,
GibberXmppStanza *sent_stanza,
@@ -1649,15 +1704,11 @@ salut_tube_stream_close (SalutTubeIface *tube, gboolean closed_remotely)
{
if (priv->initiator == priv->self_handle)
{
- SalutDirectBytestreamManager *direct_bytestream_mgr;
- g_assert (priv->conn != NULL);
- g_object_get (priv->conn,
- "direct-bytestream-manager", &direct_bytestream_mgr,
- NULL);
- g_assert (direct_bytestream_mgr != NULL);
-
- salut_direct_bytestream_manager_stop_listen (direct_bytestream_mgr, tube);
- g_object_unref (direct_bytestream_mgr);
+ if (priv->contact_listener != NULL)
+ {
+ g_object_unref (priv->contact_listener);
+ priv->contact_listener = NULL;
+ }
}
}
@@ -1912,6 +1963,7 @@ tube_iface_init (gpointer g_iface,
klass->accept = salut_tube_stream_accept;
klass->offer_needed = salut_tube_stream_offer_needed;
+ klass->listen = salut_tube_stream_listen;
klass->close = salut_tube_stream_close;
klass->add_bytestream = salut_tube_stream_add_bytestream;
}
--
1.5.6.5
More information about the Telepathy-commits
mailing list