/pidgin/main: 2539f27ecd73: This should do it for simple

Gary Kramlich <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: 2539f27ecd73849c1f1fcfcf5d2102bb95c9d23e
Author:	 Gary Kramlich <[email protected]>
Date:	 2015-12-18 19:18 -0600
Branch:	 use-gresolver
URL: https://hg.pidgin.im/pidgin/main/rev/2539f27ecd73

Description:

This should do it for simple

diffstat:

 libpurple/protocols/simple/simple.c |  106 +++++++++++++++++++++--------------
 libpurple/protocols/simple/simple.h |    6 +-
 2 files changed, 66 insertions(+), 46 deletions(-)

diffs (209 lines):

diff --git a/libpurple/protocols/simple/simple.c b/libpurple/protocols/simple/simple.c
--- a/libpurple/protocols/simple/simple.c
+++ b/libpurple/protocols/simple/simple.c
@@ -29,7 +29,6 @@
 #include "accountopt.h"
 #include "buddylist.h"
 #include "conversation.h"
-#include "dnsquery.h"
 #include "debug.h"
 #include "notify.h"
 #include "protocol.h"
@@ -41,7 +40,6 @@
 
 #include "simple.h"
 #include "sipmsg.h"
-#include "dnssrv.h"
 #include "ntlm.h"
 
 static PurpleProtocol *my_protocol = NULL;
@@ -1801,29 +1799,41 @@ static void simple_udp_host_resolved_lis
 	do_register(sip);
 }
 
