diff options
author | Olivier CrĂȘte <olivier.crete@collabora.com> | 2011-12-23 11:54:22 -0500 |
---|---|---|
committer | Xavier Claessens <xavier.claessens@collabora.co.uk> | 2012-01-11 09:53:39 +0100 |
commit | a8c774fcd09e4298ade48982112ac0cc69b89321 (patch) | |
tree | 3e7024e2849cbb382c76b42da67c7ac78905a85a | |
parent | 10d618e5098ec0b5a8baada8c1dec67428382797 (diff) | |
download | telepathy-gabble-a8c774fcd09e4298ade48982112ac0cc69b89321.tar.gz |
Export the ICE credentials from the transport to the stream
-rw-r--r-- | src/call-stream.c | 7 | ||||
-rw-r--r-- | src/jingle-content.c | 9 | ||||
-rw-r--r-- | src/jingle-content.h | 2 | ||||
-rw-r--r-- | src/jingle-transport-iceudp.c | 42 | ||||
-rw-r--r-- | src/jingle-transport-iface.c | 13 | ||||
-rw-r--r-- | src/jingle-transport-iface.h | 5 |
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); |