--- 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 @@
@@ -180,13 +182,21 @@
void nm_release_conn(NMConn *conn)
- g_slist_free_full(conn->requests, (GDestroyNotify)nm_release_request);
+ g_return_if_fail(conn != NULL); + g_slist_free_full(conn->requests, (GDestroyNotify)nm_release_request); + purple_gio_graceful_close(conn->stream, conn->input, + g_clear_object(&conn->input); + g_clear_object(&conn->output); + g_clear_object(&conn->stream); + g_clear_pointer(&conn->addr, g_free); @@ -195,7 +205,7 @@
if (conn == NULL || buff == NULL)
- return conn->write(conn->data, buff, len);
+ return g_output_stream_write(conn->output, buff, len, NULL, NULL); @@ -204,44 +214,21 @@
if (conn == NULL || buff == NULL)
- return conn->read(conn->data, buff, len);
+ return g_input_stream_read(conn->input, buff, len, NULL, NULL); nm_read_all(NMConn * conn, char *buff, int len)
if (conn == NULL || buff == NULL)
- /* Keep reading until buffer is full */
- bytes_read = nm_tcp_read(conn, &buff[total_bytes], bytes_left);
- bytes_left -= bytes_read;
- total_bytes += bytes_read;
+ if (!g_input_stream_read_all(conn->input, buff, len, NULL, NULL, NULL)) { --- 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
typedef struct _NMConn NMConn;
@@ -44,12 +46,11 @@
/* A list of requests currently awaiting a response. */
- /* Data to pass to the callbacks */
- /* Callbacks for reading/writing */
+ /* Connections to server. */ --- 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(); g_hash_table_new_full(g_str_hash, nm_utf8_str_equal,
@@ -81,6 +81,8 @@
nm_deinitialize_user(NMUser * user)
+ g_cancellable_cancel(user->cancellable); nm_release_conn(user->conn);
@@ -104,6 +106,8 @@
nm_conference_list_free(user);
nm_destroy_contact_list(user);
+ g_object_unref(user->cancellable); --- 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 */
+ GCancellable *cancellable; --- 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 "purpleaccountoption.h"
@@ -1672,22 +1672,7 @@
******************************************************************************/
-novell_ssl_connect_error(PurpleSslConnection * gsc,
- PurpleSslErrorType error, gpointer data)
- user = purple_connection_get_protocol_data(gc);
- user->conn->data = NULL;
- purple_connection_ssl_error (gc, error);
-novell_ssl_recv_cb(gpointer data, PurpleSslConnection * gsc,
- PurpleInputCondition condition)
+novell_ssl_recv_cb(GObject *stream, gpointer data) PurpleConnection *gc = data;
@@ -1716,19 +1701,28 @@
-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; - const char *my_addr = NULL;
- if (gc == NULL || gsc == 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)) { + purple_connection_take_error(gc, error); 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);
- purple_ssl_input_add(gsc, novell_ssl_recv_cb, gc);
+ 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, purple_connection_error(gc,
PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
@@ -1754,6 +1756,7 @@
3, NOVELL_CONNECT_STEPS);
/*******************************************************************************
@@ -2167,6 +2170,7 @@
@@ -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); + 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 @@
- purple_ssl_close(user->conn->data);
nm_deinitialize_user(user);