diff options
author | Elliott Sales de Andrade <qulogic@pidgin.im> | 2019-11-02 23:02:26 -0400 |
---|---|---|
committer | Elliott Sales de Andrade <qulogic@pidgin.im> | 2019-11-02 23:02:26 -0400 |
commit | 27e58e02bea4fb8f29c5ae10b9ec0f768943c474 (patch) | |
tree | caff5f09a7c5e37f66a70a9149bf8fd520fb76c5 | |
parent | 84d638c162229cf333909efe73fae066a856adbf (diff) | |
download | pidgin-27e58e02bea4fb8f29c5ae10b9ec0f768943c474.tar.gz |
Convert novell to GIO.
-rw-r--r-- | libpurple/protocols/novell/nmconn.c | 57 | ||||
-rw-r--r-- | libpurple/protocols/novell/nmconn.h | 13 | ||||
-rw-r--r-- | libpurple/protocols/novell/nmuser.c | 6 | ||||
-rw-r--r-- | libpurple/protocols/novell/nmuser.h | 1 | ||||
-rw-r--r-- | libpurple/protocols/novell/novell.c | 71 |
5 files changed, 72 insertions, 76 deletions
diff --git a/libpurple/protocols/novell/nmconn.c b/libpurple/protocols/novell/nmconn.c index 525904a225..b2da68f4a3 100644 --- a/libpurple/protocols/novell/nmconn.c +++ b/libpurple/protocols/novell/nmconn.c @@ -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 @@ nm_create_conn(const char *addr, int port) 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 @@ nm_tcp_write(NMConn * conn, const void *buff, int len) 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 @@ nm_tcp_read(NMConn * conn, void *buff, int len) 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; } diff --git a/libpurple/protocols/novell/nmconn.h b/libpurple/protocols/novell/nmconn.h index dc558b2450..363395ffcf 100644 --- a/libpurple/protocols/novell/nmconn.h +++ b/libpurple/protocols/novell/nmconn.h @@ -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 @@ struct _NMConn /* 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; }; /** diff --git a/libpurple/protocols/novell/nmuser.c b/libpurple/protocols/novell/nmuser.c index 6e3d5627db..7e706d1446 100644 --- a/libpurple/protocols/novell/nmuser.c +++ b/libpurple/protocols/novell/nmuser.c @@ -56,7 +56,7 @@ nm_initialize_user(const char *name, const char *server_addr, 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 @@ nm_initialize_user(const char *name, const char *server_addr, void nm_deinitialize_user(NMUser * user) { + g_cancellable_cancel(user->cancellable); + nm_release_conn(user->conn); if (user->contacts) { @@ -104,6 +106,8 @@ nm_deinitialize_user(NMUser * user) nm_conference_list_free(user); nm_destroy_contact_list(user); + g_object_unref(user->cancellable); + g_free(user); } diff --git a/libpurple/protocols/novell/nmuser.h b/libpurple/protocols/novell/nmuser.h index 7fc8101993..4efc988844 100644 --- a/libpurple/protocols/novell/nmuser.h +++ b/libpurple/protocols/novell/nmuser.h @@ -67,6 +67,7 @@ typedef void (*nm_event_cb) (NMUser * user, NMEvent * event); /* This represents user that we are currently logged in as */ struct _NMUser { + GCancellable *cancellable; char *name; diff --git a/libpurple/protocols/novell/novell.c b/libpurple/protocols/novell/novell.c index 018f4f77ef..4ce92e54ba 100644 --- a/libpurple/protocols/novell/novell.c +++ b/libpurple/protocols/novell/novell.c @@ -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 @@ _show_privacy_locked_error(PurpleConnection *gc, NMUser *user) ******************************************************************************/ 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 @@ novell_ssl_recv_cb(gpointer data, PurpleSslConnection * gsc, } 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; + GError *error = 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)) { + 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 @@ novell_ssl_connected_cb(gpointer data, PurpleSslConnection * gsc, 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 @@ novell_ssl_connected_cb(gpointer data, PurpleSslConnection * gsc, 3, NOVELL_CONNECT_STEPS); g_free(ua); + g_free(my_addr); } /******************************************************************************* @@ -2167,6 +2170,7 @@ novell_login(PurpleAccount * account) const char *server; const char *name; int port; + GError *error = NULL; if (account == NULL) return; @@ -2204,17 +2208,16 @@ novell_login(PurpleAccount * account) 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 @@ novell_close(PurpleConnection * gc) if (user) { conn = user->conn; if (conn) { - purple_ssl_close(user->conn->data); + nm_release_conn(conn); } nm_deinitialize_user(user); } |