[prev in list] [next in list] [prev in thread] [next in thread]
List: pidgin-commits
Subject: /pidgin/main: 8ec7c43c0f9f: Merged in CMaiku/pidgin (pull reques...
From: Gary Kramlich <grim () reaperworld ! com>
Date: 2016-10-11 0:33:20
Message-ID: hg.8ec7c43c0f9f.1476146000.-874508059 () rock ! pidgin ! im
[Download RAW message or body]
Changeset: 8ec7c43c0f9fbd8443a73c66a86ff5bdff20d1bb
Author: Gary Kramlich <grim@reaperworld.com>
Date: 2016-10-10 19:32 -0500
Branch: default
URL: https://hg.pidgin.im/pidgin/main/rev/8ec7c43c0f9f
Description:
Merged in CMaiku/pidgin (pull request #125)
Port PurpleSocket usage Gio and remove it
diffstat:
doc/reference/libpurple/libpurple-docs.xml | 1 -
libpurple/Makefile.am | 2 -
libpurple/Makefile.mingw | 1 -
libpurple/connection.c | 1 -
libpurple/core.c | 2 -
libpurple/http.c | 233 ++++++++++++----
libpurple/internal.h | 25 -
libpurple/protocols/gg/tcpsocket.c | 196 +++++++++++--
libpurple/purple-gio.c | 16 +-
libpurple/purple-socket.c | 410 -----------------------------
libpurple/purple-socket.h | 217 ---------------
po/POTFILES.in | 1 -
12 files changed, 347 insertions(+), 758 deletions(-)
diffs (truncated from 1481 to 300 lines):
diff --git a/doc/reference/libpurple/libpurple-docs.xml b/doc/reference/libpurple/libpurple-docs.xml
--- a/doc/reference/libpurple/libpurple-docs.xml
+++ b/doc/reference/libpurple/libpurple-docs.xml
@@ -51,7 +51,6 @@
<xi:include href="xml/eventloop.xml" />
<xi:include href="xml/group.xml" />
<xi:include href="xml/xfer.xml" />
- <xi:include href="xml/purple-socket.xml" />
<xi:include href="xml/http.xml" />
<xi:include href="xml/idle.xml" />
<xi:include href="xml/keyring.xml" />
diff --git a/libpurple/Makefile.am b/libpurple/Makefile.am
--- a/libpurple/Makefile.am
+++ b/libpurple/Makefile.am
@@ -94,7 +94,6 @@ purple_coresources = \
protocol.c \
protocols.c \
purple-gio.c \
- purple-socket.c \
queuedoutputstream.c \
request.c \
request-datasheet.c \
@@ -179,7 +178,6 @@ purple_coreheaders = \
protocol.h \
protocols.h \
purple-gio.h \
- purple-socket.h \
queuedoutputstream.h \
request.h \
request-datasheet.h \
diff --git a/libpurple/Makefile.mingw b/libpurple/Makefile.mingw
--- a/libpurple/Makefile.mingw
+++ b/libpurple/Makefile.mingw
@@ -115,7 +115,6 @@ C_SRC = \
proxy.c \
protocol.c \
protocols.c \
- purple-socket.c \
request.c \
request-datasheet.c \
roomlist.c \
diff --git a/libpurple/connection.c b/libpurple/connection.c
--- a/libpurple/connection.c
+++ b/libpurple/connection.c
@@ -845,7 +845,6 @@ purple_connection_finalize(GObject *obje
}
purple_http_conn_cancel_all(gc);
- _purple_socket_cancel_with_connection(gc);
purple_proxy_connect_cancel_with_handle(gc);
connections = g_list_remove(connections, gc);
diff --git a/libpurple/core.c b/libpurple/core.c
--- a/libpurple/core.c
+++ b/libpurple/core.c
@@ -190,7 +190,6 @@ purple_core_init(const char *ui)
purple_log_init();
purple_network_init();
purple_pounces_init();
- _purple_socket_init();
purple_proxy_init();
purple_sound_init();
purple_stun_init();
@@ -254,7 +253,6 @@ purple_core_quit(void)
purple_theme_manager_uninit();
purple_xfers_uninit();
purple_proxy_uninit();
- _purple_socket_uninit();
_purple_image_store_uninit();
purple_network_uninit();
diff --git a/libpurple/http.c b/libpurple/http.c
--- a/libpurple/http.c
+++ b/libpurple/http.c
@@ -28,7 +28,7 @@
#include "debug.h"
#include "ntlm.h"
#include "proxy.h"
-#include "purple-socket.h"
+#include "purple-gio.h"
#include <zlib.h>
#ifndef z_const
@@ -57,9 +57,15 @@ typedef struct _PurpleHttpKeepaliveReque
typedef struct _PurpleHttpGzStream PurpleHttpGzStream;
+typedef void (*PurpleHttpSocketConnectCb)(PurpleHttpSocket *hs,
+ const gchar *error, gpointer _hc);
+
struct _PurpleHttpSocket
{
- PurpleSocket *ps;
+ GSocketConnection *conn;
+ GCancellable *cancellable;
+ guint input_source;
+ guint output_source;
gboolean is_busy;
guint use_count;
@@ -175,7 +181,7 @@ struct _PurpleHttpCookieJar
struct _PurpleHttpKeepaliveRequest
{
PurpleConnection *gc;
- PurpleSocketConnectCb cb;
+ PurpleHttpSocketConnectCb cb;
gpointer user_data;
PurpleHttpKeepaliveHost *host;
@@ -247,7 +253,7 @@ gchar * purple_http_cookie_jar_dump(Purp
static PurpleHttpKeepaliveRequest *
purple_http_keepalive_pool_request(PurpleHttpKeepalivePool *pool,
PurpleConnection *gc, const gchar *host, int port, gboolean is_ssl,
- PurpleSocketConnectCb cb, gpointer user_data);
+ PurpleHttpSocketConnectCb cb, gpointer user_data);
static void
purple_http_keepalive_pool_request_cancel(PurpleHttpKeepaliveRequest *req);
static void
@@ -463,23 +469,69 @@ purple_http_socket_hash(const gchar *hos
return g_strdup_printf("%c:%s:%d", (is_ssl ? 'S' : 'R'), host, port);
}
+static void
+purple_http_socket_connect_new_cb(GObject *source, GAsyncResult *res,
+ gpointer user_data)
+{
+ PurpleHttpSocket *hs = user_data;
+ GSocketConnection *conn;
+ PurpleHttpSocketConnectCb cb;
+ gpointer cb_data;
+ GError *error = NULL;
+
+ conn = g_socket_client_connect_to_host_finish(G_SOCKET_CLIENT(source),
+ res, &error);
+
+ cb = g_object_steal_data(source, "cb");
+ cb_data = g_object_steal_data(source, "cb_data");
+
+ if (conn == NULL) {
+ if (!g_error_matches(error,
+ G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+ cb(hs, error->message, cb_data);
+ }
+
+ g_clear_error(&error);
+ return;
+ }
+
+ hs->conn = conn;
+
+ cb(hs, NULL, cb_data);
+}
+
static PurpleHttpSocket *
purple_http_socket_connect_new(PurpleConnection *gc, const gchar *host,
- int port, gboolean is_ssl, PurpleSocketConnectCb cb, gpointer user_data)
+ int port, gboolean is_ssl,
+ PurpleHttpSocketConnectCb cb, gpointer user_data)
{
- PurpleHttpSocket *hs = g_new0(PurpleHttpSocket, 1);
-
- hs->ps = purple_socket_new(gc);
- purple_socket_set_data(hs->ps, "hs", hs);
- purple_socket_set_tls(hs->ps, is_ssl);
- purple_socket_set_host(hs->ps, host);
- purple_socket_set_port(hs->ps, port);
- if (!purple_socket_connect(hs->ps, cb, user_data)) {
- purple_socket_destroy(hs->ps);
- g_free(hs);
+ PurpleHttpSocket *hs;
+ GSocketClient *client;
+ GError *error = NULL;
+
+ client = purple_gio_socket_client_new(
+ purple_connection_get_account(gc), &error);
+
+ if (client == NULL) {
+ purple_debug_error("http", "Error connecting to '%s:%d': %s",
+ host, port, error->message);
+ g_clear_error(&error);
return NULL;
}
+ hs = g_new0(PurpleHttpSocket, 1);
+ hs->cancellable = g_cancellable_new();
+
+ g_socket_client_set_tls(client, is_ssl);
+ g_object_set_data(G_OBJECT(client), "cb", cb);
+ g_object_set_data(G_OBJECT(client), "cb_data", user_data);
+
+ g_socket_client_connect_to_host_async(client,
+ host, port, hs->cancellable,
+ purple_http_socket_connect_new_cb, hs);
+
+ g_object_unref(client);
+
if (purple_debug_is_verbose())
purple_debug_misc("http", "new socket created: %p\n", hs);
@@ -495,7 +547,26 @@ purple_http_socket_close_free(PurpleHttp
if (purple_debug_is_verbose())
purple_debug_misc("http", "destroying socket: %p\n", hs);
- purple_socket_destroy(hs->ps);
+ if (hs->input_source > 0) {
+ g_source_remove(hs->input_source);
+ hs->input_source = 0;
+ }
+
+ if (hs->output_source > 0) {
+ g_source_remove(hs->output_source);
+ hs->output_source = 0;
+ }
+
+ if (hs->cancellable != NULL) {
+ g_cancellable_cancel(hs->cancellable);
+ g_clear_object(&hs->cancellable);
+ }
+
+ if (hs->conn != NULL) {
+ purple_gio_graceful_close(G_IO_STREAM(hs->conn), NULL, NULL);
+ g_clear_object(&hs->conn);
+ }
+
g_free(hs);
}
@@ -682,10 +753,9 @@ static void _purple_http_disconnect(Purp
gboolean is_graceful);
static void _purple_http_gen_headers(PurpleHttpConnection *hc);
-static gboolean _purple_http_recv_loopbody(PurpleHttpConnection *hc, gint fd);
-static void _purple_http_recv(gpointer _hc, gint fd,
- PurpleInputCondition cond);
-static void _purple_http_send(gpointer _hc, gint fd, PurpleInputCondition cond);
+static gboolean _purple_http_recv_loopbody(PurpleHttpConnection *hc);
+static gboolean _purple_http_recv(GObject *source, gpointer _hc);
+static gboolean _purple_http_send(GObject *source, gpointer _hc);
/* closes current connection (if exists), estabilishes one and proceeds with
* request */
@@ -1077,21 +1147,33 @@ static gboolean _purple_http_recv_body(P
return _purple_http_recv_body_data(hc, buf, len);
}
-static gboolean _purple_http_recv_loopbody(PurpleHttpConnection *hc, gint fd)
+static gboolean _purple_http_recv_loopbody(PurpleHttpConnection *hc)
{
int len;
gchar buf[4096];
gboolean got_anything;
-
- len = purple_socket_read(hc->socket->ps, (guchar*)buf, sizeof(buf));
+ GError *error = NULL;
+
+ len = g_pollable_input_stream_read_nonblocking(
+ G_POLLABLE_INPUT_STREAM(
+ g_io_stream_get_input_stream(
+ G_IO_STREAM(hc->socket->conn))),
+ buf, sizeof(buf), hc->socket->cancellable,
+ &error);
got_anything = (len > 0);
- if (len < 0 && errno == EAGAIN)
+ if (len < 0 && (g_error_matches(error,
+ G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK) ||
+ g_error_matches(error,
+ G_IO_ERROR, G_IO_ERROR_CANCELLED))) {
+ g_clear_error(&error);
return FALSE;
+ }
if (len < 0) {
_purple_http_error(hc, _("Error reading from %s: %s"),
- hc->url->host, g_strerror(errno));
+ hc->url->host, error->message);
+ g_clear_error(&error);
return FALSE;
}
@@ -1270,11 +1352,13 @@ static gboolean _purple_http_recv_loopbo
return got_anything;
}
-static void _purple_http_recv(gpointer _hc, gint fd, PurpleInputCondition cond)
+static gboolean _purple_http_recv(GObject *source, gpointer _hc)
{
PurpleHttpConnection *hc = _hc;
- while (_purple_http_recv_loopbody(hc, fd));
+ while (_purple_http_recv_loopbody(hc));
+
+ return G_SOURCE_CONTINUE;
}
static void _purple_http_send_got_data(PurpleHttpConnection *hc,
@@ -1305,17 +1389,19 @@ static void _purple_http_send_got_data(P
hc->request->contents_length = estimated_length;
}
_______________________________________________
Commits mailing list
Commits@pidgin.im
https://pidgin.im/cgi-bin/mailman/listinfo/commits
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic