Mercurial > pidgin
annotate src/protocols/oscar/txqueue.c @ 13545:cfc2f7fcb3dd
[gaim-migrate @ 15922]
Way more changes that I initially thought I was going to make. I apologize
for the commit message spam. These changes bring a lot of consistency to
our capitalization and punctuation, especially of words like "e-mail".
For reference, I've used these rules (after discussing in #gaim):
e-mail, a case of two words joined:
"e-mail" - in the middle of a sentence caps context
"E-mail" - start of text in a sentence caps context
"E-Mail" - in a header (title) caps context
re-enable, a single word, would be:
"re-enable", "Re-enable", and "Re-enable" (respectively)
The reason this changeset exploded is that, as I went through and verified
these changes, I realized we were using improper capitalization (e.g. header
instead of sentence) in a number of dialogs. I fixed a number of these
cases before, and this corrects another pile.
This looks like I've made a LOT of work for the translators, but the impact
is significantly mitigated by three factors: 1) Many of these changes use
strings that already exist, or change one string in many places. 2) I've
used sed to correct the .po files where possible. 3) The actual changes
are extremely trivial.
committer: Tailor Script <tailor@pidgin.im>
| author | Richard Laager <rlaager@wiktel.com> |
|---|---|
| date | Tue, 21 Mar 2006 04:32:45 +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 } |
