diff options
Diffstat (limited to 'toxcore')
-rw-r--r-- | toxcore/Messenger.c | 141 | ||||
-rw-r--r-- | toxcore/Messenger.h | 60 |
2 files changed, 200 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 | } |
diff --git a/toxcore/Messenger.h b/toxcore/Messenger.h index 0ff14de4..05a5af27 100644 --- a/toxcore/Messenger.h +++ b/toxcore/Messenger.h | |||
@@ -44,6 +44,9 @@ | |||
44 | #define PACKET_ID_RECEIPT 65 | 44 | #define PACKET_ID_RECEIPT 65 |
45 | #define PACKET_ID_MESSAGE 64 | 45 | #define PACKET_ID_MESSAGE 64 |
46 | #define PACKET_ID_ACTION 63 | 46 | #define PACKET_ID_ACTION 63 |
47 | #define PACKET_ID_FILE_SENDREQUEST 80 | ||
48 | #define PACKET_ID_FILE_CONTROL 81 | ||
49 | #define PACKET_ID_FILE_DATA 82 | ||
47 | #define PACKET_ID_INVITE_GROUPCHAT 144 | 50 | #define PACKET_ID_INVITE_GROUPCHAT 144 |
48 | #define PACKET_ID_JOIN_GROUPCHAT 145 | 51 | #define PACKET_ID_JOIN_GROUPCHAT 145 |
49 | #define PACKET_ID_ACCEPT_GROUPCHAT 146 | 52 | #define PACKET_ID_ACCEPT_GROUPCHAT 146 |
@@ -157,11 +160,19 @@ typedef struct Messenger { | |||
157 | void *friend_statuschange_userdata; | 160 | void *friend_statuschange_userdata; |
158 | void (*friend_connectionstatuschange)(struct Messenger *m, int, uint8_t, void *); | 161 | void (*friend_connectionstatuschange)(struct Messenger *m, int, uint8_t, void *); |
159 | void *friend_connectionstatuschange_userdata; | 162 | void *friend_connectionstatuschange_userdata; |
163 | |||
160 | void (*group_invite)(struct Messenger *m, int, uint8_t *, void *); | 164 | void (*group_invite)(struct Messenger *m, int, uint8_t *, void *); |
161 | void *group_invite_userdata; | 165 | void *group_invite_userdata; |
162 | void (*group_message)(struct Messenger *m, int, int, uint8_t *, uint16_t, void *); | 166 | void (*group_message)(struct Messenger *m, int, int, uint8_t *, uint16_t, void *); |
163 | void *group_message_userdata; | 167 | void *group_message_userdata; |
164 | 168 | ||
169 | void (*file_sendrequest)(struct Messenger *m, int, uint8_t, uint64_t, uint8_t *, uint16_t, void *); | ||
170 | void *file_sendrequest_userdata; | ||
171 | void (*file_filecontrol)(struct Messenger *m, int, uint8_t, uint8_t, uint8_t *, uint16_t, void *); | ||
172 | void *file_filecontrol_userdata; | ||
173 | void (*file_filedata)(struct Messenger *m, int, uint8_t, uint8_t *, uint16_t length, void *); | ||
174 | void *file_filedata_userdata; | ||
175 | |||
165 | } Messenger; | 176 | } Messenger; |
166 | 177 | ||
167 | /* Format: [client_id (32 bytes)][nospam number (4 bytes)][checksum (2 bytes)] | 178 | /* Format: [client_id (32 bytes)][nospam number (4 bytes)][checksum (2 bytes)] |
@@ -439,6 +450,55 @@ int join_groupchat(Messenger *m, int friendnumber, uint8_t *friend_group_public_ | |||
439 | 450 | ||
440 | int group_message_send(Messenger *m, int groupnumber, uint8_t *message, uint32_t length); | 451 | int group_message_send(Messenger *m, int groupnumber, uint8_t *message, uint32_t length); |
441 | 452 | ||
453 | /****************FILE SENDING*****************/ | ||
454 | |||
455 | |||
456 | /* Set the callback for file send requests. | ||
457 | * | ||
458 | * Function(Tox *tox, int friendnumber, uint8_t filenumber, uint64_t filesize, uint8_t *filename, uint16_t filename_length, void *userdata) | ||
459 | */ | ||
460 | void callback_file_sendrequest(Messenger *m, void (*function)(Messenger *m, int, uint8_t, uint64_t, uint8_t *, uint16_t, | ||
461 | void *), void *userdata); | ||
462 | |||
463 | /* Set the callback for file control requests. | ||
464 | * | ||
465 | * Function(Tox *tox, int friendnumber, uint8_t filenumber, uint8_t control_type, uint8_t *data, uint16_t length, void *userdata) | ||
466 | * | ||
467 | */ | ||
468 | void callback_file_control(Messenger *m, void (*function)(Messenger *m, int, uint8_t, uint8_t, uint8_t *, uint16_t, | ||
469 | void *), void *userdata); | ||
470 | |||
471 | /* Set the callback for file data. | ||
472 | * | ||
473 | * Function(Tox *tox, int friendnumber, uint8_t filenumber, uint8_t *data, uint16_t length, void *userdata) | ||
474 | * | ||
475 | */ | ||
476 | void callback_file_data(Messenger *m, void (*function)(Messenger *m, int, uint8_t, uint8_t *, uint16_t length, void *), | ||
477 | void *userdata); | ||
478 | |||
479 | /* Send a file send request. | ||
480 | * Maximum filename length is 256 bytes. | ||
481 | * return 1 on success | ||
482 | * return 0 on failure | ||
483 | */ | ||
484 | int file_sendrequest(Messenger *m, int friendnumber, uint8_t filenumber, uint64_t filesize, uint8_t *filename, | ||
485 | uint16_t filename_length); | ||
486 | |||
487 | /* Send a file control request. | ||
488 | * | ||
489 | * return 1 on success | ||
490 | * return 0 on failure | ||
491 | */ | ||
492 | int file_control(Messenger *m, int friendnumber, uint8_t filenumber, uint8_t message_id, uint8_t *data, | ||
493 | uint16_t length); | ||
494 | |||
495 | /* Send file data. | ||
496 | * | ||
497 | * return 1 on success | ||
498 | * return 0 on failure | ||
499 | */ | ||
500 | int file_data(Messenger *m, int friendnumber, uint8_t filenumber, uint8_t *data, uint16_t length); | ||
501 | |||
442 | /*********************************/ | 502 | /*********************************/ |
443 | 503 | ||
444 | /* Run this at startup. | 504 | /* Run this at startup. |