Merged in default (pull request #621)

Mon, 04 Nov 2019 02:24:02 +0000

author
Gary Kramlich <grim@reaperworld.com>
date
Mon, 04 Nov 2019 02:24:02 +0000
changeset 40117
bc6bb63ae605
parent 40112
52c9656e40ed (current diff)
parent 40116
29830983ace7 (diff)
child 40121
3682f08744da

Merged in default (pull request #621)

Convert SILC to GIO, plus a minor version bump

Approved-by: Gary Kramlich

--- a/libpurple/protocols/silc/silc.c	Mon Nov 04 01:18:24 2019 +0000
+++ b/libpurple/protocols/silc/silc.c	Mon Nov 04 02:24:02 2019 +0000
@@ -42,6 +42,25 @@
 	return TRUE;
 }
 
+static void
+silcpurple_free(SilcPurple sg)
+{
+	g_return_if_fail(sg != NULL);
+
+	g_cancellable_cancel(sg->cancellable);
+	g_clear_object(&sg->cancellable);
+	g_clear_object(&sg->sockconn);
+
+	g_clear_pointer(&sg->client, silc_client_free);
+	g_clear_pointer(&sg->sha1hash, silc_hash_free);
+	g_clear_pointer(&sg->mimeass, silc_mime_assembler_free);
+
+	g_clear_pointer(&sg->public_key, silc_pkcs_public_key_free);
+	g_clear_pointer(&sg->private_key, silc_pkcs_private_key_free);
+
+	silc_free(sg);
+}
+
 static const char *
 silcpurple_list_icon(PurpleAccount *a, PurpleBuddy *b)
 {
@@ -135,15 +154,6 @@
 			 NULL, 0);
 }
 
-#if __SILC_TOOLKIT_VERSION < SILC_VERSION(1,1,1)
-static gboolean
-silcpurple_scheduler(gpointer *context)
-{
-	SilcClient client = (SilcClient)context;
-	silc_client_run_one(client);
-	return TRUE;
-}
-#else
 typedef struct {
   SilcPurple sg;
   SilcUInt32 fd;
@@ -241,7 +251,6 @@
 	  }
 	}
 }
-#endif /* __SILC_TOOLKIT_VERSION */
 
 static void
 silcpurple_connect_cb(SilcClient client, SilcClientConnection conn,
@@ -378,9 +387,7 @@
 		purple_connection_error(gc,
 			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
 			_("Connection failed"));
-		silc_pkcs_public_key_free(sg->public_key);
-		silc_pkcs_private_key_free(sg->private_key);
-		silc_free(sg);
+		silcpurple_free(sg);
 		purple_connection_set_protocol_data(gc, NULL);
 		return;
 	}
@@ -413,29 +420,43 @@
 }
 
 static void
