Sat, 02 Nov 2019 23:02:26 -0400
Convert novell to GIO.
--- 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); }