summaryrefslogtreecommitdiff
path: root/toxcore
diff options
context:
space:
mode:
authorCoren[m] <Break@Ocean>2013-09-13 09:06:52 +0200
committerCoren[m] <Break@Ocean>2013-09-13 09:06:52 +0200
commite67a11dd04edce395c2d0ac403241ed08a875737 (patch)
tree4a0c069cfe501c6395ee25a4050fd6068acd2f29 /toxcore
parentec3734fc5d0f0d81a5220cf16ad6ef8eb5f06c7c (diff)
parentf8b979a92a8c316c49bed28e158a468a2f74346c (diff)
Merge remote-tracking branch 'upstream/master' into Integration
Diffstat (limited to 'toxcore')
-rw-r--r--toxcore/LAN_discovery.h2
-rw-r--r--toxcore/Messenger.c124
-rw-r--r--toxcore/Messenger.h56
-rw-r--r--toxcore/group_chats.h1
-rw-r--r--toxcore/tox.c75
-rw-r--r--toxcore/tox.h53
6 files changed, 303 insertions, 8 deletions
diff --git a/toxcore/LAN_discovery.h b/toxcore/LAN_discovery.h
index a0789956..3e9d9de5 100644
--- a/toxcore/LAN_discovery.h
+++ b/toxcore/LAN_discovery.h
@@ -35,7 +35,7 @@
35#include <linux/netdevice.h> 35#include <linux/netdevice.h>
36#endif 36#endif
37 37
38/* standard interval in seconds between LAN discovery packet sending. */ 38/* Interval in seconds between LAN discovery packet sending. */
39#define LAN_DISCOVERY_INTERVAL 60 39#define LAN_DISCOVERY_INTERVAL 60
40 40
41/* Send a LAN discovery pcaket to the broadcast address with port port. */ 41/* Send a LAN discovery pcaket to the broadcast address with port port. */
diff --git a/toxcore/Messenger.c b/toxcore/Messenger.c
index d228fcc2..8d0b149f 100644
--- a/toxcore/Messenger.c
+++ b/toxcore/Messenger.c
@@ -674,6 +674,40 @@ static int group_num(Messenger *m, uint8_t *group_public_key)
674 return -1; 674 return -1;
675} 675}
676 676
677/* Set the callback for group invites.
678 *
679 * Function(Messenger *m, int friendnumber, uint8_t *group_public_key, void *userdata)
680 */
681void m_callback_group_invite(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, void *), void *userdata)
682{
683 m->group_invite = function;
684 m->group_invite_userdata = userdata;
685}
686
687/* Set the callback for group messages.
688 *
689 * Function(Messenger *m, int groupnumber, uint8_t * message, uint16_t length, void *userdata)
690 */
691void m_callback_group_message(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void *),
692 void *userdata)
693{
694 m->group_message = function;
695 m->group_message_userdata = userdata;
696}
697static void group_message_function(Group_Chat *chat, int peer_number, uint8_t *message, uint16_t length, void *userdata)
698{
699 Messenger *m = userdata;
700 uint32_t i;
701
702 for (i = 0; i < m->numchats; ++i) { //TODO: remove this
703 if (m->chats[i] == chat)
704 break;
705 }
706
707 if (m->group_message)
708 (*m->group_message)(m, i, message, length, m->group_invite_userdata);
709}
710
677/* Creates a new groupchat and puts it in the chats array. 711/* Creates a new groupchat and puts it in the chats array.
678 * 712 *
679 * return group number on success. 713 * return group number on success.
@@ -690,6 +724,7 @@ int add_groupchat(Messenger *m)
690 if (newchat == NULL) 724 if (newchat == NULL)
691 return -1; 725 return -1;
692 726
727 callback_groupmessage(newchat, &group_message_function, m);
693 m->chats[i] = newchat; 728 m->chats[i] = newchat;
694 return i; 729 return i;
695 } 730 }
@@ -706,6 +741,8 @@ int add_groupchat(Messenger *m)
706 if (temp[m->numchats] == NULL) 741 if (temp[m->numchats] == NULL)
707 return -1; 742 return -1;
708 743
744 m->chats = temp;
745 callback_groupmessage(temp[m->numchats], &group_message_function, m);
709 ++m->numchats; 746 ++m->numchats;
710 return (m->numchats - 1); 747 return (m->numchats - 1);
711} 748}
@@ -715,7 +752,7 @@ int add_groupchat(Messenger *m)
715 * return 0 on success. 752 * return 0 on success.
716 * return -1 if failure. 753 * return -1 if failure.
717 */ 754 */
718static int del_groupchat(Messenger *m, int groupnumber) 755int del_groupchat(Messenger *m, int groupnumber)
719{ 756{
720 if ((unsigned int)groupnumber >= m->numchats) 757 if ((unsigned int)groupnumber >= m->numchats)
721 return -1; 758 return -1;
@@ -749,9 +786,42 @@ static int del_groupchat(Messenger *m, int groupnumber)
749 return 0; 786 return 0;
750} 787}
751 788
789/* return 1 if that friend was invited to the group
790 * return 0 if the friend was not or error.
791 */
792static uint8_t group_invited(Messenger *m, int friendnumber, int groupnumber)
793{
794 //TODO: this function;
795 return 1;
796}
797
798/* invite friendnumber to groupnumber
799 * return 0 on success
800 * return -1 on failure
801 */
802int invite_friend(Messenger *m, int friendnumber, int groupnumber)
803{
804 if (friend_not_valid(m, friendnumber) || (unsigned int)groupnumber >= m->numchats)
805 return -1;
806
807 if (m->chats == NULL)
808 return -1;
809
810 if (m->friendlist[friendnumber].status == NOFRIEND || m->chats[groupnumber] == NULL)
811 return -1;
812
813 //TODO: store invited friends.
814 if (write_cryptpacket_id(m, friendnumber, PACKET_ID_INVITE_GROUPCHAT, m->chats[groupnumber]->self_public_key,
815 crypto_box_PUBLICKEYBYTES) == 0)
816 return -1;
817
818 return 0;
819}
820
821
752/* Join a group (you need to have been invited first.) 822/* Join a group (you need to have been invited first.)
753 * 823 *
754 * returns 0 on success 824 * returns group number on success
755 * returns -1 on failure. 825 * returns -1 on failure.
756 */ 826 */
757int join_groupchat(Messenger *m, int friendnumber, uint8_t *friend_group_public_key) 827int join_groupchat(Messenger *m, int friendnumber, uint8_t *friend_group_public_key)
@@ -771,12 +841,34 @@ int join_groupchat(Messenger *m, int friendnumber, uint8_t *friend_group_public_
771 if (write_cryptpacket_id(m, friendnumber, PACKET_ID_JOIN_GROUPCHAT, data, sizeof(data))) { 841 if (write_cryptpacket_id(m, friendnumber, PACKET_ID_JOIN_GROUPCHAT, data, sizeof(data))) {
772 chat_bootstrap_nonlazy(m->chats[groupnum], get_friend_ipport(m, friendnumber), 842 chat_bootstrap_nonlazy(m->chats[groupnum], get_friend_ipport(m, friendnumber),
773 friend_group_public_key); //TODO: check if ip returned is zero? 843 friend_group_public_key); //TODO: check if ip returned is zero?
774 return 0; 844 return groupnum;
775 } 845 }
776 846
777 return -1; 847 return -1;
778} 848}
779 849
850/* send a group message
851 * return 0 on success
852 * return -1 on failure
853 */
854
855int group_message_send(Messenger *m, int groupnumber, uint8_t *message, uint32_t length)
856{
857 if ((unsigned int)groupnumber >= m->numchats)
858 return -1;
859
860 if (m->chats == NULL)
861 return -1;
862
863 if (m->chats[groupnumber] == NULL)
864 return -1;
865
866 if (group_sendmessage(m->chats[groupnumber], message, length) > 0)
867 return 0;
868
869 return -1;
870}
871
780static int handle_group(void *object, IP_Port source, uint8_t *packet, uint32_t length) 872static int handle_group(void *object, IP_Port source, uint8_t *packet, uint32_t length)
781{ 873{
782 Messenger *m = object; 874 Messenger *m = object;
@@ -810,9 +902,6 @@ static void do_allgroupchats(Messenger *m)
810 902
811/*********************************/ 903/*********************************/
812 904
813/* Interval in seconds between LAN discovery packet sending. */
814#define LAN_DISCOVERY_INTERVAL 60
815
816/* Send a LAN discovery packet every LAN_DISCOVERY_INTERVAL seconds. */ 905/* Send a LAN discovery packet every LAN_DISCOVERY_INTERVAL seconds. */
817static void LANdiscovery(Messenger *m) 906static void LANdiscovery(Messenger *m)
818{ 907{
@@ -1065,6 +1154,29 @@ void doFriends(Messenger *m)
1065 1154
1066 break; 1155 break;
1067 } 1156 }
1157
1158 case PACKET_ID_INVITE_GROUPCHAT: {
1159 if (data_length != crypto_box_PUBLICKEYBYTES)
1160 break;
1161
1162 if (m->group_invite)
1163 (*m->group_invite)(m, i, data, m->group_invite_userdata);
1164 }
1165
1166 case PACKET_ID_JOIN_GROUPCHAT: {
1167 if (data_length != crypto_box_PUBLICKEYBYTES * 2)
1168 break;
1169
1170 int groupnum = group_num(m, data);
1171
1172 if (groupnum == -1)
1173 break;
1174
1175 if (!group_invited(m, i, groupnum))
1176 break;
1177
1178 group_newpeer(m->chats[groupnum], data + crypto_box_PUBLICKEYBYTES);
1179 }
1068 } 1180 }
1069 } else { 1181 } else {
1070 if (is_cryptoconnected(m->net_crypto, 1182 if (is_cryptoconnected(m->net_crypto,
diff --git a/toxcore/Messenger.h b/toxcore/Messenger.h
index b7032bbd..bfcc69df 100644
--- a/toxcore/Messenger.h
+++ b/toxcore/Messenger.h
@@ -157,7 +157,10 @@ typedef struct Messenger {
157 void *friend_statuschange_userdata; 157 void *friend_statuschange_userdata;
158 void (*friend_connectionstatuschange)(struct Messenger *m, int, uint8_t, void *); 158 void (*friend_connectionstatuschange)(struct Messenger *m, int, uint8_t, void *);
159 void *friend_connectionstatuschange_userdata; 159 void *friend_connectionstatuschange_userdata;
160 160 void (*group_invite)(struct Messenger *m, int, uint8_t *, void *);
161 void *group_invite_userdata;
162 void (*group_message)(struct Messenger *m, int, uint8_t *, uint16_t, void *);
163 void *group_message_userdata;
161 164
162} Messenger; 165} Messenger;
163 166
@@ -369,6 +372,57 @@ void m_callback_read_receipt(Messenger *m, void (*function)(Messenger *m, int, u
369 */ 372 */
370void m_callback_connectionstatus(Messenger *m, void (*function)(Messenger *m, int, uint8_t, void *), void *userdata); 373void m_callback_connectionstatus(Messenger *m, void (*function)(Messenger *m, int, uint8_t, void *), void *userdata);
371 374
375/**********GROUP CHATS************/
376
377/* Set the callback for group invites.
378 *
379 * Function(Messenger *m, int friendnumber, uint8_t *group_public_key, void *userdata)
380 */
381void m_callback_group_invite(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, void *), void *userdata);
382
383/* Set the callback for group messages.
384 *
385 * Function(Messenger *m, int groupnumber, uint8_t * message, uint16_t length, void *userdata)
386 */
387void m_callback_group_message(Messenger *m, void (*function)(Messenger *m, int, uint8_t *, uint16_t, void *),
388 void *userdata);
389
390/* Creates a new groupchat and puts it in the chats array.
391 *
392 * return group number on success.
393 * return -1 on failure.
394 */
395int add_groupchat(Messenger *m);
396
397/* Delete a groupchat from the chats array.
398 *
399 * return 0 on success.
400 * return -1 if failure.
401 */
402int del_groupchat(Messenger *m, int groupnumber);
403
404/* invite friendnumber to groupnumber
405 * return 0 on success
406 * return -1 on failure
407 */
408int invite_friend(Messenger *m, int friendnumber, int groupnumber);
409
410/* Join a group (you need to have been invited first.)
411 *
412 * returns group number on success
413 * returns -1 on failure.
414 */
415int join_groupchat(Messenger *m, int friendnumber, uint8_t *friend_group_public_key);
416
417/* send a group message
418 * return 0 on success
419 * return -1 on failure
420 */
421
422int group_message_send(Messenger *m, int groupnumber, uint8_t *message, uint32_t length);
423
424/*********************************/
425
372/* Run this at startup. 426/* Run this at startup.
373 * return allocated instance of Messenger on success. 427 * return allocated instance of Messenger on success.
374 * return 0 if there are problems. 428 * return 0 if there are problems.
diff --git a/toxcore/group_chats.h b/toxcore/group_chats.h
index 535b46db..78a5488c 100644
--- a/toxcore/group_chats.h
+++ b/toxcore/group_chats.h
@@ -77,6 +77,7 @@ void callback_groupmessage(Group_Chat *chat, void (*function)(Group_Chat *chat,
77/* 77/*
78 * Send a message to the group. 78 * Send a message to the group.
79 * 79 *
80 * returns the number of peers it has sent it to.
80 */ 81 */
81uint32_t group_sendmessage(Group_Chat *chat, uint8_t *message, uint32_t length); 82uint32_t group_sendmessage(Group_Chat *chat, uint8_t *message, uint32_t length);
82 83
diff --git a/toxcore/tox.c b/toxcore/tox.c
index 3eb80d22..68b1e6e9 100644
--- a/toxcore/tox.c
+++ b/toxcore/tox.c
@@ -366,6 +366,81 @@ void tox_callback_connectionstatus(void *tox, void (*function)(Messenger *tox, i
366 m_callback_connectionstatus(m, function, userdata); 366 m_callback_connectionstatus(m, function, userdata);
367} 367}
368 368
369/**********GROUP CHAT FUNCTIONS: WARNING WILL BREAK A LOT************/
370
371/* Set the callback for group invites.
372 *
373 * Function(Tox *tox, int friendnumber, uint8_t *group_public_key, void *userdata)
374 */
375void tox_callback_group_invite(void *tox, void (*function)(Messenger *tox, int, uint8_t *, void *), void *userdata)
376{
377 Messenger *m = tox;
378 m_callback_group_invite(m, function, userdata);
379}
380/* Set the callback for group messages.
381 *
382 * Function(Tox *tox, int groupnumber, uint8_t * message, uint16_t length, void *userdata)
383 */
384void tox_callback_group_message(void *tox, void (*function)(Messenger *tox, int, uint8_t *, uint16_t, void *),
385 void *userdata)
386{
387 Messenger *m = tox;
388 m_callback_group_message(m, function, userdata);
389}
390/* Creates a new groupchat and puts it in the chats array.
391 *
392 * return group number on success.
393 * return -1 on failure.
394 */
395int tox_add_groupchat(void *tox)
396{
397 Messenger *m = tox;
398 return add_groupchat(m);
399}
400/* Delete a groupchat from the chats array.
401 *
402 * return 0 on success.
403 * return -1 if failure.
404 */
405int tox_del_groupchat(void *tox, int groupnumber)
406{
407 Messenger *m = tox;
408 return del_groupchat(m, groupnumber);
409}
410/* invite friendnumber to groupnumber
411 * return 0 on success
412 * return -1 on failure
413 */
414int tox_invite_friend(void *tox, int friendnumber, int groupnumber)
415{
416 Messenger *m = tox;
417 return invite_friend(m, friendnumber, groupnumber);
418}
419/* Join a group (you need to have been invited first.)
420 *
421 * returns group number on success
422 * returns -1 on failure.
423 */
424int tox_join_groupchat(void *tox, int friendnumber, uint8_t *friend_group_public_key)
425{
426 Messenger *m = tox;
427 return join_groupchat(m, friendnumber, friend_group_public_key);
428}
429
430/* send a group message
431 * return 0 on success
432 * return -1 on failure
433 */
434int tox_group_message_send(void *tox, int groupnumber, uint8_t *message, uint32_t length)
435{
436 Messenger *m = tox;
437 return group_message_send(m, groupnumber, message, length);
438}
439
440
441
442/******************END OF GROUP CHAT FUNCTIONS************************/
443
369/* Use these functions to bootstrap the client. 444/* Use these functions to bootstrap the client.
370 * Sends a get nodes request to the given node with ip port and public_key. 445 * Sends a get nodes request to the given node with ip port and public_key.
371 */ 446 */
diff --git a/toxcore/tox.h b/toxcore/tox.h
index 4c597250..c52a644f 100644
--- a/toxcore/tox.h
+++ b/toxcore/tox.h
@@ -342,6 +342,59 @@ void tox_callback_read_receipt(Tox *tox, void (*function)(Tox *tox, int, uint32_
342 */ 342 */
343void tox_callback_connectionstatus(Tox *tox, void (*function)(Tox *tox, int, uint8_t, void *), void *userdata); 343void tox_callback_connectionstatus(Tox *tox, void (*function)(Tox *tox, int, uint8_t, void *), void *userdata);
344 344
345/**********GROUP CHAT FUNCTIONS: WARNING WILL BREAK A LOT************/
346
347/* Set the callback for group invites.
348 *
349 * Function(Tox *tox, int friendnumber, uint8_t *group_public_key, void *userdata)
350 */
351void tox_callback_group_invite(Tox *tox, void (*function)(Tox *tox, int, uint8_t *, void *), void *userdata);
352
353/* Set the callback for group messages.
354 *
355 * Function(Tox *tox, int groupnumber, uint8_t * message, uint16_t length, void *userdata)
356 */
357void tox_callback_group_message(Tox *tox, void (*function)(Tox *tox, int, uint8_t *, uint16_t, void *),
358 void *userdata);
359
360/* Creates a new groupchat and puts it in the chats array.
361 *
362 * return group number on success.
363 * return -1 on failure.
364 */
365int tox_add_groupchat(Tox *tox);
366
367/* Delete a groupchat from the chats array.
368 *
369 * return 0 on success.
370 * return -1 if failure.
371 */
372int tox_del_groupchat(Tox *tox, int groupnumber);
373
374/* invite friendnumber to groupnumber
375 * return 0 on success
376 * return -1 on failure
377 */
378int tox_invite_friend(Tox *tox, int friendnumber, int groupnumber);
379
380/* Join a group (you need to have been invited first.)
381 *
382 * returns group number on success
383 * returns -1 on failure.
384 */
385int tox_join_groupchat(Tox *tox, int friendnumber, uint8_t *friend_group_public_key);
386
387
388/* send a group message
389 * return 0 on success
390 * return -1 on failure
391 */
392int tox_group_message_send(Tox *tox, int groupnumber, uint8_t *message, uint32_t length);
393
394
395
396/******************END OF GROUP CHAT FUNCTIONS************************/
397
345/* 398/*
346 * Use these two functions to bootstrap the client. 399 * Use these two functions to bootstrap the client.
347 */ 400 */