pidgin/pidgin

Convert novell to GIO.

2019-11-02, Elliott Sales de Andrade
621987e8e765
Parents 52c9656e40ed
Children 2e1969768857
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);
}