summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Lundblad <malu@pidgin.im>2009-09-24 20:22:24 +0000
committerMarcus Lundblad <malu@pidgin.im>2009-09-24 20:22:24 +0000
commitb422e23a16e0c6b159d01441608eb714973a4042 (patch)
tree0a0bfd7ce3c1fdc5cc67e468035d71d702ed5ca0
parent23933cc46e0dc86beeb2202b5eff17727df976b5 (diff)
downloadpidgin-b422e23a16e0c6b159d01441608eb714973a4042.tar.gz
Can now generate a relayed candidate for the initiator
-rw-r--r--libpurple/protocols/jabber/Makefile.am10
-rw-r--r--libpurple/protocols/jabber/google.c65
-rw-r--r--libpurple/protocols/jabber/jingle/jingle.c106
-rw-r--r--libpurple/protocols/jabber/jingle/jingle.h6
-rw-r--r--libpurple/protocols/jabber/jingle/rtp.c3
5 files changed, 165 insertions, 25 deletions
diff --git a/libpurple/protocols/jabber/Makefile.am b/libpurple/protocols/jabber/Makefile.am
index d334313707..e80b2fc431 100644
--- a/libpurple/protocols/jabber/Makefile.am
+++ b/libpurple/protocols/jabber/Makefile.am
@@ -88,7 +88,10 @@ else
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 @@ AM_CPPFLAGS = \
$(DEBUG_CFLAGS) \
$(GLIB_CFLAGS) \
$(IDN_CFLAGS) \
- $(LIBXML_CFLAGS)
+ $(LIBXML_CFLAGS) \
+ $(FARSIGHT_CFLAGS) \
+ $(GSTREAMER_CFLAGS) \
+ $(GSTINTERFACES_CFLAGS)
diff --git a/libpurple/protocols/jabber/google.c b/libpurple/protocols/jabber/google.c
index 92de7e95d0..2620c58300 100644
--- a/libpurple/protocols/jabber/google.c
+++ b/libpurple/protocols/jabber/google.c
@@ -323,10 +323,14 @@ google_session_stream_info_cb(PurpleMedia *media, PurpleMediaInfoType type,
}
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 @@ jabber_google_session_get_params(JabberStream *js, guint *num)
}
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 @@ jabber_google_relay_response_cb(PurpleUtilFetchUrlData *url_data,
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 @@ jabber_google_relay_response_cb(PurpleUtilFetchUrlData *url_data,
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 @@ jabber_google_relay_response_cb(PurpleUtilFetchUrlData *url_data,
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 @@ google_session_handle_initiate(JabberStream *js, GoogleSession *session, xmlnode
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 --git a/libpurple/protocols/jabber/jingle/jingle.c b/libpurple/protocols/jabber/jingle/jingle.c
index 99c1e6b08a..44e57bb777 100644
--- a/libpurple/protocols/jabber/jingle/jingle.c
+++ b/libpurple/protocols/jabber/jingle/jingle.c
@@ -35,6 +35,11 @@
#include "rawudp.h"
#include "rtp.h"
+#ifdef USE_VV
+#include <gst/farsight/fs-conference-iface.h>
+#include <gst/farsight/fs-element-added-notifier.h>
+#endif
+
GType
jingle_get_type(const gchar *type)
{
@@ -430,32 +435,103 @@ jingle_terminate_sessions(JabberStream *js)
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(&params[0].value, G_TYPE_STRING);
- g_value_set_string(&params[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(&params[1].value, G_TYPE_UINT);
- g_value_set_uint(&params[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(&params[next_index].value, G_TYPE_STRING);
+ g_value_set_string(&params[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(&params[next_index].value, G_TYPE_UINT);
+ g_value_set_uint(&params[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(&params[next_index].value, G_TYPE_VALUE_ARRAY);
+ g_value_set_boxed(&params[next_index].value, relay_info);
+ g_value_array_free(relay_info);
+ }
}
*num = num_params;
return params;
}
+#endif
+
diff --git a/libpurple/protocols/jabber/jingle/jingle.h b/libpurple/protocols/jabber/jingle/jingle.h
index 7ccdc55fe2..3813529f8d 100644
--- a/libpurple/protocols/jabber/jingle/jingle.h
+++ b/libpurple/protocols/jabber/jingle/jingle.h
@@ -78,9 +78,13 @@ void jingle_parse(JabberStream *js, const char *from, JabberIqType type,
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 --git a/libpurple/protocols/jabber/jingle/rtp.c b/libpurple/protocols/jabber/jingle/rtp.c
index 36aa9237f0..377ef0eb11 100644
--- a/libpurple/protocols/jabber/jingle/rtp.c
+++ b/libpurple/protocols/jabber/jingle/rtp.c
@@ -602,7 +602,8 @@ jingle_rtp_init_media(JingleContent *content)
: 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"))