libpurple/protocols/oscar/flap_connection.c

Wed, 15 Jul 2009 16:57:33 +0000

author
Paul Aurich <darkrain42@pidgin.im>
date
Wed, 15 Jul 2009 16:57:33 +0000
changeset 27813
7989c9bb5000
parent 27688
8c89470bfe9d
child 28804
24b032f5d478
child 34021
25c14927f826
permissions
-rw-r--r--

Add purple_ssl_connect_with_ssl_cn, which takes a host to connect to
in addition to a string with which to validate the SSL certificate.
Useful for OSCAR (and XMPP BOSH soon), where we have an IP to connect
to, but need to validate the SSL cert.

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);
27367
82426b0162d4 Make a function static and add two comments
Mark Doliner <markdoliner@pidgin.im>
parents: 25519
diff changeset
49 byte_stream_put32(&frame->data, 0x00000001); /* FLAP Version */
13593
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);
27367
82426b0162d4 Make a function static and add two comments
Mark Doliner <markdoliner@pidgin.im>
parents: 25519
diff changeset
67 byte_stream_put32(&frame->data, 0x00000001); /* FLAP Version */
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
27385
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
75 void
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
76 flap_connection_send_version_with_cookie_and_clientinfo(OscarData *od, FlapConnection *conn, guint16 length, const guint8 *chipsahoy, ClientInfo *ci)
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
77 {
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
78 FlapFrame *frame;
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
79 GSList *tlvlist = NULL;
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
80
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
81 frame = flap_frame_new(od, 0x01, 1152 + length);
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
82
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
83 byte_stream_put32(&frame->data, 0x00000001); /* FLAP Version */
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
84 aim_tlvlist_add_raw(&tlvlist, 0x0006, length, chipsahoy);
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
85
27688
8c89470bfe9d Oh, we don't need a special ui_info field for the AIM clientstring
Mark Doliner <markdoliner@pidgin.im>
parents: 27687
diff changeset
86 if (ci->clientstring != NULL)
8c89470bfe9d Oh, we don't need a special ui_info field for the AIM clientstring
Mark Doliner <markdoliner@pidgin.im>
parents: 27687
diff changeset
87 aim_tlvlist_add_str(&tlvlist, 0x0003, ci->clientstring);
8c89470bfe9d Oh, we don't need a special ui_info field for the AIM clientstring
Mark Doliner <markdoliner@pidgin.im>
parents: 27687
diff changeset
88 else {
8c89470bfe9d Oh, we don't need a special ui_info field for the AIM clientstring
Mark Doliner <markdoliner@pidgin.im>
parents: 27687
diff changeset
89 gchar *clientstring = oscar_get_clientstring();
27687
f46b6b5c25e1 Use the ui_info hash table instead of prefs when passing the clientstring
Mark Doliner <markdoliner@pidgin.im>
parents: 27635
diff changeset
90 aim_tlvlist_add_str(&tlvlist, 0x0003, clientstring);
27688
8c89470bfe9d Oh, we don't need a special ui_info field for the AIM clientstring
Mark Doliner <markdoliner@pidgin.im>
parents: 27687
diff changeset
91 g_free(clientstring);
8c89470bfe9d Oh, we don't need a special ui_info field for the AIM clientstring
Mark Doliner <markdoliner@pidgin.im>
parents: 27687
diff changeset
92 }
27385
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
93 aim_tlvlist_add_16(&tlvlist, 0x0017, (guint16)ci->major);
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
94 aim_tlvlist_add_16(&tlvlist, 0x0018, (guint16)ci->minor);
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
95 aim_tlvlist_add_16(&tlvlist, 0x0019, (guint16)ci->point);
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
96 aim_tlvlist_add_16(&tlvlist, 0x001a, (guint16)ci->build);
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
97 aim_tlvlist_add_8(&tlvlist, 0x004a, 0x01);
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
98
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
99 aim_tlvlist_write(&frame->data, &tlvlist);
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
100
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
101 aim_tlvlist_free(tlvlist);
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
102
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
103 flap_connection_send(conn, frame);
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
104 }
cd0d721fec8f Check in code that connects to oscar using clientLogin. This is the
Mark Doliner <markdoliner@pidgin.im>
parents: 27382
diff changeset
105
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
106 static struct rateclass *
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
107 flap_connection_get_rateclass(FlapConnection *conn, guint16 family, guint16 subtype)
15152
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
108 {
15168
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
109 GSList *tmp1;
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
110 gconstpointer key;
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
111
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
112 key = GUINT_TO_POINTER((family << 16) + subtype);
15152
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
113
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
114 for (tmp1 = conn->rateclasses; tmp1 != NULL; tmp1 = tmp1->next)
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
115 {
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
116 struct rateclass *rateclass;
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
117 rateclass = tmp1->data;
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
118
15168
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
119 if (g_hash_table_lookup(rateclass->members, key))
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
120 return rateclass;
15152
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
121 }
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
122
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
123 return NULL;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
124 }
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 /*
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
127 * 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
128 * 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
129 */
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
130 static guint32
15172
8032180fbca3 [gaim-migrate @ 17896]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
131 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
132 {
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
133 unsigned long timediff; /* In milliseconds */
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
134
15172
8032180fbca3 [gaim-migrate @ 17896]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
135 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
136
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
137 /* This formula is taken from the joscar API docs. Preesh. */
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
138 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
139 }
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
140
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
141 /*
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
142 * 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
143 *
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
144 * @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
145 * 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
146 * emptied.
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
147 */
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
148 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
149 {
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
150 while (!g_queue_is_empty(queue))
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
151 {
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
152 QueuedSnac *queued_snac;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
153 struct rateclass *rateclass;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
154
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
155 queued_snac = g_queue_peek_head(queue);
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
156
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
157 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
158 if (rateclass != NULL)
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
159 {
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
160 guint32 new_current;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
161
15172
8032180fbca3 [gaim-migrate @ 17896]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
162 new_current = rateclass_get_new_current(conn, rateclass, &now);
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
163
19110
0a9827c6feb0 Wiggle two comments around
Mark Doliner <markdoliner@pidgin.im>
parents: 18875
diff changeset
164 /* (Add 100ms padding to account for inaccuracies in the calculation) */
15191
d52a86abd255 [gaim-migrate @ 17915]
Mark Doliner <markdoliner@pidgin.im>
parents: 15172
diff changeset
165 if (new_current < rateclass->alert + 100)
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
166 /* 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
167 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
168
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
169 rateclass->current = new_current;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
170 rateclass->last.tv_sec = now.tv_sec;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
171 rateclass->last.tv_usec = now.tv_usec;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
172 }
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
173
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
174 flap_connection_send(conn, queued_snac->frame);
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
175 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
176 g_queue_pop_head(queue);
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
177 }
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
178
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
179 /* We emptied the queue */
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
180 return TRUE;
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
181 }
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
182
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
183 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
184 {
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
185 FlapConnection *conn;
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
186 struct timeval now;
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
187
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
188 conn = data;
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
189 gettimeofday(&now, NULL);
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
190
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
191 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
192 (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
193 (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
194 conn);
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
195 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
196 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
197 /* Both queues emptied. */
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
198 conn->queued_timeout = 0;
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
199 return FALSE;
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
200 }
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
201 }
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
202
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
203 /* 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
204 return TRUE;
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
205 }
15152
6eb1a86c7729 [gaim-migrate @ 17876]
Mark Doliner <markdoliner@pidgin.im>
parents: 15151
diff changeset
206
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
207 /**
15150
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
208 * 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
209 * 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
210 * sending this SNAC will induce rate limiting then we delay sending
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
211 * 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
212 *
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
213 * @param data The optional bytestream that makes up the data portion
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
214 * 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
215 * @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
216 * 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
217 * only if all high priority SNACs have been sent.
15150
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
218 */
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
219 void
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
220 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
221 {
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
222 FlapFrame *frame;
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
223 guint32 length;
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
224 gboolean enqueue = FALSE;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
225 struct rateclass *rateclass;
15150
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
226
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
227 length = data != NULL ? data->offset : 0;
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
228
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
229 frame = flap_frame_new(od, 0x02, 10 + length);
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
230 aim_putsnac(&frame->data, family, subtype, flags, snacid);
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
231
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
232 if (length > 0)
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
233 {
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
234 byte_stream_rewind(data);
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
235 byte_stream_putbs(&frame->data, data, length);
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
236 }
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
237
15168
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
238 if (conn->queued_timeout != 0)
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
239 enqueue = TRUE;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
240 else if ((rateclass = flap_connection_get_rateclass(conn, family, subtype)) != NULL)
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 struct timeval now;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
243 guint32 new_current;
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 gettimeofday(&now, NULL);
15172
8032180fbca3 [gaim-migrate @ 17896]
Mark Doliner <markdoliner@pidgin.im>
parents: 15169
diff changeset
246 new_current = rateclass_get_new_current(conn, rateclass, &now);
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
247
19110
0a9827c6feb0 Wiggle two comments around
Mark Doliner <markdoliner@pidgin.im>
parents: 18875
diff changeset
248 /* (Add 100ms padding to account for inaccuracies in the calculation) */
15191
d52a86abd255 [gaim-migrate @ 17915]
Mark Doliner <markdoliner@pidgin.im>
parents: 15172
diff changeset
249 if (new_current < rateclass->alert + 100)
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
250 {
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
251 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
252
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
253 enqueue = TRUE;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
254 }
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
255 else
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
256 {
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
257 rateclass->current = new_current;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
258 rateclass->last.tv_sec = now.tv_sec;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
259 rateclass->last.tv_usec = now.tv_usec;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
260 }
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
261 } else {
24659
6e20158ee689 Remove a few spurious debug_warns
Mark Doliner <markdoliner@pidgin.im>
parents: 24317
diff changeset
262 /*
6e20158ee689 Remove a few spurious debug_warns
Mark Doliner <markdoliner@pidgin.im>
parents: 24317
diff changeset
263 * 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
264 * 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
265 * bother warning about them.
6e20158ee689 Remove a few spurious debug_warns
Mark Doliner <markdoliner@pidgin.im>
parents: 24317
diff changeset
266 */
6e20158ee689 Remove a few spurious debug_warns
Mark Doliner <markdoliner@pidgin.im>
parents: 24317
diff changeset
267 if (family != 0x0001 || (subtype != 0x0006 && subtype != 0x0017))
6e20158ee689 Remove a few spurious debug_warns
Mark Doliner <markdoliner@pidgin.im>
parents: 24317
diff changeset
268 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
269 }
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
270
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
271 if (enqueue)
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
272 {
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
273 /* We've been sending too fast, so delay this message */
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
274 QueuedSnac *queued_snac;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
275
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
276 queued_snac = g_new(QueuedSnac, 1);
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
277 queued_snac->family = family;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
278 queued_snac->subtype = subtype;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
279 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
280
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
281 if (high_priority) {
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
282 if (!conn->queued_snacs)
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
283 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
284 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
285 } else {
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
286 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
287 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
288 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
289 }
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
290
15168
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
291 if (conn->queued_timeout == 0)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
292 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
293
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
294 return;
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
295 }
15150
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
296
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
297 flap_connection_send(conn, frame);
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
298 }
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
299
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
300 void
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
301 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
302 {
23889
9c737b728db7 Missed one of these guys
Mark Doliner <markdoliner@pidgin.im>
parents: 23888
diff changeset
303 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
304 }
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
305
15150
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
306 /**
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
307 * 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
308 * that we're logging off. This shouldn't really be necessary--
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
309 * usually the AIM server will detect that the TCP connection has
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
310 * been destroyed--but it's good practice.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
311 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
312 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
313 flap_connection_send_close(OscarData *od, FlapConnection *conn)
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 FlapFrame *frame;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
316
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
317 frame = flap_frame_new(od, 0x04, 0);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
318 flap_connection_send(conn, frame);
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
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
321 /**
15150
c218efb19164 [gaim-migrate @ 17874]
Mark Doliner <markdoliner@pidgin.im>
parents: 15148
diff changeset
322 * 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
323 * packet in FLAP connections. WinAIM 4.x and higher send these
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
324 * _every minute_ to keep the connection alive.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
325 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
326 void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
327 flap_connection_send_keepalive(OscarData *od, FlapConnection *conn)
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 FlapFrame *frame;
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 frame = flap_frame_new(od, 0x05, 0);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
332 flap_connection_send(conn, frame);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
333
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
334 /* clean out SNACs over 60sec old */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
335 aim_cleansnacs(od, 60);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
336 }
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 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
339 * Allocate a new empty connection structure.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
340 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
341 * @param od The oscar session associated with this connection.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
342 * @param type Type of connection to create
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
343 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
344 * @return Returns the new connection structure.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
345 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
346 FlapConnection *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
347 flap_connection_new(OscarData *od, int type)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
348 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
349 FlapConnection *conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
350
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
351 conn = g_new0(FlapConnection, 1);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
352 conn->od = od;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
353 conn->buffer_outgoing = purple_circ_buffer_new(0);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
354 conn->fd = -1;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
355 conn->subtype = -1;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
356 conn->type = type;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
357
14410
a5ae93474db6 [gaim-migrate @ 17050]
Mark Doliner <markdoliner@pidgin.im>
parents: 14324
diff changeset
358 od->oscar_connections = g_slist_prepend(od->oscar_connections, conn);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
359
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
360 return conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
361 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
362
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
363 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
364 * Close (but not free) a connection.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
365 *
14171
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
366 * This cancels any currently pending connection attempt,
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
367 * closes any open fd and frees the auth cookie.
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
368 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
369 * @param conn The connection to close.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
370 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
371 void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
372 flap_connection_close(OscarData *od, FlapConnection *conn)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
373 {
14324
8cbedd82b6ac [gaim-migrate @ 16944]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
374 if (conn->connect_data != NULL)
14171
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
375 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
376 purple_proxy_connect_cancel(conn->connect_data);
14324
8cbedd82b6ac [gaim-migrate @ 16944]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
377 conn->connect_data = NULL;
14171
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
378 }
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
379
23878
63d4f60097a4 Daniel Atallah pointed out that this was obviously wrong. So we would
Mark Doliner <markdoliner@pidgin.im>
parents: 23082
diff changeset
380 if (conn->new_conn_data != NULL)
14171
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
381 {
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
382 if (conn->type == SNAC_FAMILY_CHAT)
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
383 {
14324
8cbedd82b6ac [gaim-migrate @ 16944]
Mark Doliner <markdoliner@pidgin.im>
parents: 14254
diff changeset
384 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
385 conn->new_conn_data = NULL;
14171
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
386 }
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
387 }
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
388
27382
4a4dfc6ad0d6 Stop the watchers before closing the fds
Mark Doliner <markdoliner@pidgin.im>
parents: 27367
diff changeset
389 if ((conn->fd >= 0 || conn->gsc != NULL)
4a4dfc6ad0d6 Stop the watchers before closing the fds
Mark Doliner <markdoliner@pidgin.im>
parents: 27367
diff changeset
390 && conn->type == SNAC_FAMILY_LOCATE)
4a4dfc6ad0d6 Stop the watchers before closing the fds
Mark Doliner <markdoliner@pidgin.im>
parents: 27367
diff changeset
391 flap_connection_send_close(od, conn);
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
392
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
393 if (conn->watcher_incoming != 0)
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
394 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
395 purple_input_remove(conn->watcher_incoming);
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
396 conn->watcher_incoming = 0;
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
397 }
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
398
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
399 if (conn->watcher_outgoing != 0)
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
400 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
401 purple_input_remove(conn->watcher_outgoing);
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
402 conn->watcher_outgoing = 0;
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
403 }
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
404
27382
4a4dfc6ad0d6 Stop the watchers before closing the fds
Mark Doliner <markdoliner@pidgin.im>
parents: 27367
diff changeset
405 if (conn->fd >= 0)
4a4dfc6ad0d6 Stop the watchers before closing the fds
Mark Doliner <markdoliner@pidgin.im>
parents: 27367
diff changeset
406 {
4a4dfc6ad0d6 Stop the watchers before closing the fds
Mark Doliner <markdoliner@pidgin.im>
parents: 27367
diff changeset
407 close(conn->fd);
4a4dfc6ad0d6 Stop the watchers before closing the fds
Mark Doliner <markdoliner@pidgin.im>
parents: 27367
diff changeset
408 conn->fd = -1;
4a4dfc6ad0d6 Stop the watchers before closing the fds
Mark Doliner <markdoliner@pidgin.im>
parents: 27367
diff changeset
409 }
4a4dfc6ad0d6 Stop the watchers before closing the fds
Mark Doliner <markdoliner@pidgin.im>
parents: 27367
diff changeset
410
4a4dfc6ad0d6 Stop the watchers before closing the fds
Mark Doliner <markdoliner@pidgin.im>
parents: 27367
diff changeset
411 if (conn->gsc != NULL)
4a4dfc6ad0d6 Stop the watchers before closing the fds
Mark Doliner <markdoliner@pidgin.im>
parents: 27367
diff changeset
412 {
4a4dfc6ad0d6 Stop the watchers before closing the fds
Mark Doliner <markdoliner@pidgin.im>
parents: 27367
diff changeset
413 purple_ssl_close(conn->gsc);
4a4dfc6ad0d6 Stop the watchers before closing the fds
Mark Doliner <markdoliner@pidgin.im>
parents: 27367
diff changeset
414 conn->gsc = NULL;
4a4dfc6ad0d6 Stop the watchers before closing the fds
Mark Doliner <markdoliner@pidgin.im>
parents: 27367
diff changeset
415 }
4a4dfc6ad0d6 Stop the watchers before closing the fds
Mark Doliner <markdoliner@pidgin.im>
parents: 27367
diff changeset
416
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
417 g_free(conn->buffer_incoming.data.data);
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
418 conn->buffer_incoming.data.data = NULL;
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
419
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
420 purple_circ_buffer_destroy(conn->buffer_outgoing);
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
421 conn->buffer_outgoing = NULL;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
422 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
423
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
424 static void
15148
48ce0abb422a [gaim-migrate @ 17872]
Mark Doliner <markdoliner@pidgin.im>
parents: 15147
diff changeset
425 flap_connection_destroy_rateclass(struct rateclass *rateclass)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
426 {
15168
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
427 g_hash_table_destroy(rateclass->members);
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
428 g_free(rateclass);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
429 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
430
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
431 /**
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
432 * Free a FlapFrame
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
433 *
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
434 * @param frame The frame to free.
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
435 */
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
436 static void
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
437 flap_frame_destroy(FlapFrame *frame)
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
438 {
15168
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
439 g_free(frame->data.data);
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
440 g_free(frame);
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
441 }
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
442
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
443 static gboolean
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
444 flap_connection_destroy_cb(gpointer data)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
445 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
446 FlapConnection *conn;
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
447 OscarData *od;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
448 PurpleAccount *account;
18874
556ca90e3b0d Call the AIM_CB_SPECIAL_CONNERR callback from
Mark Doliner <markdoliner@pidgin.im>
parents: 17573
diff changeset
449 aim_rxcallback_t userfunc;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
450
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
451 conn = data;
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
452 od = conn->od;
22296
120207b25525 Undo revision c10f76ea0a1d80d4b5e7c2807c239a9bbb59bc1e. This should
Mark Doliner <markdoliner@pidgin.im>
parents: 22295
diff changeset
453 account = purple_connection_get_account(od->gc);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
454
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
455 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
456 "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
457 conn->type, conn->disconnect_reason);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
458
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
459 od->oscar_connections = g_slist_remove(od->oscar_connections, conn);
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
460
18874
556ca90e3b0d Call the AIM_CB_SPECIAL_CONNERR callback from
Mark Doliner <markdoliner@pidgin.im>
parents: 17573
diff changeset
461 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
462 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
463
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
464 /*
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
465 * 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
466 * we should try to request one instead of disconnecting.
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
467 */
22296
120207b25525 Undo revision c10f76ea0a1d80d4b5e7c2807c239a9bbb59bc1e. This should
Mark Doliner <markdoliner@pidgin.im>
parents: 22295
diff changeset
468 if (!account->disconnecting && ((od->oscar_connections == NULL)
120207b25525 Undo revision c10f76ea0a1d80d4b5e7c2807c239a9bbb59bc1e. This should
Mark Doliner <markdoliner@pidgin.im>
parents: 22295
diff changeset
469 || (!flap_connection_getbytype(od, SNAC_FAMILY_LOCATE))))
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
470 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
471 /* No more FLAP connections! Sign off this PurpleConnection! */
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
472 gchar *tmp;
21279
40685e1f50ca Rename:
Will Thompson <resiak@pidgin.im>
parents: 21152
diff changeset
473 PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
20452
a9fc6198b5c6 Add disconnection reasons to oscar.
Will Thompson <resiak@pidgin.im>
parents: 19859
diff changeset
474
18875
c9c59be46538 Move a call to purple_connection_error() from oscar.c to
Mark Doliner <markdoliner@pidgin.im>
parents: 18874
diff changeset
475 if (conn->disconnect_code == 0x0001) {
21279
40685e1f50ca Rename:
Will Thompson <resiak@pidgin.im>
parents: 21152
diff changeset
476 reason = PURPLE_CONNECTION_ERROR_NAME_IN_USE;
27628
26ab0a63a199 Remove trailing periods from short disconnection error messags and remove
Mark Doliner <markdoliner@pidgin.im>
parents: 27385
diff changeset
477 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
478 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
479 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
480 } else if (conn->disconnect_reason == OSCAR_DISCONNECT_REMOTE_CLOSED)
27628
26ab0a63a199 Remove trailing periods from short disconnection error messags and remove
Mark Doliner <markdoliner@pidgin.im>
parents: 27385
diff changeset
481 tmp = g_strdup(_("Server closed the connection"));
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
482 else if (conn->disconnect_reason == OSCAR_DISCONNECT_LOST_CONNECTION)
27628
26ab0a63a199 Remove trailing periods from short disconnection error messags and remove
Mark Doliner <markdoliner@pidgin.im>
parents: 27385
diff changeset
483 tmp = g_strdup_printf(_("Lost connection with server: %s"),
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
484 conn->error_message);
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
485 else if (conn->disconnect_reason == OSCAR_DISCONNECT_INVALID_DATA)
27628
26ab0a63a199 Remove trailing periods from short disconnection error messags and remove
Mark Doliner <markdoliner@pidgin.im>
parents: 27385
diff changeset
486 tmp = g_strdup(_("Received invalid data on connection with server"));
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
487 else if (conn->disconnect_reason == OSCAR_DISCONNECT_COULD_NOT_CONNECT)
27635
0cd19038c417 More uniformity among disconnect error messages
Mark Doliner <markdoliner@pidgin.im>
parents: 27628
diff changeset
488 tmp = g_strdup_printf(_("Unable to connect: %s"),
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
489 conn->error_message);
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
490 else
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
491 /*
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
492 * We shouldn't print a message for some disconnect_reasons.
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
493 * Like OSCAR_DISCONNECT_LOCAL_CLOSED.
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
494 */
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
495 tmp = NULL;
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
496
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
497 if (tmp != NULL)
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
498 {
20452
a9fc6198b5c6 Add disconnection reasons to oscar.
Will Thompson <resiak@pidgin.im>
parents: 19859
diff changeset
499 purple_connection_error_reason(od->gc, reason, tmp);
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
500 g_free(tmp);
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
501 }
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
502 }
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
503
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
504 flap_connection_close(od, conn);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
505
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
506 g_free(conn->error_message);
14171
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
507 g_free(conn->cookie);
351b731b9553 [gaim-migrate @ 16743]
Mark Doliner <markdoliner@pidgin.im>
parents: 14048
diff changeset
508
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
509 /*
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
510 * Free conn->internal, if necessary
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
511 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
512 if (conn->type == SNAC_FAMILY_CHAT)
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
513 flap_connection_destroy_chat(od, conn);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
514
14410
a5ae93474db6 [gaim-migrate @ 17050]
Mark Doliner <markdoliner@pidgin.im>
parents: 14324
diff changeset
515 g_slist_free(conn->groups);
15148
48ce0abb422a [gaim-migrate @ 17872]
Mark Doliner <markdoliner@pidgin.im>
parents: 15147
diff changeset
516 while (conn->rateclasses != NULL)
48ce0abb422a [gaim-migrate @ 17872]
Mark Doliner <markdoliner@pidgin.im>
parents: 15147
diff changeset
517 {
48ce0abb422a [gaim-migrate @ 17872]
Mark Doliner <markdoliner@pidgin.im>
parents: 15147
diff changeset
518 flap_connection_destroy_rateclass(conn->rateclasses->data);
48ce0abb422a [gaim-migrate @ 17872]
Mark Doliner <markdoliner@pidgin.im>
parents: 15147
diff changeset
519 conn->rateclasses = g_slist_delete_link(conn->rateclasses, conn->rateclasses);
48ce0abb422a [gaim-migrate @ 17872]
Mark Doliner <markdoliner@pidgin.im>
parents: 15147
diff changeset
520 }
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
521
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
522 if (conn->queued_snacs) {
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
523 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
524 {
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
525 QueuedSnac *queued_snac;
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
526 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
527 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
528 g_free(queued_snac);
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
529 }
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
530 g_queue_free(conn->queued_snacs);
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
531 }
23886
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
532
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
533 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
534 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
535 {
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
536 QueuedSnac *queued_snac;
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
537 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
538 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
539 g_free(queued_snac);
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
540 }
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
541 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
542 }
416eb5818cee Added `flap_connection_send_snac_with_priority()`, which allows specifying
Evan Schoenberg <evands@pidgin.im>
parents: 23879
diff changeset
543
15168
4e604d302448 [gaim-migrate @ 17892]
Mark Doliner <markdoliner@pidgin.im>
parents: 15167
diff changeset
544 if (conn->queued_timeout > 0)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
545 purple_timeout_remove(conn->queued_timeout);
15167
7114af0af12f [gaim-migrate @ 17891]
Mark Doliner <markdoliner@pidgin.im>
parents: 15153
diff changeset
546
14048
b577c53406c0 [gaim-migrate @ 16556]
Mark Doliner <markdoliner@pidgin.im>
parents: 13726
diff changeset
547 g_free(conn);
b577c53406c0 [gaim-migrate @ 16556]
Mark Doliner <markdoliner@pidgin.im>
parents: 13726
diff changeset
548
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
549 return FALSE;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
550 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
551
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
552 /**
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
553 * See the comments for the parameters of
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
554 * flap_connection_schedule_destroy().
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
555 */
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
556 void
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
557 flap_connection_destroy(FlapConnection *conn, OscarDisconnectReason reason, const gchar *error_message)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
558 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
559 if (conn->destroy_timeout != 0)
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
560 purple_timeout_remove(conn->destroy_timeout);
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
561 conn->disconnect_reason = reason;
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
562 g_free(conn->error_message);
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
563 conn->error_message = g_strdup(error_message);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
564 flap_connection_destroy_cb(conn);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
565 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
566
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
567 /**
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
568 * Schedule Purple to destroy the given FlapConnection as soon as we
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
569 * 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
570 * 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
571 * for some reason.
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
572 *
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
573 * @param reason The reason for the disconnection.
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
574 * @param error_message A brief error message that gives more detail
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
575 * regarding the reason for the disconnecting. This should
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
576 * 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
577 * 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
578 * and OSCAR_DISCONNECT_COULD_NOT_CONNECT, in which case it
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
579 * 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
580 * to purple_proxy_connect().
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
581 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
582 void
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
583 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
584 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
585 if (conn->destroy_timeout != 0)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
586 /* Already taken care of */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
587 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
588
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
589 purple_debug_info("oscar", "Scheduling destruction of FLAP "
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
590 "connection of type 0x%04hx\n", conn->type);
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
591 conn->disconnect_reason = reason;
14464
b7bca43f75b3 [gaim-migrate @ 17110]
Mark Doliner <markdoliner@pidgin.im>
parents: 14454
diff changeset
592 g_free(conn->error_message);
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
593 conn->error_message = g_strdup(error_message);
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
594 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
595 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
596
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
597 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
598 * In OSCAR, every connection has a set of SNAC groups associated
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
599 * 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
600 * without being guaranteed a "Not supported" SNAC error.
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 * The grand theory of things says that these associations transcend
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
603 * what libfaim calls "connection types" (conn->type). You can probably
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
604 * 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
605 * get to hear it all spelled out.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
606 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
607 * 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
608 * 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
609 * 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
610 * at the top of your connection list, looking for a connection that
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
611 * claims to support group 0x0004. You find one. Why, that neat BOS
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
612 * 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
613 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
614 * 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
615 * 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
616 * 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
617 * searched your connection list for someone who wants to make your life
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
618 * 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
619 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
620 * Here comes the good bit. Without even letting anyone know, particularly
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
621 * 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
622 * 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
623 * marked the need for a connection supporting group 0x000e. A few seconds
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
624 * 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
625 * 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
626 * 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
627 * 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
628 * for. So you continue and send rate confirmation and all that.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
629 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
630 * 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
631 * 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
632 * still stuck in the bitter cold.
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 * 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
635 * future, this may help convince me to implement rate limit mitigation
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
636 * for real. We'll see.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
637 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
638 * 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
639 * 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
640 * 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
641 * 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
642 * 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
643 * instantly have a couple of supporters of not doing it.)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
644 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
645 * Generally, addgroup is only called by the internal handling of the
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
646 * 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
647 * 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
648 * 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
649 * about such inane things.
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
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
653 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
654 * Find a FlapConnection that supports the given oscar
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
655 * family.
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 FlapConnection *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
658 flap_connection_findbygroup(OscarData *od, guint16 group)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
659 {
14410
a5ae93474db6 [gaim-migrate @ 17050]
Mark Doliner <markdoliner@pidgin.im>
parents: 14324
diff changeset
660 GSList *cur;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
661
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
662 for (cur = od->oscar_connections; cur != NULL; cur = cur->next)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
663 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
664 FlapConnection *conn;
14410
a5ae93474db6 [gaim-migrate @ 17050]
Mark Doliner <markdoliner@pidgin.im>
parents: 14324
diff changeset
665 GSList *l;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
666
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
667 conn = cur->data;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
668
13612
c51da9e6fec1 [gaim-migrate @ 15997]
Mark Doliner <markdoliner@pidgin.im>
parents: 13611
diff changeset
669 for (l = conn->groups; l != NULL; l = l->next)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
670 {
13612
c51da9e6fec1 [gaim-migrate @ 15997]
Mark Doliner <markdoliner@pidgin.im>
parents: 13611
diff changeset
671 if (GPOINTER_TO_UINT(l->data) == group)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
672 return conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
673 }
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 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
680 * Locates a connection of the specified type in the
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
681 * specified session.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
682 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
683 * TODO: Use flap_connection_findbygroup everywhere and get rid of this.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
684 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
685 * @param od The session to search.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
686 * @param type The type of connection to look for.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
687 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
688 * @return Returns the first connection found of the given target type,
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
689 * or NULL if none could be found.
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 FlapConnection *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
692 flap_connection_getbytype(OscarData *od, int type)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
693 {
14410
a5ae93474db6 [gaim-migrate @ 17050]
Mark Doliner <markdoliner@pidgin.im>
parents: 14324
diff changeset
694 GSList *cur;
13593
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 for (cur = od->oscar_connections; cur != NULL; cur = cur->next)
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 FlapConnection *conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
699 conn = cur->data;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
700 if ((conn->type == type) && (conn->connected))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
701 return conn;
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
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
704 return NULL;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
705 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
706
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
707 FlapConnection *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
708 flap_connection_getbytype_all(OscarData *od, int type)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
709 {
14410
a5ae93474db6 [gaim-migrate @ 17050]
Mark Doliner <markdoliner@pidgin.im>
parents: 14324
diff changeset
710 GSList *cur;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
711
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
712 for (cur = od->oscar_connections; cur; cur = cur->next)
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 FlapConnection *conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
715 conn = cur->data;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
716 if (conn->type == type)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
717 return conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
718 }
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 return NULL;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
721 }
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 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
724 * Allocate a new FLAP frame.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
725 *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
726 * @param channel The FLAP channel. This is almost always 2.
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 FlapFrame *
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
729 flap_frame_new(OscarData *od, guint16 channel, int datalen)
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 FlapFrame *frame;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
732
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
733 frame = g_new0(FlapFrame, 1);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
734 frame->channel = channel;
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 (datalen > 0)
15151
bb985812fefa [gaim-migrate @ 17875]
Mark Doliner <markdoliner@pidgin.im>
parents: 15150
diff changeset
737 byte_stream_new(&frame->data, datalen);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
738
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
739 return frame;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
740 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
741
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
742 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
743 parse_snac(OscarData *od, FlapConnection *conn, FlapFrame *frame)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
744 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
745 aim_module_t *cur;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
746 aim_modsnac_t snac;
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 if (byte_stream_empty(&frame->data) < 10)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
749 return;
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 snac.family = byte_stream_get16(&frame->data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
752 snac.subtype = byte_stream_get16(&frame->data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
753 snac.flags = byte_stream_get16(&frame->data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
754 snac.id = byte_stream_get32(&frame->data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
755
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
756 /* 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
757 if (snac.flags & 0x0001) {
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 * This means the SNAC will be followed by another SNAC with
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
760 * related information. We don't need to do anything about
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
761 * this here.
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 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
764 if (snac.flags & 0x8000) {
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 * This packet contains the version of the family that this SNAC is
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
767 * 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
768 * 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
769 * 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
770 * 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
771 * of type 0x0001, length 0x0002, value is the 2 byte version
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
772 * number
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
773 */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
774 byte_stream_advance(&frame->data, byte_stream_get16(&frame->data));
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
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
777 for (cur = (aim_module_t *)od->modlistv; cur; cur = cur->next) {
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 if (!(cur->flags & AIM_MODFLAG_MULTIFAMILY) &&
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
780 (cur->family != snac.family))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
781 continue;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
782
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
783 if (cur->snachandler(od, conn, cur, frame, &snac, &frame->data))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
784 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
785 }
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
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
788 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
789 parse_fakesnac(OscarData *od, FlapConnection *conn, FlapFrame *frame, guint16 family, guint16 subtype)
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 aim_module_t *cur;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
792 aim_modsnac_t snac;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
793
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
794 snac.family = family;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
795 snac.subtype = subtype;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
796 snac.flags = snac.id = 0;
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 for (cur = (aim_module_t *)od->modlistv; cur; cur = cur->next) {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
799
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
800 if (!(cur->flags & AIM_MODFLAG_MULTIFAMILY) &&
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
801 (cur->family != snac.family))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
802 continue;
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 (cur->snachandler(od, conn, cur, frame, &snac, &frame->data))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
805 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
806 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
807 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
808
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
809 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
810 parse_flap_ch4(OscarData *od, FlapConnection *conn, FlapFrame *frame)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
811 {
17443
bae8548d98b3 Cleanup and simplification of some tlvlist stuff in the oscar protocol.
Mark Doliner <markdoliner@pidgin.im>
parents: 17280
diff changeset
812 GSList *tlvlist;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
813 char *msg = NULL;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
814
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
815 if (byte_stream_empty(&frame->data) == 0) {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
816 /* XXX should do something with this */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
817 return;
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
13603
12489c04a4ea [gaim-migrate @ 15988]
Mark Doliner <markdoliner@pidgin.im>
parents: 13593
diff changeset
820 /* An ICQ account is logging in */
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
821 if (conn->type == SNAC_FAMILY_AUTH)
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 parse_fakesnac(od, conn, frame, 0x0017, 0x0003);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
824 return;
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
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
827 tlvlist = aim_tlvlist_read(&frame->data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
828
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
829 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
830 conn->disconnect_code = aim_tlv_get16(tlvlist, 0x0009, 1);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
831
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
832 if (aim_tlv_gettlv(tlvlist, 0x000b, 1))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
833 msg = aim_tlv_getstr(tlvlist, 0x000b, 1);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
834
18874
556ca90e3b0d Call the AIM_CB_SPECIAL_CONNERR callback from
Mark Doliner <markdoliner@pidgin.im>
parents: 17573
diff changeset
835 /*
556ca90e3b0d Call the AIM_CB_SPECIAL_CONNERR callback from
Mark Doliner <markdoliner@pidgin.im>
parents: 17573
diff changeset
836 * 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
837 * close the physical TCP connection
556ca90e3b0d Call the AIM_CB_SPECIAL_CONNERR callback from
Mark Doliner <markdoliner@pidgin.im>
parents: 17573
diff changeset
838 */
556ca90e3b0d Call the AIM_CB_SPECIAL_CONNERR callback from
Mark Doliner <markdoliner@pidgin.im>
parents: 17573
diff changeset
839 flap_connection_schedule_destroy(conn,
556ca90e3b0d Call the AIM_CB_SPECIAL_CONNERR callback from
Mark Doliner <markdoliner@pidgin.im>
parents: 17573
diff changeset
840 OSCAR_DISCONNECT_REMOTE_CLOSED, msg);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
841
17443
bae8548d98b3 Cleanup and simplification of some tlvlist stuff in the oscar protocol.
Mark Doliner <markdoliner@pidgin.im>
parents: 17280
diff changeset
842 aim_tlvlist_free(tlvlist);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
843
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
844 g_free(msg);
13593
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
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
847 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
848 * Takes a new incoming FLAP frame and sends it to the appropriate
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
849 * handler function to be parsed.
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 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
852 parse_flap(OscarData *od, FlapConnection *conn, FlapFrame *frame)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
853 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
854 if (frame->channel == 0x01) {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
855 guint32 flap_version = byte_stream_get32(&frame->data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
856 if (flap_version != 0x00000001)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
857 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
858 /* Error! */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
859 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
860 "0x00000001 but received FLAP version %08x. Closing connection.\n",
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
861 flap_version);
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
862 flap_connection_schedule_destroy(conn,
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
863 OSCAR_DISCONNECT_INVALID_DATA, NULL);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
864 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
865 else
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
866 conn->connected = TRUE;
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 } else if (frame->channel == 0x02) {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
869 parse_snac(od, conn, frame);
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 } else if (frame->channel == 0x04) {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
872 parse_flap_ch4(od, conn, frame);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
873
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
874 } else if (frame->channel == 0x05) {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
875 /* TODO: Reset our keepalive watchdog? */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
876
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
877 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
878 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
879
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
880 /**
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
881 * Read in all available data on the socket for a given connection.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
882 * All complete FLAPs handled immedate after they're received.
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
883 * Incomplete FLAP data is stored locally and appended to the next
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
884 * time this callback is triggered.
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
885 *
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
886 * 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
887 * flap_connection_recv_cb_ssl for unencrypted/encrypted connections.
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
888 */
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
889 static void
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
890 flap_connection_recv(FlapConnection *conn)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
891 {
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
892 gpointer buf;
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
893 gsize buflen;
23079
b887906eed60 More s/ssize_t/gssize/
Daniel Atallah <datallah@pidgin.im>
parents: 23004
diff changeset
894 gssize read;
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
895
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
896 /* 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
897 while (TRUE)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
898 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
899 /* Start reading a new FLAP */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
900 if (conn->buffer_incoming.data.data == NULL)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
901 {
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
902 buf = conn->header + conn->header_received;
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
903 buflen = 6 - conn->header_received;
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
904
15256
c57887cd5d08 [gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents: 15191
diff changeset
905 /* 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
906 if (conn->gsc)
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
907 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
908 else
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
909 read = recv(conn->fd, buf, buflen, 0);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
910
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
911 /* Check if the FLAP server closed the connection */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
912 if (read == 0)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
913 {
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
914 flap_connection_schedule_destroy(conn,
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
915 OSCAR_DISCONNECT_REMOTE_CLOSED, NULL);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
916 break;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
917 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
918
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
919 /* 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
920 if (read < 0)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
921 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
922 if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
923 /* No worries */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
924 break;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
925
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
926 /* Error! */
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
927 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
928 OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno));
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
929 break;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
930 }
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
931 conn->od->gc->last_received = time(NULL);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
932
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
933 /* 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
934 conn->header_received += read;
c57887cd5d08 [gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents: 15191
diff changeset
935 if (conn->header_received < 6)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
936 break;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
937
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
938 /* All FLAP frames must start with the byte 0x2a */
15256
c57887cd5d08 [gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents: 15191
diff changeset
939 if (aimutil_get8(&conn->header[0]) != 0x2a)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
940 {
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
941 flap_connection_schedule_destroy(conn,
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
942 OSCAR_DISCONNECT_INVALID_DATA, NULL);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
943 break;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
944 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
945
15169
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
946 /* Verify the sequence number sent by the server. */
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
947 #if 0
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
948 /* 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
949 if (aimutil_get16(&conn->header[1]) != conn->seqnum_in++)
15169
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
950 {
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
951 /* Received an out-of-order FLAP! */
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
952 flap_connection_schedule_destroy(conn,
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
953 OSCAR_DISCONNECT_INVALID_DATA, NULL);
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
954 break;
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
955 }
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
956 #endif
15147
101192282f5d [gaim-migrate @ 17871]
Mark Doliner <markdoliner@pidgin.im>
parents: 14464
diff changeset
957
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
958 /* Initialize a new temporary FlapFrame for incoming data */
15256
c57887cd5d08 [gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents: 15191
diff changeset
959 conn->buffer_incoming.channel = aimutil_get8(&conn->header[1]);
c57887cd5d08 [gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents: 15191
diff changeset
960 conn->buffer_incoming.seqnum = aimutil_get16(&conn->header[2]);
c57887cd5d08 [gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents: 15191
diff changeset
961 conn->buffer_incoming.data.len = aimutil_get16(&conn->header[4]);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
962 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
963 conn->buffer_incoming.data.offset = 0;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
964 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
965
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
966 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
967 if (buflen)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
968 {
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
969 buf = &conn->buffer_incoming.data.data[conn->buffer_incoming.data.offset];
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
970 /* 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
971 if (conn->gsc)
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
972 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
973 else
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
974 read = recv(conn->fd, buf, buflen, 0);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
975
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
976 /* Check if the FLAP server closed the connection */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
977 if (read == 0)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
978 {
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
979 flap_connection_schedule_destroy(conn,
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
980 OSCAR_DISCONNECT_REMOTE_CLOSED, NULL);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
981 break;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
982 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
983
17539
0fd875385856 Only check for EAGAIN if send returns -1, not when it returns 0
Mark Doliner <markdoliner@pidgin.im>
parents: 17443
diff changeset
984 if (read < 0)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
985 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
986 if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
987 /* No worries */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
988 break;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
989
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
990 /* Error! */
13609
a6fbfad454b6 [gaim-migrate @ 15994]
Mark Doliner <markdoliner@pidgin.im>
parents: 13603
diff changeset
991 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
992 OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno));
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
993 break;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
994 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
995
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
996 conn->buffer_incoming.data.offset += read;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
997 if (conn->buffer_incoming.data.offset < conn->buffer_incoming.data.len)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
998 /* Waiting for more data to arrive */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
999 break;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1000 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1001
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1002 /* We have a complete FLAP! Handle it and continue reading */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1003 byte_stream_rewind(&conn->buffer_incoming.data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1004 parse_flap(conn->od, conn, &conn->buffer_incoming);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1005 conn->lastactivity = time(NULL);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1006
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1007 g_free(conn->buffer_incoming.data.data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1008 conn->buffer_incoming.data.data = NULL;
15256
c57887cd5d08 [gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents: 15191
diff changeset
1009
c57887cd5d08 [gaim-migrate @ 17983]
Mark Doliner <markdoliner@pidgin.im>
parents: 15191
diff changeset
1010 conn->header_received = 0;
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 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1013
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1014 void
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1015 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
1016 {
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1017 FlapConnection *conn = data;
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1018
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1019 flap_connection_recv(conn);
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1020 }
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1021
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1022 void
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1023 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
1024 {
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1025 FlapConnection *conn = data;
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1026
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1027 flap_connection_recv(conn);
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1028 }
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1029
25519
d15507b37c1a Shuffle a few comments around to make it look like I did something
Mark Doliner <markdoliner@pidgin.im>
parents: 25128
diff changeset
1030 /**
d15507b37c1a Shuffle a few comments around to make it look like I did something
Mark Doliner <markdoliner@pidgin.im>
parents: 25128
diff changeset
1031 * @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
1032 * 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
1033 * 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
1034 * 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
1035 * 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
1036 */
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1037 static void
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1038 send_cb(gpointer data, gint source, PurpleInputCondition cond)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1039 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1040 FlapConnection *conn;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1041 int writelen, ret;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1042
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1043 conn = data;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1044 writelen = purple_circ_buffer_get_max_read(conn->buffer_outgoing);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1045
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1046 if (writelen == 0)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1047 {
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1048 purple_input_remove(conn->watcher_outgoing);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1049 conn->watcher_outgoing = 0;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1050 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1051 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1052
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1053 if (conn->gsc)
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1054 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
1055 writelen);
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1056 else
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1057 ret = send(conn->fd, conn->buffer_outgoing->outptr, writelen, 0);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1058 if (ret <= 0)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1059 {
27628
26ab0a63a199 Remove trailing periods from short disconnection error messags and remove
Mark Doliner <markdoliner@pidgin.im>
parents: 27385
diff changeset
1060 if (ret < 0 && (errno == EAGAIN || errno == EWOULDBLOCK))
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1061 /* No worries */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1062 return;
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 /* Error! */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1065 purple_input_remove(conn->watcher_outgoing);
15191
d52a86abd255 [gaim-migrate @ 17915]
Mark Doliner <markdoliner@pidgin.im>
parents: 15172
diff changeset
1066 conn->watcher_outgoing = 0;
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1067 if (conn->gsc) {
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1068 purple_ssl_close(conn->gsc);
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1069 conn->gsc = NULL;
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1070 } else {
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1071 close(conn->fd);
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1072 conn->fd = -1;
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1073 }
14454
df290cda81a3 [gaim-migrate @ 17099]
Mark Doliner <markdoliner@pidgin.im>
parents: 14410
diff changeset
1074 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
1075 OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno));
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1076 return;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1077 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1078
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1079 purple_circ_buffer_mark_read(conn->buffer_outgoing, ret);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1080 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1081
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1082 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1083 flap_connection_send_byte_stream(ByteStream *bs, FlapConnection *conn, size_t count)
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 if (conn == NULL)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1086 return;
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 /* Make sure we don't send past the end of the bs */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1089 if (count > byte_stream_empty(bs))
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1090 count = byte_stream_empty(bs); /* truncate to remaining space */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1091
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1092 if (count == 0)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1093 return;
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 /* Add everything to our outgoing buffer */
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
1096 purple_circ_buffer_append(conn->buffer_outgoing, bs->data, count);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1097
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1098 /* 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
1099 if (conn->watcher_outgoing == 0)
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1100 {
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1101 if (conn->gsc) {
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1102 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
1103 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
1104 send_cb(conn, -1, 0);
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1105 } else if (conn->fd >= 0) {
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1106 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
1107 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
1108 send_cb(conn, -1, 0);
25126
2a75db143599 First pass at adding SSL connections to OSCAR.
Paul Aurich <darkrain42@pidgin.im>
parents: 24659
diff changeset
1109 }
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
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1113 static void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1114 sendframe_flap(FlapConnection *conn, FlapFrame *frame)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1115 {
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1116 ByteStream bs;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1117 int payloadlen, bslen;
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1118
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1119 payloadlen = byte_stream_curpos(&frame->data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1120
15151
bb985812fefa [gaim-migrate @ 17875]
Mark Doliner <markdoliner@pidgin.im>
parents: 15150
diff changeset
1121 byte_stream_new(&bs, 6 + payloadlen);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1122
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1123 /* FLAP header */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1124 byte_stream_put8(&bs, 0x2a);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1125 byte_stream_put8(&bs, frame->channel);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1126 byte_stream_put16(&bs, frame->seqnum);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1127 byte_stream_put16(&bs, payloadlen);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1128
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1129 /* Payload */
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1130 byte_stream_rewind(&frame->data);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1131 byte_stream_putbs(&bs, &frame->data, payloadlen);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1132
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1133 bslen = byte_stream_curpos(&bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1134 byte_stream_rewind(&bs);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1135 flap_connection_send_byte_stream(&bs, conn, bslen);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1136
22861
76cb58c0c40a Used byte_stream_destroy(), added in 2b0e247173b206213210577c194020c78c864474,
Evan Schoenberg <evands@pidgin.im>
parents: 22860
diff changeset
1137 byte_stream_destroy(&bs);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1138 }
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1139
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1140 void
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1141 flap_connection_send(FlapConnection *conn, FlapFrame *frame)
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1142 {
15169
5066b0eb6abf [gaim-migrate @ 17893]
Mark Doliner <markdoliner@pidgin.im>
parents: 15168
diff changeset
1143 frame->seqnum = ++(conn->seqnum_out);
13593
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1144 sendframe_flap(conn, frame);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1145 flap_frame_destroy(frame);
3450a7cede99 [gaim-migrate @ 15978]
Mark Doliner <markdoliner@pidgin.im>
parents:
diff changeset
1146 }

mercurial