Sat, 08 May 2004 07:19:33 +0000
[gaim-migrate @ 9671]
Show "not specified" as a gender instead of defaulting to male.
I thought about using "inhuman" or "unknown"... but I didn't.
| 2086 | 1 | /* |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
2 | * txqueue.c |
| 2086 | 3 | * |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
7945
diff
changeset
|
4 | * Herein lies all the management routines for the transmit (Tx) queue. |
| 2086 | 5 | * |
| 6 | */ | |
| 7 | ||
| 8 | #define FAIM_INTERNAL | |
| 9 | #include <aim.h> | |
| 10 | ||
| 11 | #ifndef _WIN32 | |
| 12 | #include <sys/socket.h> | |
| 3630 | 13 | #else |
| 14 | #include "win32dep.h" | |
| 2086 | 15 | #endif |
| 16 | ||
| 17 | /* | |
| 18 | * Allocate a new tx frame. | |
| 19 | * | |
| 20 | * This is more for looks than anything else. | |
| 21 | * | |
| 22 | * Right now, that is. If/when we implement a pool of transmit | |
| 23 | * frames, this will become the request-an-unused-frame part. | |
| 24 | * | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
25 | * framing = AIM_FRAMETYPE_OFT/FLAP |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
26 | * chan = channel for FLAP, hdrtype for OFT |
| 2086 | 27 | * |
| 28 | */ | |
| 3630 | 29 | faim_internal aim_frame_t *aim_tx_new(aim_session_t *sess, aim_conn_t *conn, fu8_t framing, fu16_t chan, int datalen) |
| 2086 | 30 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
31 | aim_frame_t *fr; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
32 | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
33 | if (!sess || !conn) { |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
34 | faimdprintf(sess, 0, "aim_tx_new: No session or no connection specified!\n"); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
35 | return NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
36 | } |
| 2086 | 37 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
38 | /* For sanity... */ |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
39 | if ((conn->type == AIM_CONN_TYPE_RENDEZVOUS) || (conn->type == AIM_CONN_TYPE_LISTENER)) { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
40 | if (framing != AIM_FRAMETYPE_OFT) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
41 | faimdprintf(sess, 0, "aim_tx_new: attempted to allocate inappropriate frame type for rendezvous connection\n"); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
42 | return NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
43 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
44 | } else { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
45 | if (framing != AIM_FRAMETYPE_FLAP) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
46 | faimdprintf(sess, 0, "aim_tx_new: attempted to allocate inappropriate frame type for FLAP connection\n"); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
47 | return NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
48 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
49 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
50 | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
51 | if (!(fr = (aim_frame_t *)calloc(1, sizeof(aim_frame_t)))) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
52 | return NULL; |
| 2086 | 53 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
54 | fr->conn = conn; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
55 | fr->hdrtype = framing; |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
56 | if (fr->hdrtype == AIM_FRAMETYPE_FLAP) |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
57 | fr->hdr.flap.channel = chan; |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
58 | else if (fr->hdrtype == AIM_FRAMETYPE_OFT) |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
59 | fr->hdr.rend.type = chan; |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
60 | else |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
61 | faimdprintf(sess, 0, "tx_new: unknown framing\n"); |
| 2086 | 62 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
63 | if (datalen > 0) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
64 | fu8_t *data; |
| 2086 | 65 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
66 | if (!(data = (unsigned char *)malloc(datalen))) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
67 | aim_frame_destroy(fr); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
68 | return NULL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
69 | } |
| 2086 | 70 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
71 | aim_bstream_init(&fr->data, data, datalen); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
72 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
73 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
74 | return fr; |
| 2086 | 75 | } |
| 76 | ||
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
77 | /* |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
78 | * This increments the tx command count, and returns the seqnum |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
79 | * that should be stamped on the next FLAP packet sent. This is |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
80 | * normally called during the final step of packet preparation |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
81 | * before enqueuement (in aim_tx_enqueue()). |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
82 | */ |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
83 | static flap_seqnum_t aim_get_next_txseqnum(aim_conn_t *conn) |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
84 | { |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
85 | flap_seqnum_t ret; |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
86 | |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
87 | ret = ++conn->seqnum; |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
88 | |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
89 | return ret; |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
90 | } |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
91 | |
| 2086 | 92 | /* |
| 93 | * The overall purpose here is to enqueue the passed in command struct | |
| 94 | * into the outgoing (tx) queue. Basically... | |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
7945
diff
changeset
|
95 | * 1) Make a scope-irrelevant copy of the struct |
| 2086 | 96 | * 3) Mark as not-sent-yet |
| 97 | * 4) Enqueue the struct into the list | |
| 98 | * 6) Return | |
| 99 | * | |
| 100 | * Note that this is only used when doing queue-based transmitting; | |
| 101 | * that is, when sess->tx_enqueue is set to &aim_tx_enqueue__queuebased. | |
| 102 | * | |
| 103 | */ | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
104 | static int aim_tx_enqueue__queuebased(aim_session_t *sess, aim_frame_t *fr) |
| 2086 | 105 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
106 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
107 | if (!fr->conn) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
108 | faimdprintf(sess, 1, "aim_tx_enqueue: WARNING: enqueueing packet with no connecetion\n"); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
109 | fr->conn = aim_getconn_type(sess, AIM_CONN_TYPE_BOS); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
110 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
111 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
112 | if (fr->hdrtype == AIM_FRAMETYPE_FLAP) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
113 | /* assign seqnum -- XXX should really not assign until hardxmit */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
114 | fr->hdr.flap.seqnum = aim_get_next_txseqnum(fr->conn); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
115 | } |
| 2086 | 116 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
117 | fr->handled = 0; /* not sent yet */ |
| 2086 | 118 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
119 | /* see overhead note in aim_rxqueue counterpart */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
120 | if (!sess->queue_outgoing) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
121 | sess->queue_outgoing = fr; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
122 | else { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
123 | aim_frame_t *cur; |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
124 | for (cur = sess->queue_outgoing; cur->next; cur = cur->next); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
125 | cur->next = fr; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
126 | } |
| 2086 | 127 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
128 | return 0; |
| 2086 | 129 | } |
| 130 | ||
| 131 | /* | |
| 132 | * Parallel to aim_tx_enqueue__queuebased, however, this bypasses | |
| 133 | * the whole queue mess when you want immediate writes to happen. | |
| 134 | * | |
| 135 | * Basically the same as its __queuebased couterpart, however | |
| 136 | * instead of doing a list append, it just calls aim_tx_sendframe() | |
| 137 | * right here. | |
| 138 | * | |
| 139 | */ | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
140 | static int aim_tx_enqueue__immediate(aim_session_t *sess, aim_frame_t *fr) |
| 2086 | 141 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
142 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
143 | if (!fr->conn) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
144 | faimdprintf(sess, 1, "aim_tx_enqueue: ERROR: packet has no connection\n"); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
145 | aim_frame_destroy(fr); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
146 | return 0; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
147 | } |
| 2086 | 148 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
149 | if (fr->hdrtype == AIM_FRAMETYPE_FLAP) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
150 | fr->hdr.flap.seqnum = aim_get_next_txseqnum(fr->conn); |
| 2086 | 151 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
152 | fr->handled = 0; /* not sent yet */ |
| 2086 | 153 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
154 | aim_tx_sendframe(sess, fr); |
| 2086 | 155 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
156 | aim_frame_destroy(fr); |
| 2086 | 157 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
158 | return 0; |
| 2086 | 159 | } |
| 160 | ||
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
161 | faim_export int aim_tx_setenqueue(aim_session_t *sess, int what, int (*func)(aim_session_t *, aim_frame_t *)) |
| 2086 | 162 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
163 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
164 | if (what == AIM_TX_QUEUED) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
165 | sess->tx_enqueue = &aim_tx_enqueue__queuebased; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
166 | else if (what == AIM_TX_IMMEDIATE) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
167 | sess->tx_enqueue = &aim_tx_enqueue__immediate; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
168 | else if (what == AIM_TX_USER) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
169 | if (!func) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
170 | return -EINVAL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
171 | sess->tx_enqueue = func; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
172 | } else |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
173 | return -EINVAL; /* unknown action */ |
| 2086 | 174 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
175 | return 0; |
| 2086 | 176 | } |
| 177 | ||
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
178 | faim_internal int aim_tx_enqueue(aim_session_t *sess, aim_frame_t *fr) |
| 2086 | 179 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
180 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
181 | /* |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
7945
diff
changeset
|
182 | * If we want to send on a connection that is in progress, we have to force |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
183 | * them to use the queue based version. Otherwise, use whatever they |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
184 | * want. |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
185 | */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
186 | if (fr && fr->conn && |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
187 | (fr->conn->status & AIM_CONN_STATUS_INPROGRESS)) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
188 | return aim_tx_enqueue__queuebased(sess, fr); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
189 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
190 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
191 | return (*sess->tx_enqueue)(sess, fr); |
| 2086 | 192 | } |
| 193 | ||
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
194 | static int aim_send(int fd, const void *buf, size_t count) |
| 2086 | 195 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
196 | int left, cur; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
197 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
198 | for (cur = 0, left = count; left; ) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
199 | int ret; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
200 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
201 | ret = send(fd, ((unsigned char *)buf)+cur, left, 0); |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
202 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
203 | if (ret == -1) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
204 | return -1; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
205 | else if (ret == 0) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
206 | return cur; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
207 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
208 | cur += ret; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
209 | left -= ret; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
210 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
211 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
212 | return cur; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
213 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
214 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
215 | static int aim_bstream_send(aim_bstream_t *bs, aim_conn_t *conn, size_t count) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
216 | { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
217 | int wrote = 0; |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
218 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
219 | if (!bs || !conn || (count < 0)) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
220 | return -EINVAL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
221 | |
|
7945
7270cd25f841
[gaim-migrate @ 8619]
Mark Doliner <markdoliner@pidgin.im>
parents:
7806
diff
changeset
|
222 | /* Make sure we don't send past the end of the bs */ |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
223 | if (count > aim_bstream_empty(bs)) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
224 | count = aim_bstream_empty(bs); /* truncate to remaining space */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
225 | |
| 3044 | 226 | if (count) { |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
227 | /* |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
228 | * If we're sending a large direct IM (maybe it contains an |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
229 | * image or something), then we want to break it up into chunks |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
230 | * of 1024 and update the UI between sending each one. This is |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
231 | * kind of ugly. Ideally, if the client wants to send a large |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
232 | * amount of data it should just write to the fd directly--we're |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
233 | * not multithreaded and this is just a stop-gap thingy. |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
234 | */ |
| 3044 | 235 | if ((conn->type == AIM_CONN_TYPE_RENDEZVOUS) && |
| 236 | (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM)) { | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
237 | const char *sn = aim_odc_getsn(conn); |
| 3044 | 238 | aim_rxcallback_t userfunc; |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
239 | |
| 3044 | 240 | while (count - wrote > 1024) { |
| 241 | wrote = wrote + aim_send(conn->fd, bs->data + bs->offset + wrote, 1024); | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
242 | if ((userfunc=aim_callhandler(conn->sessv, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER))) |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
243 | userfunc(conn->sessv, NULL, sn, count-wrote>1024 ? ((double)wrote / count) : 1); |
| 3044 | 244 | } |
| 245 | } | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
246 | |
| 3044 | 247 | if (count - wrote) { |
| 248 | wrote = wrote + aim_send(conn->fd, bs->data + bs->offset + wrote, count - wrote); | |
| 249 | } | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
250 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
251 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
252 | bs->offset += wrote; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
253 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
254 | return wrote; |
| 2086 | 255 | } |
| 256 | ||
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
257 | static int sendframe_flap(aim_session_t *sess, aim_frame_t *fr) |
| 2086 | 258 | { |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
259 | aim_bstream_t bs; |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
260 | fu8_t *bs_raw; |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
261 | int payloadlen, err = 0, bslen; |
| 2086 | 262 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
263 | payloadlen = aim_bstream_curpos(&fr->data); |
| 2086 | 264 | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
265 | if (!(bs_raw = malloc(6 + payloadlen))) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
266 | return -ENOMEM; |
| 2086 | 267 | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
268 | aim_bstream_init(&bs, bs_raw, 6 + payloadlen); |
| 2086 | 269 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
270 | /* FLAP header */ |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
271 | aimbs_put8(&bs, 0x2a); |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
272 | aimbs_put8(&bs, fr->hdr.flap.channel); |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
273 | aimbs_put16(&bs, fr->hdr.flap.seqnum); |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
274 | aimbs_put16(&bs, payloadlen); |
| 2086 | 275 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
276 | /* payload */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
277 | aim_bstream_rewind(&fr->data); |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
278 | aimbs_putbs(&bs, &fr->data, payloadlen); |
| 2086 | 279 | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
280 | bslen = aim_bstream_curpos(&bs); |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
281 | aim_bstream_rewind(&bs); |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
282 | if (aim_bstream_send(&bs, fr->conn, bslen) != bslen) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
283 | err = -errno; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
284 | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
285 | free(bs_raw); /* XXX aim_bstream_free */ |
| 2086 | 286 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
287 | fr->handled = 1; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
288 | fr->conn->lastactivity = time(NULL); |
| 2086 | 289 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
290 | return err; |
| 2086 | 291 | } |
| 292 | ||
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
293 | static int sendframe_rendezvous(aim_session_t *sess, aim_frame_t *fr) |
| 2086 | 294 | { |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
295 | aim_bstream_t bs; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
296 | fu8_t *bs_raw; |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
297 | int payloadlen, err = 0, bslen; |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
298 | |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
299 | payloadlen = aim_bstream_curpos(&fr->data); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
300 | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
301 | if (!(bs_raw = malloc(8 + payloadlen))) |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
302 | return -ENOMEM; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
303 | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
304 | aim_bstream_init(&bs, bs_raw, 8 + payloadlen); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
305 | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
306 | /* Rendezvous header */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
307 | aimbs_putraw(&bs, fr->hdr.rend.magic, 4); |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
308 | aimbs_put16(&bs, fr->hdr.rend.hdrlen); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
309 | aimbs_put16(&bs, fr->hdr.rend.type); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
310 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
311 | /* payload */ |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
312 | aim_bstream_rewind(&fr->data); |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
313 | aimbs_putbs(&bs, &fr->data, payloadlen); |
| 2086 | 314 | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
315 | bslen = aim_bstream_curpos(&bs); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
316 | aim_bstream_rewind(&bs); |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
317 | if (aim_bstream_send(&bs, fr->conn, bslen) != bslen) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
318 | err = -errno; |
| 2086 | 319 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
320 | free(bs_raw); /* XXX aim_bstream_free */ |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
321 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
322 | fr->handled = 1; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
323 | fr->conn->lastactivity = time(NULL); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
324 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
325 | return err; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
326 | } |
| 2086 | 327 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
328 | faim_internal int aim_tx_sendframe(aim_session_t *sess, aim_frame_t *fr) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
329 | { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
330 | if (fr->hdrtype == AIM_FRAMETYPE_FLAP) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
331 | return sendframe_flap(sess, fr); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
332 | else if (fr->hdrtype == AIM_FRAMETYPE_OFT) |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
333 | return sendframe_rendezvous(sess, fr); |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
334 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
335 | return -1; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
336 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
337 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
338 | faim_export int aim_tx_flushqueue(aim_session_t *sess) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
339 | { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
340 | aim_frame_t *cur; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
341 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
342 | for (cur = sess->queue_outgoing; cur; cur = cur->next) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
343 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
344 | if (cur->handled) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
345 | continue; /* already been sent */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
346 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
347 | if (cur->conn && (cur->conn->status & AIM_CONN_STATUS_INPROGRESS)) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
348 | continue; |
| 2086 | 349 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
350 | /* |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
351 | * And now for the meager attempt to force transmit |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
352 | * latency and avoid missed messages. |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
353 | */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
354 | if ((cur->conn->lastactivity + cur->conn->forcedlatency) >= time(NULL)) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
355 | /* |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
7945
diff
changeset
|
356 | * XXX should be a break! we don't want to block the |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
357 | * upper layers |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
358 | * |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
359 | * XXX or better, just do this right. |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
360 | * |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
361 | */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
362 | sleep((cur->conn->lastactivity + cur->conn->forcedlatency) - time(NULL)); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
363 | } |
| 2086 | 364 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
365 | /* XXX this should call the custom "queuing" function!! */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
366 | aim_tx_sendframe(sess, cur); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
367 | } |
| 2086 | 368 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
369 | /* purge sent commands from queue */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
370 | aim_tx_purgequeue(sess); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
371 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
372 | return 0; |
| 2086 | 373 | } |
| 374 | ||
| 375 | /* | |
|
7945
7270cd25f841
[gaim-migrate @ 8619]
Mark Doliner <markdoliner@pidgin.im>
parents:
7806
diff
changeset
|
376 | * This is responsible for removing sent commands from the transmit |
|
7270cd25f841
[gaim-migrate @ 8619]
Mark Doliner <markdoliner@pidgin.im>
parents:
7806
diff
changeset
|
377 | * queue. This is not a required operation, but it of course helps |
|
7270cd25f841
[gaim-migrate @ 8619]
Mark Doliner <markdoliner@pidgin.im>
parents:
7806
diff
changeset
|
378 | * reduce memory footprint at run time! |
| 2086 | 379 | */ |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
380 | faim_export void aim_tx_purgequeue(aim_session_t *sess) |
| 2086 | 381 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
382 | aim_frame_t *cur, **prev; |
| 2086 | 383 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
384 | for (prev = &sess->queue_outgoing; (cur = *prev); ) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
385 | if (cur->handled) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
386 | *prev = cur->next; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
387 | aim_frame_destroy(cur); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
388 | } else |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
389 | prev = &cur->next; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
390 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
391 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
392 | return; |
| 2086 | 393 | } |
| 394 | ||
| 395 | /** | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
396 | * Get rid of packets waiting for tx on a dying conn. For now this |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
397 | * simply marks all packets as sent and lets them disappear without |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
398 | * warning. |
| 2086 | 399 | * |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
400 | * @param sess A session. |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
401 | * @param conn Connection that's dying. |
| 2086 | 402 | */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
403 | faim_internal void aim_tx_cleanqueue(aim_session_t *sess, aim_conn_t *conn) |
| 2086 | 404 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
405 | aim_frame_t *cur; |
| 2086 | 406 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
407 | for (cur = sess->queue_outgoing; cur; cur = cur->next) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
408 | if (cur->conn == conn) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
409 | cur->handled = 1; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
410 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
411 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
412 | return; |
| 2086 | 413 | } |