libpurple/protocols/gg/tcpsocket.c

Sun, 11 Sep 2016 11:25:03 -0500

author
Mike Ruprecht <cmaiku@gmail.com>
date
Sun, 11 Sep 2016 11:25:03 -0500
changeset 38139
42143502b9d0
parent 37417
b29ee022017f
child 38142
1dff6e343f9f
permissions
-rw-r--r--

gg: Port to Gio

This patch ports the Gadu-Gadu protocol plugin to use Gio internally.
Unfortunately libgg deals a lot with raw socket style API, which
isn't ideal. This patch therefore uses the pollable interface.

It would be nice to use the native asynchronous Gio API, but
I'm not certain that's possible without modifying libgg itself.
Perhaps someone more familiar with the protocol plugin would be
able to improve this.

35358
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
1 /* purple
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
2 *
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
3 * Purple is the legal property of its developers, whose names are too numerous
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
4 * to list here. Please refer to the COPYRIGHT file distributed with this
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
5 * source distribution.
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
6 *
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
7 * Component written by Tomek Wasilczyk (http://www.wasilczyk.pl).
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
8 *
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
9 * This file is dual-licensed under the GPL2+ and the X11 (MIT) licences.
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
10 * As a recipient of this file you may choose, which license to receive the
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
11 * code under. As a contributor, you have to ensure the new code is
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
12 * compatible with both.
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
13 *
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
14 * This program is free software; you can redistribute it and/or modify
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
15 * it under the terms of the GNU General Public License as published by
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
16 * the Free Software Foundation; either version 2 of the License, or
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
17 * (at your option) any later version.
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
18 *
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
19 * This program is distributed in the hope that it will be useful,
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
22 * GNU General Public License for more details.
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
23 *
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
24 * You should have received a copy of the GNU General Public License
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
25 * along with this program; if not, write to the Free Software
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
26 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
7beae478c905 Style: fix gg (partially)
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34473
diff changeset
27 */
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
28 #include "tcpsocket.h"
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
29
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
30 #include "gg.h"
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
31
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
32 #include "debug.h"
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
33 #include "purple-gio.h"
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
34
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
35 typedef struct {
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
36 GSocketConnection *conn;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
37 GCancellable *cancellable;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
38 PurpleConnection *gc;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
39 gpointer priv_gg;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
40 } GGPTcpSocketData;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
41
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
42 static void
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
43 ggp_tcp_socket_data_free(GGPTcpSocketData *data)
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
44 {
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
45 g_return_if_fail(data != NULL);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
46
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
47 if (data->cancellable != NULL) {
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
48 g_cancellable_cancel(data->cancellable);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
49 g_clear_object(&data->cancellable);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
50 }
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
51
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
52 if (data->conn != NULL) {
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
53 purple_gio_graceful_close(G_IO_STREAM(data->conn), NULL, NULL);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
54 g_clear_object(&data->conn);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
55 }
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
56
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
57 g_free(data);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
58 }
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
59
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
60 static void
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
61 ggp_tcpsocket_connected(GObject *source, GAsyncResult *res, gpointer user_data)
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
62 {
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
63 GGPTcpSocketData *data = user_data;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
64 GSocketConnection *conn;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
65 GSocket *socket;
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
66 int fd = -1;
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
67 GGPInfo *info;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
68 GError *error = NULL;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
69
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
70 conn = g_socket_client_connect_to_host_finish(G_SOCKET_CLIENT(source),
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
71 res, &error);
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
72
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
73 if (conn == NULL) {
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
74 if (!g_error_matches(error,
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
75 G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
76 purple_debug_error("gg", "socket failed to connect: %s",
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
77 error->message);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
78 }
36068
e9b9320a985a Drop PURPLE_CONNECTION_IS_VALID in favor of (temporary) PURPLE_ASSERT_CONNECTION_IS_VALID
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36067
diff changeset
79
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
80 g_clear_error(&error);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
81 } else {
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
82 data->conn = conn;
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
83
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
84 socket = g_socket_connection_get_socket(data->conn);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
85
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
86 if (socket != NULL) {
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
87 fd = g_socket_get_fd(socket);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
88 }
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
89 }
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
90
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
91 PURPLE_ASSERT_CONNECTION_IS_VALID(data->gc);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
92
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
93 if (!gg_socket_manager_connected(data, data->priv_gg, fd)) {
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
94 purple_debug_error("gg", "socket not handled");
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
95 ggp_tcp_socket_data_free(data);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
96 return;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
97 }
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
98
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
99 info = purple_connection_get_protocol_data(data->gc);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
100
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
101 if (info->inpa > 0) {
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
102 g_source_remove(info->inpa);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
103 info->inpa = 0;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
104 }
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
105
34442
4534c27446e8 Gadu-Gadu: better fit for new API
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34437
diff changeset
106 if (info->session->fd < 0)
4534c27446e8 Gadu-Gadu: better fit for new API
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34437
diff changeset
107 return;
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
108
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
109 /* XXX: This works, but not recommended to use GSocket FDs directly */
34442
4534c27446e8 Gadu-Gadu: better fit for new API
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34437
diff changeset
110 info->inpa = purple_input_add(info->session->fd,
4534c27446e8 Gadu-Gadu: better fit for new API
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34437
diff changeset
111 ggp_tcpsocket_inputcond_gg_to_purple(info->session->check),
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
112 ggp_async_login_handler, data->gc);
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
113 }
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
114
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
115 static void*
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
116 ggp_tcpsocket_connect(void *_gc, const char *host, int port, int is_tls,
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
117 int is_async, void *priv)
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
118 {
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
119 PurpleConnection *gc = _gc;
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
120 GGPTcpSocketData *data;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
121 GSocketClient *client;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
122 GError *error = NULL;
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
123
36068
e9b9320a985a Drop PURPLE_CONNECTION_IS_VALID in favor of (temporary) PURPLE_ASSERT_CONNECTION_IS_VALID
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 36067
diff changeset
124 PURPLE_ASSERT_CONNECTION_IS_VALID(gc);
36067
df9f5de00ea2 PurpleSocket: fix a crash
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35358
diff changeset
125 g_return_val_if_fail(!purple_connection_is_disconnecting(gc), NULL);
df9f5de00ea2 PurpleSocket: fix a crash
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 35358
diff changeset
126
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
127 g_return_val_if_fail(host != NULL, NULL);
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
128 g_return_val_if_fail(is_async, NULL);
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
129
34434
e2b8c80078c0 Fix typo
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34433
diff changeset
130 purple_debug_misc("gg", "ggp_tcpsocket_connect(%p, %s:%d, %s, %p)",
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
131 gc, host, port, is_tls ? "tls" : "tcp", priv);
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
132
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
133 client = purple_gio_socket_client_new(
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
134 purple_connection_get_account(gc), &error);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
135
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
136 if (client == NULL) {
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
137 purple_debug_error("gg", "unable to connect: %s",
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
138 error->message);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
139 g_clear_error(&error);
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
140 return NULL;
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
141 }
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
142
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
143 g_socket_client_set_tls(client, is_tls);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
144
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
145 data = g_new0(GGPTcpSocketData, 1);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
146 data->cancellable = g_cancellable_new();
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
147 data->gc = gc;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
148 data->priv_gg = priv;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
149
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
150 g_socket_client_connect_to_host_async(client, host, port,
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
151 data->cancellable, ggp_tcpsocket_connected, data);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
152 g_object_unref(client);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
153
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
154 return data;
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
155 }
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
156
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
157 static void
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
158 ggp_tcpsocket_close(void *_gc, void *_data)
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
159 {
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
160 GGPTcpSocketData *data = _data;
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
161
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
162 ggp_tcp_socket_data_free(data);
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
163 }
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
164
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
165 static ssize_t
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
166 ggp_tcpsocket_read(void *_gc, void *_data, unsigned char *buffer, size_t bufsize)
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
167 {
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
168 GGPTcpSocketData *data = _data;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
169 GPollableInputStream *input;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
170 gssize ret;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
171 GError *error = NULL;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
172
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
173 if (data->conn == NULL) {
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
174 return -1;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
175 }
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
176
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
177 input = G_POLLABLE_INPUT_STREAM(
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
178 g_io_stream_get_input_stream(G_IO_STREAM(data->conn)));
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
179 ret = g_pollable_input_stream_read_nonblocking(input,
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
180 buffer, bufsize, NULL, &error);
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
181
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
182 if (ret < 0) {
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
183 if (g_error_matches(error,
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
184 G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
185 errno = EAGAIN;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
186 } else {
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
187 purple_debug_error("gg", "socket read error: %s",
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
188 error->message);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
189 }
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
190
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
191 g_clear_error(&error);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
192 }
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
193
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
194 return ret;
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
195 }
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
196
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
197 static ssize_t
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
198 ggp_tcpsocket_write(void *_gc, void *_data, const unsigned char *data_buf, size_t len)
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
199 {
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
200 GGPTcpSocketData *data = _data;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
201 GPollableOutputStream *output;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
202 gssize ret;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
203 GError *error = NULL;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
204
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
205 if (data->conn == NULL) {
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
206 return -1;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
207 }
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
208
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
209 output = G_POLLABLE_OUTPUT_STREAM(
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
210 g_io_stream_get_output_stream(G_IO_STREAM(data->conn)));
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
211 ret = g_pollable_output_stream_write_nonblocking(output,
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
212 data_buf, len, NULL, &error);
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
213
38139
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
214 if (ret < 0) {
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
215 if (g_error_matches(error,
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
216 G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) {
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
217 errno = EAGAIN;
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
218 } else {
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
219 purple_debug_error("gg", "socket write error: %s",
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
220 error->message);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
221 }
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
222
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
223 g_clear_error(&error);
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
224 }
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
225
42143502b9d0 gg: Port to Gio
Mike Ruprecht <cmaiku@gmail.com>
parents: 37417
diff changeset
226 return ret;
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
227 }
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
228
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
229 void
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
230 ggp_tcpsocket_setup(PurpleConnection *gc, struct gg_login_params *glp)
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
231 {
37417
b29ee022017f Require SSL/TLS support. ok'd by elb@
Michael McConville <mmcco@mykolab.com>
parents: 36124
diff changeset
232 glp->socket_manager_type = GG_SOCKET_MANAGER_TYPE_TLS;
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
233 glp->socket_manager.cb_data = gc;
34473
fb04c75906e0 Gadu-Gadu: update code for the new libpurple and libgadu APIs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34442
diff changeset
234 glp->socket_manager.connect_cb = ggp_tcpsocket_connect;
fb04c75906e0 Gadu-Gadu: update code for the new libpurple and libgadu APIs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34442
diff changeset
235 glp->socket_manager.close_cb = ggp_tcpsocket_close;
fb04c75906e0 Gadu-Gadu: update code for the new libpurple and libgadu APIs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34442
diff changeset
236 glp->socket_manager.read_cb = ggp_tcpsocket_read;
fb04c75906e0 Gadu-Gadu: update code for the new libpurple and libgadu APIs
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 34442
diff changeset
237 glp->socket_manager.write_cb = ggp_tcpsocket_write;
34433
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
238 }
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
239
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
240 PurpleInputCondition
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
241 ggp_tcpsocket_inputcond_gg_to_purple(enum gg_check_t check)
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
242 {
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
243 PurpleInputCondition cond = 0;
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
244
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
245 if (check & GG_CHECK_READ)
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
246 cond |= PURPLE_INPUT_READ;
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
247 if (check & GG_CHECK_WRITE)
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
248 cond |= PURPLE_INPUT_WRITE;
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
249
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
250 return cond;
fa2313e5f320 Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff changeset
251 }

mercurial