1 #ifndef FILE_TRANSFERS_H
2 #define FILE_TRANSFERS_H
3 
4 #include <stdbool.h>
5 #include <stdint.h>
6 #include <stdio.h>
7 #include <tox/tox.h>
8 
9 typedef struct msg_header MSG_HEADER;
10 
11 #define MAX_FILE_TRANSFERS 32
12 
13 typedef enum {
14     FILE_TRANSFER_STATUS_NONE,
15     FILE_TRANSFER_STATUS_ACTIVE,
16     FILE_TRANSFER_STATUS_PAUSED_US,
17     FILE_TRANSFER_STATUS_PAUSED_BOTH,
18     FILE_TRANSFER_STATUS_PAUSED_THEM,
19     FILE_TRANSFER_STATUS_BROKEN,
20     FILE_TRANSFER_STATUS_COMPLETED,
21     FILE_TRANSFER_STATUS_KILLED,
22 } UTOX_FILE_TRANSFER_STATUS;
23 
24 typedef struct {
25     FILE *file;
26     uint8_t *name;
27 } UTOX_MSG_FT;
28 
29 typedef struct file_transfer {
30     bool in_use;
31     bool incoming;
32     bool in_memory;
33     bool avatar;
34     bool inline_img;
35     bool resumeable;
36 
37     uint32_t friend_number;
38     uint32_t file_number;
39 
40     uint8_t  data_hash[TOX_HASH_LENGTH];
41 
42     UTOX_FILE_TRANSFER_STATUS status;
43 
44     uint8_t path[1024]; // UTOX_FILE_NAME_LENGTH
45 
46     uint8_t *name;
47     size_t  name_length;
48 
49     size_t target_size;
50     size_t current_size;
51 
52     union {
53         uint8_t *memory;
54         uint8_t *avatar;
55         FILE    *file;
56     } via;
57 
58     /* speed + progress calculations. */
59     uint32_t speed, num_packets;
60     uint64_t last_check_time, last_check_transferred;
61 
62     FILE    *resume_file;
63     uint8_t  resume_update;
64 
65     MSG_HEADER *ui_data;
66     bool decon_wait; // Used to pause decon/file cleanup, for the UI thread to copy the data;
67 } FILE_TRANSFER;
68 
69 void ft_local_control(Tox *tox, uint32_t friend_number, uint32_t file_number, TOX_FILE_CONTROL control);
70 
71 uint32_t ft_send_avatar(Tox *tox, uint32_t friend_number);
72 
73 uint32_t ft_send_file(Tox *tox, uint32_t friend_number, FILE *file, uint8_t *name, size_t name_length, uint8_t *hash);
74 
75 uint32_t ft_send_data(Tox *tox, uint32_t friend_number, uint8_t *data, size_t size, uint8_t *name, size_t name_length);
76 
77 /** Sets the UI pointer to the File Transfer Message pointer.
78  *
79  * This is non robust and could use some LTC */
80 bool ft_set_ui_data(uint32_t friend_number, uint32_t file_number, MSG_HEADER *ui_data);
81 
82 bool utox_file_start_write(uint32_t friend_number, uint32_t file_number, const char *file);
83 
84 void utox_set_callbacks_file_transfer(Tox *tox);
85 
86 void ft_friend_online(Tox *tox, uint32_t friend_number);
87 void ft_friend_offline(Tox *tox, uint32_t friend_number);
88 
89 #endif
90