# HG changeset patch # User Elliott Sales de Andrade # Date 1267345332 0 # Node ID 1326fd4dfdc9a6d336a162d80aac4685c066b8af # Parent a0adf0bb19b7e6c077cc8b7588561227e3c61020 ft: Don't try to read from the source file if the byte array already holds enough data for the current write. I'm not sure if this check should be added to the UI read side too. diff -r a0adf0bb19b7 -r 1326fd4dfdc9 libpurple/ft.c --- a/libpurple/ft.c Sun Feb 28 06:46:32 2010 +0000 +++ b/libpurple/ft.c Sun Feb 28 08:22:12 2010 +0000 @@ -1085,7 +1085,7 @@ return; } } else if (xfer->type == PURPLE_XFER_SEND) { - size_t result; + size_t result = 0; size_t s = MIN(purple_xfer_get_bytes_remaining(xfer), xfer->current_buffer_size); PurpleXferPrivData *priv = g_hash_table_lookup(xfers_data, xfer); @@ -1130,13 +1130,24 @@ result = tmp; } else { - buffer = g_malloc0(s); - result = fread(buffer, 1, s, xfer->dest_fp); - if (result != s) { - purple_debug_error("filetransfer", "Unable to read whole buffer.\n"); - purple_xfer_cancel_local(xfer); - g_free(buffer); - return; + gboolean read = TRUE; + if (priv->buffer) { + if (priv->buffer->len < s) { + s -= priv->buffer->len; + read = TRUE; + } else { + read = FALSE; + } + } + if (read) { + buffer = g_malloc(s); + result = fread(buffer, 1, s, xfer->dest_fp); + if (result != s) { + purple_debug_error("filetransfer", "Unable to read whole buffer.\n"); + purple_xfer_cancel_local(xfer); + g_free(buffer); + return; + } } }