-silcpurple_login_connected(gpointer data, gint source, const gchar *error_message)
+silcpurple_login_connected(GObject *source, GAsyncResult *res, gpointer data)
 {
 	PurpleConnection *gc = data;
 	SilcPurple sg;
+	GSocketConnection *conn;
+	GSocket *socket;
+	gint fd;
+	GError *error = NULL;
 
 	g_return_if_fail(gc != NULL);
 
 	sg = purple_connection_get_protocol_data(gc);
 
-	if (source < 0) {
-		purple_connection_error(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
-		                             _("Connection failed"));
-		silc_pkcs_public_key_free(sg->public_key);
-		silc_pkcs_private_key_free(sg->private_key);
-		silc_free(sg);
-		purple_connection_set_protocol_data(gc, NULL);
+	conn = g_socket_client_connect_to_host_finish(G_SOCKET_CLIENT(source),
+			res, &error);
+	if (conn == NULL) {
+		if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+			purple_connection_error(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+						     _("Connection failed"));
+			silcpurple_free(sg);
+			purple_connection_set_protocol_data(gc, NULL);
+		}
+
+		g_clear_error(&error);
 		return;
 	}
 
+	socket = g_socket_connection_get_socket(conn);
+	g_assert(socket != NULL);
+
+	fd = g_socket_get_fd(socket);
+	sg->sockconn = conn;
+
 	silc_hash_alloc((unsigned char *)"sha1", &sg->sha1hash);
 
 	/* Wrap socket to TCP stream */
-	silc_socket_tcp_stream_create(source, TRUE, FALSE,
+	silc_socket_tcp_stream_create(fd, TRUE, FALSE,
 				      sg->client->schedule,
 				      silcpurple_stream_created, gc);
 }
@@ -444,20 +465,27 @@
 {
 	PurpleConnection *gc = sg->gc;
 	PurpleAccount *account = purple_connection_get_account(gc);
+	GSocketClient *client;
+
+	client = purple_gio_socket_client_new(account, &error);
+	if (client == NULL) {
+		/* Assume it's a proxy error */
+		purple_notify_error(NULL, NULL, _("Invalid proxy settings"),
+			error->message,
+			purple_request_cpar_from_account(account));
+		purple_connection_take_error(gc, error);
+		purple_connection_set_protocol_data(gc, NULL);
+		silcpurple_free(sg);
+		return;
+	}
 
 	/* Connect to the SILC server */
-	if (purple_proxy_connect(gc, account,
+	g_socket_client_connect_to_host_async(client,
 				 purple_account_get_string(account, "server",
 							   "silc.silcnet.org"),
 				 purple_account_get_int(account, "port", 706),
-				 silcpurple_login_connected, gc) == NULL)
-	{
-		purple_connection_error(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
-		                             _("Unable to connect"));
-		purple_connection_set_protocol_data(gc, NULL);
-		silc_free(sg);
-		return;
-	}
+				 sg->cancellable, silcpurple_login_connected, gc);
+	g_object_unref(client);
 }
 
 static void silcpurple_got_password_cb(PurpleConnection *gc, PurpleRequestFields *fields)
@@ -480,7 +508,7 @@
 			_("Password is required to sign on."), NULL,
 			purple_request_cpar_from_connection(gc));
 		purple_connection_set_protocol_data(gc, NULL);
-		silc_free(sg);
+		silcpurple_free(sg);
 		return;
 	}
 
@@ -499,7 +527,7 @@
 		purple_connection_error(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR,
 		                             _("Unable to load SILC key pair"));
 		purple_connection_set_protocol_data(gc, NULL);
-		silc_free(sg);
+		silcpurple_free(sg);
 		return;
 	}
 	silcpurple_continue_running(sg);
@@ -516,7 +544,7 @@
 	purple_connection_error(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR,
 			_("Unable to load SILC key pair"));
 	purple_connection_set_protocol_data(gc, NULL);
-	silc_free(sg);
+	silcpurple_free(sg);
 }
 
 static void silcpurple_running(SilcClient client, void *context)
@@ -545,7 +573,7 @@
 		purple_connection_error(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR,
 		                             _("Unable to load SILC key pair"));
 		purple_connection_set_protocol_data(gc, NULL);
-		silc_free(sg);
+		silcpurple_free(sg);
 		return;
 	}
 	silcpurple_continue_running(sg);
@@ -616,6 +644,7 @@
 	sg = silc_calloc(1, sizeof(*sg));
 	if (!sg)
 		return;
+	sg->cancellable = g_cancellable_new();
 	sg->client = client;
 	sg->gc = gc;
 	sg->account = account;
@@ -627,7 +656,7 @@
 		purple_connection_error(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR,
 		                             _("Unable to initialize SILC protocol"));
 		purple_connection_set_protocol_data(gc, NULL);
-		silc_free(sg);
+		silcpurple_free(sg);
 		silc_free(hostname);
 		g_free(username);
 		return;
@@ -640,20 +669,15 @@
 		purple_connection_error(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR,
 		                             _("Error loading SILC key pair"));
 		purple_connection_set_protocol_data(gc, NULL);
-		silc_free(sg);
+		silcpurple_free(sg);
 		return;
 	}
 
