comparison src/ft.c @ 4150:1bd663beada5

[gaim-migrate @ 4369] potato chip file receive in msn committer: Tailor Script <tailor@pidgin.im>
author Rob Flynn <gaim@robflynn.com>
date Sat, 28 Dec 2002 05:15:43 +0000
parents a20bf3d247ff
children d3c8d2b40494
comparison
equal deleted inserted replaced
4149:baf9d94e0128 4150:1bd663beada5
569 static void ft_callback(gpointer data, gint source, 569 static void ft_callback(gpointer data, gint source,
570 GaimInputCondition condition) 570 GaimInputCondition condition)
571 { 571 {
572 struct file_transfer *xfer = (struct file_transfer *)data; 572 struct file_transfer *xfer = (struct file_transfer *)data;
573 int rt, i; 573 int rt, i;
574 char buf[FT_BUFFER_SIZE]; 574 char *buf = NULL;
575 575
576 if (condition & GAIM_INPUT_READ) { 576 if (condition & GAIM_INPUT_READ) {
577 rt = read(xfer->fd, buf, MIN(xfer->bytesleft, FT_BUFFER_SIZE)); 577 if (xfer->gc->prpl->file_transfer_read)
578 rt = xfer->gc->prpl->file_transfer_read(xfer->gc, xfer,
579 xfer->fd, &buf);
580 else {
581 buf = g_new0(char, MIN(xfer->bytesleft, FT_BUFFER_SIZE));
582 rt = read(xfer->fd, buf, MIN(xfer->bytesleft, FT_BUFFER_SIZE));
583 }
584
578 /* XXX What if the transfer is interrupted while we 585 /* XXX What if the transfer is interrupted while we
579 * are inside read()? How can this be handled safely? 586 * are inside read()? How can this be handled safely?
580 * -- wtm 587 * -- wtm
581 */ 588 */
582 if (rt > 0) { 589 if (rt > 0) {
583 xfer->bytesleft -= rt; 590 xfer->bytesleft -= rt;
584 for (i = 0; i < rt; i++) { 591 fwrite(buf, 1, rt, xfer->file);
585 fprintf(xfer->file, "%c", buf[i]);
586 }
587 } 592 }
588 593
589 } 594 }
590 else /* (condition & GAIM_INPUT_WRITE) */ { 595 else /* (condition & GAIM_INPUT_WRITE) */ {
591 int remain = MIN(xfer->bytesleft, FT_BUFFER_SIZE); 596 int remain = MIN(xfer->bytesleft, FT_BUFFER_SIZE);
592 597
593 for (i = 0; i < remain; i++) 598 buf = g_new0(char, remain);
594 fscanf(xfer->file, "%c", &buf[i]); 599
595 600 fread(buf, 1, remain, xfer->file);
596 rt = write(xfer->fd, buf, remain); 601
602 if (xfer->gc->prpl->file_transfer_write)
603 rt = xfer->gc->prpl->file_transfer_write(xfer->gc, xfer, xfer->fd,
604 buf, remain);
605 else
606 rt = write(xfer->fd, buf, remain);
607
597 if (rt > 0) 608 if (rt > 0)
598 xfer->bytesleft -= rt; 609 xfer->bytesleft -= rt;
599 } 610 }
600 611
601 if (rt < 0) 612 if (rt < 0) {
613 if (buf != NULL)
614 g_free(buf);
615
602 return; 616 return;
617 }
603 618
604 xfer->bytessent += rt; 619 xfer->bytessent += rt;
605 620
606 if (xfer->gc->prpl->file_transfer_data_chunk) 621 if (xfer->gc->prpl->file_transfer_data_chunk)
607 xfer->gc->prpl->file_transfer_data_chunk(xfer->gc, xfer, buf, rt); 622 xfer->gc->prpl->file_transfer_data_chunk(xfer->gc, xfer, buf, rt);
612 xfer->watcher = 0; 627 xfer->watcher = 0;
613 fclose(xfer->file); 628 fclose(xfer->file);
614 xfer->file = 0; 629 xfer->file = 0;
615 ft_nextfile(xfer); 630 ft_nextfile(xfer);
616 } 631 }
632
633 if (buf != NULL)
634 g_free(buf);
617 } 635 }
618 636
619 static void ft_nextfile(struct file_transfer *xfer) 637 static void ft_nextfile(struct file_transfer *xfer)
620 { 638 {
621 debug_printf("file transfer %d of %d done\n", 639 debug_printf("file transfer %d of %d done\n",