1
0
mirror of https://github.com/Tha14/toxic.git synced 2024-07-01 17:07:46 +02:00

Fix some issues with file transfers

- Fix bug causing failed avatar transfers to be sent as normal file transfers
      when a friend goes offline and comes back online
- Remove some unused members of the FileTransfer struct
- Rename filenum -> filenumber and friendnum -> friendnumber
This commit is contained in:
jfreegman 2020-11-13 19:38:33 -05:00
parent 15b7a30925
commit dac0124f0f
No known key found for this signature in database
GPG Key ID: 3627F3144076AE63
7 changed files with 106 additions and 99 deletions

View File

@ -78,27 +78,27 @@ static void avatar_clear(void)
}; };
} }
/* Sends avatar to friendnum. /* Sends avatar to friendnumber.
* *
* Returns 0 on success. * Returns 0 on success.
* Returns -1 on failure. * Returns -1 on failure.
*/ */
int avatar_send(Tox *m, uint32_t friendnum) int avatar_send(Tox *m, uint32_t friendnumber)
{ {
Tox_Err_File_Send err; Tox_Err_File_Send err;
uint32_t filenum = tox_file_send(m, friendnum, TOX_FILE_KIND_AVATAR, (size_t) Avatar.size, uint32_t filenumber = tox_file_send(m, friendnumber, TOX_FILE_KIND_AVATAR, (size_t) Avatar.size,
NULL, (uint8_t *) Avatar.name, Avatar.name_len, &err); NULL, (uint8_t *) Avatar.name, Avatar.name_len, &err);
if (Avatar.size == 0) { if (Avatar.size == 0) {
return 0; return 0;
} }
if (err != TOX_ERR_FILE_SEND_OK) { if (err != TOX_ERR_FILE_SEND_OK) {
fprintf(stderr, "tox_file_send failed for friendnumber %u (error %d)\n", friendnum, err); fprintf(stderr, "tox_file_send failed for friendnumber %u (error %d)\n", friendnumber, err);
return -1; return -1;
} }
struct FileTransfer *ft = new_file_transfer(NULL, friendnum, filenum, FILE_TRANSFER_SEND, TOX_FILE_KIND_AVATAR); struct FileTransfer *ft = new_file_transfer(NULL, friendnumber, filenumber, FILE_TRANSFER_SEND, TOX_FILE_KIND_AVATAR);
if (!ft) { if (!ft) {
return -1; return -1;
@ -119,9 +119,7 @@ int avatar_send(Tox *m, uint32_t friendnum)
/* Sends avatar to all friends */ /* Sends avatar to all friends */
static void avatar_send_all(Tox *m) static void avatar_send_all(Tox *m)
{ {
size_t i; for (size_t i = 0; i < Friends.max_idx; ++i) {
for (i = 0; i < Friends.max_idx; ++i) {
if (Friends.list[i].connection_status != TOX_CONNECTION_NONE) { if (Friends.list[i].connection_status != TOX_CONNECTION_NONE) {
avatar_send(m, Friends.list[i].num); avatar_send(m, Friends.list[i].num);
} }
@ -182,6 +180,13 @@ void avatar_unset(Tox *m)
avatar_send_all(m); avatar_send_all(m);
} }
void on_avatar_friend_connection_status(Tox *m, uint32_t friendnumber, Tox_Connection connection_status)
{
if (connection_status == TOX_CONNECTION_NONE) {
kill_avatar_file_transfers_friend(m, friendnumber);
}
}
void on_avatar_file_control(Tox *m, struct FileTransfer *ft, Tox_File_Control control) void on_avatar_file_control(Tox *m, struct FileTransfer *ft, Tox_File_Control control)
{ {
switch (control) { switch (control) {
@ -245,7 +250,7 @@ void on_avatar_chunk_request(Tox *m, struct FileTransfer *ft, uint64_t position,
} }
Tox_Err_File_Send_Chunk err; Tox_Err_File_Send_Chunk err;
tox_file_send_chunk(m, ft->friendnum, ft->filenum, position, send_data, send_length, &err); tox_file_send_chunk(m, ft->friendnumber, ft->filenumber, position, send_data, send_length, &err);
free(send_data); free(send_data);
@ -254,5 +259,4 @@ void on_avatar_chunk_request(Tox *m, struct FileTransfer *ft, uint64_t position,
} }
ft->position += send_length; ft->position += send_length;
ft->last_keep_alive = get_unix_time();
} }

View File

@ -48,5 +48,6 @@ void avatar_unset(Tox *m);
void on_avatar_chunk_request(Tox *m, struct FileTransfer *ft, uint64_t position, size_t length); void on_avatar_chunk_request(Tox *m, struct FileTransfer *ft, uint64_t position, size_t length);
void on_avatar_file_control(Tox *m, struct FileTransfer *ft, Tox_File_Control control); void on_avatar_file_control(Tox *m, struct FileTransfer *ft, Tox_File_Control control);
void on_avatar_friend_connection_status(Tox *m, uint32_t friendnumber, Tox_Connection connection_status);
#endif /* AVATARS_H */ #endif /* AVATARS_H */

View File

@ -326,15 +326,17 @@ static void chat_pause_file_transfers(uint32_t friendnum)
{ {
ToxicFriend *friend = &Friends.list[friendnum]; ToxicFriend *friend = &Friends.list[friendnum];
size_t i; for (size_t i = 0; i < MAX_FILES; ++i) {
struct FileTransfer *fts = &friend->file_sender[i];
for (i = 0; i < MAX_FILES; ++i) { if (fts->file_type == TOX_FILE_KIND_DATA && fts->state >= FILE_TRANSFER_STARTED) {
if (friend->file_sender[i].state >= FILE_TRANSFER_STARTED) { fts->state = FILE_TRANSFER_PAUSED;
friend->file_sender[i].state = FILE_TRANSFER_PAUSED;
} }
if (friend->file_receiver[i].state >= FILE_TRANSFER_STARTED) { struct FileTransfer *ftr = &friend->file_receiver[i];
friend->file_receiver[i].state = FILE_TRANSFER_PAUSED;
if (ftr->file_type == TOX_FILE_KIND_DATA && ftr->state >= FILE_TRANSFER_STARTED) {
ftr->state = FILE_TRANSFER_PAUSED;
} }
} }
} }
@ -342,18 +344,16 @@ static void chat_pause_file_transfers(uint32_t friendnum)
/* Tries to resume broken file senders. Called when a friend comes online */ /* Tries to resume broken file senders. Called when a friend comes online */
static void chat_resume_file_senders(ToxWindow *self, Tox *m, uint32_t friendnum) static void chat_resume_file_senders(ToxWindow *self, Tox *m, uint32_t friendnum)
{ {
size_t i; for (size_t i = 0; i < MAX_FILES; ++i) {
for (i = 0; i < MAX_FILES; ++i) {
struct FileTransfer *ft = &Friends.list[friendnum].file_sender[i]; struct FileTransfer *ft = &Friends.list[friendnum].file_sender[i];
if (ft->state != FILE_TRANSFER_PAUSED) { if (ft->state != FILE_TRANSFER_PAUSED || ft->file_type != TOX_FILE_KIND_DATA) {
continue; continue;
} }
Tox_Err_File_Send err; Tox_Err_File_Send err;
ft->filenum = tox_file_send(m, friendnum, TOX_FILE_KIND_DATA, ft->file_size, ft->file_id, ft->filenumber = tox_file_send(m, friendnum, TOX_FILE_KIND_DATA, ft->file_size, ft->file_id,
(uint8_t *) ft->file_name, strlen(ft->file_name), &err); (uint8_t *) ft->file_name, strlen(ft->file_name), &err);
if (err != TOX_ERR_FILE_SEND_OK) { if (err != TOX_ERR_FILE_SEND_OK) {
char msg[MAX_STR_SIZE]; char msg[MAX_STR_SIZE];
@ -364,14 +364,14 @@ static void chat_resume_file_senders(ToxWindow *self, Tox *m, uint32_t friendnum
} }
} }
static void chat_onFileChunkRequest(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_t filenum, uint64_t position, static void chat_onFileChunkRequest(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_t filenumber, uint64_t position,
size_t length) size_t length)
{ {
if (friendnum != self->num) { if (friendnum != self->num) {
return; return;
} }
struct FileTransfer *ft = get_file_transfer_struct(friendnum, filenum); struct FileTransfer *ft = get_file_transfer_struct(friendnum, filenumber);
if (!ft) { if (!ft) {
return; return;
@ -424,7 +424,7 @@ static void chat_onFileChunkRequest(ToxWindow *self, Tox *m, uint32_t friendnum,
} }
Tox_Err_File_Send_Chunk err; Tox_Err_File_Send_Chunk err;
tox_file_send_chunk(m, ft->friendnum, ft->filenum, position, send_data, send_length, &err); tox_file_send_chunk(m, ft->friendnumber, ft->filenumber, position, send_data, send_length, &err);
free(send_data); free(send_data);
@ -434,10 +434,9 @@ static void chat_onFileChunkRequest(ToxWindow *self, Tox *m, uint32_t friendnum,
ft->position += send_length; ft->position += send_length;
ft->bps += send_length; ft->bps += send_length;
ft->last_keep_alive = get_unix_time();
} }
static void chat_onFileRecvChunk(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_t filenum, uint64_t position, static void chat_onFileRecvChunk(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_t filenumber, uint64_t position,
const char *data, size_t length) const char *data, size_t length)
{ {
UNUSED_VAR(position); UNUSED_VAR(position);
@ -446,7 +445,7 @@ static void chat_onFileRecvChunk(ToxWindow *self, Tox *m, uint32_t friendnum, ui
return; return;
} }
struct FileTransfer *ft = get_file_transfer_struct(friendnum, filenum); struct FileTransfer *ft = get_file_transfer_struct(friendnum, filenumber);
if (!ft) { if (!ft) {
return; return;
@ -479,16 +478,16 @@ static void chat_onFileRecvChunk(ToxWindow *self, Tox *m, uint32_t friendnum, ui
ft->bps += length; ft->bps += length;
ft->position += length; ft->position += length;
ft->last_keep_alive = get_unix_time();
} }
static void chat_onFileControl(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_t filenum, Tox_File_Control control) static void chat_onFileControl(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_t filenumber,
Tox_File_Control control)
{ {
if (friendnum != self->num) { if (friendnum != self->num) {
return; return;
} }
struct FileTransfer *ft = get_file_transfer_struct(friendnum, filenum); struct FileTransfer *ft = get_file_transfer_struct(friendnum, filenumber);
if (!ft) { if (!ft) {
return; return;
@ -498,8 +497,6 @@ static void chat_onFileControl(ToxWindow *self, Tox *m, uint32_t friendnum, uint
switch (control) { switch (control) {
case TOX_FILE_CONTROL_RESUME: { case TOX_FILE_CONTROL_RESUME: {
ft->last_keep_alive = get_unix_time();
/* transfer is accepted */ /* transfer is accepted */
if (ft->state == FILE_TRANSFER_PENDING) { if (ft->state == FILE_TRANSFER_PENDING) {
ft->state = FILE_TRANSFER_STARTED; ft->state = FILE_TRANSFER_STARTED;
@ -534,12 +531,12 @@ static void chat_onFileControl(ToxWindow *self, Tox *m, uint32_t friendnum, uint
* *
* Returns true if resume is successful. * Returns true if resume is successful.
*/ */
static bool chat_resume_broken_ft(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_t filenum) static bool chat_resume_broken_ft(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_t filenumber)
{ {
char msg[MAX_STR_SIZE]; char msg[MAX_STR_SIZE];
uint8_t file_id[TOX_FILE_ID_LENGTH]; uint8_t file_id[TOX_FILE_ID_LENGTH];
if (!tox_file_get_file_id(m, friendnum, filenum, file_id, NULL)) { if (!tox_file_get_file_id(m, friendnum, filenumber, file_id, NULL)) {
return false; return false;
} }
@ -555,9 +552,8 @@ static bool chat_resume_broken_ft(ToxWindow *self, Tox *m, uint32_t friendnum, u
} }
if (memcmp(ft->file_id, file_id, TOX_FILE_ID_LENGTH) == 0) { if (memcmp(ft->file_id, file_id, TOX_FILE_ID_LENGTH) == 0) {
ft->filenum = filenum; ft->filenumber = filenumber;
ft->state = FILE_TRANSFER_STARTED; ft->state = FILE_TRANSFER_STARTED;
ft->last_keep_alive = get_unix_time();
resuming = true; resuming = true;
break; break;
} }
@ -567,11 +563,11 @@ static bool chat_resume_broken_ft(ToxWindow *self, Tox *m, uint32_t friendnum, u
return false; return false;
} }
if (!tox_file_seek(m, ft->friendnum, ft->filenum, ft->position, NULL)) { if (!tox_file_seek(m, ft->friendnumber, ft->filenumber, ft->position, NULL)) {
goto on_error; goto on_error;
} }
if (!tox_file_control(m, ft->friendnum, ft->filenum, TOX_FILE_CONTROL_RESUME, NULL)) { if (!tox_file_control(m, ft->friendnumber, ft->filenumber, TOX_FILE_CONTROL_RESUME, NULL)) {
goto on_error; goto on_error;
} }
@ -615,7 +611,7 @@ static bool valid_file_name(const char *filename, size_t length)
return true; return true;
} }
static void chat_onFileRecv(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_t filenum, uint64_t file_size, static void chat_onFileRecv(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_t filenumber, uint64_t file_size,
const char *filename, size_t name_length) const char *filename, size_t name_length)
{ {
if (self->num != friendnum) { if (self->num != friendnum) {
@ -623,14 +619,14 @@ static void chat_onFileRecv(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_
} }
/* first check if we need to resume a broken transfer */ /* first check if we need to resume a broken transfer */
if (chat_resume_broken_ft(self, m, friendnum, filenum)) { if (chat_resume_broken_ft(self, m, friendnum, filenumber)) {
return; return;
} }
struct FileTransfer *ft = new_file_transfer(self, friendnum, filenum, FILE_TRANSFER_RECV, TOX_FILE_KIND_DATA); struct FileTransfer *ft = new_file_transfer(self, friendnum, filenumber, FILE_TRANSFER_RECV, TOX_FILE_KIND_DATA);
if (!ft) { if (!ft) {
tox_file_control(m, friendnum, filenum, TOX_FILE_CONTROL_CANCEL, NULL); tox_file_control(m, friendnum, filenumber, TOX_FILE_CONTROL_CANCEL, NULL);
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0,
"File transfer request failed: Too many concurrent file transfers."); "File transfer request failed: Too many concurrent file transfers.");
return; return;
@ -702,7 +698,7 @@ static void chat_onFileRecv(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_
ft->file_size = file_size; ft->file_size = file_size;
snprintf(ft->file_path, sizeof(ft->file_path), "%s", file_path); snprintf(ft->file_path, sizeof(ft->file_path), "%s", file_path);
snprintf(ft->file_name, sizeof(ft->file_name), "%s", filename); snprintf(ft->file_name, sizeof(ft->file_name), "%s", filename);
tox_file_get_file_id(m, friendnum, filenum, ft->file_id, NULL); tox_file_get_file_id(m, friendnum, filenumber, ft->file_id, NULL);
free(file_path); free(file_path);

View File

@ -183,7 +183,7 @@ void cmd_savefile(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv
} }
Tox_Err_File_Control err; Tox_Err_File_Control err;
tox_file_control(m, self->num, ft->filenum, TOX_FILE_CONTROL_RESUME, &err); tox_file_control(m, self->num, ft->filenumber, TOX_FILE_CONTROL_RESUME, &err);
if (err != TOX_ERR_FILE_CONTROL_OK) { if (err != TOX_ERR_FILE_CONTROL_OK) {
goto on_recv_error; goto on_recv_error;

View File

@ -116,13 +116,11 @@ static void refresh_progress_helper(ToxWindow *self, struct FileTransfer *ft)
} }
/* refreshes active file transfer status bars. */ /* refreshes active file transfer status bars. */
void refresh_file_transfer_progress(ToxWindow *self, uint32_t friendnum) void refresh_file_transfer_progress(ToxWindow *self, uint32_t friendnumber)
{ {
size_t i; for (size_t i = 0; i < MAX_FILES; ++i) {
refresh_progress_helper(self, &Friends.list[friendnumber].file_receiver[i]);
for (i = 0; i < MAX_FILES; ++i) { refresh_progress_helper(self, &Friends.list[friendnumber].file_sender[i]);
refresh_progress_helper(self, &Friends.list[friendnum].file_receiver[i]);
refresh_progress_helper(self, &Friends.list[friendnum].file_sender[i]);
} }
} }
@ -133,21 +131,21 @@ static void clear_file_transfer(struct FileTransfer *ft)
}; };
} }
/* Returns a pointer to friendnum's FileTransfer struct associated with filenum. /* Returns a pointer to friendnumber's FileTransfer struct associated with filenumber.
* Returns NULL if filenum is invalid. * Returns NULL if filenumber is invalid.
*/ */
struct FileTransfer *get_file_transfer_struct(uint32_t friendnum, uint32_t filenum) struct FileTransfer *get_file_transfer_struct(uint32_t friendnumber, uint32_t filenumber)
{ {
for (size_t i = 0; i < MAX_FILES; ++i) { for (size_t i = 0; i < MAX_FILES; ++i) {
struct FileTransfer *ft_send = &Friends.list[friendnum].file_sender[i]; struct FileTransfer *ft_send = &Friends.list[friendnumber].file_sender[i];
if (ft_send->state != FILE_TRANSFER_INACTIVE && ft_send->filenum == filenum) { if (ft_send->state != FILE_TRANSFER_INACTIVE && ft_send->filenumber == filenumber) {
return ft_send; return ft_send;
} }
struct FileTransfer *ft_recv = &Friends.list[friendnum].file_receiver[i]; struct FileTransfer *ft_recv = &Friends.list[friendnumber].file_receiver[i];
if (ft_recv->state != FILE_TRANSFER_INACTIVE && ft_recv->filenum == filenum) { if (ft_recv->state != FILE_TRANSFER_INACTIVE && ft_recv->filenumber == filenumber) {
return ft_recv; return ft_recv;
} }
} }
@ -158,7 +156,7 @@ struct FileTransfer *get_file_transfer_struct(uint32_t friendnum, uint32_t filen
/* Returns a pointer to the FileTransfer struct associated with index with the direction specified. /* Returns a pointer to the FileTransfer struct associated with index with the direction specified.
* Returns NULL on failure. * Returns NULL on failure.
*/ */
struct FileTransfer *get_file_transfer_struct_index(uint32_t friendnum, uint32_t index, struct FileTransfer *get_file_transfer_struct_index(uint32_t friendnumber, uint32_t index,
FILE_TRANSFER_DIRECTION direction) FILE_TRANSFER_DIRECTION direction)
{ {
if (direction != FILE_TRANSFER_RECV && direction != FILE_TRANSFER_SEND) { if (direction != FILE_TRANSFER_RECV && direction != FILE_TRANSFER_SEND) {
@ -167,8 +165,8 @@ struct FileTransfer *get_file_transfer_struct_index(uint32_t friendnum, uint32_t
for (size_t i = 0; i < MAX_FILES; ++i) { for (size_t i = 0; i < MAX_FILES; ++i) {
struct FileTransfer *ft = direction == FILE_TRANSFER_SEND ? struct FileTransfer *ft = direction == FILE_TRANSFER_SEND ?
&Friends.list[friendnum].file_sender[i] : &Friends.list[friendnumber].file_sender[i] :
&Friends.list[friendnum].file_receiver[i]; &Friends.list[friendnumber].file_receiver[i];
if (ft->state != FILE_TRANSFER_INACTIVE && ft->index == index) { if (ft->state != FILE_TRANSFER_INACTIVE && ft->index == index) {
return ft; return ft;
@ -181,21 +179,19 @@ struct FileTransfer *get_file_transfer_struct_index(uint32_t friendnum, uint32_t
/* Returns a pointer to an unused file sender. /* Returns a pointer to an unused file sender.
* Returns NULL if all file senders are in use. * Returns NULL if all file senders are in use.
*/ */
static struct FileTransfer *new_file_sender(ToxWindow *window, uint32_t friendnum, uint32_t filenum, uint8_t type) static struct FileTransfer *new_file_sender(ToxWindow *window, uint32_t friendnumber, uint32_t filenumber, uint8_t type)
{ {
for (size_t i = 0; i < MAX_FILES; ++i) { for (size_t i = 0; i < MAX_FILES; ++i) {
struct FileTransfer *ft = &Friends.list[friendnum].file_sender[i]; struct FileTransfer *ft = &Friends.list[friendnumber].file_sender[i];
if (ft->state == FILE_TRANSFER_INACTIVE) { if (ft->state == FILE_TRANSFER_INACTIVE) {
clear_file_transfer(ft); clear_file_transfer(ft);
ft->window = window; ft->window = window;
ft->index = i; ft->index = i;
ft->friendnum = friendnum; ft->friendnumber = friendnumber;
ft->filenum = filenum; ft->filenumber = filenumber;
ft->file_type = type; ft->file_type = type;
ft->last_keep_alive = get_unix_time();
ft->state = FILE_TRANSFER_PENDING; ft->state = FILE_TRANSFER_PENDING;
ft->direction = FILE_TRANSFER_SEND;
return ft; return ft;
} }
} }
@ -206,21 +202,20 @@ static struct FileTransfer *new_file_sender(ToxWindow *window, uint32_t friendnu
/* Returns a pointer to an unused file receiver. /* Returns a pointer to an unused file receiver.
* Returns NULL if all file receivers are in use. * Returns NULL if all file receivers are in use.
*/ */
static struct FileTransfer *new_file_receiver(ToxWindow *window, uint32_t friendnum, uint32_t filenum, uint8_t type) static struct FileTransfer *new_file_receiver(ToxWindow *window, uint32_t friendnumber, uint32_t filenumber,
uint8_t type)
{ {
for (size_t i = 0; i < MAX_FILES; ++i) { for (size_t i = 0; i < MAX_FILES; ++i) {
struct FileTransfer *ft = &Friends.list[friendnum].file_receiver[i]; struct FileTransfer *ft = &Friends.list[friendnumber].file_receiver[i];
if (ft->state == FILE_TRANSFER_INACTIVE) { if (ft->state == FILE_TRANSFER_INACTIVE) {
clear_file_transfer(ft); clear_file_transfer(ft);
ft->window = window; ft->window = window;
ft->index = i; ft->index = i;
ft->friendnum = friendnum; ft->friendnumber = friendnumber;
ft->filenum = filenum; ft->filenumber = filenumber;
ft->file_type = type; ft->file_type = type;
ft->last_keep_alive = get_unix_time();
ft->state = FILE_TRANSFER_PENDING; ft->state = FILE_TRANSFER_PENDING;
ft->direction = FILE_TRANSFER_RECV;
return ft; return ft;
} }
} }
@ -231,15 +226,15 @@ static struct FileTransfer *new_file_receiver(ToxWindow *window, uint32_t friend
/* Initializes an unused file transfer and returns its pointer. /* Initializes an unused file transfer and returns its pointer.
* Returns NULL on failure. * Returns NULL on failure.
*/ */
struct FileTransfer *new_file_transfer(ToxWindow *window, uint32_t friendnum, uint32_t filenum, struct FileTransfer *new_file_transfer(ToxWindow *window, uint32_t friendnumber, uint32_t filenumber,
FILE_TRANSFER_DIRECTION direction, uint8_t type) FILE_TRANSFER_DIRECTION direction, uint8_t type)
{ {
if (direction == FILE_TRANSFER_RECV) { if (direction == FILE_TRANSFER_RECV) {
return new_file_receiver(window, friendnum, filenum, type); return new_file_receiver(window, friendnumber, filenumber, type);
} }
if (direction == FILE_TRANSFER_SEND) { if (direction == FILE_TRANSFER_SEND) {
return new_file_sender(window, friendnum, filenum, type); return new_file_sender(window, friendnumber, filenumber, type);
} }
return NULL; return NULL;
@ -267,7 +262,7 @@ void close_file_transfer(ToxWindow *self, Tox *m, struct FileTransfer *ft, int C
} }
if (CTRL >= 0) { if (CTRL >= 0) {
tox_file_control(m, ft->friendnum, ft->filenum, (Tox_File_Control) CTRL, NULL); tox_file_control(m, ft->friendnumber, ft->filenumber, (Tox_File_Control) CTRL, NULL);
} }
if (message && self) { if (message && self) {
@ -283,22 +278,30 @@ void close_file_transfer(ToxWindow *self, Tox *m, struct FileTransfer *ft, int C
clear_file_transfer(ft); clear_file_transfer(ft);
} }
/* Kills all active file transfers for friendnum */ /* Kills active outgoing avatar file transfers for friendnumber */
void kill_all_file_transfers_friend(Tox *m, uint32_t friendnum) void kill_avatar_file_transfers_friend(Tox *m, uint32_t friendnumber)
{ {
size_t i; for (size_t i = 0; i < MAX_FILES; ++i) {
struct FileTransfer *ft = &Friends.list[friendnumber].file_sender[i];
for (i = 0; i < MAX_FILES; ++i) { if (ft->file_type == TOX_FILE_KIND_AVATAR) {
close_file_transfer(NULL, m, &Friends.list[friendnum].file_sender[i], TOX_FILE_CONTROL_CANCEL, NULL, silent); close_file_transfer(NULL, m, ft, TOX_FILE_CONTROL_CANCEL, NULL, silent);
close_file_transfer(NULL, m, &Friends.list[friendnum].file_receiver[i], TOX_FILE_CONTROL_CANCEL, NULL, silent); }
}
}
/* Kills all active file transfers for friendnumber */
void kill_all_file_transfers_friend(Tox *m, uint32_t friendnumber)
{
for (size_t i = 0; i < MAX_FILES; ++i) {
close_file_transfer(NULL, m, &Friends.list[friendnumber].file_sender[i], TOX_FILE_CONTROL_CANCEL, NULL, silent);
close_file_transfer(NULL, m, &Friends.list[friendnumber].file_receiver[i], TOX_FILE_CONTROL_CANCEL, NULL, silent);
} }
} }
void kill_all_file_transfers(Tox *m) void kill_all_file_transfers(Tox *m)
{ {
size_t i; for (size_t i = 0; i < Friends.max_idx; ++i) {
for (i = 0; i < Friends.max_idx; ++i) {
kill_all_file_transfers_friend(m, Friends.list[i].num); kill_all_file_transfers_friend(m, Friends.list[i].num);
} }
} }

View File

@ -51,18 +51,16 @@ struct FileTransfer {
ToxWindow *window; ToxWindow *window;
FILE *file; FILE *file;
FILE_TRANSFER_STATE state; FILE_TRANSFER_STATE state;
FILE_TRANSFER_DIRECTION direction;
uint8_t file_type; uint8_t file_type;
char file_name[TOX_MAX_FILENAME_LENGTH + 1]; char file_name[TOX_MAX_FILENAME_LENGTH + 1];
char file_path[PATH_MAX + 1]; /* Not used by senders */ char file_path[PATH_MAX + 1]; /* Not used by senders */
double bps; double bps;
uint32_t filenum; uint32_t filenumber;
uint32_t friendnum; uint32_t friendnumber;
size_t index; size_t index;
uint64_t file_size; uint64_t file_size;
uint64_t position; uint64_t position;
time_t last_line_progress; /* The last time we updated the progress bar */ time_t last_line_progress; /* The last time we updated the progress bar */
time_t last_keep_alive; /* The last time we sent or received data */
uint32_t line_id; uint32_t line_id;
uint8_t file_id[TOX_FILE_ID_LENGTH]; uint8_t file_id[TOX_FILE_ID_LENGTH];
}; };
@ -75,24 +73,24 @@ void init_progress_bar(char *progline);
void print_progress_bar(ToxWindow *self, double pct_done, double bps, uint32_t line_id); void print_progress_bar(ToxWindow *self, double pct_done, double bps, uint32_t line_id);
/* refreshes active file transfer status bars. */ /* refreshes active file transfer status bars. */
void refresh_file_transfer_progress(ToxWindow *self, uint32_t friendnum); void refresh_file_transfer_progress(ToxWindow *self, uint32_t friendnumber);
/* Returns a pointer to friendnum's FileTransfer struct associated with filenum. /* Returns a pointer to friendnumber's FileTransfer struct associated with filenumber.
* Returns NULL if filenum is invalid. * Returns NULL if filenumber is invalid.
*/ */
struct FileTransfer *get_file_transfer_struct(uint32_t friendnum, uint32_t filenum); struct FileTransfer *get_file_transfer_struct(uint32_t friendnumber, uint32_t filenumber);
/* Returns a pointer to the FileTransfer struct associated with index with the direction specified. /* Returns a pointer to the FileTransfer struct associated with index with the direction specified.
* Returns NULL on failure. * Returns NULL on failure.
*/ */
struct FileTransfer *get_file_transfer_struct_index(uint32_t friendnum, uint32_t index, struct FileTransfer *get_file_transfer_struct_index(uint32_t friendnumber, uint32_t index,
FILE_TRANSFER_DIRECTION direction); FILE_TRANSFER_DIRECTION direction);
/* Initializes an unused file transfer and returns its pointer. /* Initializes an unused file transfer and returns its pointer.
* Returns NULL on failure. * Returns NULL on failure.
*/ */
struct FileTransfer *new_file_transfer(ToxWindow *window, uint32_t friendnum, uint32_t filenum, struct FileTransfer *new_file_transfer(ToxWindow *window, uint32_t friendnumber, uint32_t filenumber,
FILE_TRANSFER_DIRECTION direction, uint8_t type); FILE_TRANSFER_DIRECTION direction, uint8_t type);
/* Closes file transfer ft. /* Closes file transfer ft.
@ -103,8 +101,11 @@ struct FileTransfer *new_file_transfer(ToxWindow *window, uint32_t friendnum, ui
void close_file_transfer(ToxWindow *self, Tox *m, struct FileTransfer *ft, int CTRL, const char *message, void close_file_transfer(ToxWindow *self, Tox *m, struct FileTransfer *ft, int CTRL, const char *message,
Notification sound_type); Notification sound_type);
/* Kills all active file transfers for friendnum */ /* Kills active outgoing avatar file transfers for friendnumber */
void kill_all_file_transfers_friend(Tox *m, uint32_t friendnum); void kill_avatar_file_transfers_friend(Tox *m, uint32_t friendnumber);
/* Kills all active file transfers for friendnumber */
void kill_all_file_transfers_friend(Tox *m, uint32_t friendnumber);
void kill_all_file_transfers(Tox *m); void kill_all_file_transfers(Tox *m);

View File

@ -66,6 +66,8 @@ void on_friend_connection_status(Tox *m, uint32_t friendnumber, Tox_Connection c
{ {
UNUSED_VAR(userdata); UNUSED_VAR(userdata);
on_avatar_friend_connection_status(m, friendnumber, connection_status);
for (uint8_t i = 0; i < MAX_WINDOWS_NUM; ++i) { for (uint8_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onConnectionChange != NULL) { if (windows[i] != NULL && windows[i]->onConnectionChange != NULL) {
windows[i]->onConnectionChange(windows[i], m, friendnumber, connection_status); windows[i]->onConnectionChange(windows[i], m, friendnumber, connection_status);