-#if __SILC_TOOLKIT_VERSION < SILC_VERSION(1,1,1)
-	/* Schedule SILC using Glib's event loop */
-	sg->scheduler = g_timeout_add(300, (GSourceFunc)silcpurple_scheduler, client);
-#else
 	/* Run SILC scheduler */
 	sg->tasks = silc_dlist_init();
 	silc_schedule_set_notify(client->schedule, silcpurple_scheduler,
 				 client);
 	silc_client_run_one(client);
-#endif /* __SILC_TOOLKIT_VERSION */
 }
 
 static int
@@ -664,12 +688,8 @@
 	purple_debug_info("silc", "Finalizing SilcPurple %p\n", sg);
 
 	silc_client_stop(sg->client, NULL, NULL);
-	silc_client_free(sg->client);
-	if (sg->sha1hash)
-		silc_hash_free(sg->sha1hash);
-	if (sg->mimeass)
-		silc_mime_assembler_free(sg->mimeass);
-	silc_free(sg);
+
+	silcpurple_free(sg);
 	return 0;
 }
 
@@ -677,9 +697,7 @@
 silcpurple_close(PurpleConnection *gc)
 {
 	SilcPurple sg = purple_connection_get_protocol_data(gc);
-#if __SILC_TOOLKIT_VERSION >= SILC_VERSION(1,1,1)
 	SilcPurpleTask task;
-#endif /* __SILC_TOOLKIT_VERSION */
 	GHashTable *ui_info;
 	const char *ui_name = NULL, *ui_website = NULL;
 	char *quit_msg;
@@ -709,7 +727,6 @@
 	if (sg->conn)
 		silc_client_close_connection(sg->client, sg->conn);
 
-#if __SILC_TOOLKIT_VERSION >= SILC_VERSION(1,1,1)
 	if (sg->conn)
 	  silc_client_run_one(sg->client);
 	silc_schedule_set_notify(sg->client->schedule, NULL, NULL);
@@ -720,7 +737,6 @@
 	  silc_free(task);
 	}
 	silc_dlist_uninit(sg->tasks);
-#endif /* __SILC_TOOLKIT_VERSION */
 
 	if (sg->scheduler)
 		g_source_remove(sg->scheduler);
--- a/libpurple/protocols/silc/silcpurple.h	Mon Nov 04 01:18:24 2019 +0000
+++ b/libpurple/protocols/silc/silcpurple.h	Mon Nov 04 02:24:02 2019 +0000
@@ -37,9 +37,6 @@
 #include "server.h"
 #include "util.h"
 
-#undef SILC_VERSION
-#define SILC_VERSION(a, b, c) (((a) << 24) + ((b) << 16) + ((c) << 8))
-
 #define SILCPURPLE_TYPE_PROTOCOL             (silcpurple_protocol_get_type())
 #define SILCPURPLE_PROTOCOL(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj), SILCPURPLE_TYPE_PROTOCOL, SilcProtocol))
 #define SILCPURPLE_PROTOCOL_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass), SILCPURPLE_TYPE_PROTOCOL, SilcProtocolClass))
@@ -86,6 +83,9 @@
 
 /* The SILC Purple plugin context */
 typedef struct SilcPurpleStruct {
+	GCancellable *cancellable;
+	GSocketConnection *sockconn;
+
 	SilcClient client;
 	SilcClientConnection conn;
 	SilcPublicKey public_key;
--- a/meson.build	Mon Nov 04 01:18:24 2019 +0000
+++ b/meson.build	Mon Nov 04 02:24:02 2019 +0000
@@ -455,7 +455,7 @@
 #######################################################################
 # Check for SILC client includes and libraries
 #######################################################################
-silc = dependency('silcclient', version : '>= 1.1', required : get_option('silc'))
+silc = dependency('silcclient', version : '>= 1.1.1', required : get_option('silc'))
 
 #######################################################################
 # Check for Gadu-Gadu protocol library (libgadu)

mercurial