# HG changeset patch # User Marcus Lundblad # Date 1253823744 0 # Node ID f858b53dfbf0720cf88cfb60113abc17de39d3a0 # Parent 794001c2230664c60fbbb7de33c1b210569c4f96 Can now generate a relayed candidate for the initiator diff -r 794001c22306 -r f858b53dfbf0 libpurple/protocols/jabber/Makefile.am --- a/libpurple/protocols/jabber/Makefile.am Tue Sep 22 22:42:21 2009 +0000 +++ b/libpurple/protocols/jabber/Makefile.am Thu Sep 24 20:22:24 2009 +0000 @@ -88,7 +88,10 @@ st = pkg_LTLIBRARIES = libjabber.la libxmpp.la libjabber_la_SOURCES = $(JABBERSOURCES) -libjabber_la_LIBADD = $(GLIB_LIBS) $(SASL_LIBS) $(LIBXML_LIBS) $(IDN_LIBS) +libjabber_la_LIBADD = $(GLIB_LIBS) $(SASL_LIBS) $(LIBXML_LIBS) $(IDN_LIBS)\ + $(FARSIGHT_LIBS) \ + $(GSTREAMER_LIBS) \ + $(GSTINTERFACES_LIBS) libxmpp_la_SOURCES = libxmpp.c libxmpp_la_LIBADD = libjabber.la @@ -101,4 +104,7 @@ $(DEBUG_CFLAGS) \ $(GLIB_CFLAGS) \ $(IDN_CFLAGS) \ - $(LIBXML_CFLAGS) + $(LIBXML_CFLAGS) \ + $(FARSIGHT_CFLAGS) \ + $(GSTREAMER_CFLAGS) \ + $(GSTINTERFACES_CFLAGS) diff -r 794001c22306 -r f858b53dfbf0 libpurple/protocols/jabber/google.c --- a/libpurple/protocols/jabber/google.c Tue Sep 22 22:42:21 2009 +0000 +++ b/libpurple/protocols/jabber/google.c Thu Sep 24 20:22:24 2009 +0000 @@ -323,10 +323,14 @@ } static GParameter * -jabber_google_session_get_params(JabberStream *js, guint *num) +jabber_google_session_get_params(JabberStream *js, const gchar *relay_ip, + guint16 relay_udp, guint16 relay_tcp, guint16 relay_ssltcp, + const gchar *relay_username, const gchar *relay_password, guint *num) { guint num_params; - GParameter *params = jingle_get_params(js, &num_params); + GParameter *params = + jingle_get_params(js, relay_ip, relay_udp, relay_tcp, relay_ssltcp, + relay_username, relay_password, &num_params); GParameter *new_params = g_new0(GParameter, num_params + 1); memcpy(new_params, params, sizeof(GParameter) * num_params); @@ -342,6 +346,41 @@ } static void +jabber_google_relay_parse_response(const gchar *response, gchar **ip, + guint *udp, guint *tcp, guint *ssltcp, gchar **username, gchar **password) +{ + gchar **lines = g_strsplit(response, "\n", -1); + int i = 0; + + for (; lines[i] ; i++) { + gchar *line = lines[i]; + gchar **parts = g_strsplit(line, "=", 2); + + purple_debug_info("jabber", "parsing line %s in Google relay response\n", + line); + + if (parts[0] && parts[1]) { + if (purple_strequal(parts[0], "relay.ip")) { + *ip = g_strdup(parts[1]); + } else if (purple_strequal(parts[0], "relay.udp_port")) { + *udp = atoi(parts[1]); + } else if (purple_strequal(parts[0], "relay.tcp_port")) { + *tcp = atoi(parts[1]); + } else if (purple_strequal(parts[0], "relay.ssltcp_port")) { + *ssltcp = atoi(parts[1]); + } else if (purple_strequal(parts[0], "username")) { + *username = g_strdup(parts[1]); + } else if (purple_strequal(parts[0], "password")) { + *password = g_strdup(parts[1]); + } + } + g_strfreev(parts); + } + + g_strfreev(lines); +} + +static void jabber_google_relay_response_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message) @@ -350,6 +389,12 @@ GParameter *params; guint num_params; JabberStream *js = session->js; + gchar *relay_ip = NULL; + guint relay_udp = 0; + guint relay_tcp = 0; + guint relay_ssltcp = 0; + gchar *relay_username = NULL; + gchar *relay_password = NULL; js->google_relay_request = NULL; @@ -358,8 +403,8 @@ if (url_text && len > 0) { purple_debug_info("jabber", "got Google relay request response:\n%s\n", url_text); - } else { - + jabber_google_relay_parse_response(url_text, &relay_ip, &relay_udp, + &relay_tcp, &relay_ssltcp, &relay_username, &relay_password); } session->media = purple_media_manager_create_media( @@ -379,8 +424,14 @@ g_signal_connect(G_OBJECT(session->media), "stream-info", G_CALLBACK(google_session_stream_info_cb), session); - params = jabber_google_session_get_params(js, &num_params); + params = + jabber_google_session_get_params(js, relay_ip, relay_udp, relay_tcp, + relay_ssltcp, relay_username, relay_password, &num_params); + g_free(relay_ip); + g_free(relay_username); + g_free(relay_password); + if (purple_media_add_stream(session->media, "google-voice", session->remote_jid, PURPLE_MEDIA_AUDIO, TRUE, "nice", num_params, params) == FALSE || @@ -507,7 +558,9 @@ g_signal_connect(G_OBJECT(session->media), "stream-info", G_CALLBACK(google_session_stream_info_cb), session); - params = jabber_google_session_get_params(js, &num_params); + /* TODO: setup relay stuff... */ + params = jabber_google_session_get_params(js, NULL, 0, 0, 0, NULL, NULL, + &num_params); if (purple_media_add_stream(session->media, "google-voice", session->remote_jid, PURPLE_MEDIA_AUDIO, FALSE, diff -r 794001c22306 -r f858b53dfbf0 libpurple/protocols/jabber/jingle/jingle.c --- a/libpurple/protocols/jabber/jingle/jingle.c Tue Sep 22 22:42:21 2009 +0000 +++ b/libpurple/protocols/jabber/jingle/jingle.c Thu Sep 24 20:22:24 2009 +0000 @@ -35,6 +35,11 @@ #include "rawudp.h" #include "rtp.h" +#ifdef USE_VV +#include +#include +#endif + GType jingle_get_type(const gchar *type) { @@ -430,32 +435,103 @@ jingle_terminate_sessions_gh, NULL); } +#ifdef USE_VV GParameter * -jingle_get_params(JabberStream *js, guint *num) +jingle_get_params(JabberStream *js, const gchar *relay_ip, guint relay_udp, + guint relay_tcp, guint relay_ssltcp, const gchar *relay_username, + const gchar *relay_password, guint *num) { /* don't set a STUN server if one is set globally in prefs, in that case this will be handled in media.c */ gboolean has_account_stun = js->stun_ip && !purple_network_get_stun_ip(); - guint num_params = has_account_stun ? 2 : 0; + guint num_params = has_account_stun ? + (relay_ip ? 3 : 2) : (relay_ip ? 1 : 0); GParameter *params = NULL; - + int next_index = 0; + if (num_params > 0) { params = g_new0(GParameter, num_params); - purple_debug_info("jabber", - "setting param stun-ip for stream using Google auto-config: %s\n", - js->stun_ip); - params[0].name = "stun-ip"; - g_value_init(¶ms[0].value, G_TYPE_STRING); - g_value_set_string(¶ms[0].value, js->stun_ip); - purple_debug_info("jabber", - "setting param stun-port for stream using Google auto-config: %d\n", - js->stun_port); - params[1].name = "stun-port"; - g_value_init(¶ms[1].value, G_TYPE_UINT); - g_value_set_uint(¶ms[1].value, js->stun_port); + if (has_account_stun) { + purple_debug_info("jabber", + "setting param stun-ip for stream using Google auto-config: %s\n", + js->stun_ip); + params[next_index].name = "stun-ip"; + g_value_init(¶ms[next_index].value, G_TYPE_STRING); + g_value_set_string(¶ms[next_index].value, js->stun_ip); + purple_debug_info("jabber", + "setting param stun-port for stream using Google auto-config: %d\n", + js->stun_port); + next_index++; + params[next_index].name = "stun-port"; + g_value_init(¶ms[next_index].value, G_TYPE_UINT); + g_value_set_uint(¶ms[next_index].value, js->stun_port); + next_index++; + } + + if (relay_ip) { + GValueArray *relay_info = g_value_array_new(0); + GValue udp_value; + GValue tcp_value; + GValue ssltcp_value; + + if (relay_udp) { + GstStructure *turn_setup = gst_structure_new("relay-info", + "ip", G_TYPE_STRING, relay_ip, + "port", G_TYPE_UINT, relay_udp, + "username", G_TYPE_STRING, relay_username, + "password", G_TYPE_STRING, relay_password, + "relay-type", G_TYPE_STRING, "udp", + NULL); + if (turn_setup) { + memset(&udp_value, 0, sizeof(GValue)); + g_value_init(&udp_value, GST_TYPE_STRUCTURE); + gst_value_set_structure(&udp_value, turn_setup); + relay_info = g_value_array_append(relay_info, &udp_value); + gst_structure_free(turn_setup); + } + } + if (relay_tcp) { + GstStructure *turn_setup = gst_structure_new("relay-info", + "ip", G_TYPE_STRING, relay_ip, + "port", G_TYPE_UINT, relay_tcp, + "username", G_TYPE_STRING, relay_username, + "password", G_TYPE_STRING, relay_password, + "relay-type", G_TYPE_STRING, "tcp", + NULL); + if (turn_setup) { + memset(&tcp_value, 0, sizeof(GValue)); + g_value_init(&tcp_value, GST_TYPE_STRUCTURE); + gst_value_set_structure(&tcp_value, turn_setup); + relay_info = g_value_array_append(relay_info, &tcp_value); + gst_structure_free(turn_setup); + } + } + if (relay_ssltcp) { + GstStructure *turn_setup = gst_structure_new("relay-info", + "ip", G_TYPE_STRING, relay_ip, + "port", G_TYPE_UINT, relay_ssltcp, + "username", G_TYPE_STRING, relay_username, + "password", G_TYPE_STRING, relay_password, + "relay-type", G_TYPE_STRING, "tls", + NULL); + if (turn_setup) { + memset(&ssltcp_value, 0, sizeof(GValue)); + g_value_init(&ssltcp_value, GST_TYPE_STRUCTURE); + gst_value_set_structure(&ssltcp_value, turn_setup); + relay_info = g_value_array_append(relay_info, &ssltcp_value); + gst_structure_free(turn_setup); + } + } + params[next_index].name = "relay-info"; + g_value_init(¶ms[next_index].value, G_TYPE_VALUE_ARRAY); + g_value_set_boxed(¶ms[next_index].value, relay_info); + g_value_array_free(relay_info); + } } *num = num_params; return params; } +#endif + diff -r 794001c22306 -r f858b53dfbf0 libpurple/protocols/jabber/jingle/jingle.h --- a/libpurple/protocols/jabber/jingle/jingle.h Tue Sep 22 22:42:21 2009 +0000 +++ b/libpurple/protocols/jabber/jingle/jingle.h Thu Sep 24 20:22:24 2009 +0000 @@ -78,9 +78,13 @@ void jingle_terminate_sessions(JabberStream *js); +#ifdef USE_VV /* create a GParam array given autoconfigured STUN (and later perhaps TURN). if google_talk is TRUE, set compatability mode to GOOGLE_TALK */ -GParameter *jingle_get_params(JabberStream *js, guint *num_params); +GParameter *jingle_get_params(JabberStream *js, const gchar *relay_ip, + guint relay_udp, guint relay_tcp, guint relay_ssltcp, + const gchar *relay_username, const gchar *relay_password, guint *num_params); +#endif #ifdef __cplusplus } diff -r 794001c22306 -r f858b53dfbf0 libpurple/protocols/jabber/jingle/rtp.c --- a/libpurple/protocols/jabber/jingle/rtp.c Tue Sep 22 22:42:21 2009 +0000 +++ b/libpurple/protocols/jabber/jingle/rtp.c Thu Sep 24 20:22:24 2009 +0000 @@ -602,7 +602,8 @@ : PURPLE_MEDIA_RECV_VIDEO; params = - jingle_get_params(jingle_session_get_js(session), &num_params); + jingle_get_params(jingle_session_get_js(session), NULL, 0, 0, 0, + NULL, NULL, &num_params); creator = jingle_content_get_creator(content); if (!strcmp(creator, "initiator"))