summaryrefslogtreecommitdiff
path: root/toxcore/Messenger.c
diff options
context:
space:
mode:
authorirungentoo <irungentoo@gmail.com>2013-09-30 09:35:17 -0400
committerirungentoo <irungentoo@gmail.com>2013-09-30 09:35:17 -0400
commita0f94267ad2ea0ecd111c4aac2e8b35aad6ceed3 (patch)
treee82ebb699696a78679ba39c754ba9303cb76e19e /toxcore/Messenger.c
parent01ddd3249c36452b1c79ad4f7b236282f8b92017 (diff)
File sending.
Diffstat (limited to 'toxcore/Messenger.c')
-rw-r--r--toxcore/Messenger.c141
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 */
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 }