Fri, 01 May 2020 12:13:35 -0500
Make sure that internal.h can only be included by libpurple and split out some pieces to purpleprivate.h
|
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 | |
|
40439
e9838d634d5e
Make sure that internal.h can only be included by libpurple and split out some pieces to purpleprivate.h
Gary Kramlich <grim@reaperworld.com>
parents:
40358
diff
changeset
|
32 | #include <purple.h> |
|
e9838d634d5e
Make sure that internal.h can only be included by libpurple and split out some pieces to purpleprivate.h
Gary Kramlich <grim@reaperworld.com>
parents:
40358
diff
changeset
|
33 | #include "purpleprivate.h" |
|
e9838d634d5e
Make sure that internal.h can only be included by libpurple and split out some pieces to purpleprivate.h
Gary Kramlich <grim@reaperworld.com>
parents:
40358
diff
changeset
|
34 | |
| 38139 | 35 | typedef struct { |
| 36 | GSocketConnection *conn; | |
| 37 | GCancellable *cancellable; | |
| 38 | PurpleConnection *gc; | |
| 39 | gpointer priv_gg; | |
| 40 | } GGPTcpSocketData; | |
| 41 | ||
| 42 | static void | |
| 43 | ggp_tcp_socket_data_free(GGPTcpSocketData *data) | |
| 44 | { | |
| 45 | g_return_if_fail(data != NULL); | |
| 46 | ||
| 47 | if (data->cancellable != NULL) { | |
| 48 | g_cancellable_cancel(data->cancellable); | |
| 49 | g_clear_object(&data->cancellable); | |
| 50 | } | |
| 51 | ||
| 52 | if (data->conn != NULL) { | |
| 53 | purple_gio_graceful_close(G_IO_STREAM(data->conn), NULL, NULL); | |
| 54 | g_clear_object(&data->conn); | |
| 55 | } | |
| 56 | ||
| 57 | g_free(data); | |
| 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 | 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 | 63 | GGPTcpSocketData *data = user_data; |
| 64 | GSocketConnection *conn; | |
| 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 | 67 | GGPInfo *info; |
| 68 | GError *error = NULL; | |
| 69 | ||
| 70 | conn = g_socket_client_connect_to_host_finish(G_SOCKET_CLIENT(source), | |
| 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 | 73 | if (conn == NULL) { |
|
38142
1dff6e343f9f
gg: Protect against issues when closing while connecting
Mike Ruprecht <cmaiku@gmail.com>
parents:
38139
diff
changeset
|
74 | if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { |
|
1dff6e343f9f
gg: Protect against issues when closing while connecting
Mike Ruprecht <cmaiku@gmail.com>
parents:
38139
diff
changeset
|
75 | /* The connection was already closed, return now */ |
|
1dff6e343f9f
gg: Protect against issues when closing while connecting
Mike Ruprecht <cmaiku@gmail.com>
parents:
38139
diff
changeset
|
76 | g_clear_error(&error); |
|
1dff6e343f9f
gg: Protect against issues when closing while connecting
Mike Ruprecht <cmaiku@gmail.com>
parents:
38139
diff
changeset
|
77 | return; |
| 38139 | 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 | |
|
38142
1dff6e343f9f
gg: Protect against issues when closing while connecting
Mike Ruprecht <cmaiku@gmail.com>
parents:
38139
diff
changeset
|
80 | purple_debug_error("gg", "socket failed to connect: %s", |
|
1dff6e343f9f
gg: Protect against issues when closing while connecting
Mike Ruprecht <cmaiku@gmail.com>
parents:
38139
diff
changeset
|
81 | error->message); |
| 38139 | 82 | g_clear_error(&error); |
| 83 | } else { | |
| 84 | 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
|
85 | |
| 38139 | 86 | socket = g_socket_connection_get_socket(data->conn); |
| 87 | ||
| 88 | if (socket != NULL) { | |
| 89 | fd = g_socket_get_fd(socket); | |
| 90 | } | |
|
34433
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
91 | } |
|
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
92 | |
|
38142
1dff6e343f9f
gg: Protect against issues when closing while connecting
Mike Ruprecht <cmaiku@gmail.com>
parents:
38139
diff
changeset
|
93 | /* XXX: For some reason if you try to connect and then immediately |
|
1dff6e343f9f
gg: Protect against issues when closing while connecting
Mike Ruprecht <cmaiku@gmail.com>
parents:
38139
diff
changeset
|
94 | * disconnect, this gets into a state where ggp_tcpsocket_close() |
|
1dff6e343f9f
gg: Protect against issues when closing while connecting
Mike Ruprecht <cmaiku@gmail.com>
parents:
38139
diff
changeset
|
95 | * isn't called. The cancellable is therefore not cancelled, and |
|
1dff6e343f9f
gg: Protect against issues when closing while connecting
Mike Ruprecht <cmaiku@gmail.com>
parents:
38139
diff
changeset
|
96 | * the connection is never closed. Guard against that state here. |
|
1dff6e343f9f
gg: Protect against issues when closing while connecting
Mike Ruprecht <cmaiku@gmail.com>
parents:
38139
diff
changeset
|
97 | */ |
|
1dff6e343f9f
gg: Protect against issues when closing while connecting
Mike Ruprecht <cmaiku@gmail.com>
parents:
38139
diff
changeset
|
98 | if (data->gc == NULL || |
|
1dff6e343f9f
gg: Protect against issues when closing while connecting
Mike Ruprecht <cmaiku@gmail.com>
parents:
38139
diff
changeset
|
99 | !g_list_find(purple_connections_get_all(), data->gc)) { |
|
1dff6e343f9f
gg: Protect against issues when closing while connecting
Mike Ruprecht <cmaiku@gmail.com>
parents:
38139
diff
changeset
|
100 | purple_debug_error("gg", |
|
1dff6e343f9f
gg: Protect against issues when closing while connecting
Mike Ruprecht <cmaiku@gmail.com>
parents:
38139
diff
changeset
|
101 | "disconnected without closing connection: %p", |
|
1dff6e343f9f
gg: Protect against issues when closing while connecting
Mike Ruprecht <cmaiku@gmail.com>
parents:
38139
diff
changeset
|
102 | data); |
|
1dff6e343f9f
gg: Protect against issues when closing while connecting
Mike Ruprecht <cmaiku@gmail.com>
parents:
38139
diff
changeset
|
103 | ggp_tcp_socket_data_free(data); |
|
1dff6e343f9f
gg: Protect against issues when closing while connecting
Mike Ruprecht <cmaiku@gmail.com>
parents:
38139
diff
changeset
|
104 | return; |
|
1dff6e343f9f
gg: Protect against issues when closing while connecting
Mike Ruprecht <cmaiku@gmail.com>
parents:
38139
diff
changeset
|
105 | } |
| 38139 | 106 | |
| 107 | if (!gg_socket_manager_connected(data, data->priv_gg, fd)) { | |
| 108 | purple_debug_error("gg", "socket not handled"); | |
| 109 | ggp_tcp_socket_data_free(data); | |
| 110 | return; | |
| 111 | } | |
| 112 | ||
| 113 | info = purple_connection_get_protocol_data(data->gc); | |
| 114 | ||
| 115 | if (info->inpa > 0) { | |
| 116 | g_source_remove(info->inpa); | |
| 117 | info->inpa = 0; | |
| 118 | } | |
| 119 | ||
|
34442
4534c27446e8
Gadu-Gadu: better fit for new API
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
34437
diff
changeset
|
120 | if (info->session->fd < 0) |
|
4534c27446e8
Gadu-Gadu: better fit for new API
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
34437
diff
changeset
|
121 | return; |
| 38139 | 122 | |
| 123 | /* 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
|
124 | 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
|
125 | ggp_tcpsocket_inputcond_gg_to_purple(info->session->check), |
| 38139 | 126 | 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
|
127 | } |
|
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
128 | |
|
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
129 | static void* |
|
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
130 | 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
|
131 | 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
|
132 | { |
|
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
133 | PurpleConnection *gc = _gc; |
| 38139 | 134 | GGPTcpSocketData *data; |
| 135 | GSocketClient *client; | |
| 136 | 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
|
137 | |
|
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
|
138 | PURPLE_ASSERT_CONNECTION_IS_VALID(gc); |
|
36067
df9f5de00ea2
PurpleSocket: fix a crash
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35358
diff
changeset
|
139 | 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
|
140 | |
|
34433
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
141 | 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
|
142 | 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
|
143 | |
| 34434 | 144 | 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
|
145 | 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
|
146 | |
| 38139 | 147 | client = purple_gio_socket_client_new( |
| 148 | purple_connection_get_account(gc), &error); | |
| 149 | ||
| 150 | if (client == NULL) { | |
| 151 | purple_debug_error("gg", "unable to connect: %s", | |
| 152 | error->message); | |
| 153 | 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
|
154 | return NULL; |
|
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 | |
| 38139 | 157 | g_socket_client_set_tls(client, is_tls); |
| 158 | ||
| 159 | data = g_new0(GGPTcpSocketData, 1); | |
| 160 | data->cancellable = g_cancellable_new(); | |
| 161 | data->gc = gc; | |
| 162 | data->priv_gg = priv; | |
| 163 | ||
| 164 | g_socket_client_connect_to_host_async(client, host, port, | |
| 165 | data->cancellable, ggp_tcpsocket_connected, data); | |
| 166 | g_object_unref(client); | |
| 167 | ||
| 168 | 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
|
169 | } |
|
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
170 | |
|
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
171 | static void |
| 38139 | 172 | 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
|
173 | { |
| 38139 | 174 | 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
|
175 | |
| 38139 | 176 | 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
|
177 | } |
|
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
178 | |
|
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
179 | static ssize_t |
| 38139 | 180 | 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
|
181 | { |
| 38139 | 182 | GGPTcpSocketData *data = _data; |
| 183 | GPollableInputStream *input; | |
| 184 | gssize ret; | |
| 185 | GError *error = NULL; | |
| 186 | ||
| 187 | if (data->conn == NULL) { | |
| 188 | return -1; | |
| 189 | } | |
| 190 | ||
| 191 | input = G_POLLABLE_INPUT_STREAM( | |
| 192 | g_io_stream_get_input_stream(G_IO_STREAM(data->conn))); | |
| 193 | ret = g_pollable_input_stream_read_nonblocking(input, | |
| 194 | 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
|
195 | |
| 38139 | 196 | if (ret < 0) { |
| 197 | if (g_error_matches(error, | |
| 198 | G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) { | |
| 199 | errno = EAGAIN; | |
| 200 | } else { | |
| 201 | purple_debug_error("gg", "socket read error: %s", | |
| 202 | error->message); | |
| 203 | } | |
| 204 | ||
| 205 | g_clear_error(&error); | |
| 206 | } | |
| 207 | ||
| 208 | 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
|
209 | } |
|
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
210 | |
|
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
211 | static ssize_t |
| 38139 | 212 | 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
|
213 | { |
| 38139 | 214 | GGPTcpSocketData *data = _data; |
| 215 | GPollableOutputStream *output; | |
| 216 | gssize ret; | |
| 217 | GError *error = NULL; | |
| 218 | ||
| 219 | if (data->conn == NULL) { | |
| 220 | return -1; | |
| 221 | } | |
| 222 | ||
| 223 | output = G_POLLABLE_OUTPUT_STREAM( | |
| 224 | g_io_stream_get_output_stream(G_IO_STREAM(data->conn))); | |
| 225 | ret = g_pollable_output_stream_write_nonblocking(output, | |
| 226 | 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
|
227 | |
| 38139 | 228 | if (ret < 0) { |
| 229 | if (g_error_matches(error, | |
| 230 | G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) { | |
| 231 | errno = EAGAIN; | |
| 232 | } else { | |
| 233 | purple_debug_error("gg", "socket write error: %s", | |
| 234 | error->message); | |
| 235 | } | |
| 236 | ||
| 237 | g_clear_error(&error); | |
| 238 | } | |
| 239 | ||
| 240 | 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
|
241 | } |
|
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 | void |
|
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
244 | 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
|
245 | { |
|
37417
b29ee022017f
Require SSL/TLS support. ok'd by elb@
Michael McConville <mmcco@mykolab.com>
parents:
36124
diff
changeset
|
246 | 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
|
247 | 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
|
248 | 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
|
249 | 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
|
250 | 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
|
251 | 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
|
252 | } |
|
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
253 | |
|
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
254 | PurpleInputCondition |
|
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
255 | 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
|
256 | { |
|
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
257 | 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
|
258 | |
|
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
259 | 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
|
260 | 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
|
261 | 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
|
262 | 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
|
263 | |
|
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
264 | return cond; |
|
fa2313e5f320
Gadu-Gadu: use our own proxy/tls connecting code instead of libgadu's
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
diff
changeset
|
265 | } |