Mercurial > pidgin
annotate libfaim/aim_txqueue.c @ 1235:a9cf2f61a7b1
[gaim-migrate @ 1245]
1. added protocol names to menus in conversation/join chat dialog. helpful if you're signed on as warmenhoven in both irc and yahoo.
2. made "no sounds when away" mean absolutely no sounds when away.
3. fixed buddy pounces and made it so you can save them.
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Tue, 12 Dec 2000 09:09:24 +0000 |
parents | ed8855ae6632 |
children |
rev | line source |
---|---|
2 | 1 /* |
237 | 2 * aim_txqueue.c |
3 * | |
4 * Herein lies all the mangement routines for the transmit (Tx) queue. | |
5 * | |
2 | 6 */ |
7 | |
283
0f14e6d8a51b
[gaim-migrate @ 293]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
281
diff
changeset
|
8 #include <faim/aim.h> |
237 | 9 |
889
e1da6a6ec42b
[gaim-migrate @ 899]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
840
diff
changeset
|
10 #ifndef _WIN32 |
e1da6a6ec42b
[gaim-migrate @ 899]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
840
diff
changeset
|
11 #include <sys/socket.h> |
e1da6a6ec42b
[gaim-migrate @ 899]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
840
diff
changeset
|
12 #endif |
e1da6a6ec42b
[gaim-migrate @ 899]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
840
diff
changeset
|
13 |
237 | 14 /* |
15 * Allocate a new tx frame. | |
16 * | |
17 * This is more for looks than anything else. | |
18 * | |
19 * Right now, that is. If/when we implement a pool of transmit | |
20 * frames, this will become the request-an-unused-frame part. | |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
21 * |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
22 * framing = AIM_FRAMETYPE_OFT/OSCAR |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
23 * chan = channel for OSCAR, hdrtype for OFT |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
24 * |
237 | 25 */ |
889
e1da6a6ec42b
[gaim-migrate @ 899]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
840
diff
changeset
|
26 faim_internal struct command_tx_struct *aim_tx_new(unsigned char framing, int chan, struct aim_conn_t *conn, int datalen) |
2 | 27 { |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
28 struct command_tx_struct *newtx; |
2 | 29 |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
30 if (!conn) { |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
31 printf("aim_tx_new: ERROR: no connection specified\n"); |
237 | 32 return NULL; |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
33 } |
237 | 34 |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
35 newtx = (struct command_tx_struct *)malloc(sizeof(struct command_tx_struct)); |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
36 if (!newtx) |
237 | 37 return NULL; |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
38 memset(newtx, 0, sizeof(struct command_tx_struct)); |
2 | 39 |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
40 newtx->conn = conn; |
237 | 41 |
42 if(datalen) { | |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
43 newtx->data = (unsigned char *)malloc(datalen); |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
44 newtx->commandlen = datalen; |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
45 } else |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
46 newtx->data = NULL; |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
47 |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
48 newtx->hdrtype = framing; |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
49 if (newtx->hdrtype == AIM_FRAMETYPE_OSCAR) { |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
50 newtx->hdr.oscar.type = chan; |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
51 } else if (newtx->hdrtype == AIM_FRAMETYPE_OFT) { |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
52 newtx->hdr.oft.type = chan; |
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
53 newtx->hdr.oft.hdr2len = 0; /* this will get setup by caller */ |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
54 } else { |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
55 printf("tx_new: unknown framing\n"); |
237 | 56 } |
57 | |
900
e18815f5a4e9
[gaim-migrate @ 910]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
889
diff
changeset
|
58 return newtx; |
237 | 59 } |
2 | 60 |
237 | 61 /* |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
62 * aim_tx_enqeue__queuebased() |
237 | 63 * |
64 * The overall purpose here is to enqueue the passed in command struct | |
65 * into the outgoing (tx) queue. Basically... | |
66 * 1) Make a scope-irrelevent copy of the struct | |
67 * 2) Lock the struct | |
68 * 3) Mark as not-sent-yet | |
69 * 4) Enqueue the struct into the list | |
70 * 5) Unlock the struct once it's linked in | |
71 * 6) Return | |
72 * | |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
73 * Note that this is only used when doing queue-based transmitting; |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
74 * that is, when sess->tx_enqueue is set to &aim_tx_enqueue__queuebased. |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
75 * |
237 | 76 */ |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
445
diff
changeset
|
77 faim_internal int aim_tx_enqueue__queuebased(struct aim_session_t *sess, |
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
445
diff
changeset
|
78 struct command_tx_struct *newpacket) |
237 | 79 { |
80 struct command_tx_struct *cur; | |
2 | 81 |
237 | 82 if (newpacket->conn == NULL) { |
83 faimdprintf(1, "aim_tx_enqueue: WARNING: enqueueing packet with no connecetion\n"); | |
84 newpacket->conn = aim_getconn_type(sess, AIM_CONN_TYPE_BOS); | |
85 } | |
86 | |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
87 if (newpacket->hdrtype == AIM_FRAMETYPE_OSCAR) { |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
88 /* assign seqnum */ |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
89 newpacket->hdr.oscar.seqnum = aim_get_next_txseqnum(newpacket->conn); |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
90 } |
237 | 91 /* set some more fields */ |
92 newpacket->lock = 1; /* lock */ | |
93 newpacket->sent = 0; /* not sent yet */ | |
94 newpacket->next = NULL; /* always last */ | |
2 | 95 |
237 | 96 /* see overhead note in aim_rxqueue counterpart */ |
97 if (sess->queue_outgoing == NULL) { | |
98 sess->queue_outgoing = newpacket; | |
99 } else { | |
100 for (cur = sess->queue_outgoing; | |
101 cur->next; | |
102 cur = cur->next) | |
103 ; | |
104 cur->next = newpacket; | |
105 } | |
106 | |
107 newpacket->lock = 0; /* unlock so it can be sent */ | |
108 | |
109 #if debug == 2 | |
110 faimdprintf(2, "calling aim_tx_printqueue()\n"); | |
111 aim_tx_printqueue(sess); | |
112 faimdprintf(2, "back from aim_tx_printqueue()\n"); | |
2 | 113 #endif |
114 | |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
115 return 0; |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
116 } |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
117 |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
118 /* |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
119 * aim_tx_enqueue__immediate() |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
120 * |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
121 * Parallel to aim_tx_enqueue__queuebased, however, this bypasses |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
122 * the whole queue mess when you want immediate writes to happen. |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
123 * |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
124 * Basically the same as its __queuebased couterpart, however |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
125 * instead of doing a list append, it just calls aim_tx_sendframe() |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
126 * right here. |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
127 * |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
128 */ |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
445
diff
changeset
|
129 faim_internal int aim_tx_enqueue__immediate(struct aim_session_t *sess, struct command_tx_struct *newpacket) |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
130 { |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
131 if (newpacket->conn == NULL) { |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
132 faimdprintf(1, "aim_tx_enqueue: ERROR: packet has no connection\n"); |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
133 if (newpacket->data) |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
134 free(newpacket->data); |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
135 free(newpacket); |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
136 return -1; |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
137 } |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
138 |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
139 if (newpacket->hdrtype == AIM_FRAMETYPE_OSCAR) |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
140 newpacket->hdr.oscar.seqnum = aim_get_next_txseqnum(newpacket->conn); |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
141 |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
142 newpacket->lock = 1; /* lock */ |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
143 newpacket->sent = 0; /* not sent yet */ |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
144 |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
145 aim_tx_sendframe(sess, newpacket); |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
146 |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
147 if (newpacket->data) |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
148 free(newpacket->data); |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
149 free(newpacket); |
270
cfa39d39dec6
[gaim-migrate @ 280]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
237
diff
changeset
|
150 |
2 | 151 return 0; |
152 } | |
153 | |
1081
efcacae6acdb
[gaim-migrate @ 1091]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
960
diff
changeset
|
154 faim_internal int aim_tx_enqueue(struct aim_session_t *sess, struct command_tx_struct *command) |
efcacae6acdb
[gaim-migrate @ 1091]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
960
diff
changeset
|
155 { |
efcacae6acdb
[gaim-migrate @ 1091]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
960
diff
changeset
|
156 /* |
efcacae6acdb
[gaim-migrate @ 1091]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
960
diff
changeset
|
157 * If we want to send a connection thats inprogress, we have to force |
efcacae6acdb
[gaim-migrate @ 1091]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
960
diff
changeset
|
158 * them to use the queue based version. Otherwise, use whatever they |
efcacae6acdb
[gaim-migrate @ 1091]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
960
diff
changeset
|
159 * want. |
efcacae6acdb
[gaim-migrate @ 1091]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
960
diff
changeset
|
160 */ |
efcacae6acdb
[gaim-migrate @ 1091]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
960
diff
changeset
|
161 if (command && command->conn && (command->conn->status & AIM_CONN_STATUS_INPROGRESS)) { |
efcacae6acdb
[gaim-migrate @ 1091]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
960
diff
changeset
|
162 return aim_tx_enqueue__queuebased(sess, command); |
efcacae6acdb
[gaim-migrate @ 1091]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
960
diff
changeset
|
163 } |
efcacae6acdb
[gaim-migrate @ 1091]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
960
diff
changeset
|
164 return (*sess->tx_enqueue)(sess, command); |
efcacae6acdb
[gaim-migrate @ 1091]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
960
diff
changeset
|
165 } |
efcacae6acdb
[gaim-migrate @ 1091]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
960
diff
changeset
|
166 |
2 | 167 /* |
237 | 168 * aim_get_next_txseqnum() |
169 * | |
170 * This increments the tx command count, and returns the seqnum | |
171 * that should be stamped on the next FLAP packet sent. This is | |
172 * normally called during the final step of packet preparation | |
173 * before enqueuement (in aim_tx_enqueue()). | |
174 * | |
2 | 175 */ |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
445
diff
changeset
|
176 faim_internal unsigned int aim_get_next_txseqnum(struct aim_conn_t *conn) |
2 | 177 { |
281
7b06ba09ffe2
[gaim-migrate @ 291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
279
diff
changeset
|
178 u_int ret; |
7b06ba09ffe2
[gaim-migrate @ 291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
279
diff
changeset
|
179 |
7b06ba09ffe2
[gaim-migrate @ 291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
279
diff
changeset
|
180 faim_mutex_lock(&conn->seqnum_lock); |
7b06ba09ffe2
[gaim-migrate @ 291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
279
diff
changeset
|
181 ret = ++conn->seqnum; |
7b06ba09ffe2
[gaim-migrate @ 291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
279
diff
changeset
|
182 faim_mutex_unlock(&conn->seqnum_lock); |
7b06ba09ffe2
[gaim-migrate @ 291]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
279
diff
changeset
|
183 return ret; |
2 | 184 } |
185 | |
186 /* | |
237 | 187 * aim_tx_printqueue() |
188 * | |
189 * This is basically for debuging purposes only. It dumps all the | |
190 * records in the tx queue and their current status. Very helpful | |
191 * if the queue isn't working quite right. | |
192 * | |
2 | 193 */ |
237 | 194 #if debug == 2 |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
445
diff
changeset
|
195 faim_internal int aim_tx_printqueue(struct aim_session_t *sess) |
2 | 196 { |
237 | 197 struct command_tx_struct *cur; |
2 | 198 |
237 | 199 faimdprintf(2, "\ncurrent aim_queue_outgoing...\n"); |
200 faimdprintf(2, "\ttype seqnum len lock sent\n"); | |
2 | 201 |
237 | 202 if (sess->queue_outgoing == NULL) |
203 faimdprintf(2, "aim_tx_flushqueue(): queue empty"); | |
204 else { | |
205 for (cur = sess->queue_outgoing; cur; cur = cur->next) { | |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
206 faimdprintf(2, "\t %2x %2x %4x %4x %1d %1d\n", |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
207 cur->hdrtype, |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
208 (cur->hdrtype==AIM_FRAMETYPE_OFT)?cur->hdr.oft.type:cur->hdr.oscar.type, |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
209 (cur->hdrtype==AIM_FRAMETYPE_OSCAR)?cur->seqnum:0, |
237 | 210 cur->commandlen, cur->lock, |
211 cur->sent); | |
212 } | |
213 } | |
214 | |
215 faimdprintf(2, "\n(done printing queue)\n"); | |
2 | 216 |
217 return 0; | |
218 } | |
219 #endif | |
220 | |
221 /* | |
237 | 222 * aim_tx_flushqueue() |
223 * | |
224 * This the function is responsable for putting the queued commands | |
225 * onto the wire. This function is critical to the operation of | |
226 * the queue and therefore is the most prone to brokenness. It | |
227 * seems to be working quite well at this point. | |
228 * | |
229 * Procedure: | |
230 * 1) Traverse the list, only operate on commands that are unlocked | |
231 * and haven't been sent yet. | |
232 * 2) Lock the struct | |
233 * 3) Allocate a temporary buffer to store the finished, fully | |
234 * processed packet in. | |
235 * 4) Build the packet from the command_tx_struct data. | |
236 * 5) Write the packet to the socket. | |
237 * 6) If success, mark the packet sent, if fail report failure, do NOT | |
238 * mark the packet sent (so it will not get purged and therefore | |
239 * be attempted again on next call). | |
240 * 7) Unlock the struct. | |
241 * 8) Free the temp buffer | |
242 * 9) Step to next struct in list and go back to 1. | |
243 * | |
2 | 244 */ |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
445
diff
changeset
|
245 faim_internal int aim_tx_sendframe(struct aim_session_t *sess, struct command_tx_struct *cur) |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
246 { |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
247 int buflen = 0; |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
248 unsigned char *curPacket; |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
249 |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
250 if (!cur) |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
251 return -1; /* fatal */ |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
252 |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
253 cur->lock = 1; /* lock the struct */ |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
254 |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
255 if (cur->hdrtype == AIM_FRAMETYPE_OSCAR) |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
256 buflen = cur->commandlen + 6; |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
257 else if (cur->hdrtype == AIM_FRAMETYPE_OFT) |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
258 buflen = cur->hdr.oft.hdr2len + 8; |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
259 else { |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
260 cur->lock = 0; |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
261 return -1; |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
262 } |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
263 |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
264 /* allocate full-packet buffer */ |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
265 if (!(curPacket = (unsigned char *) malloc(buflen))) { |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
266 cur->lock = 0; |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
267 return -1; |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
268 } |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
269 |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
270 if (cur->hdrtype == AIM_FRAMETYPE_OSCAR) { |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
271 /* command byte */ |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
272 curPacket[0] = 0x2a; |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
273 |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
274 /* type/family byte */ |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
275 curPacket[1] = cur->hdr.oscar.type; |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
276 |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
277 /* bytes 3+4: word: FLAP sequence number */ |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
278 aimutil_put16(curPacket+2, cur->hdr.oscar.seqnum); |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
279 |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
280 /* bytes 5+6: word: SNAC len */ |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
281 aimutil_put16(curPacket+4, cur->commandlen); |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
282 |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
283 /* bytes 7 and on: raw: SNAC data */ /* XXX: ye gods! get rid of this! */ |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
284 memcpy(&(curPacket[6]), cur->data, cur->commandlen); |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
285 |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
286 } else if (cur->hdrtype == AIM_FRAMETYPE_OFT) { |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
287 int z = 0; |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
288 |
960
fa681641643d
[gaim-migrate @ 970]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
289 z += aimutil_put8(curPacket+z, cur->hdr.oft.magic[0]); |
fa681641643d
[gaim-migrate @ 970]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
290 z += aimutil_put8(curPacket+z, cur->hdr.oft.magic[1]); |
fa681641643d
[gaim-migrate @ 970]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
291 z += aimutil_put8(curPacket+z, cur->hdr.oft.magic[2]); |
fa681641643d
[gaim-migrate @ 970]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
900
diff
changeset
|
292 z += aimutil_put8(curPacket+z, cur->hdr.oft.magic[3]); |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
293 |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
294 z += aimutil_put16(curPacket+z, cur->hdr.oft.hdr2len + 8); |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
295 z += aimutil_put16(curPacket+z, cur->hdr.oft.type); |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
296 |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
297 memcpy(curPacket+z, cur->hdr.oft.hdr2, cur->hdr.oft.hdr2len); |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
298 } |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
299 |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
300 /* |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
301 * For OSCAR, a full image of the raw packet data now in curPacket. |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
302 * For OFT, an image of just the bloated header is in curPacket, |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
303 * since OFT allows us to do the data in a different write (yay!). |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
304 */ |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
305 faim_mutex_lock(&cur->conn->active); |
889
e1da6a6ec42b
[gaim-migrate @ 899]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
840
diff
changeset
|
306 if (send(cur->conn->fd, curPacket, buflen, 0) != buflen) { |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
307 faim_mutex_unlock(&cur->conn->active); |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
308 cur->sent = 1; |
1184
ed8855ae6632
[gaim-migrate @ 1194]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1081
diff
changeset
|
309 aim_conn_close(cur->conn); |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
310 return 0; /* bail out */ |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
311 } |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
312 |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
313 if ((cur->hdrtype == AIM_FRAMETYPE_OFT) && cur->commandlen) { |
889
e1da6a6ec42b
[gaim-migrate @ 899]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
840
diff
changeset
|
314 if (send(cur->conn->fd, cur->data, cur->commandlen, 0) != (int)cur->commandlen) { |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
315 /* |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
316 * Theres nothing we can do about this since we've already sent the |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
317 * header! The connection is unstable. |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
318 */ |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
319 } |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
320 } |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
321 |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
322 cur->sent = 1; /* mark the struct as sent */ |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
323 cur->conn->lastactivity = time(NULL); |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
324 |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
325 faim_mutex_unlock(&cur->conn->active); |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
326 |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
327 #if debug > 2 |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
328 faimdprintf(2, "\nPacket:"); |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
329 for (i = 0; i < (cur->commandlen + 6); i++) { |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
330 if ((i % 8) == 0) { |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
331 faimdprintf(2, "\n\t"); |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
332 } |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
333 if (curPacket[i] >= ' ' && curPacket[i]<127) { |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
334 faimdprintf(2, "%c=%02x ", curPacket[i], curPacket[i]); |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
335 } else { |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
336 faimdprintf(2, "0x%2x ", curPacket[i]); |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
337 } |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
338 } |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
339 faimdprintf(2, "\n"); |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
340 #endif |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
341 cur->lock = 0; /* unlock the struct */ |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
342 free(curPacket); /* free up full-packet buffer */ |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
343 |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
344 return 1; /* success */ |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
345 } |
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
346 |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
445
diff
changeset
|
347 faim_export int aim_tx_flushqueue(struct aim_session_t *sess) |
2 | 348 { |
237 | 349 struct command_tx_struct *cur; |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
350 |
2 | 351 #if debug > 1 |
352 int i = 0; | |
353 #endif | |
354 | |
237 | 355 if (sess->queue_outgoing == NULL) |
356 return 0; | |
357 | |
358 faimdprintf(2, "beginning txflush...\n"); | |
359 for (cur = sess->queue_outgoing; cur; cur = cur->next) { | |
360 /* only process if its unlocked and unsent */ | |
361 if (!cur->lock && !cur->sent) { | |
362 | |
1081
efcacae6acdb
[gaim-migrate @ 1091]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
960
diff
changeset
|
363 if (cur->conn && (cur->conn->status & AIM_CONN_STATUS_INPROGRESS)) |
efcacae6acdb
[gaim-migrate @ 1091]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
960
diff
changeset
|
364 continue; |
efcacae6acdb
[gaim-migrate @ 1091]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
960
diff
changeset
|
365 |
237 | 366 /* |
367 * And now for the meager attempt to force transmit | |
368 * latency and avoid missed messages. | |
369 */ | |
370 if ((cur->conn->lastactivity + cur->conn->forcedlatency) >= time(NULL)) { | |
371 /* FIXME FIXME -- should be a break! we dont want to block the upper layers */ | |
372 sleep((cur->conn->lastactivity + cur->conn->forcedlatency) - time(NULL)); | |
373 } | |
2 | 374 |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
375 if (aim_tx_sendframe(sess, cur) == -1) |
279
501e09c51cbc
[gaim-migrate @ 289]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
270
diff
changeset
|
376 break; |
2 | 377 } |
237 | 378 } |
2 | 379 |
380 /* purge sent commands from queue */ | |
237 | 381 aim_tx_purgequeue(sess); |
2 | 382 |
383 return 0; | |
384 } | |
385 | |
386 /* | |
237 | 387 * aim_tx_purgequeue() |
388 * | |
389 * This is responsable for removing sent commands from the transmit | |
390 * queue. This is not a required operation, but it of course helps | |
391 * reduce memory footprint at run time! | |
392 * | |
2 | 393 */ |
840
595ac7759563
[gaim-migrate @ 850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
445
diff
changeset
|
394 faim_export void aim_tx_purgequeue(struct aim_session_t *sess) |
2 | 395 { |
237 | 396 struct command_tx_struct *cur = NULL; |
397 struct command_tx_struct *tmp; | |
398 | |
399 if (sess->queue_outgoing == NULL) | |
400 return; | |
401 | |
402 if (sess->queue_outgoing->next == NULL) { | |
403 if (!sess->queue_outgoing->lock && sess->queue_outgoing->sent) { | |
404 tmp = sess->queue_outgoing; | |
405 sess->queue_outgoing = NULL; | |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
406 if (tmp->hdrtype == AIM_FRAMETYPE_OFT) |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
407 free(tmp->hdr.oft.hdr2); |
237 | 408 free(tmp->data); |
409 free(tmp); | |
2 | 410 } |
237 | 411 return; |
412 } | |
413 | |
414 for(cur = sess->queue_outgoing; cur->next != NULL; ) { | |
415 if (!cur->next->lock && cur->next->sent) { | |
416 tmp = cur->next; | |
417 cur->next = tmp->next; | |
445
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
418 if (tmp->hdrtype == AIM_FRAMETYPE_OFT) |
e4c34ca88d9b
[gaim-migrate @ 455]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
283
diff
changeset
|
419 free(tmp->hdr.oft.hdr2); |
237 | 420 free(tmp->data); |
421 free(tmp); | |
422 } | |
423 cur = cur->next; | |
2 | 424 |
237 | 425 /* |
426 * Be careful here. Because of the way we just | |
427 * manipulated the pointer, cur may be NULL and | |
428 * the for() will segfault doing the check unless | |
429 * we find this case first. | |
430 */ | |
431 if (cur == NULL) | |
432 break; | |
433 } | |
434 return; | |
2 | 435 } |