mirror of
				https://github.com/Tha14/toxic.git
				synced 2025-10-31 19:56:51 +01: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:
		| @@ -78,27 +78,27 @@ static void avatar_clear(void) | ||||
|     }; | ||||
| } | ||||
|  | ||||
| /* Sends avatar to friendnum. | ||||
| /* Sends avatar to friendnumber. | ||||
|  * | ||||
|  * Returns 0 on success. | ||||
|  * 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; | ||||
|     uint32_t filenum = tox_file_send(m, friendnum, TOX_FILE_KIND_AVATAR, (size_t) Avatar.size, | ||||
|                                      NULL, (uint8_t *) Avatar.name, Avatar.name_len, &err); | ||||
|     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); | ||||
|  | ||||
|     if (Avatar.size == 0) { | ||||
|         return 0; | ||||
|     } | ||||
|  | ||||
|     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; | ||||
|     } | ||||
|  | ||||
|     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) { | ||||
|         return -1; | ||||
| @@ -119,9 +119,7 @@ int avatar_send(Tox *m, uint32_t friendnum) | ||||
| /* Sends avatar to all friends */ | ||||
| static void avatar_send_all(Tox *m) | ||||
| { | ||||
|     size_t i; | ||||
|  | ||||
|     for (i = 0; i < Friends.max_idx; ++i) { | ||||
|     for (size_t i = 0; i < Friends.max_idx; ++i) { | ||||
|         if (Friends.list[i].connection_status != TOX_CONNECTION_NONE) { | ||||
|             avatar_send(m, Friends.list[i].num); | ||||
|         } | ||||
| @@ -182,6 +180,13 @@ void avatar_unset(Tox *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) | ||||
| { | ||||
|     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_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); | ||||
|  | ||||
| @@ -254,5 +259,4 @@ void on_avatar_chunk_request(Tox *m, struct FileTransfer *ft, uint64_t position, | ||||
|     } | ||||
|  | ||||
|     ft->position += send_length; | ||||
|     ft->last_keep_alive = get_unix_time(); | ||||
| } | ||||
|   | ||||
| @@ -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_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 */ | ||||
|   | ||||
							
								
								
									
										64
									
								
								src/chat.c
									
									
									
									
									
								
							
							
						
						
									
										64
									
								
								src/chat.c
									
									
									
									
									
								
							| @@ -326,15 +326,17 @@ static void chat_pause_file_transfers(uint32_t 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 (friend->file_sender[i].state >= FILE_TRANSFER_STARTED) { | ||||
|             friend->file_sender[i].state = FILE_TRANSFER_PAUSED; | ||||
|         if (fts->file_type == TOX_FILE_KIND_DATA && fts->state >= FILE_TRANSFER_STARTED) { | ||||
|             fts->state = FILE_TRANSFER_PAUSED; | ||||
|         } | ||||
|  | ||||
|         if (friend->file_receiver[i].state >= FILE_TRANSFER_STARTED) { | ||||
|             friend->file_receiver[i].state = FILE_TRANSFER_PAUSED; | ||||
|         struct FileTransfer *ftr = &friend->file_receiver[i]; | ||||
|  | ||||
|         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 */ | ||||
| static void chat_resume_file_senders(ToxWindow *self, Tox *m, uint32_t friendnum) | ||||
| { | ||||
|     size_t i; | ||||
|  | ||||
|     for (i = 0; i < MAX_FILES; ++i) { | ||||
|     for (size_t i = 0; i < MAX_FILES; ++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; | ||||
|         } | ||||
|  | ||||
|         Tox_Err_File_Send err; | ||||
|         ft->filenum = 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); | ||||
|         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); | ||||
|  | ||||
|         if (err != TOX_ERR_FILE_SEND_OK) { | ||||
|             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) | ||||
| { | ||||
|     if (friendnum != self->num) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     struct FileTransfer *ft = get_file_transfer_struct(friendnum, filenum); | ||||
|     struct FileTransfer *ft = get_file_transfer_struct(friendnum, filenumber); | ||||
|  | ||||
|     if (!ft) { | ||||
|         return; | ||||
| @@ -424,7 +424,7 @@ static void chat_onFileChunkRequest(ToxWindow *self, Tox *m, uint32_t friendnum, | ||||
|     } | ||||
|  | ||||
|     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); | ||||
|  | ||||
| @@ -434,10 +434,9 @@ static void chat_onFileChunkRequest(ToxWindow *self, Tox *m, uint32_t friendnum, | ||||
|  | ||||
|     ft->position += 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) | ||||
| { | ||||
|     UNUSED_VAR(position); | ||||
| @@ -446,7 +445,7 @@ static void chat_onFileRecvChunk(ToxWindow *self, Tox *m, uint32_t friendnum, ui | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     struct FileTransfer *ft = get_file_transfer_struct(friendnum, filenum); | ||||
|     struct FileTransfer *ft = get_file_transfer_struct(friendnum, filenumber); | ||||
|  | ||||
|     if (!ft) { | ||||
|         return; | ||||
| @@ -479,16 +478,16 @@ static void chat_onFileRecvChunk(ToxWindow *self, Tox *m, uint32_t friendnum, ui | ||||
|  | ||||
|     ft->bps += 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) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     struct FileTransfer *ft = get_file_transfer_struct(friendnum, filenum); | ||||
|     struct FileTransfer *ft = get_file_transfer_struct(friendnum, filenumber); | ||||
|  | ||||
|     if (!ft) { | ||||
|         return; | ||||
| @@ -498,8 +497,6 @@ static void chat_onFileControl(ToxWindow *self, Tox *m, uint32_t friendnum, uint | ||||
|  | ||||
|     switch (control) { | ||||
|         case TOX_FILE_CONTROL_RESUME: { | ||||
|             ft->last_keep_alive = get_unix_time(); | ||||
|  | ||||
|             /* transfer is accepted */ | ||||
|             if (ft->state == FILE_TRANSFER_PENDING) { | ||||
|                 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. | ||||
|  */ | ||||
| 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]; | ||||
|     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; | ||||
|     } | ||||
|  | ||||
| @@ -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) { | ||||
|             ft->filenum = filenum; | ||||
|             ft->filenumber = filenumber; | ||||
|             ft->state = FILE_TRANSFER_STARTED; | ||||
|             ft->last_keep_alive = get_unix_time(); | ||||
|             resuming = true; | ||||
|             break; | ||||
|         } | ||||
| @@ -567,11 +563,11 @@ static bool chat_resume_broken_ft(ToxWindow *self, Tox *m, uint32_t friendnum, u | ||||
|         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; | ||||
|     } | ||||
|  | ||||
|     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; | ||||
|     } | ||||
|  | ||||
| @@ -615,7 +611,7 @@ static bool valid_file_name(const char *filename, size_t length) | ||||
|     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) | ||||
| { | ||||
|     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 */ | ||||
|     if (chat_resume_broken_ft(self, m, friendnum, filenum)) { | ||||
|     if (chat_resume_broken_ft(self, m, friendnum, filenumber)) { | ||||
|         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) { | ||||
|         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, | ||||
|                       "File transfer request failed: Too many concurrent file transfers."); | ||||
|         return; | ||||
| @@ -702,7 +698,7 @@ static void chat_onFileRecv(ToxWindow *self, Tox *m, uint32_t friendnum, uint32_ | ||||
|     ft->file_size = file_size; | ||||
|     snprintf(ft->file_path, sizeof(ft->file_path), "%s", file_path); | ||||
|     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); | ||||
|  | ||||
|   | ||||
| @@ -183,7 +183,7 @@ void cmd_savefile(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv | ||||
|     } | ||||
|  | ||||
|     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) { | ||||
|         goto on_recv_error; | ||||
|   | ||||
| @@ -116,13 +116,11 @@ static void refresh_progress_helper(ToxWindow *self, struct FileTransfer *ft) | ||||
| } | ||||
|  | ||||
| /* 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 (i = 0; i < MAX_FILES; ++i) { | ||||
|         refresh_progress_helper(self, &Friends.list[friendnum].file_receiver[i]); | ||||
|         refresh_progress_helper(self, &Friends.list[friendnum].file_sender[i]); | ||||
|     for (size_t i = 0; i < MAX_FILES; ++i) { | ||||
|         refresh_progress_helper(self, &Friends.list[friendnumber].file_receiver[i]); | ||||
|         refresh_progress_helper(self, &Friends.list[friendnumber].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 NULL if filenum is invalid. | ||||
| /* Returns a pointer to friendnumber's FileTransfer struct associated with filenumber. | ||||
|  * 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) { | ||||
|         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; | ||||
|         } | ||||
|  | ||||
|         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; | ||||
|         } | ||||
|     } | ||||
| @@ -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 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) | ||||
| { | ||||
|     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) { | ||||
|         struct FileTransfer *ft = direction == FILE_TRANSFER_SEND ? | ||||
|                                       &Friends.list[friendnum].file_sender[i] : | ||||
|                                       &Friends.list[friendnum].file_receiver[i]; | ||||
|                                       &Friends.list[friendnumber].file_sender[i] : | ||||
|                                       &Friends.list[friendnumber].file_receiver[i]; | ||||
|  | ||||
|         if (ft->state != FILE_TRANSFER_INACTIVE && ft->index == index) { | ||||
|             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 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) { | ||||
|         struct FileTransfer *ft = &Friends.list[friendnum].file_sender[i]; | ||||
|         struct FileTransfer *ft = &Friends.list[friendnumber].file_sender[i]; | ||||
|  | ||||
|         if (ft->state == FILE_TRANSFER_INACTIVE) { | ||||
|             clear_file_transfer(ft); | ||||
|             ft->window = window; | ||||
|             ft->index = i; | ||||
|             ft->friendnum = friendnum; | ||||
|             ft->filenum = filenum; | ||||
|             ft->friendnumber = friendnumber; | ||||
|             ft->filenumber = filenumber; | ||||
|             ft->file_type = type; | ||||
|             ft->last_keep_alive = get_unix_time(); | ||||
|             ft->state = FILE_TRANSFER_PENDING; | ||||
|             ft->direction = FILE_TRANSFER_SEND; | ||||
|             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 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) { | ||||
|         struct FileTransfer *ft = &Friends.list[friendnum].file_receiver[i]; | ||||
|         struct FileTransfer *ft = &Friends.list[friendnumber].file_receiver[i]; | ||||
|  | ||||
|         if (ft->state == FILE_TRANSFER_INACTIVE) { | ||||
|             clear_file_transfer(ft); | ||||
|             ft->window = window; | ||||
|             ft->index = i; | ||||
|             ft->friendnum = friendnum; | ||||
|             ft->filenum = filenum; | ||||
|             ft->friendnumber = friendnumber; | ||||
|             ft->filenumber = filenumber; | ||||
|             ft->file_type = type; | ||||
|             ft->last_keep_alive = get_unix_time(); | ||||
|             ft->state = FILE_TRANSFER_PENDING; | ||||
|             ft->direction = FILE_TRANSFER_RECV; | ||||
|             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. | ||||
|  * 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) | ||||
| { | ||||
|     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) { | ||||
|         return new_file_sender(window, friendnum, filenum, type); | ||||
|         return new_file_sender(window, friendnumber, filenumber, type); | ||||
|     } | ||||
|  | ||||
|     return NULL; | ||||
| @@ -267,7 +262,7 @@ void close_file_transfer(ToxWindow *self, Tox *m, struct FileTransfer *ft, int C | ||||
|     } | ||||
|  | ||||
|     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) { | ||||
| @@ -283,22 +278,30 @@ void close_file_transfer(ToxWindow *self, Tox *m, struct FileTransfer *ft, int C | ||||
|     clear_file_transfer(ft); | ||||
| } | ||||
|  | ||||
| /* Kills all active file transfers for friendnum */ | ||||
| void kill_all_file_transfers_friend(Tox *m, uint32_t friendnum) | ||||
| /* Kills active outgoing avatar file transfers for friendnumber */ | ||||
| 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) { | ||||
|         close_file_transfer(NULL, m, &Friends.list[friendnum].file_sender[i], TOX_FILE_CONTROL_CANCEL, NULL, silent); | ||||
|         close_file_transfer(NULL, m, &Friends.list[friendnum].file_receiver[i], TOX_FILE_CONTROL_CANCEL, NULL, silent); | ||||
|         if (ft->file_type == TOX_FILE_KIND_AVATAR) { | ||||
|             close_file_transfer(NULL, m, ft, 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) | ||||
| { | ||||
|     size_t i; | ||||
|  | ||||
|     for (i = 0; i < Friends.max_idx; ++i) { | ||||
|     for (size_t i = 0; i < Friends.max_idx; ++i) { | ||||
|         kill_all_file_transfers_friend(m, Friends.list[i].num); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -51,18 +51,16 @@ struct FileTransfer { | ||||
|     ToxWindow *window; | ||||
|     FILE *file; | ||||
|     FILE_TRANSFER_STATE state; | ||||
|     FILE_TRANSFER_DIRECTION direction; | ||||
|     uint8_t file_type; | ||||
|     char file_name[TOX_MAX_FILENAME_LENGTH + 1]; | ||||
|     char file_path[PATH_MAX + 1];    /* Not used by senders */ | ||||
|     double   bps; | ||||
|     uint32_t filenum; | ||||
|     uint32_t friendnum; | ||||
|     uint32_t filenumber; | ||||
|     uint32_t friendnumber; | ||||
|     size_t   index; | ||||
|     uint64_t file_size; | ||||
|     uint64_t position; | ||||
|     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; | ||||
|     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); | ||||
|  | ||||
| /* 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 NULL if filenum is invalid. | ||||
| /* Returns a pointer to friendnumber's FileTransfer struct associated with filenumber. | ||||
|  * 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 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); | ||||
|  | ||||
| /* Initializes an unused file transfer and returns its pointer. | ||||
|  * 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); | ||||
|  | ||||
| /* 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, | ||||
|                          Notification sound_type); | ||||
|  | ||||
| /* Kills all active file transfers for friendnum */ | ||||
| void kill_all_file_transfers_friend(Tox *m, uint32_t friendnum); | ||||
| /* Kills active outgoing avatar file transfers for friendnumber */ | ||||
| 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); | ||||
|  | ||||
|   | ||||
| @@ -66,6 +66,8 @@ void on_friend_connection_status(Tox *m, uint32_t friendnumber, Tox_Connection c | ||||
| { | ||||
|     UNUSED_VAR(userdata); | ||||
|  | ||||
|     on_avatar_friend_connection_status(m, friendnumber, connection_status); | ||||
|  | ||||
|     for (uint8_t i = 0; i < MAX_WINDOWS_NUM; ++i) { | ||||
|         if (windows[i] != NULL && windows[i]->onConnectionChange != NULL) { | ||||
|             windows[i]->onConnectionChange(windows[i], m, friendnumber, connection_status); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user