Convert novell to GIO.

Sat, 02 Nov 2019 23:02:26 -0400

author
Elliott Sales de Andrade <qulogic@pidgin.im>
date
Sat, 02 Nov 2019 23:02:26 -0400
changeset 40118
621987e8e765
parent 40112
52c9656e40ed
child 40119
2e1969768857

Convert novell to GIO.

libpurple/protocols/novell/nmconn.c file | annotate | diff | comparison | revisions
libpurple/protocols/novell/nmconn.h file | annotate | diff | comparison | revisions
libpurple/protocols/novell/nmuser.c file | annotate | diff | comparison | revisions
libpurple/protocols/novell/nmuser.h file | annotate | diff | comparison | revisions
libpurple/protocols/novell/novell.c file | annotate | diff | comparison | revisions
--- a/libpurple/protocols/novell/nmconn.c	Mon Nov 04 01:18:24 2019 +0000
+++ b/libpurple/protocols/novell/nmconn.c	Sat Nov 02 23:02:26 2019 -0400
@@ -20,9 +20,11 @@
 
 #include <glib.h>
 #include <unistd.h>
-#include <errno.h>
 #include <string.h>
 #include <ctype.h>
+
+#include "purple-gio.h"
+
 #include "nmconn.h"
 
 #ifdef _WIN32
@@ -180,13 +182,21 @@
 
 void nm_release_conn(NMConn *conn)
 {
-	if (conn) {
-		g_slist_free_full(conn->requests, (GDestroyNotify)nm_release_request);
-		conn->requests = NULL;
-		g_free(conn->addr);
-		conn->addr = NULL;
-		g_free(conn);
+	g_return_if_fail(conn != NULL);
+
+	g_slist_free_full(conn->requests, (GDestroyNotify)nm_release_request);
+	conn->requests = NULL;
+
+	if (conn->input) {
+		purple_gio_graceful_close(conn->stream, conn->input,
+					  conn->output);
 	}
+	g_clear_object(&conn->input);
+	g_clear_object(&conn->output);
+	g_clear_object(&conn->stream);
+
+	g_clear_pointer(&conn->addr, g_free);
+	g_free(conn);
 }
 
 int
@@ -195,7 +205,7 @@
 	if (conn == NULL || buff == NULL)
 		return -1;
 
-	return conn->write(conn->data, buff, len);
+	return g_output_stream_write(conn->output, buff, len, NULL, NULL);
 }
 
 int
@@ -204,44 +214,21 @@
 	if (conn == NULL || buff == NULL)
 		return -1;
 
