summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.com>2011-12-23 11:54:22 -0500
committerXavier Claessens <xavier.claessens@collabora.co.uk>2012-01-11 09:53:39 +0100
commita8c774fcd09e4298ade48982112ac0cc69b89321 (patch)
tree3e7024e2849cbb382c76b42da67c7ac78905a85a
parent10d618e5098ec0b5a8baada8c1dec67428382797 (diff)
downloadtelepathy-gabble-a8c774fcd09e4298ade48982112ac0cc69b89321.tar.gz
Export the ICE credentials from the transport to the stream
-rw-r--r--src/call-stream.c7
-rw-r--r--src/jingle-content.c9
-rw-r--r--src/jingle-content.h2
-rw-r--r--src/jingle-transport-iceudp.c42
-rw-r--r--src/jingle-transport-iface.c13
-rw-r--r--src/jingle-transport-iface.h5
6 files changed, 78 insertions, 0 deletions
diff --git a/src/call-stream.c b/src/call-stream.c
index 2c310d8fa..dade2b2a6 100644
--- a/src/call-stream.c
+++ b/src/call-stream.c
@@ -225,10 +225,14 @@ _new_candidates_cb (
TpCallStreamEndpoint *endpoint)
{
GPtrArray *tp_candidates;
+ gchar *ufrag, *pwd;
if (candidates == NULL)
return;
+ if (gabble_jingle_content_get_credentials (content, &ufrag, &pwd))
+ tp_call_stream_endpoint_set_remote_credentials (endpoint, ufrag, pwd);
+
tp_candidates = gabble_call_candidates_to_array (candidates);
tp_call_stream_endpoint_add_new_candidates (endpoint, tp_candidates);
g_boxed_free (TP_ARRAY_TYPE_CANDIDATE_LIST, tp_candidates);
@@ -259,6 +263,7 @@ _hook_up_endpoint (GabbleCallStream *self,
TpStreamTransportType type = 0;
GPtrArray *tp_candidates;
GList *candidates;
+ gchar *ufrag, *pwd;
switch (gabble_jingle_content_get_transport_type (content))
{
@@ -279,6 +284,8 @@ _hook_up_endpoint (GabbleCallStream *self,
/* FIXME: ice??? */
endpoint = tp_call_stream_endpoint_new (bus, path, type, FALSE);
+ if (gabble_jingle_content_get_credentials (content, &ufrag, &pwd))
+ tp_call_stream_endpoint_set_remote_credentials (endpoint, ufrag, pwd);
candidates = gabble_jingle_content_get_remote_candidates (content);
tp_candidates = gabble_call_candidates_to_array (candidates);
tp_call_stream_endpoint_add_new_candidates (endpoint, tp_candidates);
diff --git a/src/jingle-content.c b/src/jingle-content.c
index b8ebefd60..22116768e 100644
--- a/src/jingle-content.c
+++ b/src/jingle-content.c
@@ -1134,6 +1134,15 @@ gabble_jingle_content_get_local_candidates (GabbleJingleContent *c)
}
gboolean
+gabble_jingle_content_get_credentials (GabbleJingleContent *c,
+ gchar **ufrag, gchar **pwd)
+{
+ GabbleJingleContentPrivate *priv = c->priv;
+
+ return jingle_transport_get_credentials (priv->transport, ufrag, pwd);
+}
+
+gboolean
gabble_jingle_content_change_direction (GabbleJingleContent *c,
JingleContentSenders senders)
{
diff --git a/src/jingle-content.h b/src/jingle-content.h
index 809de89fc..95cc26daa 100644
--- a/src/jingle-content.h
+++ b/src/jingle-content.h
@@ -131,6 +131,8 @@ void gabble_jingle_content_reject (GabbleJingleContent *c,
GList *gabble_jingle_content_get_remote_candidates (GabbleJingleContent *c);
GList *gabble_jingle_content_get_local_candidates (GabbleJingleContent *c);
+gboolean gabble_jingle_content_get_credentials (GabbleJingleContent *c,
+ gchar **ufrag, gchar **pwd);
gboolean gabble_jingle_content_change_direction (GabbleJingleContent *c,
JingleContentSenders senders);
void gabble_jingle_content_retransmit_candidates (GabbleJingleContent *self,
diff --git a/src/jingle-transport-iceudp.c b/src/jingle-transport-iceudp.c
index 4b108868b..d676f3a83 100644
--- a/src/jingle-transport-iceudp.c
+++ b/src/jingle-transport-iceudp.c
@@ -78,6 +78,9 @@ struct _GabbleJingleTransportIceUdpPrivate
GList *pending_candidates;
GList *remote_candidates;
+ gchar *ufrag;
+ gchar *pwd;
+
/* next ID to send with a candidate */
int id_sequence;
@@ -117,6 +120,12 @@ gabble_jingle_transport_iceudp_dispose (GObject *object)
g_free (priv->transport_ns);
priv->transport_ns = NULL;
+ g_free (priv->ufrag);
+ priv->ufrag = NULL;
+
+ g_free (priv->pwd);
+ priv->pwd = NULL;
+
if (G_OBJECT_CLASS (gabble_jingle_transport_iceudp_parent_class)->dispose)
G_OBJECT_CLASS (gabble_jingle_transport_iceudp_parent_class)->dispose (object);
}
@@ -368,6 +377,18 @@ parse_candidates (GabbleJingleTransportIface *obj,
}
component = atoi (str);
+ if (priv->ufrag == NULL || strcmp (priv->ufrag, user))
+ {
+ g_free (priv->ufrag);
+ priv->ufrag = g_strdup (user);
+ }
+
+ if (priv->pwd == NULL || strcmp (priv->pwd, pass))
+ {
+ g_free (priv->pwd);
+ priv->pwd = g_strdup (pass);
+ }
+
c = jingle_candidate_new (proto, ctype, id, component,
address, port, gen, pref, user, pass, net);
@@ -553,6 +574,26 @@ get_transport_type (void)
return JINGLE_TRANSPORT_ICE_UDP;
}
+static gboolean
+get_credentials (GabbleJingleTransportIface *iface,
+ gchar **ufrag, gchar **pwd)
+{
+ GabbleJingleTransportIceUdp *transport =
+ GABBLE_JINGLE_TRANSPORT_ICEUDP (iface);
+ GabbleJingleTransportIceUdpPrivate *priv = transport->priv;
+
+ if (!priv->ufrag || !priv->pwd)
+ return FALSE;
+
+ if (ufrag)
+ *ufrag = priv->ufrag;
+ if (pwd)
+ *pwd = priv->pwd;
+
+ return TRUE;
+}
+
+
static void
transport_iface_init (gpointer g_iface, gpointer iface_data)
{
@@ -567,6 +608,7 @@ transport_iface_init (gpointer g_iface, gpointer iface_data)
klass->get_remote_candidates = get_remote_candidates;
klass->get_local_candidates = get_local_candidates;
klass->get_transport_type = get_transport_type;
+ klass->get_credentials = get_credentials;
}
void
diff --git a/src/jingle-transport-iface.c b/src/jingle-transport-iface.c
index 8c9861ec5..c0ac8bf11 100644
--- a/src/jingle-transport-iface.c
+++ b/src/jingle-transport-iface.c
@@ -136,6 +136,19 @@ gabble_jingle_transport_iface_get_local_candidates (
return virtual_method (self);
}
+gboolean
+jingle_transport_get_credentials (GabbleJingleTransportIface *self,
+ gchar **ufrag, gchar **pwd)
+{
+ GabbleJingleTransportIfaceClass *klass =
+ GABBLE_JINGLE_TRANSPORT_IFACE_GET_CLASS (self);
+
+ if (klass->get_credentials)
+ return klass->get_credentials (self, ufrag, pwd);
+ else
+ return FALSE;
+}
+
JingleTransportType
gabble_jingle_transport_iface_get_transport_type (GabbleJingleTransportIface *self)
{
diff --git a/src/jingle-transport-iface.h b/src/jingle-transport-iface.h
index 9e0a36810..036ecc7a8 100644
--- a/src/jingle-transport-iface.h
+++ b/src/jingle-transport-iface.h
@@ -52,6 +52,9 @@ struct _GabbleJingleTransportIfaceClass {
GList * (*get_remote_candidates) (GabbleJingleTransportIface *);
GList * (*get_local_candidates) (GabbleJingleTransportIface *);
+ gboolean (*get_credentials) (GabbleJingleTransportIface *,
+ gchar **ufrag, gchar **pwd);
+
JingleTransportType (*get_transport_type) (void);
};
@@ -86,6 +89,8 @@ gboolean gabble_jingle_transport_iface_can_accept (
GList *gabble_jingle_transport_iface_get_remote_candidates (GabbleJingleTransportIface *);
GList *gabble_jingle_transport_iface_get_local_candidates (GabbleJingleTransportIface *);
JingleTransportType gabble_jingle_transport_iface_get_transport_type (GabbleJingleTransportIface *);
+gboolean jingle_transport_get_credentials (GabbleJingleTransportIface *,
+ gchar **ufrag, gchar **pwd);
GabbleJingleTransportIface *gabble_jingle_transport_iface_new (
GType type, GabbleJingleContent *content, const gchar *transport_ns);