comparison src/protocols/oscar/txqueue.c @ 3044:e68e2ba82310

[gaim-migrate @ 3057] DirectIM Image sending. Not all the kinks are worked out, and it's really hackish at parts, but it works and I think it's stable. It's late and I have to be up early tommorow, and I want this to be somewhat tested before 0.54 is released so we don't have a repeat of 0.53 ;) Also, Luke Schierer wins the #gaim MVP award with an inclusion in CREDITS :) Thanks, Luke. committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Thu, 14 Mar 2002 07:44:43 +0000
parents d82efea341ef
children e729c064bc1b
comparison
equal deleted inserted replaced
3043:5a459387755a 3044:e68e2ba82310
228 } 228 }
229 229
230 static int aim_bstream_send(aim_bstream_t *bs, aim_conn_t *conn, size_t count) 230 static int aim_bstream_send(aim_bstream_t *bs, aim_conn_t *conn, size_t count)
231 { 231 {
232 int wrote = 0; 232 int wrote = 0;
233
234 if (!bs || !conn || (count < 0)) 233 if (!bs || !conn || (count < 0))
235 return -EINVAL; 234 return -EINVAL;
236 235
237 if (count > aim_bstream_empty(bs)) 236 if (count > aim_bstream_empty(bs))
238 count = aim_bstream_empty(bs); /* truncate to remaining space */ 237 count = aim_bstream_empty(bs); /* truncate to remaining space */
239 238
240 if (count) 239 if (count) {
241 wrote = aim_send(conn->fd, bs->data + bs->offset, count); 240 if ((conn->type == AIM_CONN_TYPE_RENDEZVOUS) &&
241 (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM)) {
242 /* I strongly suspect that this is a horrible thing to do
243 * and I feel really guilty doing it. */
244 char *sn = aim_directim_getsn(conn);
245 aim_rxcallback_t userfunc;
246 while (count - wrote > 1024) {
247 wrote = wrote + aim_send(conn->fd, bs->data + bs->offset + wrote, 1024);
248 if ((userfunc=aim_callhandler(conn->sessv, conn,
249 AIM_CB_FAM_SPECIAL,
250 AIM_CB_SPECIAL_IMAGETRANSFER)))
251 userfunc(conn->sessv, NULL, sn,
252 count-wrote>1024 ? ((double)wrote / count) : 1);
253 }
254 }
255 if (count - wrote) {
256 wrote = wrote + aim_send(conn->fd, bs->data + bs->offset + wrote, count - wrote);
257 }
258
259 }
260
242 261
243 if (((aim_session_t *)conn->sessv)->debug >= 2) { 262 if (((aim_session_t *)conn->sessv)->debug >= 2) {
244 int i; 263 int i;
245 aim_session_t *sess = (aim_session_t *)conn->sessv; 264 aim_session_t *sess = (aim_session_t *)conn->sessv;
246 265
282 aim_bstream_rewind(&fr->data); 301 aim_bstream_rewind(&fr->data);
283 aimbs_putbs(&obs, &fr->data, payloadlen); 302 aimbs_putbs(&obs, &fr->data, payloadlen);
284 303
285 obslen = aim_bstream_curpos(&obs); 304 obslen = aim_bstream_curpos(&obs);
286 aim_bstream_rewind(&obs); 305 aim_bstream_rewind(&obs);
287
288 if (aim_bstream_send(&obs, fr->conn, obslen) != obslen) 306 if (aim_bstream_send(&obs, fr->conn, obslen) != obslen)
289 err = -errno; 307 err = -errno;
290 308
291 free(obs_raw); /* XXX aim_bstream_free */ 309 free(obs_raw); /* XXX aim_bstream_free */
292 310
300 { 318 {
301 aim_bstream_t hbs; 319 aim_bstream_t hbs;
302 fu8_t *hbs_raw; 320 fu8_t *hbs_raw;
303 int hbslen; 321 int hbslen;
304 int err = 0; 322 int err = 0;
305 323
306 hbslen = 8 + fr->hdr.oft.hdr2len; 324 hbslen = 8 + fr->hdr.oft.hdr2len;
307
308 if (!(hbs_raw = malloc(hbslen))) 325 if (!(hbs_raw = malloc(hbslen)))
309 return -1; 326 return -1;
310 327
311 aim_bstream_init(&hbs, hbs_raw, hbslen); 328 aim_bstream_init(&hbs, hbs_raw, hbslen);
312 329
314 aimbs_put16(&hbs, fr->hdr.oft.hdr2len + 8); 331 aimbs_put16(&hbs, fr->hdr.oft.hdr2len + 8);
315 aimbs_put16(&hbs, fr->hdr.oft.type); 332 aimbs_put16(&hbs, fr->hdr.oft.type);
316 aimbs_putraw(&hbs, fr->hdr.oft.hdr2, fr->hdr.oft.hdr2len); 333 aimbs_putraw(&hbs, fr->hdr.oft.hdr2, fr->hdr.oft.hdr2len);
317 334
318 aim_bstream_rewind(&hbs); 335 aim_bstream_rewind(&hbs);
336
319 337
320 if (aim_bstream_send(&hbs, fr->conn, hbslen) != hbslen) { 338 if (aim_bstream_send(&hbs, fr->conn, hbslen) != hbslen) {
321 339
322 err = -errno; 340 err = -errno;
323 341
336 fr->handled = 1; 354 fr->handled = 1;
337 fr->conn->lastactivity = time(NULL); 355 fr->conn->lastactivity = time(NULL);
338 356
339 357
340 return err; 358 return err;
359
360
341 } 361 }
342 362
343 faim_internal int aim_tx_sendframe(aim_session_t *sess, aim_frame_t *fr) 363 faim_internal int aim_tx_sendframe(aim_session_t *sess, aim_frame_t *fr)
344 { 364 {
345 if (fr->hdrtype == AIM_FRAMETYPE_FLAP) 365 if (fr->hdrtype == AIM_FRAMETYPE_FLAP)