summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--toxcore/Messenger.c141
-rw-r--r--toxcore/Messenger.h60
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 */
938void 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 */
951void 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 */
963void 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 */
977int 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 */
998int 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 */
1016int 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. */
934static void LANdiscovery(Messenger *m) 1031static 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
440int group_message_send(Messenger *m, int groupnumber, uint8_t *message, uint32_t length); 451int 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 */
460void 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 */
468void 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 */
476void 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 */
484int 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 */
492int 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 */
500int 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.