Added name packet to group chats, send one when appropriate.

This commit is contained in:
irungentoo 2014-10-03 12:25:29 -04:00
parent 26d119a17b
commit 2977261ef1
No known key found for this signature in database
GPG Key ID: 10349DC9BED89E98
3 changed files with 86 additions and 2 deletions

View File

@ -454,6 +454,30 @@ static int delpeer(Group_Chats *g_c, int groupnumber, int peer_index)
return 0;
}
static int setnick(Group_Chats *g_c, int groupnumber, int peer_index, const uint8_t *nick, uint16_t nick_len)
{
if (nick_len > MAX_NAME_LENGTH || nick_len == 0)
return -1;
Group_c *g = get_group_c(g_c, groupnumber);
if (!g)
return -1;
/* same name as already stored? */
if (g->group[peer_index].nick_len == nick_len)
if (!memcmp(g->group[peer_index].nick, nick, nick_len))
return 0;
memcpy(g->group[peer_index].nick, nick, nick_len);
g->group[peer_index].nick_len = nick_len;
if (g_c->peer_namelistchange)
g_c->peer_namelistchange(g_c->m, groupnumber, peer_index, CHAT_CHANGE_PEER_NAME, g_c->group_namelistchange_userdata);
return 0;
}
static int remove_close_conn(Group_Chats *g_c, int groupnumber, int friendcon_id)
{
Group_c *g = get_group_c(g_c, groupnumber);
@ -583,7 +607,14 @@ int add_groupchat(Group_Chats *g_c)
new_symmetric_key(g->identifier);
g->peer_number = 0; /* Founder is peer 0. */
memcpy(g->real_pk, g_c->m->net_crypto->self_public_key, crypto_box_PUBLICKEYBYTES);
addpeer(g_c, groupnumber, g->real_pk, g_c->m->dht->self_public_key, 0);
int peer_index = addpeer(g_c, groupnumber, g->real_pk, g_c->m->dht->self_public_key, 0);
if (peer_index == -1) {
return -1;
}
setnick(g_c, groupnumber, peer_index, g_c->m->name, g_c->m->name_length);
return groupnumber;
}
@ -852,6 +883,24 @@ int group_kill_peer_send(const Group_Chats *g_c, int groupnumber, uint16_t peer_
}
}
#define GROUP_MESSAGE_NAME_ID 48
/* send a name message
* return 0 on success
* return -1 on failure
*/
static int group_name_send(const Group_Chats *g_c, int groupnumber, const uint8_t *nick, uint16_t nick_len)
{
if (nick_len > MAX_NAME_LENGTH)
return -1;
if (send_message_group(g_c, groupnumber, GROUP_MESSAGE_NAME_ID, nick, nick_len)) {
return 0;
} else {
return -1;
}
}
static void handle_friend_invite_packet(Messenger *m, int32_t friendnumber, const uint8_t *data, uint16_t length)
{
Group_Chats *g_c = m->group_chat_object;
@ -1066,6 +1115,7 @@ static int handle_send_peers(Group_Chats *g_c, int groupnumber, const uint8_t *d
&& memcmp(d, g_c->m->net_crypto->self_public_key, crypto_box_PUBLICKEYBYTES) == 0) {
g->peer_number = peer_num;
g->status = GROUPCHAT_STATUS_CONNECTED;
group_name_send(g_c, groupnumber, g_c->m->name, g_c->m->name_length);
}
d += crypto_box_PUBLICKEYBYTES * 2;
@ -1264,6 +1314,12 @@ static void handle_message_packet_group(Group_Chats *g_c, int groupnumber, const
}
break;
case GROUP_MESSAGE_NAME_ID: {
if (setnick(g_c, groupnumber, index, msg_data, msg_data_len) == -1)
return;
}
break;
case PACKET_ID_MESSAGE: {
if (msg_data_len == 0)
return;
@ -1367,6 +1423,24 @@ static int groupchat_clear_timedout(Group_Chats *g_c, int groupnumber)
return 0;
}
/* Send current name (set in messenger) to all online groups.
*/
void send_name_all_groups(Group_Chats *g_c)
{
unsigned int i;
for (i = 0; i < g_c->num_chats; ++i) {
Group_c *g = get_group_c(g_c, i);
if (!g)
continue;
if (g->status == GROUPCHAT_STATUS_CONNECTED) {
group_name_send(g_c, i, g_c->m->name, g_c->m->name_length);
}
}
}
/* Create new groupchat instance. */
Group_Chats *new_groupchats(Messenger *m)
{

View File

@ -208,6 +208,10 @@ int group_number_peers(const Group_Chats *g_c, int groupnumber);
int group_names(const Group_Chats *g_c, int groupnumber, uint8_t names[][MAX_NAME_LENGTH], uint16_t lengths[],
uint16_t length);
/* Send current name (set in messenger) to all online groups.
*/
void send_name_all_groups(Group_Chats *g_c);
/* Create new groupchat instance. */
Group_Chats *new_groupchats(Messenger *m);

View File

@ -168,7 +168,13 @@ uint32_t tox_send_action(Tox *tox, int32_t friendnumber, const uint8_t *action,
int tox_set_name(Tox *tox, const uint8_t *name, uint16_t length)
{
Messenger *m = tox;
return setname(m, name, length);
if (setname(m, name, length) == 0) {
send_name_all_groups(m->group_chat_object);
return 0;
} else {
return -1;
}
}
/* Get your nickname.