-	return conn->read(conn->data, buff, len);
+	return g_input_stream_read(conn->input, buff, len, NULL, NULL);
 }
 
 NMERR_T
 nm_read_all(NMConn * conn, char *buff, int len)
 {
 	NMERR_T rc = NM_OK;
-	int bytes_left = len;
-	int bytes_read;
-	int total_bytes = 0;
-	int retry = 1000;
 
 	if (conn == NULL || buff == NULL)
 		return NMERR_BAD_PARM;
 
-	/* Keep reading until buffer is full */
-	while (bytes_left) {
-		bytes_read = nm_tcp_read(conn, &buff[total_bytes], bytes_left);
-		if (bytes_read > 0) {
-			bytes_left -= bytes_read;
-			total_bytes += bytes_read;
-		} else {
-			if (errno == EAGAIN) {
-				if (--retry == 0) {
-					rc = NMERR_TCP_READ;
-					break;
-				}
-#ifdef _WIN32
-				Sleep(1);
-#else
-				usleep(1000);
-#endif
-			} else {
-				rc = NMERR_TCP_READ;
-				break;
-			}
-		}
+	if (!g_input_stream_read_all(conn->input, buff, len, NULL, NULL, NULL)) {
+		rc = NMERR_TCP_READ;
 	}
+
 	return rc;
 }
 
--- a/libpurple/protocols/novell/nmconn.h	Mon Nov 04 01:18:24 2019 +0000
+++ b/libpurple/protocols/novell/nmconn.h	Sat Nov 02 23:02:26 2019 -0400
@@ -21,6 +21,8 @@
 #ifndef PURPLE_NOVELL_NMCONN_H
 #define PURPLE_NOVELL_NMCONN_H
 
+#include <gio/gio.h>
+
 typedef struct _NMConn NMConn;
 
 #include "nmfield.h"
@@ -44,12 +46,11 @@
 	/* A list of requests currently awaiting a response. */
 	GSList *requests;
 
-	/*  Data to pass to the callbacks */
-	gpointer data;
-
-	/* Callbacks for reading/writing */
-	nm_ssl_read_cb read;
-	nm_ssl_write_cb write;
+	/* Connections to server. */
+	GSocketClient *client;
+	GIOStream *stream;
+	GInputStream *input;
+	GOutputStream *output;
 };
 
 /**
--- a/libpurple/protocols/novell/nmuser.c	Mon Nov 04 01:18:24 2019 +0000
+++ b/libpurple/protocols/novell/nmuser.c	Sat Nov 02 23:02:26 2019 -0400
@@ -56,7 +56,7 @@
 
 	user = g_new0(NMUser, 1);
 
-
+	user->cancellable = g_cancellable_new();
 
 	user->contacts =
 		g_hash_table_new_full(g_str_hash, nm_utf8_str_equal,
@@ -81,6 +81,8 @@
 void
 nm_deinitialize_user(NMUser * user)
 {
+	g_cancellable_cancel(user->cancellable);
+
 	nm_release_conn(user->conn);
 
 	if (user->contacts) {
@@ -104,6 +106,8 @@
 	nm_conference_list_free(user);
 	nm_destroy_contact_list(user);
 
+	g_object_unref(user->cancellable);
+
 	g_free(user);
 }
 
--- a/libpurple/protocols/novell/nmuser.h	Mon Nov 04 01:18:24 2019 +0000
+++ b/libpurple/protocols/novell/nmuser.h	Sat Nov 02 23:02:26 2019 -0400
@@ -67,6 +67,7 @@
 /* This represents user that we are currently logged in as */
 struct _NMUser
 {
+	GCancellable *cancellable;
 
 	char *name;
 
--- a/libpurple/protocols/novell/novell.c	Mon Nov 04 01:18:24 2019 +0000
+++ b/libpurple/protocols/novell/novell.c	Sat Nov 02 23:02:26 2019 -0400
@@ -27,9 +27,9 @@
 #include "nmuser.h"
 #include "notify.h"
 #include "novell.h"
+#include "purple-gio.h"
 #include "purpleaccountoption.h"
 #include "util.h"
-#include "sslconn.h"
 #include "request.h"
 #include "network.h"
 #include "status.h"
@@ -1672,22 +1672,7 @@
  ******************************************************************************/
 
 static void
-novell_ssl_connect_error(PurpleSslConnection * gsc,
-						 PurpleSslErrorType error, gpointer data)
-{
-	PurpleConnection *gc;
-	NMUser *user;
-
-	gc = data;
-	user = purple_connection_get_protocol_data(gc);
-	user->conn->data = NULL;
-
-	purple_connection_ssl_error (gc, error);
-}
-
-static void
-novell_ssl_recv_cb(gpointer data, PurpleSslConnection * gsc,
-				   PurpleInputCondition condition)
+novell_ssl_recv_cb(GObject *stream, gpointer data)
 {
 	PurpleConnection *gc = data;
 	NMUser *user;
@@ -1716,19 +1701,28 @@
 }
 
 static void
-novell_ssl_connected_cb(gpointer data, PurpleSslConnection * gsc,
-						PurpleInputCondition cond)
+novell_login_callback(GObject *source_object, GAsyncResult *res, gpointer data)
 {
+	GSocketClient *client = G_SOCKET_CLIENT(source_object);
 	PurpleConnection *gc = data;
+	GSocketConnection *sockconn;
 	NMUser *user;
 	NMConn *conn;
 	NMERR_T rc = 0;
 	const char *pwd = NULL;
-	const char *my_addr = NULL;
+	gchar *my_addr = NULL;
 	char *ua = NULL;
-
-	if (gc == NULL || gsc == NULL)
+	GError *error = NULL;
+
+	sockconn = g_socket_client_connect_to_host_finish(client, res, &error);
+	if (sockconn == NULL) {
+		if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+			g_error_free(error);
+		} else {
+			purple_connection_take_error(gc, error);
+		}
 		return;
+	}
 
 	user = purple_connection_get_protocol_data(gc);
 	if ((user == NULL) || (conn = user->conn) == NULL)
@@ -1737,13 +1731,21 @@
 	purple_connection_update_progress(gc, _("Authenticating..."),
 									2, NOVELL_CONNECT_STEPS);
 
-	my_addr = purple_network_get_my_ip(gsc->fd);
+	conn->stream = G_IO_STREAM(sockconn);
+	conn->input = g_io_stream_get_input_stream(conn->stream);
+	conn->output = g_io_stream_get_output_stream(conn->stream);
+
+	my_addr = purple_network_get_my_ip_from_gio(sockconn);
 	pwd = purple_connection_get_password(gc);
 	ua = _user_agent_string();
 
 	rc = nm_send_login(user, pwd, my_addr, ua, _login_resp_cb, NULL);
 	if (rc == NM_OK) {
-		purple_ssl_input_add(gsc, novell_ssl_recv_cb, gc);
+		GSource *source;
+		source = g_pollable_input_stream_create_source(
+		        G_POLLABLE_INPUT_STREAM(conn->input), user->cancellable);
+		g_source_set_callback(source, (GSourceFunc)novell_ssl_recv_cb, gc,
+		                      NULL);
 	} else {
 		purple_connection_error(gc,
 			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
@@ -1754,6 +1756,7 @@
 									3, NOVELL_CONNECT_STEPS);
 
 	g_free(ua);
+	g_free(my_addr);
 }
 
 /*******************************************************************************
@@ -2167,6 +2170,7 @@
 	const char *server;
 	const char *name;
 	int port;
+	GError *error = NULL;
 
 	if (account == NULL)
 		return;
@@ -2204,17 +2208,16 @@
 		purple_connection_update_progress(gc, _("Connecting"),
 										1, NOVELL_CONNECT_STEPS);
 
-		user->conn->read = (nm_ssl_read_cb)purple_ssl_read;
-		user->conn->write = (nm_ssl_write_cb)purple_ssl_write;
-
-		user->conn->data = purple_ssl_connect(
-		        user->client_data, user->conn->addr, user->conn->port,
-		        novell_ssl_connected_cb, novell_ssl_connect_error, gc);
-		if (user->conn->data == NULL) {
-			purple_connection_error(gc,
-				PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT,
-				_("SSL support unavailable"));
+		user->conn->client = purple_gio_socket_client_new(account, &error);
+		if (user->conn->client == NULL) {
+			purple_connection_take_error(gc, error);
+			return;
 		}
+
+		g_socket_client_set_tls(user->conn->client, TRUE);
+		g_socket_client_connect_to_host_async(
+		        user->conn->client, user->conn->addr, user->conn->port,
+		        user->cancellable, novell_login_callback, gc);
 	}
 }
 
@@ -2231,7 +2234,7 @@
 	if (user) {
 		conn = user->conn;
 		if (conn) {
-			purple_ssl_close(user->conn->data);
+			nm_release_conn(conn);
 		}
 		nm_deinitialize_user(user);
 	}

mercurial