libpurple/protocols/oscar/flap_connection.c

Wed, 13 May 2009 20:29:03 +0000

author
Marcus Lundblad <malu@pidgin.im>
date
Wed, 13 May 2009 20:29:03 +0000
changeset 27110
05ca719b901b
parent 25519
d15507b37c1a
child 27367
82426b0162d4
permissions
-rw-r--r--

Support custom smileys in MUCs (when all participants support BoB and a maximum
of 10 participants are in the chat).
Always announce support for BoB, since disable custom smileys will still turn
off fetching them, and BoB can be used for other purposes further on.

13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1 /*
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
2 * Purple's oscar protocol plugin
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
3 * This file is the legal property of its developers.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
4 * Please see the AUTHORS file distributed alongside this file.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
5 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
6 * This library is free software; you can redistribute it and/or
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
9 * version 2 of the License, or (at your option) any later version.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
10 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
11 * This library is distributed in the hope that it will be useful,
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
14 * Lesser General Public License for more details.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
15 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
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: 19110
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
19 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
20
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
21 #include "oscar.h"
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
22
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
23 #include "eventloop.h"
14171
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
24 #include "proxy.h"
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
25
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
26 #ifndef _WIN32
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
27 #include <netdb.h>
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
28 #include <sys/socket.h>
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
29 #include <netinet/in.h>
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
30 #endif
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
31
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
32 #ifdef _WIN32
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
33 #include "win32dep.h"
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
34 #endif
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
35
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
36 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
37 * This sends a channel 1 SNAC containing the FLAP version.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
38 * The FLAP version is sent by itself at the beginning of every
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
39 * connection to a FLAP server. It is always the very first
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
40 * packet sent by both the server and the client after the SYN,
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
41 * SYN/ACK, ACK handshake.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
42 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
43 void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
44 flap_connection_send_version(OscarData *od, FlapConnection *conn)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
45 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
46 FlapFrame *frame;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
47
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
48 frame = flap_frame_new(od, 0x01, 4);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
49 byte_stream_put32(&frame->data, 0x00000001);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
50 flap_connection_send(conn, frame);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
51 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
52
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
53 /**
15150
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
54 * This sends a channel 1 FLAP containing the FLAP version and
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
55 * the authentication cookie. This is sent when connecting to
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
56 * any FLAP server after the initial connection to the auth
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
57 * server. It is always the very first packet sent by both the
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
58 * server and the client after the SYN, SYN/ACK, ACK handshake.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
59 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
60 void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
61 flap_connection_send_version_with_cookie(OscarData *od, FlapConnection *conn, guint16 length, const guint8 *chipsahoy)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
62 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
63 FlapFrame *frame;
17443
bae8548d98b3 Cleanup and simplification of some tlvlist stuff in the oscar protocol.
Mark Doliner <markdoliner@pidgin.im>
parents: 17280
diff changeset
64 GSList *tlvlist = NULL;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
65
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
66 frame = flap_frame_new(od, 0x01, 4 + 2 + 2 + length);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
67 byte_stream_put32(&frame->data, 0x00000001);
17443
bae8548d98b3 Cleanup and simplification of some tlvlist stuff in the oscar protocol.
Mark Doliner <markdoliner@pidgin.im>
parents: 17280
diff changeset
68 aim_tlvlist_add_raw(&tlvlist, 0x0006, length, chipsahoy);
bae8548d98b3 Cleanup and simplification of some tlvlist stuff in the oscar protocol.
Mark Doliner <markdoliner@pidgin.im>
parents: 17280
diff changeset
69 aim_tlvlist_write(&frame->data, &tlvlist);
bae8548d98b3 Cleanup and simplification of some tlvlist stuff in the oscar protocol.
Mark Doliner <markdoliner@pidgin.im>
parents: 17280
diff changeset
70 aim_tlvlist_free(tlvlist);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
71
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
72 flap_connection_send(conn, frame);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
73 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
74
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
75 static struct rateclass *
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
76 flap_connection_get_rateclass(FlapConnection *conn, guint16 family, guint16 subtype)
15152
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
77 {
15168
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
78 GSList *tmp1;
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
79 gconstpointer key;
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
80
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
81 key = GUINT_TO_POINTER((family << 16) + subtype);
15152
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
82
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
83 for (tmp1 = conn->rateclasses; tmp1 != NULL; tmp1 = tmp1->next)
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
84 {
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
85 struct rateclass *rateclass;
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
86 rateclass = tmp1->data;
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
87
15168
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
88 if (g_hash_table_lookup(rateclass->members, key))
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
89 return rateclass;
15152
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
90 }
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
91
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
92 return NULL;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
93 }
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
94
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
95 /*
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
96 * Attempt to calculate what our new current average would be if we
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
97 * were to send a SNAC in this rateclass at the given time.
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
98 */
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
99 static guint32
15172
8032180fbca3 [gaim-migrate @ 17896]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
100 rateclass_get_new_current(FlapConnection *conn, struct rateclass *rateclass, struct timeval *now)
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
101 {
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
102 unsigned long timediff; /* In milliseconds */
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
103
15172
8032180fbca3 [gaim-migrate @ 17896]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
104 timediff = (now->tv_sec - rateclass->last.tv_sec) * 1000 + (now->tv_usec - rateclass->last.tv_usec) / 1000;
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
105
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
106 /* This formula is taken from the joscar API docs. Preesh. */
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
107 return MIN(((rateclass->current * (rateclass->windowsize - 1)) + timediff) / rateclass->windowsize, rateclass->max);
15152
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
108 }
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
109
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
110 /*
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
111 * Attempt to send the contents of a given queue
23888
415748b9d4f7 This looks good to me. I'm thinking we probably don't want to get
Mark Doliner <markdoliner@pidgin.im>
parents: 23886
diff changeset
112 *
415748b9d4f7 This looks good to me. I'm thinking we probably don't want to get
Mark Doliner <markdoliner@pidgin.im>
parents: 23886
diff changeset
113 * @return TRUE if the queue was completely emptied or was initially
415748b9d4f7 This looks good to me. I'm thinking we probably don't want to get
Mark Doliner <markdoliner@pidgin.im>
parents: 23886
diff changeset
114 * empty; FALSE if rate limiting prevented it from being
415748b9d4f7 This looks good to me. I'm thinking we probably don't want to get
Mark Doliner <markdoliner@pidgin.im>
parents: 23886
diff changeset
115 * emptied.
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
116 */
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
117 static gboolean flap_connection_send_snac_queue(FlapConnection *conn, struct timeval now, GQueue *queue)
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
118 {
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
119 while (!g_queue_is_empty(queue))
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
120 {
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
121 QueuedSnac *queued_snac;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
122 struct rateclass *rateclass;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
123
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
124 queued_snac = g_queue_peek_head(queue);
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
125
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
126 rateclass = flap_connection_get_rateclass(conn, queued_snac->family, queued_snac->subtype);
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
127 if (rateclass != NULL)
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
128 {
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
129 guint32 new_current;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
130
15172
8032180fbca3 [gaim-migrate @ 17896]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
131 new_current = rateclass_get_new_current(conn, rateclass, &now);
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
132
19110
0a9827c6feb0 Wiggle two comments around
Mark Doliner <markdoliner@pidgin.im>
parents: 18875
diff changeset
133 /* (Add 100ms padding to account for inaccuracies in the calculation) */
15191
d52a86abd255 [gaim-migrate @ 17915]
Mark Doliner <markdoliner@pidgin.im>
parents: 15172
diff changeset
134 if (new_current < rateclass->alert + 100)
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
135 /* Not ready to send this SNAC yet--keep waiting. */
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
136 return FALSE;
23888
415748b9d4f7 This looks good to me. I'm thinking we probably don't want to get
Mark Doliner <markdoliner@pidgin.im>
parents: 23886
diff changeset
137
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
138 rateclass->current = new_current;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
139 rateclass->last.tv_sec = now.tv_sec;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
140 rateclass->last.tv_usec = now.tv_usec;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
141 }
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
142
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
143 flap_connection_send(conn, queued_snac->frame);
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
144 g_free(queued_snac);
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
145 g_queue_pop_head(queue);
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
146 }
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
147
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
148 /* We emptied the queue */
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
149 return TRUE;
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
150 }
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
151
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
152 static gboolean flap_connection_send_queued(gpointer data)
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
153 {
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
154 FlapConnection *conn;
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
155 struct timeval now;
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
156
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
157 conn = data;
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
158 gettimeofday(&now, NULL);
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
159
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
160 purple_debug_info("oscar", "Attempting to send %u queued SNACs and %u queued low-priority SNACs for %p\n",
24317
f51faf0f2f36 Don't use g_queue_get_length because it requires glib 2.4
Mark Doliner <markdoliner@pidgin.im>
parents: 23889
diff changeset
161 (conn->queued_snacs ? conn->queued_snacs->length : 0),
f51faf0f2f36 Don't use g_queue_get_length because it requires glib 2.4
Mark Doliner <markdoliner@pidgin.im>
parents: 23889
diff changeset
162 (conn->queued_lowpriority_snacs ? conn->queued_lowpriority_snacs->length : 0),
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
163 conn);
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
164 if (!conn->queued_snacs || flap_connection_send_snac_queue(conn, now, conn->queued_snacs)) {
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
165 if (!conn->queued_lowpriority_snacs || flap_connection_send_snac_queue(conn, now, conn->queued_lowpriority_snacs)) {
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
166 /* Both queues emptied. */
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
167 conn->queued_timeout = 0;
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
168 return FALSE;
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
169 }
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
170 }
23888
415748b9d4f7 This looks good to me. I'm thinking we probably don't want to get
Mark Doliner <markdoliner@pidgin.im>
parents: 23886
diff changeset
171
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
172 /* We couldn't send all our SNACs. Keep trying */
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
173 return TRUE;
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
174 }
15152
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
175
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
176 /**
15150
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
177 * This sends a channel 2 FLAP containing a SNAC. The SNAC family and
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
178 * subtype are looked up in the rate info for this connection, and if
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
179 * sending this SNAC will induce rate limiting then we delay sending
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
180 * of the SNAC by putting it into an outgoing holding queue.
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
181 *
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
182 * @param data The optional bytestream that makes up the data portion
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
183 * of this SNAC. For empty SNACs this should be NULL.
23888
415748b9d4f7 This looks good to me. I'm thinking we probably don't want to get
Mark Doliner <markdoliner@pidgin.im>
parents: 23886
diff changeset
184 * @param high_priority If TRUE, the SNAC will be queued normally if
415748b9d4f7 This looks good to me. I'm thinking we probably don't want to get
Mark Doliner <markdoliner@pidgin.im>
parents: 23886
diff changeset
185 * needed. If FALSE, it wil be queued separately, to be sent
415748b9d4f7 This looks good to me. I'm thinking we probably don't want to get
Mark Doliner <markdoliner@pidgin.im>
parents: 23886
diff changeset
186 * only if all high priority SNACs have been sent.
15150
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
187 */
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
188 void
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
189 flap_connection_send_snac_with_priority(OscarData *od, FlapConnection *conn, guint16 family, const guint16 subtype, guint16 flags, aim_snacid_t snacid, ByteStream *data, gboolean high_priority)
15150
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
190 {
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
191 FlapFrame *frame;
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
192 guint32 length;
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
193 gboolean enqueue = FALSE;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
194 struct rateclass *rateclass;
15150
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
195
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
196 length = data != NULL ? data->offset : 0;
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
197
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
198 frame = flap_frame_new(od, 0x02, 10 + length);
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
199 aim_putsnac(&frame->data, family, subtype, flags, snacid);
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
200
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
201 if (length > 0)
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
202 {
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
203 byte_stream_rewind(data);
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
204 byte_stream_putbs(&frame->data, data, length);
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
205 }
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
206
15168
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
207 if (conn->queued_timeout != 0)
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
208 enqueue = TRUE;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
209 else if ((rateclass = flap_connection_get_rateclass(conn, family, subtype)) != NULL)
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
210 {
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
211 struct timeval now;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
212 guint32 new_current;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
213
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
214 gettimeofday(&now, NULL);
15172
8032180fbca3 [gaim-migrate @ 17896]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
215 new_current = rateclass_get_new_current(conn, rateclass, &now);
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
216
19110
0a9827c6feb0 Wiggle two comments around
Mark Doliner <markdoliner@pidgin.im>
parents: 18875
diff changeset
217 /* (Add 100ms padding to account for inaccuracies in the calculation) */
15191
d52a86abd255 [gaim-migrate @ 17915]
Mark Doliner <markdoliner@pidgin.im>
parents: 15172
diff changeset
218 if (new_current < rateclass->alert + 100)
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
219 {
22860
2b0e247173b2 All SNACs on FLAP channel 2 except in the auth family are now sent through
Evan Schoenberg <evands@pidgin.im>
parents: 22622
diff changeset
220 purple_debug_info("oscar", "Current rate for conn %p would be %u, but we alert at %u; enqueueing\n", conn, new_current, (rateclass->alert + 100));
2b0e247173b2 All SNACs on FLAP channel 2 except in the auth family are now sent through
Evan Schoenberg <evands@pidgin.im>
parents: 22622
diff changeset
221
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
222 enqueue = TRUE;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
223 }
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
224 else
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
225 {
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
226 rateclass->current = new_current;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
227 rateclass->last.tv_sec = now.tv_sec;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
228 rateclass->last.tv_usec = now.tv_usec;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
229 }
22860
2b0e247173b2 All SNACs on FLAP channel 2 except in the auth family are now sent through
Evan Schoenberg <evands@pidgin.im>
parents: 22622
diff changeset
230 } else {
24659
6e20158ee689 Remove a few spurious debug_warns
Mark Doliner <markdoliner@pidgin.im>
parents: 24317
diff changeset
231 /*
6e20158ee689 Remove a few spurious debug_warns
Mark Doliner <markdoliner@pidgin.im>
parents: 24317
diff changeset
232 * It's normal for SNACs 0x0001/0x0006 and 0x0001/0x0017 to be
6e20158ee689 Remove a few spurious debug_warns
Mark Doliner <markdoliner@pidgin.im>
parents: 24317
diff changeset
233 * sent before we receive rate info from the server, so don't
6e20158ee689 Remove a few spurious debug_warns
Mark Doliner <markdoliner@pidgin.im>
parents: 24317
diff changeset
234 * bother warning about them.
6e20158ee689 Remove a few spurious debug_warns
Mark Doliner <markdoliner@pidgin.im>
parents: 24317
diff changeset
235 */
6e20158ee689 Remove a few spurious debug_warns
Mark Doliner <markdoliner@pidgin.im>
parents: 24317
diff changeset
236 if (family != 0x0001 || (subtype != 0x0006 && subtype != 0x0017))
6e20158ee689 Remove a few spurious debug_warns
Mark Doliner <markdoliner@pidgin.im>
parents: 24317
diff changeset
237 purple_debug_warning("oscar", "No rate class found for family 0x%04hx subtype 0x%04hx\n", family, subtype);
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
238 }
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
239
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
240 if (enqueue)
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
241 {
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
242 /* We've been sending too fast, so delay this message */
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
243 QueuedSnac *queued_snac;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
244
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
245 queued_snac = g_new(QueuedSnac, 1);
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
246 queued_snac->family = family;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
247 queued_snac->subtype = subtype;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
248 queued_snac->frame = frame;
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
249
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
250 if (high_priority) {
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
251 if (!conn->queued_snacs)
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
252 conn->queued_snacs = g_queue_new();
23888
415748b9d4f7 This looks good to me. I'm thinking we probably don't want to get
Mark Doliner <markdoliner@pidgin.im>
parents: 23886
diff changeset
253 g_queue_push_tail(conn->queued_snacs, queued_snac);
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
254 } else {
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
255 if (!conn->queued_lowpriority_snacs)
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
256 conn->queued_lowpriority_snacs = g_queue_new();
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
257 g_queue_push_tail(conn->queued_lowpriority_snacs, queued_snac);
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
258 }
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
259
15168
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
260 if (conn->queued_timeout == 0)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
261 conn->queued_timeout = purple_timeout_add(500, flap_connection_send_queued, conn);
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
262
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
263 return;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
264 }
15150
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
265
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
266 flap_connection_send(conn, frame);
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
267 }
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
268
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
269 void
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
270 flap_connection_send_snac(OscarData *od, FlapConnection *conn, guint16 family, const guint16 subtype, guint16 flags, aim_snacid_t snacid, ByteStream *data)
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
271 {
23889
9c737b728db7 Missed one of these guys
Mark Doliner <markdoliner@pidgin.im>
parents: 23888
diff changeset
272 flap_connection_send_snac_with_priority(od, conn, family, subtype, flags, snacid, data, TRUE);
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
273 }
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
274
15150
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
275 /**
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
276 * This sends an empty channel 4 FLAP. This is sent to signify
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
277 * that we're logging off. This shouldn't really be necessary--
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
278 * usually the AIM server will detect that the TCP connection has
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
279 * been destroyed--but it's good practice.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
280 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
281 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
282 flap_connection_send_close(OscarData *od, FlapConnection *conn)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
283 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
284 FlapFrame *frame;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
285
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
286 frame = flap_frame_new(od, 0x04, 0);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
287 flap_connection_send(conn, frame);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
288 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
289
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
290 /**
15150
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
291 * This sends an empty channel 5 FLAP. This is used as a keepalive
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
292 * packet in FLAP connections. WinAIM 4.x and higher send these
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
293 * _every minute_ to keep the connection alive.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
294 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
295 void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
296 flap_connection_send_keepalive(OscarData *od, FlapConnection *conn)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
297 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
298 FlapFrame *frame;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
299
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
300 frame = flap_frame_new(od, 0x05, 0);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
301 flap_connection_send(conn, frame);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
302
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
303 /* clean out SNACs over 60sec old */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
304 aim_cleansnacs(od, 60);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
305 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
306
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
307 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
308 * Allocate a new empty connection structure.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
309 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
310 * @param od The oscar session associated with this connection.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
311 * @param type Type of connection to create
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
312 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
313 * @return Returns the new connection structure.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
314 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
315 FlapConnection *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
316 flap_connection_new(OscarData *od, int type)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
317 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
318 FlapConnection *conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
319
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
320 conn = g_new0(FlapConnection, 1);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
321 conn->od = od;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
322 conn->buffer_outgoing = purple_circ_buffer_new(0);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
323 conn->fd = -1;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
324 conn->subtype = -1;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
325 conn->type = type;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
326
14410
a5ae93474db6 [gaim-migrate @ 17050]
Mark Doliner <markdoliner@pidgin.im>
parents: 14324
diff changeset
327 od->oscar_connections = g_slist_prepend(od->oscar_connections, conn);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
328
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
329 return conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
330 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
331
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
332 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
333 * Close (but not free) a connection.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
334 *
14171
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
335 * This cancels any currently pending connection attempt,
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
336 * closes any open fd and frees the auth cookie.
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
337 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
338 * @param conn The connection to close.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
339 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
340 void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
341 flap_connection_close(OscarData *od, FlapConnection *conn)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
342 {
14324
8cbedd82b6ac [gaim-migrate @ 16944]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
343 if (conn->connect_data != NULL)
14171
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
344 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
345 purple_proxy_connect_cancel(conn->connect_data);
14324
8cbedd82b6ac [gaim-migrate @ 16944]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
346 conn->connect_data = NULL;
14171
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
347 }
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
348
23878
63d4f60097a4 Daniel Atallah pointed out that this was obviously wrong. So we would
Mark Doliner <markdoliner@pidgin.im>
parents: 23082
diff changeset
349 if (conn->new_conn_data != NULL)
14171
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
350 {
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
351 if (conn->type == SNAC_FAMILY_CHAT)
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
352 {
14324
8cbedd82b6ac [gaim-migrate @ 16944]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
353 oscar_chat_destroy(conn->new_conn_data);
23879
ba5affe13543 I swear I did this! I must have gotten a little overzealous with the
Mark Doliner <markdoliner@pidgin.im>
parents: 23878
diff changeset
354 conn->new_conn_data = NULL;
14171
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
355 }
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
356 }
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
357
17539
0fd875385856 Only check for EAGAIN if send returns -1, not when it returns 0
Mark Doliner <markdoliner@pidgin.im>
parents: 17443
diff changeset
358 if (conn->fd >= 0)
14171
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
359 {
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
360 if (conn->type == SNAC_FAMILY_LOCATE)
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
361 flap_connection_send_close(od, conn);
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
362
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
363 close(conn->fd);
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
364 conn->fd = -1;
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
365 }
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
366
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
367 if (conn->gsc != NULL)
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
368 {
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
369 if (conn->type == SNAC_FAMILY_LOCATE)
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
370 flap_connection_send_close(od, conn);
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
371
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
372 purple_ssl_close(conn->gsc);
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
373 conn->gsc = NULL;
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
374 }
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
375
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
376 if (conn->watcher_incoming != 0)
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
377 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
378 purple_input_remove(conn->watcher_incoming);
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
379 conn->watcher_incoming = 0;
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
380 }
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
381
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
382 if (conn->watcher_outgoing != 0)
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
383 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
384 purple_input_remove(conn->watcher_outgoing);
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
385 conn->watcher_outgoing = 0;
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
386 }
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
387
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
388 g_free(conn->buffer_incoming.data.data);
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
389 conn->buffer_incoming.data.data = NULL;
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
390
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
391 purple_circ_buffer_destroy(conn->buffer_outgoing);
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
392 conn->buffer_outgoing = NULL;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
393 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
394
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
395 static void
15148
48ce0abb422a [gaim-migrate @ 17872]
Mark Doliner <markdoliner@pidgin.im>
parents: 15147
diff changeset
396 flap_connection_destroy_rateclass(struct rateclass *rateclass)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
397 {
15168
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
398 g_hash_table_destroy(rateclass->members);
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
399 g_free(rateclass);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
400 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
401
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
402 /**
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
403 * Free a FlapFrame
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
404 *
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
405 * @param frame The frame to free.
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
406 */
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
407 static void
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
408 flap_frame_destroy(FlapFrame *frame)
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
409 {
15168
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
410 g_free(frame->data.data);
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
411 g_free(frame);
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
412 }
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
413
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
414 static gboolean
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
415 flap_connection_destroy_cb(gpointer data)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
416 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
417 FlapConnection *conn;
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
418 OscarData *od;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
419 PurpleAccount *account;
18874
556ca90e3b0d Call the AIM_CB_SPECIAL_CONNERR callback from
Mark Doliner <markdoliner@pidgin.im>
parents: 17573
diff changeset
420 aim_rxcallback_t userfunc;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
421
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
422 conn = data;
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
423 od = conn->od;
22296
120207b25525 Undo revision c10f76ea0a1d80d4b5e7c2807c239a9bbb59bc1e. This should
Mark Doliner <markdoliner@pidgin.im>
parents: 22295
diff changeset
424 account = purple_connection_get_account(od->gc);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
425
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
426 purple_debug_info("oscar", "Destroying oscar connection of "
18874
556ca90e3b0d Call the AIM_CB_SPECIAL_CONNERR callback from
Mark Doliner <markdoliner@pidgin.im>
parents: 17573
diff changeset
427 "type 0x%04hx. Disconnect reason is %d\n",
556ca90e3b0d Call the AIM_CB_SPECIAL_CONNERR callback from
Mark Doliner <markdoliner@pidgin.im>
parents: 17573
diff changeset
428 conn->type, conn->disconnect_reason);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
429
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
430 od->oscar_connections = g_slist_remove(od->oscar_connections, conn);
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
431
18874
556ca90e3b0d Call the AIM_CB_SPECIAL_CONNERR callback from
Mark Doliner <markdoliner@pidgin.im>
parents: 17573
diff changeset
432 if ((userfunc = aim_callhandler(od, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_CONNERR)))
556ca90e3b0d Call the AIM_CB_SPECIAL_CONNERR callback from
Mark Doliner <markdoliner@pidgin.im>
parents: 17573
diff changeset
433 userfunc(od, conn, NULL, conn->disconnect_code, conn->error_message);
556ca90e3b0d Call the AIM_CB_SPECIAL_CONNERR callback from
Mark Doliner <markdoliner@pidgin.im>
parents: 17573
diff changeset
434
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
435 /*
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
436 * TODO: If we don't have a SNAC_FAMILY_LOCATE connection then
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
437 * we should try to request one instead of disconnecting.
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
438 */
22296
120207b25525 Undo revision c10f76ea0a1d80d4b5e7c2807c239a9bbb59bc1e. This should
Mark Doliner <markdoliner@pidgin.im>
parents: 22295
diff changeset
439 if (!account->disconnecting && ((od->oscar_connections == NULL)
120207b25525 Undo revision c10f76ea0a1d80d4b5e7c2807c239a9bbb59bc1e. This should
Mark Doliner <markdoliner@pidgin.im>
parents: 22295
diff changeset
440 || (!flap_connection_getbytype(od, SNAC_FAMILY_LOCATE))))
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
441 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
442 /* No more FLAP connections! Sign off this PurpleConnection! */
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
443 gchar *tmp;
21279
40685e1f50ca Rename:
Will Thompson <resiak@pidgin.im>
parents: 21152
diff changeset
444 PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
20452
a9fc6198b5c6 Add disconnection reasons to oscar.
Will Thompson <resiak@pidgin.im>
parents: 19859
diff changeset
445
18875
c9c59be46538 Move a call to purple_connection_error() from oscar.c to
Mark Doliner <markdoliner@pidgin.im>
parents: 18874
diff changeset
446 if (conn->disconnect_code == 0x0001) {
21279
40685e1f50ca Rename:
Will Thompson <resiak@pidgin.im>
parents: 21152
diff changeset
447 reason = PURPLE_CONNECTION_ERROR_NAME_IN_USE;
18875
c9c59be46538 Move a call to purple_connection_error() from oscar.c to
Mark Doliner <markdoliner@pidgin.im>
parents: 18874
diff changeset
448 tmp = g_strdup(_("You have signed on from another location."));
20658
91594d39738c Clear the password consistently when we get a "Signed-On elsewhere" or a "Invalid Password" disconnection. Disconnection reason codes will take care of this in the core, but until then, this is ok. Fixes #3204.
Daniel Atallah <datallah@pidgin.im>
parents: 19859
diff changeset
449 if (!purple_account_get_remember_password(account))
91594d39738c Clear the password consistently when we get a "Signed-On elsewhere" or a "Invalid Password" disconnection. Disconnection reason codes will take care of this in the core, but until then, this is ok. Fixes #3204.
Daniel Atallah <datallah@pidgin.im>
parents: 19859
diff changeset
450 purple_account_set_password(account, NULL);
18875
c9c59be46538 Move a call to purple_connection_error() from oscar.c to
Mark Doliner <markdoliner@pidgin.im>
parents: 18874
diff changeset
451 } else if (conn->disconnect_reason == OSCAR_DISCONNECT_REMOTE_CLOSED)
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
452 tmp = g_strdup(_("Server closed the connection."));
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
453 else if (conn->disconnect_reason == OSCAR_DISCONNECT_LOST_CONNECTION)
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
454 tmp = g_strdup_printf(_("Lost connection with server:\n%s"),
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
455 conn->error_message);
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
456 else if (conn->disconnect_reason == OSCAR_DISCONNECT_INVALID_DATA)
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
457 tmp = g_strdup(_("Received invalid data on connection with server."));
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
458 else if (conn->disconnect_reason == OSCAR_DISCONNECT_COULD_NOT_CONNECT)
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
459 tmp = g_strdup_printf(_("Could not establish a connection with the server:\n%s"),
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
460 conn->error_message);
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
461 else
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
462 /*
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
463 * We shouldn't print a message for some disconnect_reasons.
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
464 * Like OSCAR_DISCONNECT_LOCAL_CLOSED.
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
465 */
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
466 tmp = NULL;
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
467
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
468 if (tmp != NULL)
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
469 {
20452
a9fc6198b5c6 Add disconnection reasons to oscar.
Will Thompson <resiak@pidgin.im>
parents: 19859
diff changeset
470 purple_connection_error_reason(od->gc, reason, tmp);
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
471 g_free(tmp);
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
472 }
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
473 }
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
474
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
475 flap_connection_close(od, conn);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
476
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
477 g_free(conn->error_message);
14171
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
478 g_free(conn->cookie);
25128
3c63f7e91d98 Use purple_proxy_connect + purple_ssl_connect_with_host_fd() to hopefully
Paul Aurich <darkrain42@pidgin.im>
parents: 25126
diff changeset
479 g_free(conn->ssl_cert_cn);
14171
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
480
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
481 /*
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
482 * Free conn->internal, if necessary
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
483 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
484 if (conn->type == SNAC_FAMILY_CHAT)
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
485 flap_connection_destroy_chat(od, conn);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
486
14410
a5ae93474db6 [gaim-migrate @ 17050]
Mark Doliner <markdoliner@pidgin.im>
parents: 14324
diff changeset
487 g_slist_free(conn->groups);
15148
48ce0abb422a [gaim-migrate @ 17872]
Mark Doliner <markdoliner@pidgin.im>
parents: 15147
diff changeset
488 while (conn->rateclasses != NULL)
48ce0abb422a [gaim-migrate @ 17872]
Mark Doliner <markdoliner@pidgin.im>
parents: 15147
diff changeset
489 {
48ce0abb422a [gaim-migrate @ 17872]
Mark Doliner <markdoliner@pidgin.im>
parents: 15147
diff changeset
490 flap_connection_destroy_rateclass(conn->rateclasses->data);
48ce0abb422a [gaim-migrate @ 17872]
Mark Doliner <markdoliner@pidgin.im>
parents: 15147
diff changeset
491 conn->rateclasses = g_slist_delete_link(conn->rateclasses, conn->rateclasses);
48ce0abb422a [gaim-migrate @ 17872]
Mark Doliner <markdoliner@pidgin.im>
parents: 15147
diff changeset
492 }
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
493
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
494 if (conn->queued_snacs) {
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
495 while (!g_queue_is_empty(conn->queued_snacs))
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
496 {
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
497 QueuedSnac *queued_snac;
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
498 queued_snac = g_queue_pop_head(conn->queued_snacs);
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
499 flap_frame_destroy(queued_snac->frame);
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
500 g_free(queued_snac);
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
501 }
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
502 g_queue_free(conn->queued_snacs);
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
503 }
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
504
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
505 if (conn->queued_lowpriority_snacs) {
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
506 while (!g_queue_is_empty(conn->queued_lowpriority_snacs))
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
507 {
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
508 QueuedSnac *queued_snac;
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
509 queued_snac = g_queue_pop_head(conn->queued_lowpriority_snacs);
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
510 flap_frame_destroy(queued_snac->frame);
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
511 g_free(queued_snac);
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
512 }
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
513 g_queue_free(conn->queued_lowpriority_snacs);
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
514 }
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
515
15168
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
516 if (conn->queued_timeout > 0)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
517 purple_timeout_remove(conn->queued_timeout);
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
518
14048
b577c53406c0 [gaim-migrate @ 16556]
Mark Doliner <markdoliner@pidgin.im>
parents: 13726
diff changeset
519 g_free(conn);
b577c53406c0 [gaim-migrate @ 16556]
Mark Doliner <markdoliner@pidgin.im>
parents: 13726
diff changeset
520
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
521 return FALSE;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
522 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
523
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
524 /**
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
525 * See the comments for the parameters of
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
526 * flap_connection_schedule_destroy().
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
527 */
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
528 void
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
529 flap_connection_destroy(FlapConnection *conn, OscarDisconnectReason reason, const gchar *error_message)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
530 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
531 if (conn->destroy_timeout != 0)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
532 purple_timeout_remove(conn->destroy_timeout);
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
533 conn->disconnect_reason = reason;
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
534 g_free(conn->error_message);
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
535 conn->error_message = g_strdup(error_message);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
536 flap_connection_destroy_cb(conn);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
537 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
538
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
539 /**
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
540 * Schedule Purple to destroy the given FlapConnection as soon as we
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
541 * return control back to the program's main loop. We must do this
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
542 * if we want to destroy the connection but we are still using it
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
543 * for some reason.
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
544 *
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
545 * @param reason The reason for the disconnection.
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
546 * @param error_message A brief error message that gives more detail
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
547 * regarding the reason for the disconnecting. This should
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
548 * be NULL for everything except OSCAR_DISCONNECT_LOST_CONNECTION,
21389
e1dd8142bb87 replace most calls to strerror with calls to g_strerror. strerror will return
Nathan Walp <nwalp@pidgin.im>
parents: 20658
diff changeset
549 * in which case it should contain the value of g_strerror(errno),
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
550 * and OSCAR_DISCONNECT_COULD_NOT_CONNECT, in which case it
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
551 * should contain the error_message passed back from the call
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
552 * to purple_proxy_connect().
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
553 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
554 void
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
555 flap_connection_schedule_destroy(FlapConnection *conn, OscarDisconnectReason reason, const gchar *error_message)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
556 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
557 if (conn->destroy_timeout != 0)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
558 /* Already taken care of */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
559 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
560
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
561 purple_debug_info("oscar", "Scheduling destruction of FLAP "
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
562 "connection of type 0x%04hx\n", conn->type);
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
563 conn->disconnect_reason = reason;
14464
b7bca43f75b3 [gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents: 14454
diff changeset
564 g_free(conn->error_message);
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
565 conn->error_message = g_strdup(error_message);
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
566 conn->destroy_timeout = purple_timeout_add(0, flap_connection_destroy_cb, conn);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
567 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
568
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
569 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
570 * In OSCAR, every connection has a set of SNAC groups associated
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
571 * with it. These are the groups that you can send over this connection
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
572 * without being guaranteed a "Not supported" SNAC error.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
573 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
574 * The grand theory of things says that these associations transcend
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
575 * what libfaim calls "connection types" (conn->type). You can probably
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
576 * see the elegance here, but since I want to revel in it for a bit, you
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
577 * get to hear it all spelled out.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
578 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
579 * So let us say that you have your core BOS connection running. One
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
580 * of your modules has just given you a SNAC of the group 0x0004 to send
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
581 * you. Maybe an IM destined for some twit in Greenland. So you start
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
582 * at the top of your connection list, looking for a connection that
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
583 * claims to support group 0x0004. You find one. Why, that neat BOS
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
584 * connection of yours can do that. So you send it on its way.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
585 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
586 * Now, say, that fellow from Greenland has friends and they all want to
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
587 * meet up with you in a lame chat room. This has landed you a SNAC
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
588 * in the family 0x000e and you have to admit you're a bit lost. You've
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
589 * searched your connection list for someone who wants to make your life
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
590 * easy and deliver this SNAC for you, but there isn't one there.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
591 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
592 * Here comes the good bit. Without even letting anyone know, particularly
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
593 * the module that decided to send this SNAC, and definitely not that twit
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
594 * in Greenland, you send out a service request. In this request, you have
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
595 * marked the need for a connection supporting group 0x000e. A few seconds
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
596 * later, you receive a service redirect with an IP address and a cookie in
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
597 * it. Great, you say. Now I have something to do. Off you go, making
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
598 * that connection. One of the first things you get from this new server
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
599 * is a message saying that indeed it does support the group you were looking
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
600 * for. So you continue and send rate confirmation and all that.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
601 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
602 * Then you remember you had that SNAC to send, and now you have a means to
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
603 * do it, and you do, and everyone is happy. Except the Greenlander, who is
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
604 * still stuck in the bitter cold.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
605 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
606 * Oh, and this is useful for building the Migration SNACs, too. In the
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
607 * future, this may help convince me to implement rate limit mitigation
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
608 * for real. We'll see.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
609 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
610 * Just to make me look better, I'll say that I've known about this great
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
611 * scheme for quite some time now. But I still haven't convinced myself
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
612 * to make libfaim work that way. It would take a fair amount of effort,
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
613 * and probably some client API changes as well. (Whenever I don't want
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
614 * to do something, I just say it would change the client API. Then I
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
615 * instantly have a couple of supporters of not doing it.)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
616 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
617 * Generally, addgroup is only called by the internal handling of the
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
618 * server ready SNAC. So if you want to do something before that, you'll
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
619 * have to be more creative. That is done rather early, though, so I don't
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
620 * think you have to worry about it. Unless you're me. I care deeply
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
621 * about such inane things.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
622 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
623 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
624
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
625 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
626 * Find a FlapConnection that supports the given oscar
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
627 * family.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
628 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
629 FlapConnection *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
630 flap_connection_findbygroup(OscarData *od, guint16 group)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
631 {
14410
a5ae93474db6 [gaim-migrate @ 17050]
Mark Doliner <markdoliner@pidgin.im>
parents: 14324
diff changeset
632 GSList *cur;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
633
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
634 for (cur = od->oscar_connections; cur != NULL; cur = cur->next)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
635 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
636 FlapConnection *conn;
14410
a5ae93474db6 [gaim-migrate @ 17050]
Mark Doliner <markdoliner@pidgin.im>
parents: 14324
diff changeset
637 GSList *l;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
638
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
639 conn = cur->data;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
640
13612
c51da9e6fec1 [gaim-migrate @ 15997]
Mark Doliner <markdoliner@pidgin.im>
parents: 13611
diff changeset
641 for (l = conn->groups; l != NULL; l = l->next)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
642 {
13612
c51da9e6fec1 [gaim-migrate @ 15997]
Mark Doliner <markdoliner@pidgin.im>
parents: 13611
diff changeset
643 if (GPOINTER_TO_UINT(l->data) == group)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
644 return conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
645 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
646 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
647
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
648 return NULL;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
649 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
650
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
651 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
652 * Locates a connection of the specified type in the
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
653 * specified session.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
654 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
655 * TODO: Use flap_connection_findbygroup everywhere and get rid of this.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
656 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
657 * @param od The session to search.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
658 * @param type The type of connection to look for.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
659 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
660 * @return Returns the first connection found of the given target type,
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
661 * or NULL if none could be found.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
662 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
663 FlapConnection *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
664 flap_connection_getbytype(OscarData *od, int type)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
665 {
14410
a5ae93474db6 [gaim-migrate @ 17050]
Mark Doliner <markdoliner@pidgin.im>
parents: 14324
diff changeset
666 GSList *cur;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
667
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
668 for (cur = od->oscar_connections; cur != NULL; cur = cur->next)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
669 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
670 FlapConnection *conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
671 conn = cur->data;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
672 if ((conn->type == type) && (conn->connected))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
673 return conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
674 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
675
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
676 return NULL;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
677 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
678
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
679 FlapConnection *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
680 flap_connection_getbytype_all(OscarData *od, int type)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
681 {
14410
a5ae93474db6 [gaim-migrate @ 17050]
Mark Doliner <markdoliner@pidgin.im>
parents: 14324
diff changeset
682 GSList *cur;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
683
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
684 for (cur = od->oscar_connections; cur; cur = cur->next)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
685 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
686 FlapConnection *conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
687 conn = cur->data;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
688 if (conn->type == type)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
689 return conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
690 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
691
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
692 return NULL;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
693 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
694
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
695 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
696 * Allocate a new FLAP frame.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
697 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
698 * @param channel The FLAP channel. This is almost always 2.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
699 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
700 FlapFrame *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
701 flap_frame_new(OscarData *od, guint16 channel, int datalen)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
702 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
703 FlapFrame *frame;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
704
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
705 frame = g_new0(FlapFrame, 1);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
706 frame->channel = channel;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
707
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
708 if (datalen > 0)
15151
bb985812fefa [gaim-migrate @ 17875]
Mark Doliner <markdoliner@pidgin.im>
parents: 15150
diff changeset
709 byte_stream_new(&frame->data, datalen);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
710
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
711 return frame;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
712 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
713
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
714 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
715 parse_snac(OscarData *od, FlapConnection *conn, FlapFrame *frame)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
716 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
717 aim_module_t *cur;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
718 aim_modsnac_t snac;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
719
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
720 if (byte_stream_empty(&frame->data) < 10)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
721 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
722
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
723 snac.family = byte_stream_get16(&frame->data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
724 snac.subtype = byte_stream_get16(&frame->data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
725 snac.flags = byte_stream_get16(&frame->data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
726 snac.id = byte_stream_get32(&frame->data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
727
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
728 /* SNAC flags are apparently uniform across all SNACs, so we handle them here */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
729 if (snac.flags & 0x0001) {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
730 /*
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
731 * This means the SNAC will be followed by another SNAC with
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
732 * related information. We don't need to do anything about
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
733 * this here.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
734 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
735 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
736 if (snac.flags & 0x8000) {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
737 /*
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
738 * This packet contains the version of the family that this SNAC is
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
739 * in. You get this when your SSI module is version 2 or higher.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
740 * For now we have no need for this, but you could always save
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
741 * it as a part of aim_modnsac_t, or something. The format is...
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
742 * 2 byte length of total mini-header (which is 6 bytes), then TLV
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
743 * of type 0x0001, length 0x0002, value is the 2 byte version
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
744 * number
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
745 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
746 byte_stream_advance(&frame->data, byte_stream_get16(&frame->data));
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
747 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
748
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
749 for (cur = (aim_module_t *)od->modlistv; cur; cur = cur->next) {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
750
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
751 if (!(cur->flags & AIM_MODFLAG_MULTIFAMILY) &&
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
752 (cur->family != snac.family))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
753 continue;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
754
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
755 if (cur->snachandler(od, conn, cur, frame, &snac, &frame->data))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
756 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
757 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
758 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
759
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
760 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
761 parse_fakesnac(OscarData *od, FlapConnection *conn, FlapFrame *frame, guint16 family, guint16 subtype)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
762 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
763 aim_module_t *cur;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
764 aim_modsnac_t snac;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
765
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
766 snac.family = family;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
767 snac.subtype = subtype;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
768 snac.flags = snac.id = 0;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
769
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
770 for (cur = (aim_module_t *)od->modlistv; cur; cur = cur->next) {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
771
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
772 if (!(cur->flags & AIM_MODFLAG_MULTIFAMILY) &&
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
773 (cur->family != snac.family))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
774 continue;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
775
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
776 if (cur->snachandler(od, conn, cur, frame, &snac, &frame->data))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
777 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
778 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
779 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
780
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
781 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
782 parse_flap_ch4(OscarData *od, FlapConnection *conn, FlapFrame *frame)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
783 {
17443
bae8548d98b3 Cleanup and simplification of some tlvlist stuff in the oscar protocol.
Mark Doliner <markdoliner@pidgin.im>
parents: 17280
diff changeset
784 GSList *tlvlist;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
785 char *msg = NULL;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
786
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
787 if (byte_stream_empty(&frame->data) == 0) {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
788 /* XXX should do something with this */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
789 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
790 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
791
13603
12489c04a4ea [gaim-migrate @ 15988]
Mark Doliner <markdoliner@pidgin.im>
parents: 13593
diff changeset
792 /* An ICQ account is logging in */
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
793 if (conn->type == SNAC_FAMILY_AUTH)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
794 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
795 parse_fakesnac(od, conn, frame, 0x0017, 0x0003);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
796 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
797 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
798
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
799 tlvlist = aim_tlvlist_read(&frame->data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
800
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
801 if (aim_tlv_gettlv(tlvlist, 0x0009, 1))
18874
556ca90e3b0d Call the AIM_CB_SPECIAL_CONNERR callback from
Mark Doliner <markdoliner@pidgin.im>
parents: 17573
diff changeset
802 conn->disconnect_code = aim_tlv_get16(tlvlist, 0x0009, 1);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
803
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
804 if (aim_tlv_gettlv(tlvlist, 0x000b, 1))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
805 msg = aim_tlv_getstr(tlvlist, 0x000b, 1);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
806
18874
556ca90e3b0d Call the AIM_CB_SPECIAL_CONNERR callback from
Mark Doliner <markdoliner@pidgin.im>
parents: 17573
diff changeset
807 /*
556ca90e3b0d Call the AIM_CB_SPECIAL_CONNERR callback from
Mark Doliner <markdoliner@pidgin.im>
parents: 17573
diff changeset
808 * The server ended this FLAP connnection, so let's be nice and
556ca90e3b0d Call the AIM_CB_SPECIAL_CONNERR callback from
Mark Doliner <markdoliner@pidgin.im>
parents: 17573
diff changeset
809 * close the physical TCP connection
556ca90e3b0d Call the AIM_CB_SPECIAL_CONNERR callback from
Mark Doliner <markdoliner@pidgin.im>
parents: 17573
diff changeset
810 */
556ca90e3b0d Call the AIM_CB_SPECIAL_CONNERR callback from
Mark Doliner <markdoliner@pidgin.im>
parents: 17573
diff changeset
811 flap_connection_schedule_destroy(conn,
556ca90e3b0d Call the AIM_CB_SPECIAL_CONNERR callback from
Mark Doliner <markdoliner@pidgin.im>
parents: 17573
diff changeset
812 OSCAR_DISCONNECT_REMOTE_CLOSED, msg);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
813
17443
bae8548d98b3 Cleanup and simplification of some tlvlist stuff in the oscar protocol.
Mark Doliner <markdoliner@pidgin.im>
parents: 17280
diff changeset
814 aim_tlvlist_free(tlvlist);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
815
17280
7c0472208173 Make all the oscar memory allocations and frees use the glib functions to avoid problems when mixing C runtimes.
Daniel Atallah <datallah@pidgin.im>
parents: 15884
diff changeset
816 g_free(msg);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
817 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
818
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
819 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
820 * Takes a new incoming FLAP frame and sends it to the appropriate
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
821 * handler function to be parsed.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
822 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
823 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
824 parse_flap(OscarData *od, FlapConnection *conn, FlapFrame *frame)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
825 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
826 if (frame->channel == 0x01) {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
827 guint32 flap_version = byte_stream_get32(&frame->data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
828 if (flap_version != 0x00000001)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
829 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
830 /* Error! */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
831 purple_debug_warning("oscar", "Expecting FLAP version "
22622
1ecb840b5101 Fix a bunch of compiler warnings caused by my addition of G_GNUC_PRINTF()
Mark Doliner <markdoliner@pidgin.im>
parents: 22317
diff changeset
832 "0x00000001 but received FLAP version %08x. Closing connection.\n",
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
833 flap_version);
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
834 flap_connection_schedule_destroy(conn,
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
835 OSCAR_DISCONNECT_INVALID_DATA, NULL);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
836 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
837 else
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
838 conn->connected = TRUE;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
839
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
840 } else if (frame->channel == 0x02) {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
841 parse_snac(od, conn, frame);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
842
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
843 } else if (frame->channel == 0x04) {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
844 parse_flap_ch4(od, conn, frame);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
845
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
846 } else if (frame->channel == 0x05) {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
847 /* TODO: Reset our keepalive watchdog? */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
848
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
849 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
850 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
851
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
852 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
853 * Read in all available data on the socket for a given connection.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
854 * All complete FLAPs handled immedate after they're received.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
855 * Incomplete FLAP data is stored locally and appended to the next
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
856 * time this callback is triggered.
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
857 *
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
858 * This is called by flap_connection_recv_cb and
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
859 * flap_connection_recv_cb_ssl for unencrypted/encrypted connections.
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
860 */
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
861 static void
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
862 flap_connection_recv(FlapConnection *conn)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
863 {
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
864 gpointer buf;
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
865 gsize buflen;
23079
b887906eed60 More s/ssize_t/gssize/
Daniel Atallah <datallah@pidgin.im>
parents: 23004
diff changeset
866 gssize read;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
867
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
868 /* Read data until we run out of data and break out of the loop */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
869 while (TRUE)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
870 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
871 /* Start reading a new FLAP */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
872 if (conn->buffer_incoming.data.data == NULL)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
873 {
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
874 buf = conn->header + conn->header_received;
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
875 buflen = 6 - conn->header_received;
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
876
15256
c57887cd5d08 [gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents: 15191
diff changeset
877 /* Read the first 6 bytes (the FLAP header) */
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
878 if (conn->gsc)
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
879 read = purple_ssl_read(conn->gsc, buf, buflen);
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
880 else
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
881 read = recv(conn->fd, buf, buflen, 0);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
882
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
883 /* Check if the FLAP server closed the connection */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
884 if (read == 0)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
885 {
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
886 flap_connection_schedule_destroy(conn,
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
887 OSCAR_DISCONNECT_REMOTE_CLOSED, NULL);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
888 break;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
889 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
890
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
891 /* 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: 17443
diff changeset
892 if (read < 0)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
893 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
894 if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
895 /* No worries */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
896 break;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
897
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
898 /* Error! */
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
899 flap_connection_schedule_destroy(conn,
21389
e1dd8142bb87 replace most calls to strerror with calls to g_strerror. strerror will return
Nathan Walp <nwalp@pidgin.im>
parents: 20658
diff changeset
900 OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno));
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
901 break;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
902 }
22277
7c386db62c81 Don't send keep-alives if we've received data since in the last KEEPALIVE_INTERVAL seconds
Sean Egan <seanegan@pidgin.im>
parents: 21503
diff changeset
903 conn->od->gc->last_received = time(NULL);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
904
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
905 /* If we don't even have a complete FLAP header then do nothing */
15256
c57887cd5d08 [gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents: 15191
diff changeset
906 conn->header_received += read;
c57887cd5d08 [gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents: 15191
diff changeset
907 if (conn->header_received < 6)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
908 break;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
909
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
910 /* All FLAP frames must start with the byte 0x2a */
15256
c57887cd5d08 [gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents: 15191
diff changeset
911 if (aimutil_get8(&conn->header[0]) != 0x2a)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
912 {
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
913 flap_connection_schedule_destroy(conn,
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
914 OSCAR_DISCONNECT_INVALID_DATA, NULL);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
915 break;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
916 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
917
15169
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
918 /* Verify the sequence number sent by the server. */
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
919 #if 0
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
920 /* TODO: Need to initialize conn->seqnum_in somewhere before we can use this. */
15256
c57887cd5d08 [gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents: 15191
diff changeset
921 if (aimutil_get16(&conn->header[1]) != conn->seqnum_in++)
15169
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
922 {
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
923 /* Received an out-of-order FLAP! */
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
924 flap_connection_schedule_destroy(conn,
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
925 OSCAR_DISCONNECT_INVALID_DATA, NULL);
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
926 break;
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
927 }
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
928 #endif
15147
101192282f5d [gaim-migrate @ 17871]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
929
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
930 /* Initialize a new temporary FlapFrame for incoming data */
15256
c57887cd5d08 [gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents: 15191
diff changeset
931 conn->buffer_incoming.channel = aimutil_get8(&conn->header[1]);
c57887cd5d08 [gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents: 15191
diff changeset
932 conn->buffer_incoming.seqnum = aimutil_get16(&conn->header[2]);
c57887cd5d08 [gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents: 15191
diff changeset
933 conn->buffer_incoming.data.len = aimutil_get16(&conn->header[4]);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
934 conn->buffer_incoming.data.data = g_new(guint8, conn->buffer_incoming.data.len);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
935 conn->buffer_incoming.data.offset = 0;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
936 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
937
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
938 buflen = conn->buffer_incoming.data.len - conn->buffer_incoming.data.offset;
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
939 if (buflen)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
940 {
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
941 buf = &conn->buffer_incoming.data.data[conn->buffer_incoming.data.offset];
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
942 /* Read data into the temporary FlapFrame until it is complete */
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
943 if (conn->gsc)
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
944 read = purple_ssl_read(conn->gsc, buf, buflen);
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
945 else
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
946 read = recv(conn->fd, buf, buflen, 0);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
947
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
948 /* Check if the FLAP server closed the connection */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
949 if (read == 0)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
950 {
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
951 flap_connection_schedule_destroy(conn,
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
952 OSCAR_DISCONNECT_REMOTE_CLOSED, NULL);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
953 break;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
954 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
955
17539
0fd875385856 Only check for EAGAIN if send returns -1, not when it returns 0
Mark Doliner <markdoliner@pidgin.im>
parents: 17443
diff changeset
956 if (read < 0)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
957 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
958 if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
959 /* No worries */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
960 break;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
961
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
962 /* Error! */
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
963 flap_connection_schedule_destroy(conn,
21389
e1dd8142bb87 replace most calls to strerror with calls to g_strerror. strerror will return
Nathan Walp <nwalp@pidgin.im>
parents: 20658
diff changeset
964 OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno));
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
965 break;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
966 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
967
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
968 conn->buffer_incoming.data.offset += read;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
969 if (conn->buffer_incoming.data.offset < conn->buffer_incoming.data.len)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
970 /* Waiting for more data to arrive */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
971 break;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
972 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
973
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
974 /* We have a complete FLAP! Handle it and continue reading */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
975 byte_stream_rewind(&conn->buffer_incoming.data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
976 parse_flap(conn->od, conn, &conn->buffer_incoming);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
977 conn->lastactivity = time(NULL);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
978
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
979 g_free(conn->buffer_incoming.data.data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
980 conn->buffer_incoming.data.data = NULL;
15256
c57887cd5d08 [gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents: 15191
diff changeset
981
c57887cd5d08 [gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents: 15191
diff changeset
982 conn->header_received = 0;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
983 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
984 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
985
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
986 void
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
987 flap_connection_recv_cb(gpointer data, gint source, PurpleInputCondition cond)
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
988 {
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
989 FlapConnection *conn = data;
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
990
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
991 flap_connection_recv(conn);
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
992 }
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
993
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
994 void
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
995 flap_connection_recv_cb_ssl(gpointer data, PurpleSslConnection *gsc, PurpleInputCondition cond)
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
996 {
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
997 FlapConnection *conn = data;
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
998
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
999 flap_connection_recv(conn);
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1000 }
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1001
25519
d15507b37c1a Shuffle a few comments around to make it look like I did something
Mark Doliner <markdoliner@pidgin.im>
parents: 25128
diff changeset
1002 /**
d15507b37c1a Shuffle a few comments around to make it look like I did something
Mark Doliner <markdoliner@pidgin.im>
parents: 25128
diff changeset
1003 * @param source When this function is called as a callback source is
d15507b37c1a Shuffle a few comments around to make it look like I did something
Mark Doliner <markdoliner@pidgin.im>
parents: 25128
diff changeset
1004 * set to the fd that triggered the callback. But this function
d15507b37c1a Shuffle a few comments around to make it look like I did something
Mark Doliner <markdoliner@pidgin.im>
parents: 25128
diff changeset
1005 * is also called directly from flap_connection_send_byte_stream(),
d15507b37c1a Shuffle a few comments around to make it look like I did something
Mark Doliner <markdoliner@pidgin.im>
parents: 25128
diff changeset
1006 * in which case source will be -1. So don't use source--use
d15507b37c1a Shuffle a few comments around to make it look like I did something
Mark Doliner <markdoliner@pidgin.im>
parents: 25128
diff changeset
1007 * conn->gsc or conn->fd instead.
d15507b37c1a Shuffle a few comments around to make it look like I did something
Mark Doliner <markdoliner@pidgin.im>
parents: 25128
diff changeset
1008 */
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1009 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1010 send_cb(gpointer data, gint source, PurpleInputCondition cond)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1011 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1012 FlapConnection *conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1013 int writelen, ret;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1014
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1015 conn = data;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1016 writelen = purple_circ_buffer_get_max_read(conn->buffer_outgoing);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1017
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1018 if (writelen == 0)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1019 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1020 purple_input_remove(conn->watcher_outgoing);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1021 conn->watcher_outgoing = 0;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1022 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1023 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1024
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1025 if (conn->gsc)
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1026 ret = purple_ssl_write(conn->gsc, conn->buffer_outgoing->outptr,
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1027 writelen);
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1028 else
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1029 ret = send(conn->fd, conn->buffer_outgoing->outptr, writelen, 0);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1030 if (ret <= 0)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1031 {
17573
798d53d90cd1 Get rid of a compile warning
Mark Doliner <markdoliner@pidgin.im>
parents: 17539
diff changeset
1032 if (ret < 0 && ((errno == EAGAIN) || (errno == EWOULDBLOCK)))
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1033 /* No worries */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1034 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1035
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1036 /* Error! */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1037 purple_input_remove(conn->watcher_outgoing);
15191
d52a86abd255 [gaim-migrate @ 17915]
Mark Doliner <markdoliner@pidgin.im>
parents: 15172
diff changeset
1038 conn->watcher_outgoing = 0;
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1039 if (conn->gsc) {
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1040 purple_ssl_close(conn->gsc);
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1041 conn->gsc = NULL;
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1042 } else {
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1043 close(conn->fd);
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1044 conn->fd = -1;
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1045 }
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
1046 flap_connection_schedule_destroy(conn,
21389
e1dd8142bb87 replace most calls to strerror with calls to g_strerror. strerror will return
Nathan Walp <nwalp@pidgin.im>
parents: 20658
diff changeset
1047 OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno));
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1048 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1049 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1050
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1051 purple_circ_buffer_mark_read(conn->buffer_outgoing, ret);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1052 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1053
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1054 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1055 flap_connection_send_byte_stream(ByteStream *bs, FlapConnection *conn, size_t count)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1056 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1057 if (conn == NULL)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1058 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1059
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1060 /* Make sure we don't send past the end of the bs */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1061 if (count > byte_stream_empty(bs))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1062 count = byte_stream_empty(bs); /* truncate to remaining space */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1063
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1064 if (count == 0)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1065 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1066
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1067 /* Add everything to our outgoing buffer */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1068 purple_circ_buffer_append(conn->buffer_outgoing, bs->data, count);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1069
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1070 /* If we haven't already started writing stuff, then start the cycle */
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1071 if (conn->watcher_outgoing == 0)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1072 {
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1073 if (conn->gsc) {
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1074 conn->watcher_outgoing = purple_input_add(conn->gsc->fd,
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1075 PURPLE_INPUT_WRITE, send_cb, conn);
25519
d15507b37c1a Shuffle a few comments around to make it look like I did something
Mark Doliner <markdoliner@pidgin.im>
parents: 25128
diff changeset
1076 send_cb(conn, -1, 0);
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1077 } else if (conn->fd >= 0) {
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1078 conn->watcher_outgoing = purple_input_add(conn->fd,
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1079 PURPLE_INPUT_WRITE, send_cb, conn);
25519
d15507b37c1a Shuffle a few comments around to make it look like I did something
Mark Doliner <markdoliner@pidgin.im>
parents: 25128
diff changeset
1080 send_cb(conn, -1, 0);
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1081 }
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1082 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1083 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1084
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1085 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1086 sendframe_flap(FlapConnection *conn, FlapFrame *frame)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1087 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1088 ByteStream bs;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1089 int payloadlen, bslen;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1090
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1091 payloadlen = byte_stream_curpos(&frame->data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1092
15151
bb985812fefa [gaim-migrate @ 17875]
Mark Doliner <markdoliner@pidgin.im>
parents: 15150
diff changeset
1093 byte_stream_new(&bs, 6 + payloadlen);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1094
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1095 /* FLAP header */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1096 byte_stream_put8(&bs, 0x2a);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1097 byte_stream_put8(&bs, frame->channel);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1098 byte_stream_put16(&bs, frame->seqnum);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1099 byte_stream_put16(&bs, payloadlen);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1100
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1101 /* Payload */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1102 byte_stream_rewind(&frame->data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1103 byte_stream_putbs(&bs, &frame->data, payloadlen);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1104
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1105 bslen = byte_stream_curpos(&bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1106 byte_stream_rewind(&bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1107 flap_connection_send_byte_stream(&bs, conn, bslen);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1108
22861
76cb58c0c40a Used byte_stream_destroy(), added in 2b0e247173b206213210577c194020c78c864474,
Evan Schoenberg <evands@pidgin.im>
parents: 22860
diff changeset
1109 byte_stream_destroy(&bs);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1110 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1111
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1112 void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1113 flap_connection_send(FlapConnection *conn, FlapFrame *frame)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1114 {
15169
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
1115 frame->seqnum = ++(conn->seqnum_out);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1116 sendframe_flap(conn, frame);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1117 flap_frame_destroy(frame);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1118 }

mercurial