Sun, 11 Sep 2016 11:25:03 -0500
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 | 33 | #include "purple-gio.h" |
| 34 | ||
| 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) { |
| 74 | if (!g_error_matches(error, | |
| 75 | G_IO_ERROR, G_IO_ERROR_CANCELLED)) { | |
| 76 | purple_debug_error("gg", "socket failed to connect: %s", | |
| 77 | error->message); | |
| 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 | 80 | g_clear_error(&error); |
| 81 | } else { | |
| 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 | 84 | socket = g_socket_connection_get_socket(data->conn); |
| 85 | ||
| 86 | if (socket != NULL) { | |
| 87 | fd = g_socket_get_fd(socket); | |
| 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 | 91 | PURPLE_ASSERT_CONNECTION_IS_VALID(data->gc); |
| 92 | ||
| 93 | if (!gg_socket_manager_connected(data, data->priv_gg, fd)) { | |
| 94 | purple_debug_error("gg", "socket not handled"); | |
| 95 | ggp_tcp_socket_data_free(data); | |
| 96 | return; | |
| 97 | } | |
| 98 | ||
| 99 | info = purple_connection_get_protocol_data(data->gc); | |
| 100 | ||
| 101 | if (info->inpa > 0) { | |
| 102 | g_source_remove(info->inpa); | |
| 103 | info->inpa = 0; | |
| 104 | } | |
| 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 | 108 | |
| 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 | 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 | 120 | GGPTcpSocketData *data; |
| 121 | GSocketClient *client; | |
| 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 | 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 | 133 | client = purple_gio_socket_client_new( |
| 134 | purple_connection_get_account(gc), &error); | |
| 135 | ||
| 136 | if (client == NULL) { | |
| 137 | purple_debug_error("gg", "unable to connect: %s", | |
| 138 | error->message); | |
| 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 | 143 | g_socket_client_set_tls(client, is_tls); |
| 144 | ||
| 145 | data = g_new0(GGPTcpSocketData, 1); | |
| 146 | data->cancellable = g_cancellable_new(); | |
| 147 | data->gc = gc; | |
| 148 | data->priv_gg = priv; | |
| 149 | ||
| 150 | g_socket_client_connect_to_host_async(client, host, port, | |
| 151 | data->cancellable, ggp_tcpsocket_connected, data); | |
| 152 | g_object_unref(client); | |
| 153 | ||
| 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 | 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 | 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 | 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 | 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 | 168 | GGPTcpSocketData *data = _data; |
| 169 | GPollableInputStream *input; | |
| 170 | gssize ret; | |
| 171 | GError *error = NULL; | |
| 172 | ||
| 173 | if (data->conn == NULL) { | |
| 174 | return -1; | |
| 175 | } | |
| 176 | ||
| 177 | input = G_POLLABLE_INPUT_STREAM( | |
| 178 | g_io_stream_get_input_stream(G_IO_STREAM(data->conn))); | |
| 179 | ret = g_pollable_input_stream_read_nonblocking(input, | |
| 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 | 182 | if (ret < 0) { |
| 183 | if (g_error_matches(error, | |
| 184 | G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) { | |
| 185 | errno = EAGAIN; | |
| 186 | } else { | |
| 187 | purple_debug_error("gg", "socket read error: %s", | |
| 188 | error->message); | |
| 189 | } | |
| 190 | ||
| 191 | g_clear_error(&error); | |
| 192 | } | |
| 193 | ||
| 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 | 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 | 200 | GGPTcpSocketData *data = _data; |
| 201 | GPollableOutputStream *output; | |
| 202 | gssize ret; | |
| 203 | GError *error = NULL; | |
| 204 | ||
| 205 | if (data->conn == NULL) { | |
| 206 | return -1; | |
| 207 | } | |
| 208 | ||
| 209 | output = G_POLLABLE_OUTPUT_STREAM( | |
| 210 | g_io_stream_get_output_stream(G_IO_STREAM(data->conn))); | |
| 211 | ret = g_pollable_output_stream_write_nonblocking(output, | |
| 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 | 214 | if (ret < 0) { |
| 215 | if (g_error_matches(error, | |
| 216 | G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) { | |
| 217 | errno = EAGAIN; | |
| 218 | } else { | |
| 219 | purple_debug_error("gg", "socket write error: %s", | |
| 220 | error->message); | |
| 221 | } | |
| 222 | ||
| 223 | g_clear_error(&error); | |
| 224 | } | |
| 225 | ||
| 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 | } |