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 } |
