Mercurial > pidgin
annotate src/protocols/oscar/txqueue.c @ 13253:87a7c3077c19
[gaim-migrate @ 15619]
More cleaning up of oscar. Renamed some functions to be more clear.
Got rid of some stuff that wasn't used. Inlined some small things
in conn.c that were only used once.
The goals of all this are
1. Non-blocking I/O for all connections
2. p2p stuff won't use the same struct as oscar connections, because
that's stupid
3. The oscar PRPL should be less scary
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Sun, 12 Feb 2006 21:27:04 +0000 |
| parents | f260d319bbbc |
| children | 7ead7b8aea63 |
| 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 /* |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
263 * And now for the meager attempt to force transmit |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
264 * latency and avoid missed messages. |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
265 */ |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
266 if ((cur->conn->lastactivity + cur->conn->forcedlatency) >= time(NULL)) { |
| 11162 | 267 /* |
| 268 * XXX should be a break! we don't want to block the | |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
269 * upper layers |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
270 * |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
271 * XXX or better, just do this right. |
|
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 */ |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
274 sleep((cur->conn->lastactivity + cur->conn->forcedlatency) - time(NULL)); |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
275 } |
| 2086 | 276 |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
277 /* XXX this should call the custom "queuing" function!! */ |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
278 aim_tx_sendframe(sess, cur); |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
279 } |
| 2086 | 280 |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
281 /* purge sent commands from queue */ |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
282 aim_tx_purgequeue(sess); |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
283 |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
284 return 0; |
| 2086 | 285 } |
| 286 | |
| 287 /* | |
| 13253 | 288 * This is responsible for removing sent commands from the transmit |
| 7945 | 289 * queue. This is not a required operation, but it of course helps |
| 13253 | 290 * reduce memory footprint at run time! |
| 2086 | 291 */ |
| 13253 | 292 void |
| 293 aim_tx_purgequeue(OscarSession *sess) | |
| 2086 | 294 { |
| 13239 | 295 FlapFrame *cur, **prev; |
| 2086 | 296 |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
297 for (prev = &sess->queue_outgoing; (cur = *prev); ) { |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
298 if (cur->handled) { |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
299 *prev = cur->next; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
300 aim_frame_destroy(cur); |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
301 } else |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
302 prev = &cur->next; |
|
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 |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
305 return; |
| 2086 | 306 } |
| 307 | |
| 308 /** | |
| 13253 | 309 * Get rid of packets waiting for tx on a dying conn. For now this |
| 310 * simply marks all packets as sent and lets them disappear without | |
| 7806 | 311 * warning. |
| 2086 | 312 * |
| 7806 | 313 * @param sess A session. |
| 314 * @param conn Connection that's dying. | |
| 2086 | 315 */ |
| 13253 | 316 void |
| 317 aim_tx_cleanqueue(OscarSession *sess, OscarConnection *conn) | |
| 2086 | 318 { |
| 13239 | 319 FlapFrame *cur; |
| 2086 | 320 |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
321 for (cur = sess->queue_outgoing; cur; cur = cur->next) { |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
322 if (cur->conn == conn) |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
323 cur->handled = 1; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
324 } |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
325 |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
326 return; |
| 2086 | 327 } |
| 13253 | 328 |
| 329 /* | |
| 330 * This increments the tx command count, and returns the seqnum | |
| 331 * that should be stamped on the next FLAP packet sent. This is | |
| 332 * normally called during the final step of packet preparation | |
| 333 * before enqueuement (in aim_tx_enqueue()). | |
| 334 */ | |
| 335 static flap_seqnum_t | |
| 336 aim_get_next_txseqnum(OscarConnection *conn) | |
| 337 { | |
| 338 flap_seqnum_t ret; | |
| 339 | |
| 340 ret = ++conn->seqnum; | |
| 341 | |
| 342 return ret; | |
| 343 } | |
| 344 | |
| 345 /* | |
| 346 * The overall purpose here is to enqueue the passed in command struct | |
| 347 * into the outgoing (tx) queue. Basically... | |
| 348 * 1) Make a scope-irrelevant copy of the struct | |
| 349 * 3) Mark as not-sent-yet | |
| 350 * 4) Enqueue the struct into the list | |
| 351 * 6) Return | |
| 352 * | |
| 353 * Note that this is only used when doing queue-based transmitting; | |
| 354 * that is, when sess->tx_enqueue is set to &aim_tx_enqueue__queuebased. | |
| 355 * | |
| 356 */ | |
| 357 static int | |
| 358 aim_tx_enqueue__queuebased(OscarSession *sess, FlapFrame *fr) | |
| 359 { | |
| 360 | |
| 361 if (!fr->conn) { | |
| 362 gaim_debug_warning("oscar", "aim_tx_enqueue: enqueueing packet with no connecetion\n"); | |
| 363 fr->conn = aim_getconn_type(sess, AIM_CONN_TYPE_BOS); | |
| 364 } | |
| 365 | |
| 366 if (fr->hdrtype == AIM_FRAMETYPE_FLAP) { | |
| 367 /* assign seqnum -- XXX should really not assign until hardxmit */ | |
| 368 fr->hdr.flap.seqnum = aim_get_next_txseqnum(fr->conn); | |
| 369 } | |
| 370 | |
| 371 fr->handled = 0; /* not sent yet */ | |
| 372 | |
| 373 /* see overhead note in aim_rxqueue counterpart */ | |
| 374 if (!sess->queue_outgoing) | |
| 375 sess->queue_outgoing = fr; | |
| 376 else { | |
| 377 FlapFrame *cur; | |
| 378 for (cur = sess->queue_outgoing; cur->next; cur = cur->next); | |
| 379 cur->next = fr; | |
| 380 } | |
| 381 | |
| 382 return 0; | |
| 383 } | |
| 384 | |
| 385 /* | |
| 386 * Parallel to aim_tx_enqueue__queuebased, however, this bypasses | |
| 387 * the whole queue mess when you want immediate writes to happen. | |
| 388 * | |
| 389 * Basically the same as its __queuebased couterpart, however | |
| 390 * instead of doing a list append, it just calls aim_tx_sendframe() | |
| 391 * right here. | |
| 392 * | |
| 393 */ | |
| 394 static int | |
| 395 aim_tx_enqueue__immediate(OscarSession *sess, FlapFrame *fr) | |
| 396 { | |
| 397 int ret; | |
| 398 | |
| 399 if (!fr->conn) { | |
| 400 gaim_debug_error("oscar", "aim_tx_enqueue: packet has no connection\n"); | |
| 401 aim_frame_destroy(fr); | |
| 402 return 0; | |
| 403 } | |
| 404 | |
| 405 if (fr->hdrtype == AIM_FRAMETYPE_FLAP) | |
| 406 fr->hdr.flap.seqnum = aim_get_next_txseqnum(fr->conn); | |
| 407 | |
| 408 fr->handled = 0; /* not sent yet */ | |
| 409 | |
| 410 ret = aim_tx_sendframe(sess, fr); | |
| 411 | |
| 412 aim_frame_destroy(fr); | |
| 413 | |
| 414 return ret; | |
| 415 } | |
| 416 | |
| 417 int | |
| 418 aim_tx_setenqueue(OscarSession *sess, int what, int (*func)(OscarSession *, FlapFrame *)) | |
| 419 { | |
| 420 | |
| 421 if (what == AIM_TX_QUEUED) | |
| 422 sess->tx_enqueue = &aim_tx_enqueue__queuebased; | |
| 423 else if (what == AIM_TX_IMMEDIATE) | |
| 424 sess->tx_enqueue = &aim_tx_enqueue__immediate; | |
| 425 else | |
| 426 return -EINVAL; /* unknown action */ | |
| 427 | |
| 428 return 0; | |
| 429 } | |
| 430 | |
| 431 int | |
| 432 aim_tx_enqueue(OscarSession *sess, FlapFrame *fr) | |
| 433 { | |
| 434 /* | |
| 435 * If we want to send on a connection that is in progress, we have to force | |
| 436 * them to use the queue based version. Otherwise, use whatever they | |
| 437 * want. | |
| 438 */ | |
| 439 if (fr && fr->conn && | |
| 440 (fr->conn->status & AIM_CONN_STATUS_INPROGRESS)) { | |
| 441 return aim_tx_enqueue__queuebased(sess, fr); | |
| 442 } | |
| 443 | |
| 444 return (*sess->tx_enqueue)(sess, fr); | |
| 445 } |
