Tue, 26 Oct 2004 01:00:35 +0000
[gaim-migrate @ 11218]
This fixes the crash / hang / strangeness when dragging a buddy to a
conversation entry thing. Also fixes a minor memory leak with old plugins.
| 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 | { |
| 9457 | 142 | int ret; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
143 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
144 | if (!fr->conn) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
145 | 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
|
146 | aim_frame_destroy(fr); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
147 | return 0; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
148 | } |
| 2086 | 149 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
150 | if (fr->hdrtype == AIM_FRAMETYPE_FLAP) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
151 | fr->hdr.flap.seqnum = aim_get_next_txseqnum(fr->conn); |
| 2086 | 152 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
153 | fr->handled = 0; /* not sent yet */ |
| 2086 | 154 | |
| 9457 | 155 | ret = aim_tx_sendframe(sess, fr); |
| 2086 | 156 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
157 | aim_frame_destroy(fr); |
| 2086 | 158 | |
| 9457 | 159 | return ret; |
| 2086 | 160 | } |
| 161 | ||
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
162 | faim_export int aim_tx_setenqueue(aim_session_t *sess, int what, int (*func)(aim_session_t *, aim_frame_t *)) |
| 2086 | 163 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
164 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
165 | if (what == AIM_TX_QUEUED) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
166 | sess->tx_enqueue = &aim_tx_enqueue__queuebased; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
167 | else if (what == AIM_TX_IMMEDIATE) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
168 | sess->tx_enqueue = &aim_tx_enqueue__immediate; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
169 | else if (what == AIM_TX_USER) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
170 | if (!func) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
171 | return -EINVAL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
172 | sess->tx_enqueue = func; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
173 | } else |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
174 | return -EINVAL; /* unknown action */ |
| 2086 | 175 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
176 | return 0; |
| 2086 | 177 | } |
| 178 | ||
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
179 | faim_internal int aim_tx_enqueue(aim_session_t *sess, aim_frame_t *fr) |
| 2086 | 180 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
181 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
182 | /* |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
7945
diff
changeset
|
183 | * 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
|
184 | * them to use the queue based version. Otherwise, use whatever they |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
185 | * want. |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
186 | */ |
| 9457 | 187 | if (fr && fr->conn && |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
188 | (fr->conn->status & AIM_CONN_STATUS_INPROGRESS)) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
189 | return aim_tx_enqueue__queuebased(sess, fr); |
|
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 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
192 | return (*sess->tx_enqueue)(sess, fr); |
| 2086 | 193 | } |
| 194 | ||
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
195 | static int aim_send(int fd, const void *buf, size_t count) |
| 2086 | 196 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
197 | int left, cur; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
198 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
199 | for (cur = 0, left = count; left; ) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
200 | int ret; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
201 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
202 | ret = send(fd, ((unsigned char *)buf)+cur, left, 0); |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
203 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
204 | if (ret == -1) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
205 | return -1; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
206 | else if (ret == 0) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
207 | return cur; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
208 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
209 | cur += ret; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
210 | left -= ret; |
|
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 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
213 | return cur; |
|
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 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
216 | 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
|
217 | { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
218 | int wrote = 0; |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
219 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
220 | if (!bs || !conn || (count < 0)) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
221 | return -EINVAL; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
222 | |
|
7945
7270cd25f841
[gaim-migrate @ 8619]
Mark Doliner <markdoliner@pidgin.im>
parents:
7806
diff
changeset
|
223 | /* 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
|
224 | if (count > aim_bstream_empty(bs)) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
225 | count = aim_bstream_empty(bs); /* truncate to remaining space */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
226 | |
| 3044 | 227 | if (count) { |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
228 | /* |
| 9457 | 229 | * I need to rewrite this. "Updating the UI" doesn't make sense. The program is |
| 230 | * blocked and the UI can't redraw. We're blocking all of Gaim. We need to set | |
| 231 | * up an actual txqueue and a GAIM_INPUT_WRITE callback and only write when we | |
| 232 | * can. Why is this file called txqueue anyway? Lets rename it to txblock. | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
233 | */ |
| 3044 | 234 | if ((conn->type == AIM_CONN_TYPE_RENDEZVOUS) && |
| 235 | (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM)) { | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
236 | const char *sn = aim_odc_getsn(conn); |
| 3044 | 237 | aim_rxcallback_t userfunc; |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
238 | |
| 3044 | 239 | while (count - wrote > 1024) { |
| 8971 | 240 | int ret; |
| 241 | ||
| 242 | ret = aim_send(conn->fd, bs->data + bs->offset + wrote, 1024); | |
| 243 | if (ret > 0) | |
| 244 | wrote += ret; | |
| 9457 | 245 | if (ret < 0) |
| 246 | return -1; | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
247 | 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
|
248 | userfunc(conn->sessv, NULL, sn, count-wrote>1024 ? ((double)wrote / count) : 1); |
| 3044 | 249 | } |
| 250 | } | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
251 | |
| 3044 | 252 | if (count - wrote) { |
| 253 | wrote = wrote + aim_send(conn->fd, bs->data + bs->offset + wrote, count - wrote); | |
| 254 | } | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
255 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
256 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
257 | bs->offset += wrote; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
258 | |
|
4617
35d860860593
[gaim-migrate @ 4908]
Mark Doliner <markdoliner@pidgin.im>
parents:
3952
diff
changeset
|
259 | return wrote; |
| 2086 | 260 | } |
| 261 | ||
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
262 | static int sendframe_flap(aim_session_t *sess, aim_frame_t *fr) |
| 2086 | 263 | { |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
264 | aim_bstream_t bs; |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
265 | fu8_t *bs_raw; |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
266 | int payloadlen, err = 0, bslen; |
| 2086 | 267 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
268 | payloadlen = aim_bstream_curpos(&fr->data); |
| 2086 | 269 | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
270 | if (!(bs_raw = malloc(6 + payloadlen))) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
271 | return -ENOMEM; |
| 2086 | 272 | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
273 | aim_bstream_init(&bs, bs_raw, 6 + payloadlen); |
| 2086 | 274 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
275 | /* FLAP header */ |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
276 | aimbs_put8(&bs, 0x2a); |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
277 | aimbs_put8(&bs, fr->hdr.flap.channel); |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
278 | aimbs_put16(&bs, fr->hdr.flap.seqnum); |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
279 | aimbs_put16(&bs, payloadlen); |
| 2086 | 280 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
281 | /* payload */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
282 | aim_bstream_rewind(&fr->data); |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
283 | aimbs_putbs(&bs, &fr->data, payloadlen); |
| 2086 | 284 | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
285 | bslen = aim_bstream_curpos(&bs); |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
286 | aim_bstream_rewind(&bs); |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
287 | if (aim_bstream_send(&bs, fr->conn, bslen) != bslen) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
288 | err = -errno; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
289 | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
290 | free(bs_raw); /* XXX aim_bstream_free */ |
| 2086 | 291 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
292 | fr->handled = 1; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
293 | fr->conn->lastactivity = time(NULL); |
| 2086 | 294 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
295 | return err; |
| 2086 | 296 | } |
| 297 | ||
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
298 | static int sendframe_rendezvous(aim_session_t *sess, aim_frame_t *fr) |
| 2086 | 299 | { |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
300 | aim_bstream_t bs; |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
301 | fu8_t *bs_raw; |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
302 | int payloadlen, err = 0, bslen; |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
303 | |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
304 | payloadlen = aim_bstream_curpos(&fr->data); |
|
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 | if (!(bs_raw = malloc(8 + payloadlen))) |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
307 | return -ENOMEM; |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
308 | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
309 | aim_bstream_init(&bs, bs_raw, 8 + payloadlen); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
310 | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
311 | /* Rendezvous header */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
312 | aimbs_putraw(&bs, fr->hdr.rend.magic, 4); |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
313 | aimbs_put16(&bs, fr->hdr.rend.hdrlen); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
314 | aimbs_put16(&bs, fr->hdr.rend.type); |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
315 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
316 | /* payload */ |
|
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
317 | aim_bstream_rewind(&fr->data); |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
318 | aimbs_putbs(&bs, &fr->data, payloadlen); |
| 2086 | 319 | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
320 | bslen = aim_bstream_curpos(&bs); |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
321 | aim_bstream_rewind(&bs); |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
322 | if (aim_bstream_send(&bs, fr->conn, bslen) != bslen) |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
323 | err = -errno; |
| 2086 | 324 | |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
325 | free(bs_raw); /* XXX aim_bstream_free */ |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
326 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
327 | fr->handled = 1; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
328 | fr->conn->lastactivity = time(NULL); |
|
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 | return err; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
331 | } |
| 2086 | 332 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
333 | 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
|
334 | { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
335 | if (fr->hdrtype == AIM_FRAMETYPE_FLAP) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
336 | return sendframe_flap(sess, fr); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
337 | else if (fr->hdrtype == AIM_FRAMETYPE_OFT) |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
338 | return sendframe_rendezvous(sess, fr); |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
339 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
340 | return -1; |
|
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 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
343 | faim_export int aim_tx_flushqueue(aim_session_t *sess) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
344 | { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
345 | aim_frame_t *cur; |
|
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 | for (cur = sess->queue_outgoing; cur; cur = cur->next) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
348 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
349 | if (cur->handled) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
350 | continue; /* already been sent */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
351 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
352 | if (cur->conn && (cur->conn->status & AIM_CONN_STATUS_INPROGRESS)) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
353 | continue; |
| 2086 | 354 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
355 | /* |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
356 | * And now for the meager attempt to force transmit |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
357 | * latency and avoid missed messages. |
|
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 | if ((cur->conn->lastactivity + cur->conn->forcedlatency) >= time(NULL)) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
360 | /* |
|
8735
01248ea222d3
[gaim-migrate @ 9490]
Jonathan Champ <royanee@users.sourceforge.net>
parents:
7945
diff
changeset
|
361 | * 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
|
362 | * upper layers |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
363 | * |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
364 | * XXX or better, just do this right. |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
365 | * |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
366 | */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
367 | sleep((cur->conn->lastactivity + cur->conn->forcedlatency) - time(NULL)); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
368 | } |
| 2086 | 369 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
370 | /* XXX this should call the custom "queuing" function!! */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
371 | aim_tx_sendframe(sess, cur); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
372 | } |
| 2086 | 373 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
374 | /* purge sent commands from queue */ |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
375 | aim_tx_purgequeue(sess); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
376 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
377 | return 0; |
| 2086 | 378 | } |
| 379 | ||
| 380 | /* | |
|
7945
7270cd25f841
[gaim-migrate @ 8619]
Mark Doliner <markdoliner@pidgin.im>
parents:
7806
diff
changeset
|
381 | * This is responsible for removing sent commands from the transmit |
|
7270cd25f841
[gaim-migrate @ 8619]
Mark Doliner <markdoliner@pidgin.im>
parents:
7806
diff
changeset
|
382 | * 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
|
383 | * reduce memory footprint at run time! |
| 2086 | 384 | */ |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
385 | faim_export void aim_tx_purgequeue(aim_session_t *sess) |
| 2086 | 386 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
387 | aim_frame_t *cur, **prev; |
| 2086 | 388 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
389 | for (prev = &sess->queue_outgoing; (cur = *prev); ) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
390 | if (cur->handled) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
391 | *prev = cur->next; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
392 | aim_frame_destroy(cur); |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
393 | } else |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
394 | prev = &cur->next; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
395 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
396 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
397 | return; |
| 2086 | 398 | } |
| 399 | ||
| 400 | /** | |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
401 | * 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
|
402 | * simply marks all packets as sent and lets them disappear without |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
403 | * warning. |
| 2086 | 404 | * |
|
7806
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
405 | * @param sess A session. |
|
072628543b7d
[gaim-migrate @ 8453]
Mark Doliner <markdoliner@pidgin.im>
parents:
4617
diff
changeset
|
406 | * @param conn Connection that's dying. |
| 2086 | 407 | */ |
|
3952
d13e1fde68d8
[gaim-migrate @ 4133]
Mark Doliner <markdoliner@pidgin.im>
parents:
3630
diff
changeset
|
408 | faim_internal void aim_tx_cleanqueue(aim_session_t *sess, aim_conn_t *conn) |
| 2086 | 409 | { |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
410 | aim_frame_t *cur; |
| 2086 | 411 | |
|
2246
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
412 | for (cur = sess->queue_outgoing; cur; cur = cur->next) { |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
413 | if (cur->conn == conn) |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
414 | cur->handled = 1; |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
415 | } |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
416 | |
|
8ade8b7421af
[gaim-migrate @ 2256]
Eric Warmenhoven <warmenhoven@yahoo.com>
parents:
2086
diff
changeset
|
417 | return; |
| 2086 | 418 | } |