[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