diff options
Diffstat (limited to 'toxcore/Messenger.c')
-rw-r--r-- | toxcore/Messenger.c | 141 |
1 files changed, 140 insertions, 1 deletions
diff --git a/toxcore/Messenger.c b/toxcore/Messenger.c index c8d69494..b21da28b 100644 --- a/toxcore/Messenger.c +++ b/toxcore/Messenger.c | |||
@@ -928,7 +928,104 @@ static void do_allgroupchats(Messenger *m) | |||
928 | } | 928 | } |
929 | } | 929 | } |
930 | 930 | ||
931 | /*********************************/ | 931 | /****************FILE SENDING*****************/ |
932 | |||
933 | |||
934 | /* Set the callback for file send requests. | ||
935 | * | ||
936 | * Function(Tox *tox, int friendnumber, uint8_t filenumber, uint64_t filesize, uint8_t *filename, uint16_t filename_length, void *userdata) | ||
937 | */ | ||
938 | void callback_file_sendrequest(Messenger *m, void (*function)(Messenger *m, int, uint8_t, uint64_t, uint8_t *, uint16_t, | ||
939 | void *), void *userdata) | ||
940 | { | ||
941 | |||
942 | m->file_sendrequest = function; | ||
943 | m->file_sendrequest_userdata = userdata; | ||
944 | } | ||
945 | |||
946 | /* Set the callback for file control requests. | ||
947 | * | ||
948 | * Function(Tox *tox, int friendnumber, uint8_t filenumber, uint8_t control_type, uint8_t *data, uint16_t length, void *userdata) | ||
949 | * | ||
950 | */ | ||
951 | void callback_file_control(Messenger *m, void (*function)(Messenger *m, int, uint8_t, uint8_t, uint8_t *, uint16_t, | ||
952 | void *), void *userdata) | ||
953 | { | ||
954 | m->file_filecontrol = function; | ||
955 | m->file_filecontrol_userdata = userdata; | ||
956 | } | ||
957 | |||
958 | /* Set the callback for file data. | ||
959 | * | ||
960 | * Function(Tox *tox, int friendnumber, uint8_t filenumber, uint8_t *data, uint16_t length, void *userdata) | ||
961 | * | ||
962 | */ | ||
963 | void callback_file_data(Messenger *m, void (*function)(Messenger *m, int, uint8_t, uint8_t *, uint16_t length, void *), | ||
964 | void *userdata) | ||
965 | { | ||
966 | m->file_filedata = function; | ||
967 | m->file_filedata_userdata = userdata; | ||
968 | } | ||
969 | |||
970 | #define MAX_FILENAME_LENGTH 256 | ||
971 | |||
972 | /* Send a file send request. | ||
973 | * Maximum filename length is 256 bytes. | ||
974 | * return 1 on success | ||
975 | * return 0 on failure | ||
976 | */ | ||
977 | int file_sendrequest(Messenger *m, int friendnumber, uint8_t filenumber, uint64_t filesize, uint8_t *filename, | ||
978 | uint16_t filename_length) | ||
979 | { | ||
980 | if (filename_length > MAX_FILENAME_LENGTH) | ||
981 | return 0; | ||
982 | |||
983 | uint8_t packet[MAX_FILENAME_LENGTH + 1 + sizeof(filesize)]; | ||
984 | packet[0] = filenumber; | ||
985 | //TODO: | ||
986 | //filesize = htonll(filesize); | ||
987 | memcpy(packet + 1, &filesize, sizeof(filesize)); | ||
988 | memcpy(packet + 1 + sizeof(filesize), filename, filename_length); | ||
989 | return write_cryptpacket_id(m, friendnumber, PACKET_ID_FILE_SENDREQUEST, packet, | ||
990 | 1 + sizeof(filesize) + filename_length); | ||
991 | } | ||
992 | |||
993 | /* Send a file control request. | ||
994 | * | ||
995 | * return 1 on success | ||
996 | * return 0 on failure | ||
997 | */ | ||
998 | int file_control(Messenger *m, int friendnumber, uint8_t filenumber, uint8_t message_id, uint8_t *data, uint16_t length) | ||
999 | { | ||
1000 | if (length > MAX_DATA_SIZE - 2) | ||
1001 | return 0; | ||
1002 | |||
1003 | uint8_t packet[MAX_DATA_SIZE]; | ||
1004 | packet[0] = filenumber; | ||
1005 | packet[1] = message_id; | ||
1006 | memcpy(packet + 2, data, length); | ||
1007 | return write_cryptpacket_id(m, friendnumber, PACKET_ID_FILE_CONTROL, packet, length + 2); | ||
1008 | } | ||
1009 | |||
1010 | |||
1011 | /* Send file data. | ||
1012 | * | ||
1013 | * return 1 on success | ||
1014 | * return 0 on failure | ||
1015 | */ | ||
1016 | int file_data(Messenger *m, int friendnumber, uint8_t filenumber, uint8_t *data, uint16_t length) | ||
1017 | { | ||
1018 | if (length > MAX_DATA_SIZE - 1) | ||
1019 | return 0; | ||
1020 | |||
1021 | uint8_t packet[MAX_DATA_SIZE]; | ||
1022 | packet[0] = filenumber; | ||
1023 | memcpy(packet + 1, data, length); | ||
1024 | return write_cryptpacket_id(m, friendnumber, PACKET_ID_FILE_DATA, packet, length + 1); | ||
1025 | } | ||
1026 | |||
1027 | /**************************************/ | ||
1028 | |||
932 | 1029 | ||
933 | /* Send a LAN discovery packet every LAN_DISCOVERY_INTERVAL seconds. */ | 1030 | /* Send a LAN discovery packet every LAN_DISCOVERY_INTERVAL seconds. */ |
934 | static void LANdiscovery(Messenger *m) | 1031 | static void LANdiscovery(Messenger *m) |
@@ -1210,6 +1307,48 @@ void doFriends(Messenger *m) | |||
1210 | break; | 1307 | break; |
1211 | } | 1308 | } |
1212 | 1309 | ||
1310 | case PACKET_ID_FILE_SENDREQUEST: { | ||
1311 | if (data_length < 1 + sizeof(uint64_t) + 1) | ||
1312 | break; | ||
1313 | |||
1314 | uint8_t filenumber = data[0]; | ||
1315 | uint64_t filesize; | ||
1316 | memcpy(&filesize, data + 1, sizeof(filesize)); | ||
1317 | |||
1318 | //TODO: | ||
1319 | //filesize = ntohll(filesize); | ||
1320 | if (m->file_sendrequest) | ||
1321 | (*m->file_sendrequest)(m, i, filenumber, filesize, data + 1 + sizeof(uint64_t), data_length - 1 - sizeof(uint64_t), | ||
1322 | m->file_sendrequest_userdata); | ||
1323 | |||
1324 | break; | ||
1325 | } | ||
1326 | |||
1327 | case PACKET_ID_FILE_CONTROL: { | ||
1328 | if (data_length < 2) | ||
1329 | break; | ||
1330 | |||
1331 | uint8_t filenumber = data[0]; | ||
1332 | uint8_t control_type = data[1]; | ||
1333 | |||
1334 | if (m->file_filecontrol) | ||
1335 | (*m->file_filecontrol)(m, i, filenumber, control_type, data + 2, data_length - 2, m->file_filecontrol_userdata); | ||
1336 | |||
1337 | break; | ||
1338 | } | ||
1339 | |||
1340 | case PACKET_ID_FILE_DATA: { | ||
1341 | if (data_length < 2) | ||
1342 | break; | ||
1343 | |||
1344 | uint8_t filenumber = data[0]; | ||
1345 | |||
1346 | if (m->file_filedata) | ||
1347 | (*m->file_filedata)(m, i, filenumber, data + 1, data_length - 1, m->file_filedata_userdata); | ||
1348 | |||
1349 | break; | ||
1350 | } | ||
1351 | |||
1213 | default: { | 1352 | default: { |
1214 | break; | 1353 | break; |
1215 | } | 1354 | } |