For file transfers UINT64_MAX is now used as the size for streaming

transfers instead of 0.

For avatar transfers file size 0 now means that the client has no avatar
set.

Added a test for streaming transfers.
This commit is contained in:
irungentoo 2015-03-20 20:12:07 -04:00
parent 8c18dd42a7
commit b1ec157175
No known key found for this signature in database
GPG Key ID: 10349DC9BED89E98
3 changed files with 82 additions and 21 deletions

View File

@ -182,6 +182,8 @@ void file_print_control(Tox *tox, uint32_t friend_number, uint32_t file_number,
sendf_ok = 1;
}
uint64_t max_sending;
_Bool m_send_reached;
uint8_t sending_num;
_Bool file_sending_done;
void tox_file_chunk_request(Tox *tox, uint32_t friend_number, uint32_t file_number, uint64_t position, size_t length,
@ -204,6 +206,15 @@ void tox_file_chunk_request(Tox *tox, uint32_t friend_number, uint32_t file_numb
return;
}
if (position + length > max_sending) {
if (m_send_reached) {
ck_abort_msg("Requested done file tranfer.");
}
length = max_sending - position;
m_send_reached = 1;
}
TOX_ERR_FILE_SEND_CHUNK error;
uint8_t f_data[length];
memset(f_data, sending_num, length);
@ -552,6 +563,7 @@ START_TEST(test_few_clients)
printf("Starting file transfer test.\n");
file_accepted = file_size = file_recv = sendf_ok = size_recv = 0;
max_sending = UINT64_MAX;
long long unsigned int f_time = time(NULL);
tox_callback_file_recv_chunk(tox3, write_file, &to_compare);
tox_callback_file_recv_control(tox2, file_print_control, &to_compare);
@ -598,6 +610,56 @@ START_TEST(test_few_clients)
printf("100MB file sent in %llu seconds\n", time(NULL) - f_time);
printf("Starting file streaming transfer test.\n");
file_sending_done = file_accepted = file_size = file_recv = sendf_ok = size_recv = 0;
f_time = time(NULL);
tox_callback_file_recv_chunk(tox3, write_file, &to_compare);
tox_callback_file_recv_control(tox2, file_print_control, &to_compare);
tox_callback_file_chunk_request(tox2, tox_file_chunk_request, &to_compare);
tox_callback_file_recv_control(tox3, file_print_control, &to_compare);
tox_callback_file_recv(tox3, tox_file_receive, &to_compare);
totalf_size = UINT64_MAX;
fnum = tox_file_send(tox2, 0, TOX_FILE_KIND_DATA, totalf_size, 0, (uint8_t *)"Gentoo.exe", sizeof("Gentoo.exe"), 0);
ck_assert_msg(fnum != UINT32_MAX, "tox_new_file_sender fail");
ck_assert_msg(!tox_file_get_file_id(tox2, 1, fnum, file_cmp_id, &gfierr), "tox_file_get_file_id didn't fail");
ck_assert_msg(gfierr == TOX_ERR_FILE_GET_FRIEND_NOT_FOUND, "wrong error");
ck_assert_msg(!tox_file_get_file_id(tox2, 0, fnum + 1, file_cmp_id, &gfierr), "tox_file_get_file_id didn't fail");
ck_assert_msg(gfierr == TOX_ERR_FILE_GET_NOT_FOUND, "wrong error");
ck_assert_msg(tox_file_get_file_id(tox2, 0, fnum, file_cmp_id, &gfierr), "tox_file_get_file_id failed");
ck_assert_msg(gfierr == TOX_ERR_FILE_GET_OK, "wrong error");
max_sending = 100 * 1024;
m_send_reached = 0;
while (1) {
tox_iterate(tox1);
tox_iterate(tox2);
tox_iterate(tox3);
if (file_sending_done) {
if (sendf_ok && file_recv && m_send_reached && totalf_size == file_size && size_recv == max_sending
&& sending_pos == size_recv) {
break;
} else {
ck_abort_msg("Something went wrong in file transfer %u %u %u %u %u %u %llu %llu %llu %llu", sendf_ok, file_recv,
m_send_reached, totalf_size == file_size, size_recv == max_sending, sending_pos == size_recv, totalf_size, file_size,
size_recv, sending_pos);
}
}
uint32_t tox1_interval = tox_iteration_interval(tox1);
uint32_t tox2_interval = tox_iteration_interval(tox2);
uint32_t tox3_interval = tox_iteration_interval(tox3);
if (tox2_interval > tox3_interval) {
c_sleep(tox3_interval);
} else {
c_sleep(tox2_interval);
}
}
printf("test_few_clients succeeded, took %llu seconds\n", time(NULL) - cur_time);
tox_kill(tox1);

View File

@ -1282,7 +1282,7 @@ int file_seek(const Messenger *m, int32_t friendnumber, uint32_t filenumber, uin
if (ft->status != FILESTATUS_NOT_ACCEPTED)
return -5;
if (ft->size && position > ft->size) {
if (position > ft->size) {
return -6;
}
@ -1356,15 +1356,13 @@ int file_data(const Messenger *m, int32_t friendnumber, uint32_t filenumber, uin
if (length > MAX_FILE_DATA_SIZE)
return -5;
if (ft->size) {
if (ft->size - ft->transferred < length) {
return -5;
}
if (length != MAX_FILE_DATA_SIZE && (ft->transferred + length) != ft->size) {
if (ft->size != UINT64_MAX && length != MAX_FILE_DATA_SIZE && (ft->transferred + length) != ft->size) {
return -5;
}
}
if (position != ft->transferred) {
return -7;
@ -1471,7 +1469,6 @@ static void do_reqchunk_filecb(Messenger *m, int32_t friendnumber)
uint16_t length = MAX_FILE_DATA_SIZE;
if (ft->size) {
if (ft->size == ft->requested) {
break;
}
@ -1479,7 +1476,6 @@ static void do_reqchunk_filecb(Messenger *m, int32_t friendnumber)
if (ft->size - ft->requested < length) {
length = ft->size - ft->requested;
}
}
++ft->slots_allocated;
@ -1586,7 +1582,7 @@ static int handle_filecontrol(Messenger *m, int32_t friendnumber, uint8_t receiv
memcpy(&position, data, sizeof(position));
net_to_host((uint8_t *) &position, sizeof(position));
if (ft->size && position > ft->size) {
if (position > ft->size) {
return -1;
}
@ -2117,7 +2113,7 @@ static int handle_packet(void *object, int i, uint8_t *temp, uint16_t len)
ft->transferred += file_data_length;
if ((ft->size && ft->transferred >= ft->size) || file_data_length != MAX_FILE_DATA_SIZE) {
if (ft->transferred >= ft->size || file_data_length != MAX_FILE_DATA_SIZE) {
file_data_length = 0;
file_data = NULL;
position = ft->transferred;

View File

@ -1395,6 +1395,9 @@ enum TOX_FILE_KIND {
* (same length as TOX_FILE_ID_LENGTH) will contain the hash. A client can compare
* this hash with a saved hash and send TOX_FILE_CONTROL_CANCEL to terminate the avatar
* transfer if it matches.
*
* When file_size is set to 0 in the transfer request it means that the client has no
* avatar.
*/
TOX_FILE_KIND_AVATAR
};
@ -1631,9 +1634,9 @@ typedef enum TOX_ERR_FILE_SEND {
* was modified and how the client determines the file size.
*
* - If the file size was increased
* - and sending mode was streaming (file_size = 0), the behaviour will be as
* - and sending mode was streaming (file_size = UINT64_MAX), the behaviour will be as
* expected.
* - and sending mode was file (file_size != 0), the file_chunk_request
* - and sending mode was file (file_size != UINT64_MAX), the file_chunk_request
* callback will receive length = 0 when Core thinks the file transfer has
* finished. If the client remembers the file size as it was when sending
* the request, it will terminate the transfer normally. If the client
@ -1654,7 +1657,7 @@ typedef enum TOX_ERR_FILE_SEND {
* @param friend_number The friend number of the friend the file send request
* should be sent to.
* @param kind The meaning of the file to be sent.
* @param file_size Size in bytes of the file the client wants to send, 0 if
* @param file_size Size in bytes of the file the client wants to send, UINT64_MAX if
* unknown or streaming.
* @param file_id A file identifier of length TOX_FILE_ID_LENGTH that can be used to
* uniquely identify file transfers across core restarts. If NULL, a random one will
@ -1804,7 +1807,7 @@ void tox_callback_file_recv(Tox *tox, tox_file_recv_cb *function, void *user_dat
*
* If position is equal to file_size (received in the file_receive callback)
* when the transfer finishes, the file was received completely. Otherwise, if
* file_size was 0, streaming ended successfully when length is 0.
* file_size was UINT64_MAX, streaming ended successfully when length is 0.
*
* @param friend_number The friend number of the friend who is sending the file.
* @param file_number The friend-specific file number the data received is