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