-static void simple_udp_host_resolved(GSList *hosts, gpointer data, const char *error_message) {
+static void
+simple_udp_host_resolved(GObject *sender, GAsyncResult *result, gpointer data) {
+	GError *error = NULL;
+	GList *addresses = NULL;
+	GInetAddress *inet_address = NULL;
+	GSocketAddress *socket_address = NULL;
 	struct simple_account_data *sip = (struct simple_account_data*) data;
-	int addr_size;
 
-	sip->query_data = NULL;
+	addresses = g_resolver_lookup_by_name_finish(g_resolver_get_default(), result, &error);
+	if(error) {
+		gchar *msg = g_strdup_printf(_("Unable to resolve hostname : %s"),
+			error->message);
 
-	if (!hosts || !hosts->data) {
 		purple_connection_error(sip->gc,
 			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
-			_("Unable to resolve hostname"));
+			msg
+			);
+
+		g_error_free(error);
+
 		return;
 	}
 
-	addr_size = GPOINTER_TO_INT(hosts->data);
-	hosts = g_slist_remove(hosts, hosts->data);
-	memcpy(&(sip->serveraddr), hosts->data, addr_size);
-	g_free(hosts->data);
-	hosts = g_slist_remove(hosts, hosts->data);
-	while(hosts) {
-		hosts = g_slist_remove(hosts, hosts->data);
-		g_free(hosts->data);
-		hosts = g_slist_remove(hosts, hosts->data);
-	}
+	inet_address = G_INET_ADDRESS(addresses->data);
+	socket_address = g_inet_socket_address_new(inet_address, sip->realport);
+	g_object_unref(G_OBJECT(inet_address));
+
+	g_socket_address_to_native(socket_address,
+	                           &(sip->serveraddr),
+	                           g_socket_address_get_native_size(socket_address),
+	                           NULL);
+
+	g_object_unref(G_OBJECT(socket_address));
+
+	g_resolver_free_addresses(addresses);
 
 	/* create socket for incoming connections */
 	sip->listen_data = purple_network_listen_range(5060, 5160, AF_UNSPEC, SOCK_DGRAM, TRUE,
@@ -1865,33 +1875,44 @@ simple_tcp_connect_listen_cb(int listenf
 	}
 }
 
-static void srvresolved(PurpleSrvResponse *resp, int results, gpointer data) {
+static void
+srvresolved(GObject *sender, GAsyncResult *result, gpointer data) {
+	GError *error = NULL;
+	GList *targets = NULL;
 	struct simple_account_data *sip;
 	gchar *hostname;
 	int port;
 
 	sip = data;
-	sip->srv_query_data = NULL;
 
-	port = purple_account_get_int(sip->account, "port", 0);
+	targets = g_resolver_lookup_service_finish(g_resolver_get_default(), result, &error);
+	if(error) {
+		purple_debug_info("simple",
+		                  "srv lookup failed, continuing with configured settings : %s",
+		                  error->message);
 
-	/* find the host to connect to */
-	if(results) {
-		hostname = g_strdup(resp->hostname);
-		if(!port)
-			port = resp->port;
-		g_free(resp);
-	} else {
+		g_error_free(error);
+
 		if(!purple_account_get_bool(sip->account, "useproxy", FALSE)) {
 			hostname = g_strdup(sip->servername);
 		} else {
 			hostname = g_strdup(purple_account_get_string(sip->account, "proxy", sip->servername));
-		}
+		}		
+		port = purple_account_get_int(sip->account, "port", 0);
+	} else {
+		GSrvTarget *target = (GSrvTarget *)targets->data;
+
+		hostname = g_strdup(g_srv_target_get_hostname(target));
+		port = g_srv_target_get_port(target);
+
+		g_resolver_free_targets(targets);
 	}
 
 	sip->realhostname = hostname;
 	sip->realport = port;
-	if(!sip->realport) sip->realport = 5060;
+
+	if(!sip->realport)
+		sip->realport = 5060;
 
 	/* TCP case */
 	if(!sip->udp) {
@@ -1907,13 +1928,11 @@ static void srvresolved(PurpleSrvRespons
 	} else { /* UDP */
 		purple_debug_info("simple", "using udp with server %s and port %d\n", hostname, port);
 
-		sip->query_data = purple_dnsquery_a(sip->account, hostname,
-			port, simple_udp_host_resolved, sip);
-		if (sip->query_data == NULL) {
-			purple_connection_error(sip->gc,
-				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
-				_("Unable to resolve hostname"));
-		}
+		g_resolver_lookup_by_name_async(g_resolver_get_default(),
+		                                sip->realhostname,
+		                                sip->cancellable,
+		                                simple_udp_host_resolved,
+		                                sip);
 	}
 }
 
@@ -1975,8 +1994,13 @@ static void simple_login(PurpleAccount *
 		hosttoconnect = purple_account_get_string(account, "proxy", sip->servername);
 	}
 
-	sip->srv_query_data = purple_srv_resolve(account, "sip",
-			sip->udp ? "udp" : "tcp", hosttoconnect, srvresolved, sip);
+	g_resolver_lookup_service_async(g_resolver_get_default(),
+	                                "sip",
+	                                sip->udp ? "udp" : "tcp",
+	                                hosttoconnect,
+	                                sip->cancellable,
+	                                srvresolved,
+	                                sip);
 }
 
 static void simple_close(PurpleConnection *gc)
@@ -2008,11 +2032,9 @@ static void simple_close(PurpleConnectio
 		purple_timeout_remove(sip->resendtimeout);
 	if (sip->registertimeout)
 		purple_timeout_remove(sip->registertimeout);
-	if (sip->query_data != NULL)
-		purple_dnsquery_destroy(sip->query_data);
 
-	if (sip->srv_query_data != NULL)
-		purple_srv_txt_query_destroy(sip->srv_query_data);
+	g_cancellable_cancel(sip->cancellable);
+	g_object_unref(G_OBJECT(sip->cancellable));
 
 	if (sip->listen_data != NULL)
 		purple_network_listen_cancel(sip->listen_data);
diff --git a/libpurple/protocols/simple/simple.h b/libpurple/protocols/simple/simple.h
--- a/libpurple/protocols/simple/simple.h
+++ b/libpurple/protocols/simple/simple.h
@@ -24,12 +24,11 @@
 #define _PURPLE_SIMPLE_H
 
 #include <glib.h>
+#include <gio/gio.h>
 #include <time.h>
 
 #include "cipher.h"
 #include "circularbuffer.h"
-#include "dnsquery.h"
-#include "dnssrv.h"
 #include "network.h"
 #include "proxy.h"
 #include "protocol.h"
@@ -99,8 +98,7 @@ struct simple_account_data {
 	gchar *servername;
 	gchar *username;
 	gchar *password;
-	PurpleDnsQueryData *query_data;
-	PurpleSrvTxtQueryData *srv_query_data;
+	GCancellable *cancellable;
 	PurpleNetworkListenData *listen_data;
 	int fd;
 	int cseq;

_______________________________________________
Commits mailing list
[email protected]
https://pidgin.im/cgi-bin/mailman/listinfo/commits
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.