Wed, 08 Jul 2009 20:44:16 +0000
Oh, we don't need a special ui_info field for the AIM clientstring
because we can just concat the name and version. And set the distids
for libpurple, Pidgin and Finch
AOL would like Adium to use 1551 (0x060f)
| 13235 | 1 | /* |
| 15884 | 2 | * Purple's oscar protocol plugin |
| 13235 | 3 | * This file is the legal property of its developers. |
| 4 | * Please see the AUTHORS file distributed alongside this file. | |
| 5 | * | |
| 6 | * This library is free software; you can redistribute it and/or | |
| 7 | * modify it under the terms of the GNU Lesser General Public | |
| 8 | * License as published by the Free Software Foundation; either | |
| 9 | * version 2 of the License, or (at your option) any later version. | |
| 10 | * | |
| 11 | * This library is distributed in the hope that it will be useful, | |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 14 | * Lesser General Public License for more details. | |
| 15 | * | |
| 16 | * You should have received a copy of the GNU Lesser General Public | |
| 17 | * License along with this library; if not, write to the Free Software | |
|
19859
71d37b57eff2
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
19855
diff
changeset
|
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
| 13235 | 19 | */ |
| 20 | ||
| 21 | /* | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
22 | * Functions dealing with peer connections. This includes the code |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
23 | * used to establish a peer connection for both Oscar File transfer |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
24 | * (OFT) and Oscar Direct Connect (ODC). (ODC is also referred to |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
25 | * as DirectIM and IM Image.) |
| 13235 | 26 | */ |
| 27 | ||
| 28 | #ifdef HAVE_CONFIG_H | |
| 29 | #include <config.h> | |
| 30 | #endif | |
| 31 | ||
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
32 | /* From the oscar PRPL */ |
| 13235 | 33 | #include "oscar.h" |
| 34 | #include "peer.h" | |
| 35 | ||
| 15884 | 36 | /* From Purple */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
37 | #include "conversation.h" |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
38 | #include "ft.h" |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
39 | #include "network.h" |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
40 | #include "notify.h" |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
41 | #include "request.h" |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
42 | #include "util.h" |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
43 | |
| 13235 | 44 | #ifndef _WIN32 |
| 45 | #include <stdio.h> | |
| 46 | #include <netdb.h> | |
| 47 | #include <sys/socket.h> | |
| 48 | #include <netinet/in.h> | |
| 49 | #include <arpa/inet.h> /* for inet_ntoa */ | |
| 50 | #include <limits.h> /* for UINT_MAX */ | |
| 51 | #endif | |
| 52 | ||
| 53 | #ifdef _WIN32 | |
| 54 | #include "win32dep.h" | |
| 55 | #endif | |
| 56 | ||
| 57 | /* | |
| 58 | * I really want to switch all our networking code to using IPv6 only, | |
| 59 | * but that really isn't a good idea at all. Evan S. of Adium says | |
| 60 | * OS X sets all connections as "AF_INET6/PF_INET6," even if there is | |
| 61 | * nothing inherently IPv6 about them. And I feel like Linux kernel | |
| 62 | * 2.6.5 is doing the same thing. So we REALLY should accept | |
| 63 | * connections if they're showing up as IPv6. Old OSes (Solaris?) | |
| 64 | * that might not have full IPv6 support yet will fail if we try | |
| 65 | * to use PF_INET6 but it isn't defined. --Mark Doliner | |
| 66 | */ | |
| 67 | #ifndef PF_INET6 | |
| 68 | #define PF_INET6 PF_INET | |
| 69 | #endif | |
| 70 | ||
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
71 | PeerConnection * |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
72 | peer_connection_find_by_type(OscarData *od, const char *bn, OscarCapability type) |
| 13235 | 73 | { |
|
14410
a5ae93474db6
[gaim-migrate @ 17050]
Mark Doliner <markdoliner@pidgin.im>
parents:
14329
diff
changeset
|
74 | GSList *cur; |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
75 | PeerConnection *conn; |
| 13235 | 76 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
77 | for (cur = od->peer_connections; cur != NULL; cur = cur->next) |
|
13255
b318f395092d
[gaim-migrate @ 15620]
Mark Doliner <markdoliner@pidgin.im>
parents:
13254
diff
changeset
|
78 | { |
|
b318f395092d
[gaim-migrate @ 15620]
Mark Doliner <markdoliner@pidgin.im>
parents:
13254
diff
changeset
|
79 | conn = cur->data; |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
80 | if ((conn->type == type) && !oscar_util_name_compare(conn->bn, bn)) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
81 | return conn; |
| 13235 | 82 | } |
| 83 | ||
| 84 | return NULL; | |
| 85 | } | |
| 86 | ||
| 87 | /** | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
88 | * @param cookie This must be exactly 8 characters. |
| 13235 | 89 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
90 | PeerConnection * |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
91 | peer_connection_find_by_cookie(OscarData *od, const char *bn, const guchar *cookie) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
92 | { |
|
14410
a5ae93474db6
[gaim-migrate @ 17050]
Mark Doliner <markdoliner@pidgin.im>
parents:
14329
diff
changeset
|
93 | GSList *cur; |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
94 | PeerConnection *conn; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
95 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
96 | for (cur = od->peer_connections; cur != NULL; cur = cur->next) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
97 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
98 | conn = cur->data; |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
99 | if (!memcmp(conn->cookie, cookie, 8) && !oscar_util_name_compare(conn->bn, bn)) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
100 | return conn; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
101 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
102 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
103 | return NULL; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
104 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
105 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
106 | PeerConnection * |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
107 | peer_connection_new(OscarData *od, OscarCapability type, const char *bn) |
| 13235 | 108 | { |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
109 | PeerConnection *conn; |
| 15884 | 110 | PurpleAccount *account; |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
111 | |
| 15884 | 112 | account = purple_connection_get_account(od->gc); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
113 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
114 | conn = g_new0(PeerConnection, 1); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
115 | conn->od = od; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
116 | conn->type = type; |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
117 | conn->bn = g_strdup(bn); |
| 15884 | 118 | conn->buffer_outgoing = purple_circ_buffer_new(0); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
119 | conn->listenerfd = -1; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
120 | conn->fd = -1; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
121 | conn->lastactivity = time(NULL); |
| 15884 | 122 | conn->use_proxy |= purple_account_get_bool(account, "always_use_rv_proxy", FALSE); |
| 13235 | 123 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
124 | if (type == OSCAR_CAPABILITY_DIRECTIM) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
125 | memcpy(conn->magic, "ODC2", 4); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
126 | else if (type == OSCAR_CAPABILITY_SENDFILE) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
127 | memcpy(conn->magic, "OFT2", 4); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
128 | |
|
14410
a5ae93474db6
[gaim-migrate @ 17050]
Mark Doliner <markdoliner@pidgin.im>
parents:
14329
diff
changeset
|
129 | od->peer_connections = g_slist_prepend(od->peer_connections, conn); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
130 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
131 | return conn; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
132 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
133 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
134 | static void |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
135 | peer_connection_close(PeerConnection *conn) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
136 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
137 | if (conn->type == OSCAR_CAPABILITY_DIRECTIM) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
138 | peer_odc_close(conn); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
139 | else if (conn->type == OSCAR_CAPABILITY_SENDFILE) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
140 | peer_oft_close(conn); |
| 13235 | 141 | |
| 15173 | 142 | if (conn->verified_connect_data != NULL) |
|
14166
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
143 | { |
| 15884 | 144 | purple_proxy_connect_cancel(conn->verified_connect_data); |
| 15173 | 145 | conn->verified_connect_data = NULL; |
| 146 | } | |
| 147 | ||
| 148 | if (conn->client_connect_data != NULL) | |
| 149 | { | |
| 15884 | 150 | purple_proxy_connect_cancel(conn->client_connect_data); |
| 15173 | 151 | conn->client_connect_data = NULL; |
|
14166
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
152 | } |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
153 | |
|
14329
05c3cc0c1f79
[gaim-migrate @ 16949]
Mark Doliner <markdoliner@pidgin.im>
parents:
14324
diff
changeset
|
154 | if (conn->listen_data != NULL) |
|
05c3cc0c1f79
[gaim-migrate @ 16949]
Mark Doliner <markdoliner@pidgin.im>
parents:
14324
diff
changeset
|
155 | { |
| 15884 | 156 | purple_network_listen_cancel(conn->listen_data); |
|
14329
05c3cc0c1f79
[gaim-migrate @ 16949]
Mark Doliner <markdoliner@pidgin.im>
parents:
14324
diff
changeset
|
157 | conn->listen_data = NULL; |
|
05c3cc0c1f79
[gaim-migrate @ 16949]
Mark Doliner <markdoliner@pidgin.im>
parents:
14324
diff
changeset
|
158 | } |
|
05c3cc0c1f79
[gaim-migrate @ 16949]
Mark Doliner <markdoliner@pidgin.im>
parents:
14324
diff
changeset
|
159 | |
|
14166
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
160 | if (conn->connect_timeout_timer != 0) |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
161 | { |
| 15884 | 162 | purple_timeout_remove(conn->connect_timeout_timer); |
|
14166
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
163 | conn->connect_timeout_timer = 0; |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
164 | } |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
165 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
166 | if (conn->watcher_incoming != 0) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
167 | { |
| 15884 | 168 | purple_input_remove(conn->watcher_incoming); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
169 | conn->watcher_incoming = 0; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
170 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
171 | if (conn->watcher_outgoing != 0) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
172 | { |
| 15884 | 173 | purple_input_remove(conn->watcher_outgoing); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
174 | conn->watcher_outgoing = 0; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
175 | } |
|
17539
0fd875385856
Only check for EAGAIN if send returns -1, not when it returns 0
Mark Doliner <markdoliner@pidgin.im>
parents:
16490
diff
changeset
|
176 | if (conn->listenerfd >= 0) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
177 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
178 | close(conn->listenerfd); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
179 | conn->listenerfd = -1; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
180 | } |
|
17539
0fd875385856
Only check for EAGAIN if send returns -1, not when it returns 0
Mark Doliner <markdoliner@pidgin.im>
parents:
16490
diff
changeset
|
181 | if (conn->fd >= 0) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
182 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
183 | close(conn->fd); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
184 | conn->fd = -1; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
185 | } |
| 13235 | 186 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
187 | g_free(conn->buffer_incoming.data); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
188 | conn->buffer_incoming.data = NULL; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
189 | conn->buffer_incoming.len = 0; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
190 | conn->buffer_incoming.offset = 0; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
191 | |
| 15884 | 192 | purple_circ_buffer_destroy(conn->buffer_outgoing); |
| 193 | conn->buffer_outgoing = purple_circ_buffer_new(0); | |
| 13235 | 194 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
195 | conn->flags &= ~PEER_CONNECTION_FLAG_IS_INCOMING; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
196 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
197 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
198 | static gboolean |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
199 | peer_connection_destroy_cb(gpointer data) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
200 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
201 | PeerConnection *conn; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
202 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
203 | conn = data; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
204 | |
| 15884 | 205 | purple_request_close_with_handle(conn); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
206 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
207 | peer_connection_close(conn); |
| 13235 | 208 | |
|
15354
52ba52a13827
[gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents:
15345
diff
changeset
|
209 | if (conn->checksum_data != NULL) |
|
52ba52a13827
[gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents:
15345
diff
changeset
|
210 | peer_oft_checksum_destroy(conn->checksum_data); |
|
52ba52a13827
[gaim-migrate @ 18083]
Mark Doliner <markdoliner@pidgin.im>
parents:
15345
diff
changeset
|
211 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
212 | if (conn->xfer != NULL) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
213 | { |
| 15884 | 214 | PurpleXferStatusType status; |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
215 | conn->xfer->data = NULL; |
| 15884 | 216 | status = purple_xfer_get_status(conn->xfer); |
| 217 | if ((status != PURPLE_XFER_STATUS_DONE) && | |
| 218 | (status != PURPLE_XFER_STATUS_CANCEL_LOCAL) && | |
| 219 | (status != PURPLE_XFER_STATUS_CANCEL_REMOTE)) | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
220 | { |
|
13609
a6fbfad454b6
[gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents:
13593
diff
changeset
|
221 | if ((conn->disconnect_reason == OSCAR_DISCONNECT_REMOTE_CLOSED) || |
|
a6fbfad454b6
[gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents:
13593
diff
changeset
|
222 | (conn->disconnect_reason == OSCAR_DISCONNECT_REMOTE_REFUSED)) |
| 15884 | 223 | purple_xfer_cancel_remote(conn->xfer); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
224 | else |
| 15884 | 225 | purple_xfer_cancel_local(conn->xfer); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
226 | } |
| 15884 | 227 | purple_xfer_unref(conn->xfer); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
228 | conn->xfer = NULL; |
| 13235 | 229 | } |
| 230 | ||
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
231 | g_free(conn->bn); |
|
14464
b7bca43f75b3
[gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents:
14410
diff
changeset
|
232 | g_free(conn->error_message); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
233 | g_free(conn->proxyip); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
234 | g_free(conn->clientip); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
235 | g_free(conn->verifiedip); |
|
15322
cd268e368bc1
[gaim-migrate @ 18050]
Mark Doliner <markdoliner@pidgin.im>
parents:
15256
diff
changeset
|
236 | g_free(conn->xferdata.name); |
| 15884 | 237 | purple_circ_buffer_destroy(conn->buffer_outgoing); |
| 13235 | 238 | |
|
14410
a5ae93474db6
[gaim-migrate @ 17050]
Mark Doliner <markdoliner@pidgin.im>
parents:
14329
diff
changeset
|
239 | conn->od->peer_connections = g_slist_remove(conn->od->peer_connections, conn); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
240 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
241 | g_free(conn); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
242 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
243 | return FALSE; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
244 | } |
| 13235 | 245 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
246 | void |
|
14464
b7bca43f75b3
[gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents:
14410
diff
changeset
|
247 | peer_connection_destroy(PeerConnection *conn, OscarDisconnectReason reason, const gchar *error_message) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
248 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
249 | if (conn->destroy_timeout != 0) |
| 15884 | 250 | purple_timeout_remove(conn->destroy_timeout); |
|
14464
b7bca43f75b3
[gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents:
14410
diff
changeset
|
251 | conn->disconnect_reason = reason; |
|
b7bca43f75b3
[gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents:
14410
diff
changeset
|
252 | g_free(conn->error_message); |
|
b7bca43f75b3
[gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents:
14410
diff
changeset
|
253 | conn->error_message = g_strdup(error_message); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
254 | peer_connection_destroy_cb(conn); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
255 | } |
| 13235 | 256 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
257 | void |
|
14464
b7bca43f75b3
[gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents:
14410
diff
changeset
|
258 | peer_connection_schedule_destroy(PeerConnection *conn, OscarDisconnectReason reason, const gchar *error_message) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
259 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
260 | if (conn->destroy_timeout != 0) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
261 | /* Already taken care of */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
262 | return; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
263 | |
| 15884 | 264 | purple_debug_info("oscar", "Scheduling destruction of peer connection\n"); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
265 | conn->disconnect_reason = reason; |
|
14464
b7bca43f75b3
[gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents:
14410
diff
changeset
|
266 | g_free(conn->error_message); |
|
b7bca43f75b3
[gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents:
14410
diff
changeset
|
267 | conn->error_message = g_strdup(error_message); |
| 15884 | 268 | conn->destroy_timeout = purple_timeout_add(0, peer_connection_destroy_cb, conn); |
| 13235 | 269 | } |
| 270 | ||
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
271 | /*******************************************************************/ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
272 | /* Begin code for receiving data on a peer connection */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
273 | /*******************************************************************/ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
274 | |
| 13235 | 275 | /** |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
276 | * This should be used to read ODC and OFT framing info. It should |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
277 | * NOT be used to read the payload sent across the connection (IMs, |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
278 | * file data, etc), and it should NOT be used to read proxy negotiation |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
279 | * headers. |
| 13235 | 280 | * |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
281 | * Unlike flap_connection_recv_cb(), this only reads one frame at a |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
282 | * time. This is done so that the watcher can be changed during the |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
283 | * handling of the frame. If the watcher is changed then this |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
284 | * function will not read in any more data. This happens when |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
285 | * reading the payload of a direct IM frame, or when we're |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
286 | * receiving a file from the remote user. Once the data has been |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
287 | * read, the watcher will be switched back to this function to |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
288 | * continue reading the next frame. |
| 13235 | 289 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
290 | void |
| 15884 | 291 | peer_connection_recv_cb(gpointer data, gint source, PurpleInputCondition cond) |
| 13235 | 292 | { |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
293 | PeerConnection *conn; |
|
23079
b887906eed60
More s/ssize_t/gssize/
Daniel Atallah <datallah@pidgin.im>
parents:
22264
diff
changeset
|
294 | gssize read; |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
295 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
296 | conn = data; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
297 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
298 | /* Start reading a new ODC/OFT frame */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
299 | if (conn->buffer_incoming.data == NULL) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
300 | { |
|
15256
c57887cd5d08
[gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents:
15191
diff
changeset
|
301 | /* Read the first 6 bytes (magic string and frame length) */ |
|
c57887cd5d08
[gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents:
15191
diff
changeset
|
302 | read = recv(conn->fd, conn->header + conn->header_received, |
|
c57887cd5d08
[gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents:
15191
diff
changeset
|
303 | 6 - conn->header_received, 0); |
| 13235 | 304 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
305 | /* Check if the remote user closed the connection */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
306 | if (read == 0) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
307 | { |
|
14464
b7bca43f75b3
[gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents:
14410
diff
changeset
|
308 | peer_connection_destroy(conn, OSCAR_DISCONNECT_REMOTE_CLOSED, NULL); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
309 | return; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
310 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
311 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
312 | /* If there was an error then close the connection */ |
|
17539
0fd875385856
Only check for EAGAIN if send returns -1, not when it returns 0
Mark Doliner <markdoliner@pidgin.im>
parents:
16490
diff
changeset
|
313 | if (read < 0) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
314 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
315 | if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
316 | /* No worries */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
317 | return; |
| 13235 | 318 | |
|
14464
b7bca43f75b3
[gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents:
14410
diff
changeset
|
319 | peer_connection_destroy(conn, |
|
21389
e1dd8142bb87
replace most calls to strerror with calls to g_strerror. strerror will return
Nathan Walp <nwalp@pidgin.im>
parents:
20239
diff
changeset
|
320 | OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno)); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
321 | return; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
322 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
323 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
324 | conn->lastactivity = time(NULL); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
325 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
326 | /* If we don't even have the first 6 bytes then do nothing */ |
|
15256
c57887cd5d08
[gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents:
15191
diff
changeset
|
327 | conn->header_received += read; |
|
c57887cd5d08
[gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents:
15191
diff
changeset
|
328 | if (conn->header_received < 6) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
329 | return; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
330 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
331 | /* All ODC/OFT frames must start with a magic string */ |
|
15256
c57887cd5d08
[gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents:
15191
diff
changeset
|
332 | if (memcmp(conn->magic, conn->header, 4)) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
333 | { |
| 15884 | 334 | purple_debug_warning("oscar", "Expecting magic string to " |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
335 | "be %c%c%c%c but received magic string %c%c%c%c. " |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
336 | "Closing connection.\n", |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
337 | conn->magic[0], conn->magic[1], conn->magic[2], |
|
15256
c57887cd5d08
[gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents:
15191
diff
changeset
|
338 | conn->magic[3], conn->header[0], conn->header[1], |
|
c57887cd5d08
[gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents:
15191
diff
changeset
|
339 | conn->header[2], conn->header[3]); |
|
14464
b7bca43f75b3
[gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents:
14410
diff
changeset
|
340 | peer_connection_destroy(conn, OSCAR_DISCONNECT_INVALID_DATA, NULL); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
341 | return; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
342 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
343 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
344 | /* Initialize a new temporary ByteStream for incoming data */ |
|
15256
c57887cd5d08
[gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents:
15191
diff
changeset
|
345 | conn->buffer_incoming.len = aimutil_get16(&conn->header[4]) - 6; |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
346 | conn->buffer_incoming.data = g_new(guint8, conn->buffer_incoming.len); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
347 | conn->buffer_incoming.offset = 0; |
| 13235 | 348 | } |
| 349 | ||
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
350 | /* Read data into the temporary buffer until it is complete */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
351 | read = recv(conn->fd, |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
352 | &conn->buffer_incoming.data[conn->buffer_incoming.offset], |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
353 | conn->buffer_incoming.len - conn->buffer_incoming.offset, |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
354 | 0); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
355 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
356 | /* Check if the remote user closed the connection */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
357 | if (read == 0) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
358 | { |
|
14464
b7bca43f75b3
[gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents:
14410
diff
changeset
|
359 | peer_connection_destroy(conn, OSCAR_DISCONNECT_REMOTE_CLOSED, NULL); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
360 | return; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
361 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
362 | |
|
17539
0fd875385856
Only check for EAGAIN if send returns -1, not when it returns 0
Mark Doliner <markdoliner@pidgin.im>
parents:
16490
diff
changeset
|
363 | if (read < 0) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
364 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
365 | if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
366 | /* No worries */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
367 | return; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
368 | |
|
14464
b7bca43f75b3
[gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents:
14410
diff
changeset
|
369 | peer_connection_destroy(conn, |
|
21389
e1dd8142bb87
replace most calls to strerror with calls to g_strerror. strerror will return
Nathan Walp <nwalp@pidgin.im>
parents:
20239
diff
changeset
|
370 | OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno)); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
371 | return; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
372 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
373 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
374 | conn->lastactivity = time(NULL); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
375 | conn->buffer_incoming.offset += read; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
376 | if (conn->buffer_incoming.offset < conn->buffer_incoming.len) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
377 | /* Waiting for more data to arrive */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
378 | return; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
379 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
380 | /* We have a complete ODC/OFT frame! Handle it and continue reading */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
381 | byte_stream_rewind(&conn->buffer_incoming); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
382 | if (conn->type == OSCAR_CAPABILITY_DIRECTIM) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
383 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
384 | peer_odc_recv_frame(conn, &conn->buffer_incoming); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
385 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
386 | else if (conn->type == OSCAR_CAPABILITY_SENDFILE) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
387 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
388 | peer_oft_recv_frame(conn, &conn->buffer_incoming); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
389 | } |
|
15256
c57887cd5d08
[gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents:
15191
diff
changeset
|
390 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
391 | g_free(conn->buffer_incoming.data); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
392 | conn->buffer_incoming.data = NULL; |
|
15256
c57887cd5d08
[gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents:
15191
diff
changeset
|
393 | |
|
c57887cd5d08
[gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents:
15191
diff
changeset
|
394 | conn->header_received = 0; |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
395 | } |
| 13235 | 396 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
397 | /*******************************************************************/ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
398 | /* End code for receiving data on a peer connection */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
399 | /*******************************************************************/ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
400 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
401 | /*******************************************************************/ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
402 | /* Begin code for sending data on a peer connection */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
403 | /*******************************************************************/ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
404 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
405 | static void |
| 15884 | 406 | send_cb(gpointer data, gint source, PurpleInputCondition cond) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
407 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
408 | PeerConnection *conn; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
409 | gsize writelen; |
|
23079
b887906eed60
More s/ssize_t/gssize/
Daniel Atallah <datallah@pidgin.im>
parents:
22264
diff
changeset
|
410 | gssize wrotelen; |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
411 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
412 | conn = data; |
| 15884 | 413 | writelen = purple_circ_buffer_get_max_read(conn->buffer_outgoing); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
414 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
415 | if (writelen == 0) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
416 | { |
| 15884 | 417 | purple_input_remove(conn->watcher_outgoing); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
418 | conn->watcher_outgoing = 0; |
|
19855
1d622674f0c9
AIM 6, when sending a file through a proxy, requires that it receive
Mark Doliner <markdoliner@pidgin.im>
parents:
18320
diff
changeset
|
419 | /* |
|
1d622674f0c9
AIM 6, when sending a file through a proxy, requires that it receive
Mark Doliner <markdoliner@pidgin.im>
parents:
18320
diff
changeset
|
420 | * The buffer is currently empty, so reset the current input |
|
1d622674f0c9
AIM 6, when sending a file through a proxy, requires that it receive
Mark Doliner <markdoliner@pidgin.im>
parents:
18320
diff
changeset
|
421 | * and output positions to the start of the buffer. We do |
|
1d622674f0c9
AIM 6, when sending a file through a proxy, requires that it receive
Mark Doliner <markdoliner@pidgin.im>
parents:
18320
diff
changeset
|
422 | * this so that the next chunk of data that we put into the |
|
1d622674f0c9
AIM 6, when sending a file through a proxy, requires that it receive
Mark Doliner <markdoliner@pidgin.im>
parents:
18320
diff
changeset
|
423 | * buffer can be read back out of the buffer in one fell swoop. |
|
1d622674f0c9
AIM 6, when sending a file through a proxy, requires that it receive
Mark Doliner <markdoliner@pidgin.im>
parents:
18320
diff
changeset
|
424 | * Otherwise it gets fragmented and we have to read from the |
|
1d622674f0c9
AIM 6, when sending a file through a proxy, requires that it receive
Mark Doliner <markdoliner@pidgin.im>
parents:
18320
diff
changeset
|
425 | * second half of the buffer than go back and read the rest of |
|
1d622674f0c9
AIM 6, when sending a file through a proxy, requires that it receive
Mark Doliner <markdoliner@pidgin.im>
parents:
18320
diff
changeset
|
426 | * the chunk from the first half. |
|
1d622674f0c9
AIM 6, when sending a file through a proxy, requires that it receive
Mark Doliner <markdoliner@pidgin.im>
parents:
18320
diff
changeset
|
427 | * |
|
1d622674f0c9
AIM 6, when sending a file through a proxy, requires that it receive
Mark Doliner <markdoliner@pidgin.im>
parents:
18320
diff
changeset
|
428 | * We're using TCP, which is a stream based protocol, so this |
|
1d622674f0c9
AIM 6, when sending a file through a proxy, requires that it receive
Mark Doliner <markdoliner@pidgin.im>
parents:
18320
diff
changeset
|
429 | * isn't supposed to matter. However, experience has shown |
|
1d622674f0c9
AIM 6, when sending a file through a proxy, requires that it receive
Mark Doliner <markdoliner@pidgin.im>
parents:
18320
diff
changeset
|
430 | * that at least the proxy file transfer code in AIM 6.1.41.2 |
|
1d622674f0c9
AIM 6, when sending a file through a proxy, requires that it receive
Mark Doliner <markdoliner@pidgin.im>
parents:
18320
diff
changeset
|
431 | * requires that the entire OFT frame arrive all at once. If |
|
1d622674f0c9
AIM 6, when sending a file through a proxy, requires that it receive
Mark Doliner <markdoliner@pidgin.im>
parents:
18320
diff
changeset
|
432 | * the frame is fragmented then AIM freaks out and aborts the |
|
1d622674f0c9
AIM 6, when sending a file through a proxy, requires that it receive
Mark Doliner <markdoliner@pidgin.im>
parents:
18320
diff
changeset
|
433 | * file transfer. Somebody should teach those guys how to |
|
1d622674f0c9
AIM 6, when sending a file through a proxy, requires that it receive
Mark Doliner <markdoliner@pidgin.im>
parents:
18320
diff
changeset
|
434 | * write good TCP code. |
|
1d622674f0c9
AIM 6, when sending a file through a proxy, requires that it receive
Mark Doliner <markdoliner@pidgin.im>
parents:
18320
diff
changeset
|
435 | */ |
|
1d622674f0c9
AIM 6, when sending a file through a proxy, requires that it receive
Mark Doliner <markdoliner@pidgin.im>
parents:
18320
diff
changeset
|
436 | conn->buffer_outgoing->inptr = conn->buffer_outgoing->buffer; |
|
1d622674f0c9
AIM 6, when sending a file through a proxy, requires that it receive
Mark Doliner <markdoliner@pidgin.im>
parents:
18320
diff
changeset
|
437 | conn->buffer_outgoing->outptr = conn->buffer_outgoing->buffer; |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
438 | return; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
439 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
440 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
441 | wrotelen = send(conn->fd, conn->buffer_outgoing->outptr, writelen, 0); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
442 | if (wrotelen <= 0) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
443 | { |
|
17539
0fd875385856
Only check for EAGAIN if send returns -1, not when it returns 0
Mark Doliner <markdoliner@pidgin.im>
parents:
16490
diff
changeset
|
444 | if (wrotelen < 0 && ((errno == EAGAIN) || (errno == EWOULDBLOCK))) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
445 | /* No worries */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
446 | return; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
447 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
448 | if (conn->ready) |
|
15191
d52a86abd255
[gaim-migrate @ 17915]
Mark Doliner <markdoliner@pidgin.im>
parents:
15178
diff
changeset
|
449 | { |
| 15884 | 450 | purple_input_remove(conn->watcher_outgoing); |
|
15191
d52a86abd255
[gaim-migrate @ 17915]
Mark Doliner <markdoliner@pidgin.im>
parents:
15178
diff
changeset
|
451 | conn->watcher_outgoing = 0; |
|
d52a86abd255
[gaim-migrate @ 17915]
Mark Doliner <markdoliner@pidgin.im>
parents:
15178
diff
changeset
|
452 | close(conn->fd); |
|
d52a86abd255
[gaim-migrate @ 17915]
Mark Doliner <markdoliner@pidgin.im>
parents:
15178
diff
changeset
|
453 | conn->fd = -1; |
|
14464
b7bca43f75b3
[gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents:
14410
diff
changeset
|
454 | peer_connection_schedule_destroy(conn, |
|
b7bca43f75b3
[gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents:
14410
diff
changeset
|
455 | OSCAR_DISCONNECT_LOST_CONNECTION, NULL); |
|
15191
d52a86abd255
[gaim-migrate @ 17915]
Mark Doliner <markdoliner@pidgin.im>
parents:
15178
diff
changeset
|
456 | } |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
457 | else |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
458 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
459 | /* |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
460 | * This could happen when unable to send a negotiation |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
461 | * frame to a peer proxy server. |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
462 | */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
463 | peer_connection_trynext(conn); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
464 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
465 | return; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
466 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
467 | |
| 15884 | 468 | purple_circ_buffer_mark_read(conn->buffer_outgoing, wrotelen); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
469 | conn->lastactivity = time(NULL); |
| 13235 | 470 | } |
| 471 | ||
| 472 | /** | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
473 | * This should be called by OFT/ODC code to send a standard OFT or ODC |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
474 | * frame across the peer connection along with some payload data. Or |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
475 | * maybe a file. Anything, really. |
| 13235 | 476 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
477 | void |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
478 | peer_connection_send(PeerConnection *conn, ByteStream *bs) |
| 13235 | 479 | { |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
480 | /* Add everything to our outgoing buffer */ |
| 15884 | 481 | purple_circ_buffer_append(conn->buffer_outgoing, bs->data, bs->len); |
| 13235 | 482 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
483 | /* If we haven't already started writing stuff, then start the cycle */ |
|
17539
0fd875385856
Only check for EAGAIN if send returns -1, not when it returns 0
Mark Doliner <markdoliner@pidgin.im>
parents:
16490
diff
changeset
|
484 | if ((conn->watcher_outgoing == 0) && (conn->fd >= 0)) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
485 | { |
| 15884 | 486 | conn->watcher_outgoing = purple_input_add(conn->fd, |
| 487 | PURPLE_INPUT_WRITE, send_cb, conn); | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
488 | send_cb(conn, conn->fd, 0); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
489 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
490 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
491 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
492 | /*******************************************************************/ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
493 | /* End code for sending data on a peer connection */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
494 | /*******************************************************************/ |
| 13235 | 495 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
496 | /*******************************************************************/ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
497 | /* Begin code for establishing a peer connection */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
498 | /*******************************************************************/ |
| 13235 | 499 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
500 | void |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
501 | peer_connection_finalize_connection(PeerConnection *conn) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
502 | { |
| 15884 | 503 | conn->watcher_incoming = purple_input_add(conn->fd, |
| 504 | PURPLE_INPUT_READ, peer_connection_recv_cb, conn); | |
| 13235 | 505 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
506 | if (conn->type == OSCAR_CAPABILITY_DIRECTIM) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
507 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
508 | /* |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
509 | * If we are connecting to them then send our cookie so they |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
510 | * can verify who we are. Note: This doesn't seem to be |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
511 | * necessary, but it also doesn't seem to hurt. |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
512 | */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
513 | if (!(conn->flags & PEER_CONNECTION_FLAG_IS_INCOMING)) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
514 | peer_odc_send_cookie(conn); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
515 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
516 | else if (conn->type == OSCAR_CAPABILITY_SENDFILE) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
517 | { |
| 15884 | 518 | if (purple_xfer_get_type(conn->xfer) == PURPLE_XFER_SEND) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
519 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
520 | peer_oft_send_prompt(conn); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
521 | } |
| 13235 | 522 | } |
| 523 | ||
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
524 | /* |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
525 | * Tell the remote user that we're connected (which may also imply |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
526 | * that we've accepted their request). |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
527 | */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
528 | if (!(conn->flags & PEER_CONNECTION_FLAG_IS_INCOMING)) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
529 | aim_im_sendch2_connected(conn); |
| 13235 | 530 | } |
| 531 | ||
| 532 | /** | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
533 | * We tried to make an outgoing connection to a remote user. It |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
534 | * either connected or failed to connect. |
| 13235 | 535 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
536 | static void |
| 15173 | 537 | peer_connection_common_established_cb(gpointer data, gint source, const gchar *error_message, gboolean verified) |
| 13235 | 538 | { |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
539 | PeerConnection *conn; |
| 13235 | 540 | |
|
14166
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
541 | conn = data; |
| 13235 | 542 | |
| 15173 | 543 | if (verified) |
| 544 | conn->verified_connect_data = NULL; | |
| 545 | else | |
| 546 | conn->client_connect_data = NULL; | |
|
15175
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
547 | |
|
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
548 | if (source < 0) |
|
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
549 | { |
|
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
550 | if ((conn->verified_connect_data == NULL) && |
|
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
551 | (conn->client_connect_data == NULL)) |
|
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
552 | { |
|
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
553 | /* Our parallel connection attemps have both failed. */ |
|
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
554 | peer_connection_trynext(conn); |
|
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
555 | } |
|
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
556 | return; |
|
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
557 | } |
|
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
558 | |
| 15884 | 559 | purple_timeout_remove(conn->connect_timeout_timer); |
|
14166
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
560 | conn->connect_timeout_timer = 0; |
| 13235 | 561 | |
|
15178
eabb35896e1a
[gaim-migrate @ 17902]
Mark Doliner <markdoliner@pidgin.im>
parents:
15175
diff
changeset
|
562 | if (conn->client_connect_data != NULL) |
|
eabb35896e1a
[gaim-migrate @ 17902]
Mark Doliner <markdoliner@pidgin.im>
parents:
15175
diff
changeset
|
563 | { |
| 15884 | 564 | purple_proxy_connect_cancel(conn->client_connect_data); |
| 15173 | 565 | conn->client_connect_data = NULL; |
|
15178
eabb35896e1a
[gaim-migrate @ 17902]
Mark Doliner <markdoliner@pidgin.im>
parents:
15175
diff
changeset
|
566 | } |
|
eabb35896e1a
[gaim-migrate @ 17902]
Mark Doliner <markdoliner@pidgin.im>
parents:
15175
diff
changeset
|
567 | |
|
eabb35896e1a
[gaim-migrate @ 17902]
Mark Doliner <markdoliner@pidgin.im>
parents:
15175
diff
changeset
|
568 | if (conn->verified_connect_data != NULL) |
|
eabb35896e1a
[gaim-migrate @ 17902]
Mark Doliner <markdoliner@pidgin.im>
parents:
15175
diff
changeset
|
569 | { |
| 15884 | 570 | purple_proxy_connect_cancel(conn->verified_connect_data); |
| 15173 | 571 | conn->verified_connect_data = NULL; |
| 572 | } | |
|
15175
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
573 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
574 | conn->fd = source; |
| 13235 | 575 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
576 | peer_connection_finalize_connection(conn); |
|
13240
db5187cc40d1
[gaim-migrate @ 15605]
Mark Doliner <markdoliner@pidgin.im>
parents:
13235
diff
changeset
|
577 | } |
| 13235 | 578 | |
| 15173 | 579 | static void |
| 580 | peer_connection_verified_established_cb(gpointer data, gint source, const gchar *error_message) | |
| 581 | { | |
| 582 | peer_connection_common_established_cb(data, source, error_message, TRUE); | |
| 583 | } | |
|
15175
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
584 | |
| 15173 | 585 | static void |
| 586 | peer_connection_client_established_cb(gpointer data, gint source, const gchar *error_message) | |
| 587 | { | |
| 588 | peer_connection_common_established_cb(data, source, error_message, FALSE); | |
| 589 | } | |
| 590 | ||
| 13235 | 591 | /** |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
592 | * This is the watcher callback for any listening socket that is |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
593 | * waiting for a peer to connect. When a peer connects we set the |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
594 | * input watcher to start reading data from the peer. |
| 13235 | 595 | * |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
596 | * To make sure that the connection is with the intended person and |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
597 | * not with a malicious middle man, we don't send anything until we've |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
598 | * received a peer frame from the remote user and have verified that |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
599 | * the cookie in the peer frame matches the cookie that was exchanged |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
600 | * in the channel 2 ICBM. |
| 13235 | 601 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
602 | void |
| 15884 | 603 | peer_connection_listen_cb(gpointer data, gint source, PurpleInputCondition cond) |
|
13240
db5187cc40d1
[gaim-migrate @ 15605]
Mark Doliner <markdoliner@pidgin.im>
parents:
13235
diff
changeset
|
604 | { |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
605 | PeerConnection *conn; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
606 | OscarData *od; |
| 15884 | 607 | PurpleConnection *gc; |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
608 | struct sockaddr addr; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
609 | socklen_t addrlen = sizeof(addr); |
|
20239
ae122f419324
applied changes from 2762c6075c0dc52a96098c5478c5bf68cfd890a3
Luke Schierer <lschiere@pidgin.im>
parents:
19865
diff
changeset
|
610 | int flags; |
| 13235 | 611 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
612 | conn = data; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
613 | od = conn->od; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
614 | gc = od->gc; |
| 13235 | 615 | |
| 15884 | 616 | purple_debug_info("oscar", "Accepting connection on listener socket.\n"); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
617 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
618 | conn->fd = accept(conn->listenerfd, &addr, &addrlen); |
|
17539
0fd875385856
Only check for EAGAIN if send returns -1, not when it returns 0
Mark Doliner <markdoliner@pidgin.im>
parents:
16490
diff
changeset
|
619 | if (conn->fd < 0) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
620 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
621 | if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
622 | /* No connection yet--no worries */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
623 | /* TODO: Hmm, but they SHOULD be connected if we're here, right? */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
624 | return; |
| 13235 | 625 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
626 | peer_connection_trynext(conn); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
627 | return; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
628 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
629 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
630 | if ((addr.sa_family != PF_INET) && (addr.sa_family != PF_INET6)) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
631 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
632 | /* Invalid connection type?! Continue waiting. */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
633 | close(conn->fd); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
634 | return; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
635 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
636 | |
|
20239
ae122f419324
applied changes from 2762c6075c0dc52a96098c5478c5bf68cfd890a3
Luke Schierer <lschiere@pidgin.im>
parents:
19865
diff
changeset
|
637 | flags = fcntl(conn->fd, F_GETFL); |
|
ae122f419324
applied changes from 2762c6075c0dc52a96098c5478c5bf68cfd890a3
Luke Schierer <lschiere@pidgin.im>
parents:
19865
diff
changeset
|
638 | fcntl(conn->fd, F_SETFL, flags | O_NONBLOCK); |
|
24041
1cfd1986dbc3
Don't leak the fd to child processes.
Daniel Atallah <datallah@pidgin.im>
parents:
23079
diff
changeset
|
639 | #ifndef _WIN32 |
|
1cfd1986dbc3
Don't leak the fd to child processes.
Daniel Atallah <datallah@pidgin.im>
parents:
23079
diff
changeset
|
640 | fcntl(conn->fd, F_SETFD, FD_CLOEXEC); |
|
1cfd1986dbc3
Don't leak the fd to child processes.
Daniel Atallah <datallah@pidgin.im>
parents:
23079
diff
changeset
|
641 | #endif |
|
1cfd1986dbc3
Don't leak the fd to child processes.
Daniel Atallah <datallah@pidgin.im>
parents:
23079
diff
changeset
|
642 | |
| 15884 | 643 | purple_input_remove(conn->watcher_incoming); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
644 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
645 | peer_connection_finalize_connection(conn); |
| 13235 | 646 | } |
| 647 | ||
| 648 | /** | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
649 | * We've just opened a listener socket, so we send the remote |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
650 | * user an ICBM and ask them to connect to us. |
| 13235 | 651 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
652 | static void |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
653 | peer_connection_establish_listener_cb(int listenerfd, gpointer data) |
| 13235 | 654 | { |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
655 | PeerConnection *conn; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
656 | OscarData *od; |
| 15884 | 657 | PurpleConnection *gc; |
| 658 | PurpleAccount *account; | |
| 659 | PurpleConversation *conv; | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
660 | char *tmp; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
661 | FlapConnection *bos_conn; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
662 | const char *listener_ip; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
663 | unsigned short listener_port; |
| 13235 | 664 | |
|
14329
05c3cc0c1f79
[gaim-migrate @ 16949]
Mark Doliner <markdoliner@pidgin.im>
parents:
14324
diff
changeset
|
665 | conn = data; |
|
05c3cc0c1f79
[gaim-migrate @ 16949]
Mark Doliner <markdoliner@pidgin.im>
parents:
14324
diff
changeset
|
666 | conn->listen_data = NULL; |
| 13235 | 667 | |
|
17539
0fd875385856
Only check for EAGAIN if send returns -1, not when it returns 0
Mark Doliner <markdoliner@pidgin.im>
parents:
16490
diff
changeset
|
668 | if (listenerfd < 0) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
669 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
670 | /* Could not open listener socket */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
671 | peer_connection_trynext(conn); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
672 | return; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
673 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
674 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
675 | od = conn->od; |
|
14329
05c3cc0c1f79
[gaim-migrate @ 16949]
Mark Doliner <markdoliner@pidgin.im>
parents:
14324
diff
changeset
|
676 | gc = od->gc; |
| 15884 | 677 | account = purple_connection_get_account(gc); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
678 | conn->listenerfd = listenerfd; |
| 13235 | 679 | |
|
19865
6e7c06b4aa3d
Start watching the listener socket immediately after it's created
Mark Doliner <markdoliner@pidgin.im>
parents:
19859
diff
changeset
|
680 | /* Watch for new connections on our listener socket */ |
|
6e7c06b4aa3d
Start watching the listener socket immediately after it's created
Mark Doliner <markdoliner@pidgin.im>
parents:
19859
diff
changeset
|
681 | conn->watcher_incoming = purple_input_add(conn->listenerfd, |
|
6e7c06b4aa3d
Start watching the listener socket immediately after it's created
Mark Doliner <markdoliner@pidgin.im>
parents:
19859
diff
changeset
|
682 | PURPLE_INPUT_READ, peer_connection_listen_cb, conn); |
|
6e7c06b4aa3d
Start watching the listener socket immediately after it's created
Mark Doliner <markdoliner@pidgin.im>
parents:
19859
diff
changeset
|
683 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
684 | /* Send the "please connect to me!" ICBM */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
685 | bos_conn = flap_connection_findbygroup(od, SNAC_FAMILY_ICBM); |
|
13665
c8984bccd64c
[gaim-migrate @ 16066]
Mark Doliner <markdoliner@pidgin.im>
parents:
13609
diff
changeset
|
686 | if (bos_conn == NULL) |
|
c8984bccd64c
[gaim-migrate @ 16066]
Mark Doliner <markdoliner@pidgin.im>
parents:
13609
diff
changeset
|
687 | { |
|
c8984bccd64c
[gaim-migrate @ 16066]
Mark Doliner <markdoliner@pidgin.im>
parents:
13609
diff
changeset
|
688 | /* Not good */ |
|
c8984bccd64c
[gaim-migrate @ 16066]
Mark Doliner <markdoliner@pidgin.im>
parents:
13609
diff
changeset
|
689 | peer_connection_trynext(conn); |
|
c8984bccd64c
[gaim-migrate @ 16066]
Mark Doliner <markdoliner@pidgin.im>
parents:
13609
diff
changeset
|
690 | return; |
|
c8984bccd64c
[gaim-migrate @ 16066]
Mark Doliner <markdoliner@pidgin.im>
parents:
13609
diff
changeset
|
691 | } |
|
c8984bccd64c
[gaim-migrate @ 16066]
Mark Doliner <markdoliner@pidgin.im>
parents:
13609
diff
changeset
|
692 | |
|
25126
2a75db143599
First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents:
24041
diff
changeset
|
693 | if (bos_conn->gsc) |
|
2a75db143599
First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents:
24041
diff
changeset
|
694 | listener_ip = purple_network_get_my_ip(bos_conn->gsc->fd); |
|
2a75db143599
First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents:
24041
diff
changeset
|
695 | else |
|
2a75db143599
First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents:
24041
diff
changeset
|
696 | listener_ip = purple_network_get_my_ip(bos_conn->fd); |
| 15884 | 697 | listener_port = purple_network_get_port_from_fd(conn->listenerfd); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
698 | if (conn->type == OSCAR_CAPABILITY_DIRECTIM) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
699 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
700 | aim_im_sendch2_odc_requestdirect(od, |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
701 | conn->cookie, conn->bn, purple_network_ip_atoi(listener_ip), |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
702 | listener_port, ++conn->lastrequestnumber); |
| 13235 | 703 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
704 | /* Print a message to a local conversation window */ |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
705 | conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, conn->bn); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
706 | tmp = g_strdup_printf(_("Asking %s to connect to us at %s:%hu for " |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
707 | "Direct IM."), conn->bn, listener_ip, listener_port); |
| 15884 | 708 | purple_conversation_write(conv, NULL, tmp, PURPLE_MESSAGE_SYSTEM, time(NULL)); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
709 | g_free(tmp); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
710 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
711 | else if (conn->type == OSCAR_CAPABILITY_SENDFILE) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
712 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
713 | aim_im_sendch2_sendfile_requestdirect(od, |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
714 | conn->cookie, conn->bn, |
| 15884 | 715 | purple_network_ip_atoi(listener_ip), |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
716 | listener_port, ++conn->lastrequestnumber, |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
717 | (const gchar *)conn->xferdata.name, |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
718 | conn->xferdata.size, conn->xferdata.totfiles); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
719 | } |
| 13235 | 720 | } |
| 721 | ||
| 722 | /** | |
|
14166
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
723 | * This is a callback function used when we're connecting to a peer |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
724 | * using either the client IP or the verified IP and the connection |
| 15173 | 725 | * took longer than 5 seconds to complete. We do this because |
|
14166
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
726 | * waiting for the OS to time out the connection attempt is not |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
727 | * practical--the default timeout on many OSes can be 3 minutes or |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
728 | * more, and users are impatient. |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
729 | * |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
730 | * Worst case scenario: the user is connected to the Internet using |
| 15884 | 731 | * a modem with severe lag. The peer connections fail and Purple falls |
|
14166
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
732 | * back to using a proxied connection. The lower bandwidth |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
733 | * limitations imposed by the proxied connection won't matter because |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
734 | * the user is using a modem. |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
735 | * |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
736 | * I suppose this line of thinking is discriminatory against people |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
737 | * with very high lag but decent throughput who are transferring |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
738 | * large files. But we don't care about those people. |
| 15173 | 739 | * |
| 740 | * I (Sean) changed the timeout from 15 to 5 seconds, as 60 seconds is | |
| 741 | * too long for a user to wait to send a file. I'm also parallelizing | |
| 742 | * requests when possible. The longest we should have to wait now is 10 | |
| 743 | * seconds. We shouldn't make it shorter than this. | |
|
14166
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
744 | */ |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
745 | static gboolean |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
746 | peer_connection_tooktoolong(gpointer data) |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
747 | { |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
748 | PeerConnection *conn; |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
749 | |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
750 | conn = data; |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
751 | |
| 15884 | 752 | purple_debug_info("oscar", "Peer connection timed out after 5 seconds. " |
|
14166
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
753 | "Trying next method...\n"); |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
754 | |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
755 | peer_connection_trynext(conn); |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
756 | |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
757 | /* Cancel this timer. It'll be added again, if needed. */ |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
758 | return FALSE; |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
759 | } |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
760 | |
|
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
761 | /** |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
762 | * Try to establish the given PeerConnection using a defined |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
763 | * sequence of steps. |
| 13235 | 764 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
765 | void |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
766 | peer_connection_trynext(PeerConnection *conn) |
| 13235 | 767 | { |
| 15884 | 768 | PurpleAccount *account; |
| 13235 | 769 | |
| 15884 | 770 | account = purple_connection_get_account(conn->od->gc); |
| 13235 | 771 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
772 | /* |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
773 | * Close any remnants of a previous failed connection attempt. |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
774 | */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
775 | peer_connection_close(conn); |
| 13235 | 776 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
777 | /* |
| 15173 | 778 | * 1. Attempt to connect to the remote user using their verifiedip and clientip. |
| 779 | * We try these at the same time and use whichever succeeds first, so we don't | |
| 780 | * have to wait for a timeout. | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
781 | */ |
| 15173 | 782 | if (!(conn->flags & PEER_CONNECTION_FLAG_TRIED_DIRECT) && |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
783 | (conn->verifiedip != NULL) && (conn->port != 0) && (!conn->use_proxy)) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
784 | { |
| 15173 | 785 | conn->flags |= PEER_CONNECTION_FLAG_TRIED_DIRECT; |
| 13235 | 786 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
787 | if (conn->type == OSCAR_CAPABILITY_DIRECTIM) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
788 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
789 | gchar *tmp; |
| 15884 | 790 | PurpleConversation *conv; |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
791 | tmp = g_strdup_printf(_("Attempting to connect to %s:%hu."), |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
792 | conn->verifiedip, conn->port); |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
793 | conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, conn->bn); |
| 15884 | 794 | purple_conversation_write(conv, NULL, tmp, |
| 795 | PURPLE_MESSAGE_SYSTEM, time(NULL)); | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
796 | g_free(tmp); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
797 | } |
| 13235 | 798 | |
| 15884 | 799 | conn->verified_connect_data = purple_proxy_connect(NULL, account, |
|
14166
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
800 | conn->verifiedip, conn->port, |
| 15173 | 801 | peer_connection_verified_established_cb, conn); |
| 13235 | 802 | |
|
13666
3fd8677daf94
[gaim-migrate @ 16067]
Mark Doliner <markdoliner@pidgin.im>
parents:
13665
diff
changeset
|
803 | if ((conn->verifiedip == NULL) || |
|
3fd8677daf94
[gaim-migrate @ 16067]
Mark Doliner <markdoliner@pidgin.im>
parents:
13665
diff
changeset
|
804 | strcmp(conn->verifiedip, conn->clientip)) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
805 | { |
| 15884 | 806 | conn->client_connect_data = purple_proxy_connect(NULL, account, |
|
14166
59f2d7f35ad8
[gaim-migrate @ 16735]
Mark Doliner <markdoliner@pidgin.im>
parents:
14151
diff
changeset
|
807 | conn->clientip, conn->port, |
| 15173 | 808 | peer_connection_client_established_cb, conn); |
|
15175
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
809 | } |
|
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
810 | |
|
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
811 | if ((conn->verified_connect_data != NULL) || |
|
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
812 | (conn->client_connect_data != NULL)) |
|
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
813 | { |
|
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
814 | /* Connecting... */ |
|
25716
1b5be208d5ba
applied changes from a336cc1fd3a1ce815f97303b8d5ae8988f8cbd5b
Ethan Blanton <elb@pidgin.im>
parents:
25513
diff
changeset
|
815 | conn->connect_timeout_timer = purple_timeout_add_seconds(5, |
|
15175
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
816 | peer_connection_tooktoolong, conn); |
|
b4e8ca031526
[gaim-migrate @ 17899]
Mark Doliner <markdoliner@pidgin.im>
parents:
15173
diff
changeset
|
817 | return; |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
818 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
819 | } |
| 13235 | 820 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
821 | /* |
| 15173 | 822 | * 2. Attempt to have the remote user connect to us (using both |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
823 | * our verifiedip and our clientip). |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
824 | */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
825 | if (!(conn->flags & PEER_CONNECTION_FLAG_TRIED_INCOMING) && |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
826 | (!conn->use_proxy)) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
827 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
828 | conn->flags |= PEER_CONNECTION_FLAG_TRIED_INCOMING; |
| 13235 | 829 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
830 | /* |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
831 | * Remote user is connecting to us, so we'll need to verify |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
832 | * that the user who connected is our friend. |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
833 | */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
834 | conn->flags |= PEER_CONNECTION_FLAG_IS_INCOMING; |
| 13235 | 835 | |
| 15884 | 836 | conn->listen_data = purple_network_listen_range(5190, 5290, SOCK_STREAM, |
|
14329
05c3cc0c1f79
[gaim-migrate @ 16949]
Mark Doliner <markdoliner@pidgin.im>
parents:
14324
diff
changeset
|
837 | peer_connection_establish_listener_cb, conn); |
|
05c3cc0c1f79
[gaim-migrate @ 16949]
Mark Doliner <markdoliner@pidgin.im>
parents:
14324
diff
changeset
|
838 | if (conn->listen_data != NULL) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
839 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
840 | /* Opening listener socket... */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
841 | return; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
842 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
843 | } |
| 13235 | 844 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
845 | /* |
| 15173 | 846 | * 3. Attempt to have both users connect to an intermediate proxy |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
847 | * server. |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
848 | */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
849 | if (!(conn->flags & PEER_CONNECTION_FLAG_TRIED_PROXY)) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
850 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
851 | conn->flags |= PEER_CONNECTION_FLAG_TRIED_PROXY; |
| 13235 | 852 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
853 | /* |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
854 | * If we initiate the proxy connection, then the remote user |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
855 | * could be anyone, so we need to verify that the user who |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
856 | * connected is our friend. |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
857 | */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
858 | if (!conn->use_proxy) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
859 | conn->flags |= PEER_CONNECTION_FLAG_IS_INCOMING; |
| 13235 | 860 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
861 | if (conn->type == OSCAR_CAPABILITY_DIRECTIM) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
862 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
863 | gchar *tmp; |
| 15884 | 864 | PurpleConversation *conv; |
|
25359
ea172b7ea601
The remainder of a patch from fqueze to fix some incorrect *printf() function
Daniel Atallah <datallah@pidgin.im>
parents:
25268
diff
changeset
|
865 | tmp = g_strdup(_("Attempting to connect via proxy server.")); |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
866 | conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, conn->bn); |
| 15884 | 867 | purple_conversation_write(conv, NULL, tmp, |
| 868 | PURPLE_MESSAGE_SYSTEM, time(NULL)); | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
869 | g_free(tmp); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
870 | } |
| 13235 | 871 | |
| 15884 | 872 | conn->verified_connect_data = purple_proxy_connect(NULL, account, |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
873 | (conn->proxyip != NULL) ? conn->proxyip : PEER_PROXY_SERVER, |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
874 | PEER_PROXY_PORT, |
|
14170
f611621bc8a0
[gaim-migrate @ 16742]
Mark Doliner <markdoliner@pidgin.im>
parents:
14166
diff
changeset
|
875 | peer_proxy_connection_established_cb, conn); |
| 15173 | 876 | if (conn->verified_connect_data != NULL) |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
877 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
878 | /* Connecting... */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
879 | return; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
880 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
881 | } |
| 13235 | 882 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
883 | /* Give up! */ |
|
14464
b7bca43f75b3
[gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents:
14410
diff
changeset
|
884 | peer_connection_destroy(conn, OSCAR_DISCONNECT_COULD_NOT_CONNECT, NULL); |
| 13235 | 885 | } |
| 886 | ||
| 887 | /** | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
888 | * Initiate a peer connection with someone. |
| 13235 | 889 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
890 | void |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
891 | peer_connection_propose(OscarData *od, OscarCapability type, const char *bn) |
| 13235 | 892 | { |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
893 | PeerConnection *conn; |
| 13235 | 894 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
895 | if (type == OSCAR_CAPABILITY_DIRECTIM) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
896 | { |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
897 | conn = peer_connection_find_by_type(od, bn, type); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
898 | if (conn != NULL) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
899 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
900 | if (conn->ready) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
901 | { |
| 15884 | 902 | PurpleAccount *account; |
| 903 | PurpleConversation *conv; | |
| 13235 | 904 | |
| 15884 | 905 | purple_debug_info("oscar", "Already have a direct IM " |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
906 | "session with %s.\n", bn); |
| 15884 | 907 | account = purple_connection_get_account(od->gc); |
| 908 | conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, | |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
909 | bn, account); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
910 | if (conv != NULL) |
| 15884 | 911 | purple_conversation_present(conv); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
912 | return; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
913 | } |
| 13235 | 914 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
915 | /* Cancel the old connection and try again */ |
|
14464
b7bca43f75b3
[gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents:
14410
diff
changeset
|
916 | peer_connection_destroy(conn, OSCAR_DISCONNECT_RETRYING, NULL); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
917 | } |
| 13235 | 918 | } |
| 919 | ||
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
920 | conn = peer_connection_new(od, type, bn); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
921 | conn->flags |= PEER_CONNECTION_FLAG_INITIATED_BY_ME; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
922 | conn->flags |= PEER_CONNECTION_FLAG_APPROVED; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
923 | aim_icbm_makecookie(conn->cookie); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
924 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
925 | peer_connection_trynext(conn); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
926 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
927 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
928 | /** |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
929 | * Someone else wants to establish a peer connection with us, |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
930 | * and we said yes. |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
931 | */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
932 | static void |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
933 | peer_connection_got_proposition_yes_cb(gpointer data, gint id) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
934 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
935 | PeerConnection *conn; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
936 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
937 | conn = data; |
| 13235 | 938 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
939 | conn->flags |= PEER_CONNECTION_FLAG_APPROVED; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
940 | peer_connection_trynext(conn); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
941 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
942 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
943 | /** |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
944 | * Someone else wants to establish a peer connection with us, |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
945 | * and we said no. |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
946 | * |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
947 | * "Well, one time my friend asked me if I wanted to play the |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
948 | * piccolo. But I said no." |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
949 | */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
950 | static void |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
951 | peer_connection_got_proposition_no_cb(gpointer data, gint id) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
952 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
953 | PeerConnection *conn; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
954 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
955 | conn = data; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
956 | |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
957 | aim_im_denytransfer(conn->od, conn->bn, conn->cookie, |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
958 | AIM_TRANSFER_DENY_DECLINE); |
|
14464
b7bca43f75b3
[gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents:
14410
diff
changeset
|
959 | peer_connection_destroy(conn, OSCAR_DISCONNECT_LOCAL_CLOSED, NULL); |
| 13235 | 960 | } |
| 961 | ||
| 962 | /** | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
963 | * Someone else wants to establish a peer connection with us. |
| 13235 | 964 | */ |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
965 | void |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
966 | peer_connection_got_proposition(OscarData *od, const gchar *bn, const gchar *message, IcbmArgsCh2 *args) |
| 13235 | 967 | { |
| 15884 | 968 | PurpleConnection *gc; |
| 969 | PurpleAccount *account; | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
970 | PeerConnection *conn; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
971 | gchar *buf; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
972 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
973 | gc = od->gc; |
| 15884 | 974 | account = purple_connection_get_account(gc); |
|
13240
db5187cc40d1
[gaim-migrate @ 15605]
Mark Doliner <markdoliner@pidgin.im>
parents:
13235
diff
changeset
|
975 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
976 | /* |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
977 | * If we have a connection with this same cookie then they are |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
978 | * probably just telling us they weren't able to connect to us |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
979 | * and we should try connecting to them, instead. Or they want |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
980 | * to go through a proxy. |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
981 | */ |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
982 | conn = peer_connection_find_by_cookie(od, bn, args->cookie); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
983 | if ((conn != NULL) && (conn->type == args->type)) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
984 | { |
| 15884 | 985 | purple_debug_info("oscar", "Remote user wants to try a " |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
986 | "different connection method\n"); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
987 | g_free(conn->proxyip); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
988 | g_free(conn->clientip); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
989 | g_free(conn->verifiedip); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
990 | if (args->use_proxy) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
991 | conn->proxyip = g_strdup(args->proxyip); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
992 | else |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
993 | conn->proxyip = NULL; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
994 | conn->verifiedip = g_strdup(args->verifiedip); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
995 | conn->clientip = g_strdup(args->clientip); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
996 | conn->port = args->port; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
997 | conn->use_proxy |= args->use_proxy; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
998 | conn->lastrequestnumber++; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
999 | peer_connection_trynext(conn); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1000 | return; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1001 | } |
|
13240
db5187cc40d1
[gaim-migrate @ 15605]
Mark Doliner <markdoliner@pidgin.im>
parents:
13235
diff
changeset
|
1002 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1003 | /* If this is a direct IM, then close any existing session */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1004 | if (args->type == OSCAR_CAPABILITY_DIRECTIM) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1005 | { |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
1006 | conn = peer_connection_find_by_type(od, bn, args->type); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1007 | if (conn != NULL) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1008 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1009 | /* Close the old direct IM and start a new one */ |
| 15884 | 1010 | purple_debug_info("oscar", "Received new direct IM request " |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
1011 | "from %s. Destroying old connection.\n", bn); |
|
14464
b7bca43f75b3
[gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents:
14410
diff
changeset
|
1012 | peer_connection_destroy(conn, OSCAR_DISCONNECT_REMOTE_CLOSED, NULL); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1013 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1014 | } |
|
13240
db5187cc40d1
[gaim-migrate @ 15605]
Mark Doliner <markdoliner@pidgin.im>
parents:
13235
diff
changeset
|
1015 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1016 | /* Check for proper arguments */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1017 | if (args->type == OSCAR_CAPABILITY_SENDFILE) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1018 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1019 | if ((args->info.sendfile.filename == NULL) || |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1020 | (args->info.sendfile.totsize == 0) || |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1021 | (args->info.sendfile.totfiles == 0)) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1022 | { |
| 15884 | 1023 | purple_debug_warning("oscar", |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1024 | "%s tried to send you a file with incomplete " |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
1025 | "information.\n", bn); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1026 | return; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1027 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1028 | } |
| 13235 | 1029 | |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
1030 | conn = peer_connection_new(od, args->type, bn); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1031 | memcpy(conn->cookie, args->cookie, 8); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1032 | if (args->use_proxy) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1033 | conn->proxyip = g_strdup(args->proxyip); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1034 | conn->clientip = g_strdup(args->clientip); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1035 | conn->verifiedip = g_strdup(args->verifiedip); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1036 | conn->port = args->port; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1037 | conn->use_proxy |= args->use_proxy; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1038 | conn->lastrequestnumber++; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1039 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1040 | if (args->type == OSCAR_CAPABILITY_DIRECTIM) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1041 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1042 | buf = g_strdup_printf(_("%s has just asked to directly connect to %s"), |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
1043 | bn, purple_account_get_username(account)); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1044 | |
|
21175
c6d76b49c206
disapproval of revision '8ba833993a115415727bb1b70362e0bd1603c169'
Richard Laager <rlaager@pidgin.im>
parents:
21174
diff
changeset
|
1045 | purple_request_action(conn, NULL, buf, |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1046 | _("This requires a direct connection between " |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1047 | "the two computers and is necessary for IM " |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1048 | "Images. Because your IP address will be " |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1049 | "revealed, this may be considered a privacy " |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1050 | "risk."), |
|
25268
c911c76e889d
Don't set a default action for oscar's "Do you want to accept this
Mark Doliner <markdoliner@pidgin.im>
parents:
24041
diff
changeset
|
1051 | PURPLE_DEFAULT_ACTION_NONE, |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
1052 | account, bn, NULL, |
|
21175
c6d76b49c206
disapproval of revision '8ba833993a115415727bb1b70362e0bd1603c169'
Richard Laager <rlaager@pidgin.im>
parents:
21174
diff
changeset
|
1053 | conn, 2, |
|
18320
f0ce496d0c25
Use a different mnemonic for Connect so it doesn't conflict with Cancel
Stu Tomlinson <nosnilmot@pidgin.im>
parents:
17539
diff
changeset
|
1054 | _("C_onnect"), G_CALLBACK(peer_connection_got_proposition_yes_cb), |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1055 | _("Cancel"), G_CALLBACK(peer_connection_got_proposition_no_cb)); |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1056 | } |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1057 | else if (args->type == OSCAR_CAPABILITY_SENDFILE) |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1058 | { |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1059 | gchar *filename; |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1060 | |
|
25889
26d9ca30335c
Change "screen name" to "username" or "buddy name" in a whole bunch of
Mark Doliner <markdoliner@pidgin.im>
parents:
25359
diff
changeset
|
1061 | conn->xfer = purple_xfer_new(account, PURPLE_XFER_RECEIVE, bn); |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1062 | if (conn->xfer) |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1063 | { |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1064 | conn->xfer->data = conn; |
| 15884 | 1065 | purple_xfer_ref(conn->xfer); |
| 1066 | purple_xfer_set_size(conn->xfer, args->info.sendfile.totsize); | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1067 | |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1068 | /* Set the file name */ |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1069 | if (g_utf8_validate(args->info.sendfile.filename, -1, NULL)) |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1070 | filename = g_strdup(args->info.sendfile.filename); |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1071 | else |
| 15884 | 1072 | filename = purple_utf8_salvage(args->info.sendfile.filename); |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1073 | |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1074 | if (args->info.sendfile.subtype == AIM_OFT_SUBTYPE_SEND_DIR) |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1075 | { |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1076 | /* |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1077 | * If they are sending us a directory then the last character |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1078 | * of the file name will be an asterisk. We don't want to |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1079 | * save stuff to a directory named "*" so we remove the |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1080 | * asterisk from the file name. |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1081 | */ |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1082 | char *tmp = strrchr(filename, '\\'); |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1083 | if ((tmp != NULL) && (tmp[1] == '*')) |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1084 | tmp[0] = '\0'; |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1085 | } |
| 15884 | 1086 | purple_xfer_set_filename(conn->xfer, filename); |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1087 | g_free(filename); |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1088 | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1089 | /* |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1090 | * Set the message, unless this is the dummy message from an |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1091 | * ICQ client or an empty message from an AIM client. |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1092 | * TODO: Maybe we should strip HTML and then see if strlen>0? |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1093 | */ |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1094 | if ((message != NULL) && |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1095 | (g_ascii_strncasecmp(message, "<ICQ_COOL_FT>", 13) != 0) && |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1096 | (g_ascii_strcasecmp(message, "<HTML>") != 0)) |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1097 | { |
| 15884 | 1098 | purple_xfer_set_message(conn->xfer, message); |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1099 | } |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1100 | |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1101 | /* Setup our I/O op functions */ |
| 15884 | 1102 | purple_xfer_set_init_fnc(conn->xfer, peer_oft_recvcb_init); |
| 1103 | purple_xfer_set_end_fnc(conn->xfer, peer_oft_recvcb_end); | |
| 1104 | purple_xfer_set_request_denied_fnc(conn->xfer, peer_oft_cb_generic_cancel); | |
| 1105 | purple_xfer_set_cancel_recv_fnc(conn->xfer, peer_oft_cb_generic_cancel); | |
| 1106 | purple_xfer_set_ack_fnc(conn->xfer, peer_oft_recvcb_ack_recv); | |
|
15345
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1107 | |
|
797936e968ff
[gaim-migrate @ 18073]
Evan Schoenberg <evands@pidgin.im>
parents:
15322
diff
changeset
|
1108 | /* Now perform the request */ |
| 15884 | 1109 | purple_xfer_request(conn->xfer); |
|
13240
db5187cc40d1
[gaim-migrate @ 15605]
Mark Doliner <markdoliner@pidgin.im>
parents:
13235
diff
changeset
|
1110 | } |
| 13235 | 1111 | } |
| 1112 | } | |
|
13593
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1113 | |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1114 | /*******************************************************************/ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1115 | /* End code for establishing a peer connection */ |
|
3450a7cede99
[gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
13255
diff
changeset
|
1116 | /*******************************************************************/ |