Mercurial > pidgin
annotate src/protocols/oscar/txqueue.c @ 13256:7ead7b8aea63
[gaim-migrate @ 15622]
Remove the latency code because
1. It uses sleep, which would block everything if it actually worked
2. It doesn't work because we don't use AIM_TX_IMMEDIATE instead of
AIM_TX_QUEUED
3. I'm going to be getting rid of AIM_TX_IMMEDIATE and AIM_TX_QUEUED
and will be using a GaimCircBuffer for transmission at all times
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sun, 12 Feb 2006 22:21:08 +0000 |
parents | 87a7c3077c19 |
children | b08f8f3c9197 |
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; |
2086 | 84 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
85 if (!(data = (unsigned char *)malloc(datalen))) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
86 aim_frame_destroy(fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
87 return NULL; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
88 } |
2086 | 89 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
90 aim_bstream_init(&fr->data, data, datalen); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
91 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
92 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
93 return fr; |
2086 | 94 } |
95 | |
13253 | 96 static int |
97 aim_send(int fd, const void *buf, size_t count) | |
2086 | 98 { |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
99 int left, cur; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
100 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
101 for (cur = 0, left = count; left; ) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
102 int ret; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
103 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
104 ret = send(fd, ((unsigned char *)buf)+cur, left, 0); |
7806 | 105 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
106 if (ret == -1) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
107 return -1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
108 else if (ret == 0) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
109 return cur; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
110 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
111 cur += ret; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
112 left -= ret; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
113 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
114 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
115 return cur; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
116 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
117 |
13253 | 118 int |
119 aim_bstream_send(ByteStream *bs, OscarConnection *conn, size_t count) | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
120 { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
121 int wrote = 0; |
7806 | 122 |
12427
c5c0f714d8bc
[gaim-migrate @ 14734]
Richard Laager <rlaager@wiktel.com>
parents:
11369
diff
changeset
|
123 if (!bs || !conn) |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
124 return -EINVAL; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
125 |
7945 | 126 /* 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
|
127 if (count > aim_bstream_empty(bs)) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
128 count = aim_bstream_empty(bs); /* truncate to remaining space */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
129 |
3044 | 130 if (count) { |
7806 | 131 /* |
9457 | 132 * I need to rewrite this. "Updating the UI" doesn't make sense. The program is |
133 * blocked and the UI can't redraw. We're blocking all of Gaim. We need to set | |
134 * up an actual txqueue and a GAIM_INPUT_WRITE callback and only write when we | |
135 * can. Why is this file called txqueue anyway? Lets rename it to txblock. | |
7806 | 136 */ |
10267 | 137 if ((conn->type == AIM_CONN_TYPE_RENDEZVOUS) && |
3044 | 138 (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM)) { |
4617 | 139 const char *sn = aim_odc_getsn(conn); |
3044 | 140 aim_rxcallback_t userfunc; |
7806 | 141 |
3044 | 142 while (count - wrote > 1024) { |
8971 | 143 int ret; |
144 | |
145 ret = aim_send(conn->fd, bs->data + bs->offset + wrote, 1024); | |
146 if (ret > 0) | |
147 wrote += ret; | |
9457 | 148 if (ret < 0) |
149 return -1; | |
7806 | 150 if ((userfunc=aim_callhandler(conn->sessv, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER))) |
151 userfunc(conn->sessv, NULL, sn, count-wrote>1024 ? ((double)wrote / count) : 1); | |
3044 | 152 } |
153 } | |
7806 | 154 |
3044 | 155 if (count - wrote) { |
156 wrote = wrote + aim_send(conn->fd, bs->data + bs->offset + wrote, count - wrote); | |
157 } | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
158 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
159 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
160 bs->offset += wrote; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
161 |
4617 | 162 return wrote; |
2086 | 163 } |
164 | |
13253 | 165 static int |
166 sendframe_flap(OscarSession *sess, FlapFrame *fr) | |
2086 | 167 { |
13239 | 168 ByteStream bs; |
13234 | 169 guint8 *bs_raw; |
7806 | 170 int payloadlen, err = 0, bslen; |
2086 | 171 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
172 payloadlen = aim_bstream_curpos(&fr->data); |
2086 | 173 |
7806 | 174 if (!(bs_raw = malloc(6 + payloadlen))) |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
175 return -ENOMEM; |
2086 | 176 |
7806 | 177 aim_bstream_init(&bs, bs_raw, 6 + payloadlen); |
2086 | 178 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
179 /* FLAP header */ |
7806 | 180 aimbs_put8(&bs, 0x2a); |
181 aimbs_put8(&bs, fr->hdr.flap.channel); | |
182 aimbs_put16(&bs, fr->hdr.flap.seqnum); | |
183 aimbs_put16(&bs, payloadlen); | |
2086 | 184 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
185 /* payload */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
186 aim_bstream_rewind(&fr->data); |
7806 | 187 aimbs_putbs(&bs, &fr->data, payloadlen); |
2086 | 188 |
7806 | 189 bslen = aim_bstream_curpos(&bs); |
190 aim_bstream_rewind(&bs); | |
191 if (aim_bstream_send(&bs, fr->conn, bslen) != bslen) | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
192 err = -errno; |
10267 | 193 |
7806 | 194 free(bs_raw); /* XXX aim_bstream_free */ |
2086 | 195 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
196 fr->handled = 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
197 fr->conn->lastactivity = time(NULL); |
2086 | 198 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
199 return err; |
2086 | 200 } |
201 | |
13253 | 202 static int |
203 sendframe_rendezvous(OscarSession *sess, FlapFrame *fr) | |
2086 | 204 { |
13239 | 205 ByteStream bs; |
13234 | 206 guint8 *bs_raw; |
7806 | 207 int payloadlen, err = 0, bslen; |
208 | |
209 payloadlen = aim_bstream_curpos(&fr->data); | |
3952 | 210 |
7806 | 211 if (!(bs_raw = malloc(8 + payloadlen))) |
212 return -ENOMEM; | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
213 |
7806 | 214 aim_bstream_init(&bs, bs_raw, 8 + payloadlen); |
3952 | 215 |
7806 | 216 /* Rendezvous header */ |
3952 | 217 aimbs_putraw(&bs, fr->hdr.rend.magic, 4); |
7806 | 218 aimbs_put16(&bs, fr->hdr.rend.hdrlen); |
3952 | 219 aimbs_put16(&bs, fr->hdr.rend.type); |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
220 |
3952 | 221 /* payload */ |
222 aim_bstream_rewind(&fr->data); | |
7806 | 223 aimbs_putbs(&bs, &fr->data, payloadlen); |
2086 | 224 |
7806 | 225 bslen = aim_bstream_curpos(&bs); |
3952 | 226 aim_bstream_rewind(&bs); |
7806 | 227 if (aim_bstream_send(&bs, fr->conn, bslen) != bslen) |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
228 err = -errno; |
2086 | 229 |
3952 | 230 free(bs_raw); /* XXX aim_bstream_free */ |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
231 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
232 fr->handled = 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
233 fr->conn->lastactivity = time(NULL); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
234 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
235 return err; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
236 } |
2086 | 237 |
13253 | 238 static int |
239 aim_tx_sendframe(OscarSession *sess, FlapFrame *fr) | |
2246
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 if (fr->hdrtype == AIM_FRAMETYPE_FLAP) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
242 return sendframe_flap(sess, fr); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
243 else if (fr->hdrtype == AIM_FRAMETYPE_OFT) |
3952 | 244 return sendframe_rendezvous(sess, fr); |
7806 | 245 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
246 return -1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
247 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
248 |
13253 | 249 int |
250 aim_tx_flushqueue(OscarSession *sess) | |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
251 { |
13239 | 252 FlapFrame *cur; |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
253 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
254 for (cur = sess->queue_outgoing; cur; cur = cur->next) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
255 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
256 if (cur->handled) |
11162 | 257 continue; /* already been sent */ |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
258 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
259 if (cur->conn && (cur->conn->status & AIM_CONN_STATUS_INPROGRESS)) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
260 continue; |
2086 | 261 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
262 /* XXX this should call the custom "queuing" function!! */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
263 aim_tx_sendframe(sess, cur); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
264 } |
2086 | 265 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
266 /* purge sent commands from queue */ |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
267 aim_tx_purgequeue(sess); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
268 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
269 return 0; |
2086 | 270 } |
271 | |
272 /* | |
13253 | 273 * This is responsible for removing sent commands from the transmit |
7945 | 274 * queue. This is not a required operation, but it of course helps |
13253 | 275 * reduce memory footprint at run time! |
2086 | 276 */ |
13253 | 277 void |
278 aim_tx_purgequeue(OscarSession *sess) | |
2086 | 279 { |
13239 | 280 FlapFrame *cur, **prev; |
2086 | 281 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
282 for (prev = &sess->queue_outgoing; (cur = *prev); ) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
283 if (cur->handled) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
284 *prev = cur->next; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
285 aim_frame_destroy(cur); |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
286 } else |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
287 prev = &cur->next; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
288 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
289 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
290 return; |
2086 | 291 } |
292 | |
293 /** | |
13253 | 294 * Get rid of packets waiting for tx on a dying conn. For now this |
295 * simply marks all packets as sent and lets them disappear without | |
7806 | 296 * warning. |
2086 | 297 * |
7806 | 298 * @param sess A session. |
299 * @param conn Connection that's dying. | |
2086 | 300 */ |
13253 | 301 void |
302 aim_tx_cleanqueue(OscarSession *sess, OscarConnection *conn) | |
2086 | 303 { |
13239 | 304 FlapFrame *cur; |
2086 | 305 |
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
306 for (cur = sess->queue_outgoing; cur; cur = cur->next) { |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
307 if (cur->conn == conn) |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
308 cur->handled = 1; |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
309 } |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
310 |
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
311 return; |
2086 | 312 } |
13253 | 313 |
314 /* | |
315 * This increments the tx command count, and returns the seqnum | |
316 * that should be stamped on the next FLAP packet sent. This is | |
317 * normally called during the final step of packet preparation | |
318 * before enqueuement (in aim_tx_enqueue()). | |
319 */ | |
320 static flap_seqnum_t | |
321 aim_get_next_txseqnum(OscarConnection *conn) | |
322 { | |
323 flap_seqnum_t ret; | |
324 | |
325 ret = ++conn->seqnum; | |
326 | |
327 return ret; | |
328 } | |
329 | |
330 /* | |
331 * The overall purpose here is to enqueue the passed in command struct | |
332 * into the outgoing (tx) queue. Basically... | |
333 * 1) Make a scope-irrelevant copy of the struct | |
334 * 3) Mark as not-sent-yet | |
335 * 4) Enqueue the struct into the list | |
336 * 6) Return | |
337 * | |
338 * Note that this is only used when doing queue-based transmitting; | |
339 * that is, when sess->tx_enqueue is set to &aim_tx_enqueue__queuebased. | |
340 * | |
341 */ | |
342 static int | |
343 aim_tx_enqueue__queuebased(OscarSession *sess, FlapFrame *fr) | |
344 { | |
345 | |
346 if (!fr->conn) { | |
347 gaim_debug_warning("oscar", "aim_tx_enqueue: enqueueing packet with no connecetion\n"); | |
348 fr->conn = aim_getconn_type(sess, AIM_CONN_TYPE_BOS); | |
349 } | |
350 | |
351 if (fr->hdrtype == AIM_FRAMETYPE_FLAP) { | |
352 /* assign seqnum -- XXX should really not assign until hardxmit */ | |
353 fr->hdr.flap.seqnum = aim_get_next_txseqnum(fr->conn); | |
354 } | |
355 | |
356 fr->handled = 0; /* not sent yet */ | |
357 | |
358 /* see overhead note in aim_rxqueue counterpart */ | |
359 if (!sess->queue_outgoing) | |
360 sess->queue_outgoing = fr; | |
361 else { | |
362 FlapFrame *cur; | |
363 for (cur = sess->queue_outgoing; cur->next; cur = cur->next); | |
364 cur->next = fr; | |
365 } | |
366 | |
367 return 0; | |
368 } | |
369 | |
370 /* | |
371 * Parallel to aim_tx_enqueue__queuebased, however, this bypasses | |
372 * the whole queue mess when you want immediate writes to happen. | |
373 * | |
374 * Basically the same as its __queuebased couterpart, however | |
375 * instead of doing a list append, it just calls aim_tx_sendframe() | |
376 * right here. | |
377 * | |
378 */ | |
379 static int | |
380 aim_tx_enqueue__immediate(OscarSession *sess, FlapFrame *fr) | |
381 { | |
382 int ret; | |
383 | |
384 if (!fr->conn) { | |
385 gaim_debug_error("oscar", "aim_tx_enqueue: packet has no connection\n"); | |
386 aim_frame_destroy(fr); | |
387 return 0; | |
388 } | |
389 | |
390 if (fr->hdrtype == AIM_FRAMETYPE_FLAP) | |
391 fr->hdr.flap.seqnum = aim_get_next_txseqnum(fr->conn); | |
392 | |
393 fr->handled = 0; /* not sent yet */ | |
394 | |
395 ret = aim_tx_sendframe(sess, fr); | |
396 | |
397 aim_frame_destroy(fr); | |
398 | |
399 return ret; | |
400 } | |
401 | |
402 int | |
403 aim_tx_setenqueue(OscarSession *sess, int what, int (*func)(OscarSession *, FlapFrame *)) | |
404 { | |
405 | |
406 if (what == AIM_TX_QUEUED) | |
407 sess->tx_enqueue = &aim_tx_enqueue__queuebased; | |
408 else if (what == AIM_TX_IMMEDIATE) | |
409 sess->tx_enqueue = &aim_tx_enqueue__immediate; | |
410 else | |
411 return -EINVAL; /* unknown action */ | |
412 | |
413 return 0; | |
414 } | |
415 | |
416 int | |
417 aim_tx_enqueue(OscarSession *sess, FlapFrame *fr) | |
418 { | |
419 /* | |
420 * If we want to send on a connection that is in progress, we have to force | |
421 * them to use the queue based version. Otherwise, use whatever they | |
422 * want. | |
423 */ | |
424 if (fr && fr->conn && | |
425 (fr->conn->status & AIM_CONN_STATUS_INPROGRESS)) { | |
426 return aim_tx_enqueue__queuebased(sess, fr); | |
427 } | |
428 | |
429 return (*sess->tx_enqueue)(sess, fr); | |
430 } |