Mercurial > pidgin
annotate src/protocols/oscar/txqueue.c @ 13262:b08f8f3c9197
[gaim-migrate @ 15628]
More cleanup. It's dinner time!
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Sun, 12 Feb 2006 23:59:30 +0000 |
| parents | 7ead7b8aea63 |
| 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 } |
