From 07adc70417a23b143d445adea30b56f89a76cf01 Mon Sep 17 00:00:00 2001 From: z3bra Date: Tue, 8 Nov 2016 21:40:16 +0100 Subject: Handle file transfer in multiple chunks --- ratox.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/ratox.c b/ratox.c index 86d57d9..7626c98 100644 --- a/ratox.c +++ b/ratox.c @@ -724,22 +724,12 @@ cbfiledatareq(Tox *m, uint32_t frnum, uint32_t fnum, uint64_t pos, size_t flen, /* Grab another buffer from the FIFO */ if (!f->tx.pendingbuf) { - n = fiforead(f->dirfd, &f->fd[FFILE_IN], ffiles[FFILE_IN], f->tx.buf, - f->tx.chunksz); + n = fiforead(f->dirfd, &f->fd[FFILE_IN], ffiles[FFILE_IN], + f->tx.buf, flen); f->tx.n = n; f->tx.pendingbuf = 0; } - if (f->tx.n == 0) { - /* Signal transfer completion to other end */ - if (!tox_file_send_chunk(tox, f->num, f->tx.fnum, pos, NULL, 0, NULL)) - weprintf("Failed to signal transfer completion to the receiver\n"); - logmsg(": %s : Tx > Complete\n", f->name); - f->tx.state = TRANSFER_NONE; - free(f->tx.buf); - f->tx.buf = NULL; - return; - } if (f->tx.n < 0) { if (errno != EWOULDBLOCK) weprintf("fiforead:"); @@ -748,6 +738,21 @@ cbfiledatareq(Tox *m, uint32_t frnum, uint32_t fnum, uint64_t pos, size_t flen, if (!tox_file_send_chunk(tox, f->num, f->tx.fnum, pos, f->tx.buf, f->tx.n, NULL)) f->tx.pendingbuf = 1; + + /* + * For streams, core will know that the transfer is finished + * if a chunk with length less than the length requested in the + * callback is sent. + */ + if (!f->tx.pendingbuf && f->tx.n < flen) { + logmsg(": %s : Tx > Complete\n", f->name); + f->tx.state = TRANSFER_NONE; + f->tx.fnum = -1; + free(f->tx.buf); + f->tx.buf = NULL; + fiforeset(f->dirfd, &f->fd[FFILE_IN], ffiles[FFILE_IN]); + return; + } } static void -- cgit v1.2.3