| 51 xfer->type = type; |
54 xfer->type = type; |
| 52 xfer->account = account; |
55 xfer->account = account; |
| 53 xfer->who = g_strdup(who); |
56 xfer->who = g_strdup(who); |
| 54 xfer->ui_ops = gaim_xfers_get_ui_ops(); |
57 xfer->ui_ops = gaim_xfers_get_ui_ops(); |
| 55 xfer->message = NULL; |
58 xfer->message = NULL; |
| |
59 xfer->current_buffer_size = FT_INITIAL_BUFFER_SIZE; |
| 56 |
60 |
| 57 ui_ops = gaim_xfer_get_ui_ops(xfer); |
61 ui_ops = gaim_xfer_get_ui_ops(xfer); |
| 58 |
62 |
| 59 if (ui_ops != NULL && ui_ops->new_xfer != NULL) |
63 if (ui_ops != NULL && ui_ops->new_xfer != NULL) |
| 60 ui_ops->new_xfer(xfer); |
64 ui_ops->new_xfer(xfer); |
| 779 g_return_if_fail(xfer != NULL); |
783 g_return_if_fail(xfer != NULL); |
| 780 |
784 |
| 781 xfer->ops.cancel_recv = fnc; |
785 xfer->ops.cancel_recv = fnc; |
| 782 } |
786 } |
| 783 |
787 |
| |
788 static void |
| |
789 gaim_xfer_increase_buffer_size(GaimXfer *xfer) |
| |
790 { |
| |
791 xfer->current_buffer_size = MIN(xfer->current_buffer_size * 1.5, |
| |
792 FT_MAX_BUFFER_SIZE); |
| |
793 } |
| |
794 |
| 784 gssize |
795 gssize |
| 785 gaim_xfer_read(GaimXfer *xfer, guchar **buffer) |
796 gaim_xfer_read(GaimXfer *xfer, guchar **buffer) |
| 786 { |
797 { |
| 787 gssize s, r; |
798 gssize s, r; |
| 788 |
799 |
| 789 g_return_val_if_fail(xfer != NULL, 0); |
800 g_return_val_if_fail(xfer != NULL, 0); |
| 790 g_return_val_if_fail(buffer != NULL, 0); |
801 g_return_val_if_fail(buffer != NULL, 0); |
| 791 |
802 |
| 792 if (gaim_xfer_get_size(xfer) == 0) |
803 if (gaim_xfer_get_size(xfer) == 0) |
| 793 s = 4096; |
804 s = xfer->current_buffer_size; |
| 794 else |
805 else |
| 795 s = MIN(gaim_xfer_get_bytes_remaining(xfer), 4096); |
806 s = MIN(gaim_xfer_get_bytes_remaining(xfer), xfer->current_buffer_size); |
| 796 |
807 |
| 797 if (xfer->ops.read != NULL) |
808 if (xfer->ops.read != NULL) |
| 798 r = (xfer->ops.read)(buffer, xfer); |
809 r = (xfer->ops.read)(buffer, xfer); |
| 799 else { |
810 else { |
| 800 *buffer = g_malloc0(s); |
811 *buffer = g_malloc0(s); |
| 809 gaim_xfer_set_completed(xfer, TRUE); |
820 gaim_xfer_set_completed(xfer, TRUE); |
| 810 else if (r == 0) |
821 else if (r == 0) |
| 811 r = -1; |
822 r = -1; |
| 812 } |
823 } |
| 813 |
824 |
| |
825 if (r == xfer->current_buffer_size) |
| |
826 /* |
| |
827 * We managed to read the entire buffer. This means our this |
| |
828 * network is fast and our buffer is too small, so make it |
| |
829 * bigger. |
| |
830 */ |
| |
831 gaim_xfer_increase_buffer_size(xfer); |
| |
832 |
| 814 return r; |
833 return r; |
| 815 } |
834 } |
| 816 |
835 |
| 817 gssize |
836 gssize |
| 818 gaim_xfer_write(GaimXfer *xfer, const guchar *buffer, gsize size) |
837 gaim_xfer_write(GaimXfer *xfer, const guchar *buffer, gsize size) |
| 881 g_free(buffer); |
900 g_free(buffer); |
| 882 return; |
901 return; |
| 883 } else if (r < s) { |
902 } else if (r < s) { |
| 884 /* We have to seek back in the file now. */ |
903 /* We have to seek back in the file now. */ |
| 885 fseek(xfer->dest_fp, r - s, SEEK_CUR); |
904 fseek(xfer->dest_fp, r - s, SEEK_CUR); |
| |
905 } else { |
| |
906 /* |
| |
907 * We managed to write the entire buffer. This means our |
| |
908 * network is fast and our buffer is too small, so make it |
| |
909 * bigger. |
| |
910 */ |
| |
911 gaim_xfer_increase_buffer_size(xfer); |
| 886 } |
912 } |
| 887 } |
913 } |
| 888 |
914 |
| 889 if (r > 0) { |
915 if (r > 0) { |
| 890 if (gaim_xfer_get_size(xfer) > 0) |
916 if (gaim_xfer_get_size(xfer) > 0) |