Mercurial > pidgin.yaz
annotate src/protocols/oscar/txqueue.c @ 13516:4279e5b5e9ac
[gaim-migrate @ 15892]
Bring MSN HTTP method closer to working again. Thanks to wabs in #gaim for noticing my braindead mistakes and pointing me in the right direction. This still needs more work.
committer: Tailor Script <tailor@pidgin.im>
author | Daniel Atallah <daniel.atallah@gmail.com> |
---|---|
date | Wed, 15 Mar 2006 04:51:59 +0000 |
parents | b08f8f3c9197 |
children |
rev | line source |
---|---|
13234 | 1 /* |
2 * Gaim's oscar protocol plugin | |
3 * This file is the legal property of its developers. | |
4 * Please see the AUTHORS file distributed alongside this file. | |
5 * | |
6 * This library is free software; you can redistribute it and/or | |
7 * modify it under the terms of the GNU Lesser General Public | |
8 * License as published by the Free Software Foundation; either | |
9 * version 2 of the License, or (at your option) any later version. | |
10 * | |
11 * This library is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 * Lesser General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU Lesser General Public | |
17 * License along with this library; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
19 */ | |
20 | |
2086 | 21 /* |
3952 | 22 * txqueue.c |
2086 | 23 * |
8735
92cbf9713795
[gaim-migrate @ 9490]
Christian Hammond <chipx86@chipx86.com>
parents:
7945
diff
changeset
|
24 * Herein lies all the management routines for the transmit (Tx) queue. |
2086 | 25 * |
26 */ | |
27 | |
13234 | 28 #include "oscar.h" |
29 #include "peer.h" | |
2086 | 30 |
31 #ifndef _WIN32 | |
32 #include <sys/socket.h> | |
3630 | 33 #else |
34 #include "win32dep.h" | |
2086 | 35 #endif |
36 | |
37 /* | |
38 * Allocate a new tx frame. | |
39 * | |
40 * This is more for looks than anything else. | |
41 * | |
42 * Right now, that is. If/when we implement a pool of transmit | |
43 * frames, this will become the request-an-unused-frame part. | |
44 * | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
45 * framing = AIM_FRAMETYPE_OFT/FLAP |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
46 * chan = channel for FLAP, hdrtype for OFT |
2086 | 47 * |
48 */ | |
13253 | 49 FlapFrame * |
50 flap_frame_new(OscarSession *sess, OscarConnection *conn, guint8 framing, guint16 chan, int datalen) | |
2086 | 51 { |
13239 | 52 FlapFrame *fr; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
53 |
7806 | 54 if (!sess || !conn) { |
13253 | 55 gaim_debug_misc("oscar", "flap_frame_new: No session or no connection specified!\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
56 return NULL; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
57 } |
2086 | 58 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
59 /* For sanity... */ |
4617 | 60 if ((conn->type == AIM_CONN_TYPE_RENDEZVOUS) || (conn->type == AIM_CONN_TYPE_LISTENER)) { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
61 if (framing != AIM_FRAMETYPE_OFT) { |
13253 | 62 gaim_debug_misc("oscar", "flap_frame_new: attempted to allocate inappropriate frame type for rendezvous connection\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
63 return NULL; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
64 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
65 } else { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
66 if (framing != AIM_FRAMETYPE_FLAP) { |
13253 | 67 gaim_debug_misc("oscar", "flap_frame_new: attempted to allocate inappropriate frame type for FLAP connection\n"); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
68 return NULL; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
69 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
70 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
71 |
13253 | 72 fr = g_new0(FlapFrame, 1); |
10267 | 73 fr->conn = conn; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
74 fr->hdrtype = framing; |
7806 | 75 if (fr->hdrtype == AIM_FRAMETYPE_FLAP) |
76 fr->hdr.flap.channel = chan; | |
77 else if (fr->hdrtype == AIM_FRAMETYPE_OFT) | |
3952 | 78 fr->hdr.rend.type = chan; |
10267 | 79 else |
11253 | 80 gaim_debug_misc("oscar", "tx_new: unknown framing\n"); |
2086 | 81 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
82 if (datalen > 0) { |
13234 | 83 guint8 *data; |
13262 | 84 data = malloc(datalen); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
85 aim_bstream_init(&fr->data, data, datalen); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
86 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
87 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
88 return fr; |
2086 | 89 } |
90 | |
13253 | 91 static int |
92 aim_send(int fd, const void *buf, size_t count) | |
2086 | 93 { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
94 int left, cur; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
95 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
96 for (cur = 0, left = count; left; ) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
97 int ret; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
98 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
99 ret = send(fd, ((unsigned char *)buf)+cur, left, 0); |
7806 | 100 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
101 if (ret == -1) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
102 return -1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
103 else if (ret == 0) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
104 return cur; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
105 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
106 cur += ret; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
107 left -= ret; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
108 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
109 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
110 return cur; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
111 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
112 |
13253 | 113 int |
114 aim_bstream_send(ByteStream *bs, OscarConnection *conn, size_t count) | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
115 { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
116 int wrote = 0; |
7806 | 117 |
12427
c5c0f714d8bc
[gaim-migrate @ 14734]
Richard Laager <rlaager@wiktel.com>
parents:
11369
diff
changeset
|
118 if (!bs || !conn) |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
119 return -EINVAL; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
120 |
7945 | 121 /* Make sure we don't send past the end of the bs */ |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
122 if (count > aim_bstream_empty(bs)) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
123 count = aim_bstream_empty(bs); /* truncate to remaining space */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
124 |
3044 | 125 if (count) { |
7806 | 126 /* |
9457 | 127 * I need to rewrite this. "Updating the UI" doesn't make sense. The program is |
128 * blocked and the UI can't redraw. We're blocking all of Gaim. We need to set | |
129 * up an actual txqueue and a GAIM_INPUT_WRITE callback and only write when we | |
130 * can. Why is this file called txqueue anyway? Lets rename it to txblock. | |
7806 | 131 */ |
10267 | 132 if ((conn->type == AIM_CONN_TYPE_RENDEZVOUS) && |
3044 | 133 (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM)) { |
4617 | 134 const char *sn = aim_odc_getsn(conn); |
3044 | 135 aim_rxcallback_t userfunc; |
7806 | 136 |
3044 | 137 while (count - wrote > 1024) { |
8971 | 138 int ret; |
139 | |
140 ret = aim_send(conn->fd, bs->data + bs->offset + wrote, 1024); | |
141 if (ret > 0) | |
142 wrote += ret; | |
9457 | 143 if (ret < 0) |
144 return -1; | |
7806 | 145 if ((userfunc=aim_callhandler(conn->sessv, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER))) |
146 userfunc(conn->sessv, NULL, sn, count-wrote>1024 ? ((double)wrote / count) : 1); | |
3044 | 147 } |
148 } | |
7806 | 149 |
3044 | 150 if (count - wrote) { |
151 wrote = wrote + aim_send(conn->fd, bs->data + bs->offset + wrote, count - wrote); | |
152 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
153 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
154 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
155 bs->offset += wrote; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
156 |
4617 | 157 return wrote; |
2086 | 158 } |
159 | |
13253 | 160 static int |
161 sendframe_flap(OscarSession *sess, FlapFrame *fr) | |
2086 | 162 { |
13239 | 163 ByteStream bs; |
13234 | 164 guint8 *bs_raw; |
7806 | 165 int payloadlen, err = 0, bslen; |
2086 | 166 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
167 payloadlen = aim_bstream_curpos(&fr->data); |
2086 | 168 |
13262 | 169 bs_raw = malloc(6 + payloadlen); |
2086 | 170 |
7806 | 171 aim_bstream_init(&bs, bs_raw, 6 + payloadlen); |
2086 | 172 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
173 /* FLAP header */ |
7806 | 174 aimbs_put8(&bs, 0x2a); |
175 aimbs_put8(&bs, fr->hdr.flap.channel); | |
176 aimbs_put16(&bs, fr->hdr.flap.seqnum); | |
177 aimbs_put16(&bs, payloadlen); | |
2086 | 178 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
179 /* payload */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
180 aim_bstream_rewind(&fr->data); |
7806 | 181 aimbs_putbs(&bs, &fr->data, payloadlen); |
2086 | 182 |
7806 | 183 bslen = aim_bstream_curpos(&bs); |
184 aim_bstream_rewind(&bs); | |
185 if (aim_bstream_send(&bs, fr->conn, bslen) != bslen) | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
186 err = -errno; |
10267 | 187 |
7806 | 188 free(bs_raw); /* XXX aim_bstream_free */ |
2086 | 189 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
190 fr->handled = 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
191 fr->conn->lastactivity = time(NULL); |
2086 | 192 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
193 return err; |
2086 | 194 } |
195 | |
13253 | 196 static int |
197 sendframe_rendezvous(OscarSession *sess, FlapFrame *fr) | |
2086 | 198 { |
13239 | 199 ByteStream bs; |
13234 | 200 guint8 *bs_raw; |
7806 | 201 int payloadlen, err = 0, bslen; |
202 | |
203 payloadlen = aim_bstream_curpos(&fr->data); | |
3952 | 204 |
13262 | 205 bs_raw = malloc(8 + payloadlen); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
206 |
7806 | 207 aim_bstream_init(&bs, bs_raw, 8 + payloadlen); |
3952 | 208 |
7806 | 209 /* Rendezvous header */ |
3952 | 210 aimbs_putraw(&bs, fr->hdr.rend.magic, 4); |
7806 | 211 aimbs_put16(&bs, fr->hdr.rend.hdrlen); |
3952 | 212 aimbs_put16(&bs, fr->hdr.rend.type); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
213 |
3952 | 214 /* payload */ |
215 aim_bstream_rewind(&fr->data); | |
7806 | 216 aimbs_putbs(&bs, &fr->data, payloadlen); |
2086 | 217 |
7806 | 218 bslen = aim_bstream_curpos(&bs); |
3952 | 219 aim_bstream_rewind(&bs); |
7806 | 220 if (aim_bstream_send(&bs, fr->conn, bslen) != bslen) |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
221 err = -errno; |
2086 | 222 |
3952 | 223 free(bs_raw); /* XXX aim_bstream_free */ |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
224 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
225 fr->handled = 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
226 fr->conn->lastactivity = time(NULL); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
227 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
228 return err; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
229 } |
2086 | 230 |
13253 | 231 static int |
232 aim_tx_sendframe(OscarSession *sess, FlapFrame *fr) | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
233 { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
234 if (fr->hdrtype == AIM_FRAMETYPE_FLAP) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
235 return sendframe_flap(sess, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
236 else if (fr->hdrtype == AIM_FRAMETYPE_OFT) |
3952 | 237 return sendframe_rendezvous(sess, fr); |
7806 | 238 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
239 return -1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
240 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
241 |
13262 | 242 /* |
243 * This is responsible for removing sent commands from the transmit | |
244 * queue. This is not a required operation, but it of course helps | |
245 * reduce memory footprint at run time! | |
246 */ | |
247 static void | |
248 aim_tx_purgequeue(OscarSession *sess) | |
249 { | |
250 FlapFrame *cur, **prev; | |
251 | |
252 for (prev = &sess->queue_outgoing; (cur = *prev); ) { | |
253 if (cur->handled) { | |
254 *prev = cur->next; | |
255 aim_frame_destroy(cur); | |
256 } else | |
257 prev = &cur->next; | |
258 } | |
259 | |
260 return; | |
261 } | |
262 | |
13253 | 263 int |
264 aim_tx_flushqueue(OscarSession *sess) | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
265 { |
13239 | 266 FlapFrame *cur; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
267 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
268 for (cur = sess->queue_outgoing; cur; cur = cur->next) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
269 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
270 if (cur->handled) |
11162 | 271 continue; /* already been sent */ |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
272 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
273 if (cur->conn && (cur->conn->status & AIM_CONN_STATUS_INPROGRESS)) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
274 continue; |
2086 | 275 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
276 /* XXX this should call the custom "queuing" function!! */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
277 aim_tx_sendframe(sess, cur); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
278 } |
2086 | 279 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
280 /* purge sent commands from queue */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
281 aim_tx_purgequeue(sess); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
282 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
283 return 0; |
2086 | 284 } |
285 | |
286 /** | |
13253 | 287 * Get rid of packets waiting for tx on a dying conn. For now this |
288 * simply marks all packets as sent and lets them disappear without | |
7806 | 289 * warning. |
2086 | 290 * |
7806 | 291 * @param sess A session. |
292 * @param conn Connection that's dying. | |
2086 | 293 */ |
13253 | 294 void |
295 aim_tx_cleanqueue(OscarSession *sess, OscarConnection *conn) | |
2086 | 296 { |
13239 | 297 FlapFrame *cur; |
2086 | 298 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
299 for (cur = sess->queue_outgoing; cur; cur = cur->next) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
300 if (cur->conn == conn) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
301 cur->handled = 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
302 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
303 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
304 return; |
2086 | 305 } |
13253 | 306 |
307 /* | |
308 * This increments the tx command count, and returns the seqnum | |
309 * that should be stamped on the next FLAP packet sent. This is | |
310 * normally called during the final step of packet preparation | |
311 * before enqueuement (in aim_tx_enqueue()). | |
312 */ | |
313 static flap_seqnum_t | |
314 aim_get_next_txseqnum(OscarConnection *conn) | |
315 { | |
316 flap_seqnum_t ret; | |
317 | |
318 ret = ++conn->seqnum; | |
319 | |
320 return ret; | |
321 } | |
322 | |
323 /* | |
324 * The overall purpose here is to enqueue the passed in command struct | |
325 * into the outgoing (tx) queue. Basically... | |
326 * 1) Make a scope-irrelevant copy of the struct | |
327 * 3) Mark as not-sent-yet | |
328 * 4) Enqueue the struct into the list | |
329 * 6) Return | |
330 * | |
331 * Note that this is only used when doing queue-based transmitting; | |
332 * that is, when sess->tx_enqueue is set to &aim_tx_enqueue__queuebased. | |
333 * | |
334 */ | |
335 static int | |
336 aim_tx_enqueue__queuebased(OscarSession *sess, FlapFrame *fr) | |
337 { | |
338 | |
339 if (!fr->conn) { | |
340 gaim_debug_warning("oscar", "aim_tx_enqueue: enqueueing packet with no connecetion\n"); | |
341 fr->conn = aim_getconn_type(sess, AIM_CONN_TYPE_BOS); | |
342 } | |
343 | |
344 if (fr->hdrtype == AIM_FRAMETYPE_FLAP) { | |
345 /* assign seqnum -- XXX should really not assign until hardxmit */ | |
346 fr->hdr.flap.seqnum = aim_get_next_txseqnum(fr->conn); | |
347 } | |
348 | |
349 fr->handled = 0; /* not sent yet */ | |
350 | |
351 /* see overhead note in aim_rxqueue counterpart */ | |
352 if (!sess->queue_outgoing) | |
353 sess->queue_outgoing = fr; | |
354 else { | |
355 FlapFrame *cur; | |
356 for (cur = sess->queue_outgoing; cur->next; cur = cur->next); | |
357 cur->next = fr; | |
358 } | |
359 | |
360 return 0; | |
361 } | |
362 | |
363 /* | |
364 * Parallel to aim_tx_enqueue__queuebased, however, this bypasses | |
365 * the whole queue mess when you want immediate writes to happen. | |
366 * | |
367 * Basically the same as its __queuebased couterpart, however | |
368 * instead of doing a list append, it just calls aim_tx_sendframe() | |
369 * right here. | |
370 * | |
371 */ | |
372 static int | |
373 aim_tx_enqueue__immediate(OscarSession *sess, FlapFrame *fr) | |
374 { | |
375 int ret; | |
376 | |
377 if (!fr->conn) { | |
378 gaim_debug_error("oscar", "aim_tx_enqueue: packet has no connection\n"); | |
379 aim_frame_destroy(fr); | |
380 return 0; | |
381 } | |
382 | |
383 if (fr->hdrtype == AIM_FRAMETYPE_FLAP) | |
384 fr->hdr.flap.seqnum = aim_get_next_txseqnum(fr->conn); | |
385 | |
386 fr->handled = 0; /* not sent yet */ | |
387 | |
388 ret = aim_tx_sendframe(sess, fr); | |
389 | |
390 aim_frame_destroy(fr); | |
391 | |
392 return ret; | |
393 } | |
394 | |
395 int | |
396 aim_tx_setenqueue(OscarSession *sess, int what, int (*func)(OscarSession *, FlapFrame *)) | |
397 { | |
398 | |
399 if (what == AIM_TX_QUEUED) | |
400 sess->tx_enqueue = &aim_tx_enqueue__queuebased; | |
401 else if (what == AIM_TX_IMMEDIATE) | |
402 sess->tx_enqueue = &aim_tx_enqueue__immediate; | |
403 else | |
404 return -EINVAL; /* unknown action */ | |
405 | |
406 return 0; | |
407 } | |
408 | |
409 int | |
410 aim_tx_enqueue(OscarSession *sess, FlapFrame *fr) | |
411 { | |
412 /* | |
413 * If we want to send on a connection that is in progress, we have to force | |
414 * them to use the queue based version. Otherwise, use whatever they | |
415 * want. | |
416 */ | |
417 if (fr && fr->conn && | |
418 (fr->conn->status & AIM_CONN_STATUS_INPROGRESS)) { | |
419 return aim_tx_enqueue__queuebased(sess, fr); | |
420 } | |
421 | |
422 return (*sess->tx_enqueue)(sess, fr); | |
423 } |