[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