comparison src/protocols/oscar/txqueue.c @ 9457:14bffb758b34

[gaim-migrate @ 10281] This fixes a infinite loop on dead socket on sending im images. It should fix bug #967282 committer: Tailor Script <tailor@pidgin.im>
author Tim Ringenbach <marv@pidgin.im>
date Tue, 06 Jul 2004 07:00:32 +0000
parents f831a38eb6ba
children 9cafe038c95e
comparison
equal deleted inserted replaced
9456:0577bb34622d 9457:14bffb758b34
137 * right here. 137 * right here.
138 * 138 *
139 */ 139 */
140 static int aim_tx_enqueue__immediate(aim_session_t *sess, aim_frame_t *fr) 140 static int aim_tx_enqueue__immediate(aim_session_t *sess, aim_frame_t *fr)
141 { 141 {
142 int ret;
142 143
143 if (!fr->conn) { 144 if (!fr->conn) {
144 faimdprintf(sess, 1, "aim_tx_enqueue: ERROR: packet has no connection\n"); 145 faimdprintf(sess, 1, "aim_tx_enqueue: ERROR: packet has no connection\n");
145 aim_frame_destroy(fr); 146 aim_frame_destroy(fr);
146 return 0; 147 return 0;
149 if (fr->hdrtype == AIM_FRAMETYPE_FLAP) 150 if (fr->hdrtype == AIM_FRAMETYPE_FLAP)
150 fr->hdr.flap.seqnum = aim_get_next_txseqnum(fr->conn); 151 fr->hdr.flap.seqnum = aim_get_next_txseqnum(fr->conn);
151 152
152 fr->handled = 0; /* not sent yet */ 153 fr->handled = 0; /* not sent yet */
153 154
154 aim_tx_sendframe(sess, fr); 155 ret = aim_tx_sendframe(sess, fr);
155 156
156 aim_frame_destroy(fr); 157 aim_frame_destroy(fr);
157 158
158 return 0; 159 return ret;
159 } 160 }
160 161
161 faim_export int aim_tx_setenqueue(aim_session_t *sess, int what, int (*func)(aim_session_t *, aim_frame_t *)) 162 faim_export int aim_tx_setenqueue(aim_session_t *sess, int what, int (*func)(aim_session_t *, aim_frame_t *))
162 { 163 {
163 164
181 /* 182 /*
182 * If we want to send on a connection that is in progress, we have to force 183 * If we want to send on a connection that is in progress, we have to force
183 * them to use the queue based version. Otherwise, use whatever they 184 * them to use the queue based version. Otherwise, use whatever they
184 * want. 185 * want.
185 */ 186 */
186 if (fr && fr->conn && 187 if (fr && fr->conn &&
187 (fr->conn->status & AIM_CONN_STATUS_INPROGRESS)) { 188 (fr->conn->status & AIM_CONN_STATUS_INPROGRESS)) {
188 return aim_tx_enqueue__queuebased(sess, fr); 189 return aim_tx_enqueue__queuebased(sess, fr);
189 } 190 }
190 191
191 return (*sess->tx_enqueue)(sess, fr); 192 return (*sess->tx_enqueue)(sess, fr);
223 if (count > aim_bstream_empty(bs)) 224 if (count > aim_bstream_empty(bs))
224 count = aim_bstream_empty(bs); /* truncate to remaining space */ 225 count = aim_bstream_empty(bs); /* truncate to remaining space */
225 226
226 if (count) { 227 if (count) {
227 /* 228 /*
228 * If we're sending a large direct IM (maybe it contains an 229 * I need to rewrite this. "Updating the UI" doesn't make sense. The program is
229 * image or something), then we want to break it up into chunks 230 * blocked and the UI can't redraw. We're blocking all of Gaim. We need to set
230 * of 1024 and update the UI between sending each one. This is 231 * up an actual txqueue and a GAIM_INPUT_WRITE callback and only write when we
231 * kind of ugly. Ideally, if the client wants to send a large 232 * can. Why is this file called txqueue anyway? Lets rename it to txblock.
232 * amount of data it should just write to the fd directly--we're
233 * not multithreaded and this is just a stop-gap thingy.
234 */ 233 */
235 if ((conn->type == AIM_CONN_TYPE_RENDEZVOUS) && 234 if ((conn->type == AIM_CONN_TYPE_RENDEZVOUS) &&
236 (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM)) { 235 (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM)) {
237 const char *sn = aim_odc_getsn(conn); 236 const char *sn = aim_odc_getsn(conn);
238 aim_rxcallback_t userfunc; 237 aim_rxcallback_t userfunc;
241 int ret; 240 int ret;
242 241
243 ret = aim_send(conn->fd, bs->data + bs->offset + wrote, 1024); 242 ret = aim_send(conn->fd, bs->data + bs->offset + wrote, 1024);
244 if (ret > 0) 243 if (ret > 0)
245 wrote += ret; 244 wrote += ret;
245 if (ret < 0)
246 return -1;
246 if ((userfunc=aim_callhandler(conn->sessv, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER))) 247 if ((userfunc=aim_callhandler(conn->sessv, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER)))
247 userfunc(conn->sessv, NULL, sn, count-wrote>1024 ? ((double)wrote / count) : 1); 248 userfunc(conn->sessv, NULL, sn, count-wrote>1024 ? ((double)wrote / count) : 1);
248 } 249 }
249 } 250 }
250 251