summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorirungentoo <irungentoo@gmail.com>2014-11-10 17:57:47 -0500
committerirungentoo <irungentoo@gmail.com>2014-11-10 17:57:47 -0500
commit97742ed1e974dbda07f8749f53a63d96b88f345a (patch)
tree7986858f53aa6cf845e7dabdec36423b75bac54d
parent5715a94061a2f585dbeb2dc18764eea41e3290aa (diff)
Group chats now have types.
-rw-r--r--toxcore/group.c24
-rw-r--r--toxcore/group.h25
-rw-r--r--toxcore/tox.c10
-rw-r--r--toxcore/tox.h18
4 files changed, 55 insertions, 22 deletions
diff --git a/toxcore/group.c b/toxcore/group.c
index 5b5455c8..9793ddae 100644
--- a/toxcore/group.c
+++ b/toxcore/group.c
@@ -630,10 +630,12 @@ static int add_conn_to_groupchat(Group_Chats *g_c, int friendcon_id, int groupnu
630 630
631/* Creates a new groupchat and puts it in the chats array. 631/* Creates a new groupchat and puts it in the chats array.
632 * 632 *
633 * type is one of GROUPCHAT_TYPE_*
634 *
633 * return group number on success. 635 * return group number on success.
634 * return -1 on failure. 636 * return -1 on failure.
635 */ 637 */
636int add_groupchat(Group_Chats *g_c) 638int add_groupchat(Group_Chats *g_c, uint8_t type)
637{ 639{
638 int groupnumber = create_group_chat(g_c); 640 int groupnumber = create_group_chat(g_c);
639 641
@@ -644,7 +646,8 @@ int add_groupchat(Group_Chats *g_c)
644 646
645 g->status = GROUPCHAT_STATUS_CONNECTED; 647 g->status = GROUPCHAT_STATUS_CONNECTED;
646 g->number_joined = -1; 648 g->number_joined = -1;
647 new_symmetric_key(g->identifier); 649 new_symmetric_key(g->identifier + 1);
650 g->identifier[0] = type;
648 g->peer_number = 0; /* Founder is peer 0. */ 651 g->peer_number = 0; /* Founder is peer 0. */
649 memcpy(g->real_pk, g_c->m->net_crypto->self_public_key, crypto_box_PUBLICKEYBYTES); 652 memcpy(g->real_pk, g_c->m->net_crypto->self_public_key, crypto_box_PUBLICKEYBYTES);
650 int peer_index = addpeer(g_c, groupnumber, g->real_pk, g_c->m->dht->self_public_key, 0); 653 int peer_index = addpeer(g_c, groupnumber, g->real_pk, g_c->m->dht->self_public_key, 0);
@@ -846,14 +849,19 @@ static unsigned int send_peer_query(Group_Chats *g_c, int friendcon_id, uint16_t
846 849
847/* Join a group (you need to have been invited first.) 850/* Join a group (you need to have been invited first.)
848 * 851 *
852 * expected_type is the groupchat type we expect the chat we are joining is.
853 *
849 * returns group number on success 854 * returns group number on success
850 * returns -1 on failure. 855 * returns -1 on failure.
851 */ 856 */
852int join_groupchat(Group_Chats *g_c, int32_t friendnumber, const uint8_t *data, uint16_t length) 857int join_groupchat(Group_Chats *g_c, int32_t friendnumber, uint8_t expected_type, const uint8_t *data, uint16_t length)
853{ 858{
854 if (length != sizeof(uint16_t) + GROUP_IDENTIFIER_LENGTH) 859 if (length != sizeof(uint16_t) + GROUP_IDENTIFIER_LENGTH)
855 return -1; 860 return -1;
856 861
862 if (data[sizeof(uint16_t)] != expected_type)
863 return -1;
864
857 int friendcon_id = getfriendcon_id(g_c->m, friendnumber); 865 int friendcon_id = getfriendcon_id(g_c->m, friendnumber);
858 866
859 if (friendcon_id == -1) 867 if (friendcon_id == -1)
@@ -899,12 +907,12 @@ int join_groupchat(Group_Chats *g_c, int32_t friendnumber, const uint8_t *data,
899 907
900/* Set the callback for group invites. 908/* Set the callback for group invites.
901 * 909 *
902 * Function(Group_Chats *g_c, int32_t friendnumber, uint8_t *data, uint16_t length, void *userdata) 910 * Function(Group_Chats *g_c, int32_t friendnumber, uint8_t type, uint8_t *data, uint16_t length, void *userdata)
903 * 911 *
904 * data of length is what needs to be passed to join_groupchat(). 912 * data of length is what needs to be passed to join_groupchat().
905 */ 913 */
906void g_callback_group_invite(Group_Chats *g_c, void (*function)(Messenger *m, int32_t, const uint8_t *, uint16_t, 914void g_callback_group_invite(Group_Chats *g_c, void (*function)(Messenger *m, int32_t, uint8_t, const uint8_t *,
907 void *), void *userdata) 915 uint16_t, void *), void *userdata)
908{ 916{
909 g_c->invite_callback = function; 917 g_c->invite_callback = function;
910 g_c->invite_callback_userdata = userdata; 918 g_c->invite_callback_userdata = userdata;
@@ -1086,7 +1094,8 @@ static void handle_friend_invite_packet(Messenger *m, int32_t friendnumber, cons
1086 1094
1087 if (groupnumber == -1) { 1095 if (groupnumber == -1) {
1088 if (g_c->invite_callback) 1096 if (g_c->invite_callback)
1089 g_c->invite_callback(m, friendnumber, invite_data, invite_length, g_c->invite_callback_userdata); 1097 g_c->invite_callback(m, friendnumber, *(invite_data + sizeof(uint16_t)), invite_data, invite_length,
1098 g_c->invite_callback_userdata);
1090 1099
1091 return; 1100 return;
1092 } 1101 }
@@ -2002,6 +2011,7 @@ void kill_groupchats(Group_Chats *g_c)
2002 2011
2003 m_callback_group_invite(g_c->m, NULL); 2012 m_callback_group_invite(g_c->m, NULL);
2004 g_c->m->group_chat_object = 0; 2013 g_c->m->group_chat_object = 0;
2014 free(g_c->av_object);
2005 free(g_c); 2015 free(g_c);
2006} 2016}
2007 2017
diff --git a/toxcore/group.h b/toxcore/group.h
index 1a51f83b..a9e6e8e9 100644
--- a/toxcore/group.h
+++ b/toxcore/group.h
@@ -33,6 +33,11 @@ enum {
33 GROUPCHAT_STATUS_CONNECTED 33 GROUPCHAT_STATUS_CONNECTED
34}; 34};
35 35
36enum {
37 GROUPCHAT_TYPE_TEXT,
38 GROUPCHAT_TYPE_AV
39};
40
36#define MAX_LOSSY_COUNT 256 41#define MAX_LOSSY_COUNT 256
37 42
38typedef struct { 43typedef struct {
@@ -55,7 +60,7 @@ typedef struct {
55 60
56#define DESIRED_CLOSE_CONNECTIONS 4 61#define DESIRED_CLOSE_CONNECTIONS 4
57#define MAX_GROUP_CONNECTIONS 16 62#define MAX_GROUP_CONNECTIONS 16
58#define GROUP_IDENTIFIER_LENGTH crypto_box_KEYBYTES /* So we can use new_symmetric_key(...) to fill it */ 63#define GROUP_IDENTIFIER_LENGTH (1 + crypto_box_KEYBYTES) /* crypto_box_KEYBYTES so we can use new_symmetric_key(...) to fill it */
59 64
60enum { 65enum {
61 GROUPCHAT_CLOSE_NONE, 66 GROUPCHAT_CLOSE_NONE,
@@ -107,7 +112,7 @@ typedef struct {
107 Group_c *chats; 112 Group_c *chats;
108 uint32_t num_chats; 113 uint32_t num_chats;
109 114
110 void (*invite_callback)(Messenger *m, int32_t, const uint8_t *, uint16_t, void *); 115 void (*invite_callback)(Messenger *m, int32_t, uint8_t, const uint8_t *, uint16_t, void *);
111 void *invite_callback_userdata; 116 void *invite_callback_userdata;
112 void (*message_callback)(Messenger *m, int, int, const uint8_t *, uint16_t, void *); 117 void (*message_callback)(Messenger *m, int, int, const uint8_t *, uint16_t, void *);
113 void *message_callback_userdata; 118 void *message_callback_userdata;
@@ -119,16 +124,18 @@ typedef struct {
119 struct { 124 struct {
120 int (*function)(void *, int, int, void *, const uint8_t *, uint16_t); 125 int (*function)(void *, int, int, void *, const uint8_t *, uint16_t);
121 } lossy_packethandlers[256]; 126 } lossy_packethandlers[256];
127
128 void *av_object;
122} Group_Chats; 129} Group_Chats;
123 130
124/* Set the callback for group invites. 131/* Set the callback for group invites.
125 * 132 *
126 * Function(Group_Chats *g_c, int32_t friendnumber, uint8_t *data, uint16_t length, void *userdata) 133 * Function(Group_Chats *g_c, int32_t friendnumber, uint8_t type, uint8_t *data, uint16_t length, void *userdata)
127 * 134 *
128 * data of length is what needs to be passed to join_groupchat(). 135 * data of length is what needs to be passed to join_groupchat().
129 */ 136 */
130void g_callback_group_invite(Group_Chats *g_c, void (*function)(Messenger *m, int32_t, const uint8_t *, uint16_t, 137void g_callback_group_invite(Group_Chats *g_c, void (*function)(Messenger *m, int32_t, uint8_t, const uint8_t *,
131 void *), void *userdata); 138 uint16_t, void *), void *userdata);
132 139
133/* Set the callback for group messages. 140/* Set the callback for group messages.
134 * 141 *
@@ -159,10 +166,12 @@ void g_callback_group_namelistchange(Group_Chats *g_c, void (*function)(Messenge
159 166
160/* Creates a new groupchat and puts it in the chats array. 167/* Creates a new groupchat and puts it in the chats array.
161 * 168 *
169 * type is one of GROUPCHAT_TYPE_*
170 *
162 * return group number on success. 171 * return group number on success.
163 * return -1 on failure. 172 * return -1 on failure.
164 */ 173 */
165int add_groupchat(Group_Chats *g_c); 174int add_groupchat(Group_Chats *g_c, uint8_t type);
166 175
167/* Delete a groupchat from the chats array. 176/* Delete a groupchat from the chats array.
168 * 177 *
@@ -187,10 +196,12 @@ int invite_friend(Group_Chats *g_c, int32_t friendnumber, int groupnumber);
187 196
188/* Join a group (you need to have been invited first.) 197/* Join a group (you need to have been invited first.)
189 * 198 *
199 * expected_type is the groupchat type we expect the chat we are joining is.
200 *
190 * returns group number on success 201 * returns group number on success
191 * returns -1 on failure. 202 * returns -1 on failure.
192 */ 203 */
193int join_groupchat(Group_Chats *g_c, int32_t friendnumber, const uint8_t *data, uint16_t length); 204int join_groupchat(Group_Chats *g_c, int32_t friendnumber, uint8_t expected_type, const uint8_t *data, uint16_t length);
194 205
195/* send a group message 206/* send a group message
196 * return 0 on success 207 * return 0 on success
diff --git a/toxcore/tox.c b/toxcore/tox.c
index 9eef6157..9e9a5057 100644
--- a/toxcore/tox.c
+++ b/toxcore/tox.c
@@ -551,12 +551,12 @@ int tox_send_lossless_packet(const Tox *tox, int32_t friendnumber, const uint8_t
551 551
552/* Set the callback for group invites. 552/* Set the callback for group invites.
553 * 553 *
554 * Function(Tox *tox, int32_t friendnumber, uint8_t *data, uint16_t length, void *userdata) 554 * Function(Tox *tox, int32_t friendnumber, uint8_t type, uint8_t *data, uint16_t length, void *userdata)
555 * 555 *
556 * data of length is what needs to be passed to join_groupchat(). 556 * data of length is what needs to be passed to join_groupchat().
557 */ 557 */
558void tox_callback_group_invite(Tox *tox, void (*function)(Messenger *tox, int32_t, const uint8_t *, uint16_t, void *), 558void tox_callback_group_invite(Tox *tox, void (*function)(Messenger *tox, int32_t, uint8_t, const uint8_t *, uint16_t,
559 void *userdata) 559 void *), void *userdata)
560{ 560{
561 Messenger *m = tox; 561 Messenger *m = tox;
562 g_callback_group_invite(m->group_chat_object, function, userdata); 562 g_callback_group_invite(m->group_chat_object, function, userdata);
@@ -603,7 +603,7 @@ void tox_callback_group_namelist_change(Tox *tox, void (*function)(Tox *tox, int
603int tox_add_groupchat(Tox *tox) 603int tox_add_groupchat(Tox *tox)
604{ 604{
605 Messenger *m = tox; 605 Messenger *m = tox;
606 return add_groupchat(m->group_chat_object); 606 return add_groupchat(m->group_chat_object, GROUPCHAT_TYPE_TEXT);
607} 607}
608 608
609/* Delete a groupchat from the chats array. 609/* Delete a groupchat from the chats array.
@@ -648,7 +648,7 @@ int tox_invite_friend(Tox *tox, int32_t friendnumber, int groupnumber)
648int tox_join_groupchat(Tox *tox, int32_t friendnumber, const uint8_t *data, uint16_t length) 648int tox_join_groupchat(Tox *tox, int32_t friendnumber, const uint8_t *data, uint16_t length)
649{ 649{
650 Messenger *m = tox; 650 Messenger *m = tox;
651 return join_groupchat(m->group_chat_object, friendnumber, data, length); 651 return join_groupchat(m->group_chat_object, friendnumber, GROUPCHAT_TYPE_TEXT, data, length);
652} 652}
653 653
654/* send a group message 654/* send a group message
diff --git a/toxcore/tox.h b/toxcore/tox.h
index 84ba293a..4f93e608 100644
--- a/toxcore/tox.h
+++ b/toxcore/tox.h
@@ -417,14 +417,26 @@ int tox_send_lossless_packet(const Tox *tox, int32_t friendnumber, const uint8_t
417 417
418/**********GROUP CHAT FUNCTIONS: WARNING Group chats will be rewritten so this might change ************/ 418/**********GROUP CHAT FUNCTIONS: WARNING Group chats will be rewritten so this might change ************/
419 419
420/* Group chat types for tox_callback_group_invite function.
421 *
422 * TOX_GROUPCHAT_TYPE_TEXT groupchats must be accepted with the tox_join_groupchat() function.
423 * The function to accept TOX_GROUPCHAT_TYPE_AV is in toxav.
424 */
425enum {
426 TOX_GROUPCHAT_TYPE_TEXT,
427 TOX_GROUPCHAT_TYPE_AV
428};
429
420/* Set the callback for group invites. 430/* Set the callback for group invites.
421 * 431 *
422 * Function(Tox *tox, int32_t friendnumber, const uint8_t *data, uint16_t length, void *userdata) 432 * Function(Tox *tox, int32_t friendnumber, uint8_t type, uint8_t *data, uint16_t length, void *userdata)
423 * 433 *
424 * data of length is what needs to be passed to join_groupchat(). 434 * data of length is what needs to be passed to join_groupchat().
435 *
436 * for what type means see the enum right above this comment.
425 */ 437 */
426void tox_callback_group_invite(Tox *tox, void (*function)(Tox *tox, int32_t, const uint8_t *, uint16_t, void *), 438void tox_callback_group_invite(Tox *tox, void (*function)(Tox *tox, int32_t, uint8_t, const uint8_t *, uint16_t,
427 void *userdata); 439 void *), void *userdata);
428 440
429/* Set the callback for group messages. 441/* Set the callback for group messages.
430 * 442 *