diff libpurple/network.c @ 26055:c56e8826fed0

Added support to generate relayed candidates (TURN). Added prefs setting for relay server in Pidgin
author Marcus Lundblad <ml@update.uu.se>
date Thu, 22 Jan 2009 23:04:52 +0000
parents ae3d25465d0f
children 4f0aec6d4ad7
line wrap: on
line diff
--- a/libpurple/network.c	Mon Jan 19 10:47:12 2009 +0000
+++ b/libpurple/network.c	Thu Jan 22 23:04:52 2009 +0000
@@ -93,8 +93,9 @@
 static NMState nm_get_network_state(void);
 #endif
 
-/* Cached IP address for STUN server */
+/* Cached IP addresses for STUN and TURN servers (set globally in prefs) */
 static gchar *stun_ip = NULL;
+static gchar *turn_ip = NULL;
 
 const unsigned char *
 purple_network_ip_atoi(const char *ip)
@@ -694,6 +695,8 @@
 			   offline */
 			purple_network_set_stun_server(
 				purple_prefs_get_string("/purple/network/stun_server"));
+			purple_network_set_turn_server(
+				purple_prefs_get_string("/purple/network/turn_server"));
 			
 			if (ui_ops != NULL && ui_ops->network_connected != NULL)
 				ui_ops->network_connected();
@@ -757,11 +760,13 @@
 #endif
 
 static void
-purple_network_stun_lookup_cb(GSList *hosts, gpointer data, 
+purple_network_ip_lookup_cb(GSList *hosts, gpointer data, 
 	const char *error_message)
 {
+	const gchar **ip = (const gchar **) data; 
+	
 	if (error_message) {
-		purple_debug_error("network", "lookup of STUN server IP failed: %s\n",
+		purple_debug_error("network", "lookup of IP address failed: %s\n",
 			error_message);
 		g_slist_free(hosts);
 		return;
@@ -780,8 +785,8 @@
 				dst, sizeof(dst));
 		}
 			
-		stun_ip = g_strdup(dst);
-		purple_debug_info("network", "set STUN IP: %s\n", stun_ip);
+		*ip = g_strdup(dst);
+		purple_debug_info("network", "set IP address: %s\n", *ip);
 	}
 	
 	g_slist_free(hosts);
@@ -793,8 +798,8 @@
 	if (stun_server && stun_server[0] != '\0') {
 		if (purple_network_is_available()) {
 			purple_debug_info("network", "running DNS query for STUN server\n");
-			purple_dnsquery_a(stun_server, 3478, purple_network_stun_lookup_cb,
-				NULL);
+			purple_dnsquery_a(stun_server, 3478, purple_network_ip_lookup_cb,
+				&stun_ip);
 		} else {
 			purple_debug_info("network", 
 				"network is unavailable, don't try to update STUN IP");
@@ -805,12 +810,38 @@
 	}
 }
 
+void
+purple_network_set_turn_server(const gchar *turn_server)
+{
+	if (turn_server && turn_server[0] != '\0') {
+		if (purple_network_is_available()) {
+			purple_debug_info("network", "running DNS query for TURN server\n");
+			purple_dnsquery_a(turn_server, 
+				purple_prefs_get_int("/purple/network/turn_port"), 
+				purple_network_ip_lookup_cb, &turn_ip);
+		} else {
+			purple_debug_info("network", 
+				"network is unavailable, don't try to update TURN IP");
+		}
+	} else if (turn_ip) {
+		g_free(turn_ip);
+		turn_ip = NULL;
+	}
+}
+
+
 const gchar *
 purple_network_get_stun_ip(void)
 {
 	return stun_ip;
 }
 
+const gchar *
+purple_network_get_turn_ip(void)
+{
+	return turn_ip;
+}
+
 void *
 purple_network_get_handle(void)
 {
@@ -843,6 +874,10 @@
 
 	purple_prefs_add_none  ("/purple/network");
 	purple_prefs_add_string("/purple/network/stun_server", "");
+	purple_prefs_add_string("/purple/network/turn_server", "");
+	purple_prefs_add_int   ("/purple/network/turn_port", 3478);
+	purple_prefs_add_string("/purple/network/turn_username", "");
+	purple_prefs_add_string("/purple/network/turn_password", "");
 	purple_prefs_add_bool  ("/purple/network/auto_ip", TRUE);
 	purple_prefs_add_string("/purple/network/public_ip", "");
 	purple_prefs_add_bool  ("/purple/network/map_ports", TRUE);
@@ -884,6 +919,8 @@
 	
 	purple_network_set_stun_server(
 		purple_prefs_get_string("/purple/network/stun_server"));
+	purple_network_set_turn_server(
+		purple_prefs_get_string("/purple/network/turn_server"));
 }
 
 void