Skip to content

Expose offline conference peers in API #1266

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 5, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions toxav/groupav.c
Original file line number Diff line number Diff line change
Expand Up @@ -473,7 +473,7 @@ int add_av_groupchat(const Logger *log, Tox *tox, Group_Chats *g_c, audio_data_c
}

if (groupchat_enable_av(log, tox, g_c, groupnumber, audio_callback, userdata) == -1) {
del_groupchat(g_c, groupnumber);
del_groupchat(g_c, groupnumber, true);
return -1;
}

Expand All @@ -495,7 +495,7 @@ int join_av_groupchat(const Logger *log, Tox *tox, Group_Chats *g_c, uint32_t fr
}

if (groupchat_enable_av(log, tox, g_c, groupnumber, audio_callback, userdata) == -1) {
del_groupchat(g_c, groupnumber);
del_groupchat(g_c, groupnumber, true);
return -1;
}

Expand Down
116 changes: 83 additions & 33 deletions toxcore/group.c
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,7 @@ typedef enum Groupchat_Closest {

static int add_to_closest(Group_Chats *g_c, uint32_t groupnumber, const uint8_t *real_pk, const uint8_t *temp_pk)
{
// TODO(zugz): this can be const. Similarly throughout the file.
Group_c *g = get_group_c(g_c, groupnumber);

if (!g) {
Expand Down Expand Up @@ -1033,19 +1034,26 @@ int add_groupchat(Group_Chats *g_c, uint8_t type)
return groupnumber;
}

/* Delete a groupchat from the chats array.
static int group_leave(const Group_Chats *g_c, uint32_t groupnumber);

/* Delete a groupchat from the chats array, informing the group first as
* appropriate.
*
* return 0 on success.
* return -1 if groupnumber is invalid.
*/
int del_groupchat(Group_Chats *g_c, uint32_t groupnumber)
int del_groupchat(Group_Chats *g_c, uint32_t groupnumber, bool leave_permanently)
{
Group_c *g = get_group_c(g_c, groupnumber);

if (!g) {
return -1;
}

if (leave_permanently) {
group_leave(g_c, groupnumber);
}

for (uint32_t i = 0; i < MAX_GROUP_CONNECTIONS; ++i) {
if (g->close[i].type == GROUPCHAT_CLOSE_NONE) {
continue;
Expand All @@ -1071,82 +1079,115 @@ int del_groupchat(Group_Chats *g_c, uint32_t groupnumber)
return wipe_group_chat(g_c, groupnumber);
}

/* Copy the public key of peernumber who is in groupnumber to pk.
* pk must be CRYPTO_PUBLIC_KEY_SIZE long.
/* Copy the public key of (frozen, if frozen is true) peernumber who is in
* groupnumber to pk. pk must be CRYPTO_PUBLIC_KEY_SIZE long.
*
* return 0 on success
* return -1 if groupnumber is invalid.
* return -2 if peernumber is invalid.
*/
int group_peer_pubkey(const Group_Chats *g_c, uint32_t groupnumber, int peernumber, uint8_t *pk)
int group_peer_pubkey(const Group_Chats *g_c, uint32_t groupnumber, int peernumber, uint8_t *pk, bool frozen)
{
Group_c *g = get_group_c(g_c, groupnumber);

if (!g) {
return -1;
}

if ((uint32_t)peernumber >= g->numpeers) {
const Group_Peer *list = frozen ? g->frozen : g->group;
const uint32_t num = frozen ? g->numfrozen : g->numpeers;

if ((uint32_t)peernumber >= num) {
return -2;
}

memcpy(pk, g->group[peernumber].real_pk, CRYPTO_PUBLIC_KEY_SIZE);
memcpy(pk, list[peernumber].real_pk, CRYPTO_PUBLIC_KEY_SIZE);
return 0;
}

/*
* Return the size of peernumber's name.
* Return the size of (frozen, if frozen is true) peernumber's name.
*
* return -1 if groupnumber is invalid.
* return -2 if peernumber is invalid.
*/
int group_peername_size(const Group_Chats *g_c, uint32_t groupnumber, int peernumber)
int group_peername_size(const Group_Chats *g_c, uint32_t groupnumber, int peernumber, bool frozen)
{
Group_c *g = get_group_c(g_c, groupnumber);

if (!g) {
return -1;
}

if ((uint32_t)peernumber >= g->numpeers) {
const Group_Peer *list = frozen ? g->frozen : g->group;
const uint32_t num = frozen ? g->numfrozen : g->numpeers;

if ((uint32_t)peernumber >= num) {
return -2;
}

if (g->group[peernumber].nick_len == 0) {
if (list[peernumber].nick_len == 0) {
return 0;
}

return g->group[peernumber].nick_len;
return list[peernumber].nick_len;
}

/* Copy the name of peernumber who is in groupnumber to name.
* name must be at least MAX_NAME_LENGTH long.
/* Copy the name of (frozen, if frozen is true) peernumber who is in
* groupnumber to name. name must be at least MAX_NAME_LENGTH long.
*
* return length of name if success
* return -1 if groupnumber is invalid.
* return -2 if peernumber is invalid.
*/
int group_peername(const Group_Chats *g_c, uint32_t groupnumber, int peernumber, uint8_t *name)
int group_peername(const Group_Chats *g_c, uint32_t groupnumber, int peernumber, uint8_t *name, bool frozen)
{
Group_c *g = get_group_c(g_c, groupnumber);

if (!g) {
return -1;
}

if ((uint32_t)peernumber >= g->numpeers) {
const Group_Peer *list = frozen ? g->frozen : g->group;
const uint32_t num = frozen ? g->numfrozen : g->numpeers;

if ((uint32_t)peernumber >= num) {
return -2;
}

if (g->group[peernumber].nick_len == 0) {
if (list[peernumber].nick_len == 0) {
return 0;
}

memcpy(name, g->group[peernumber].nick, g->group[peernumber].nick_len);
return g->group[peernumber].nick_len;
memcpy(name, list[peernumber].nick, list[peernumber].nick_len);
return list[peernumber].nick_len;
}

/* List all the peers in the group chat.
/* Copy last active timestamp of frozennumber who is in groupnumber to
* last_active.
*
* return 0 on success.
* return -1 if groupnumber is invalid.
* return -2 if frozennumber is invalid.
*/
int group_frozen_last_active(const Group_Chats *g_c, uint32_t groupnumber, int peernumber,
uint64_t *last_active)
{
Group_c *g = get_group_c(g_c, groupnumber);

if (!g) {
return -1;
}

if ((uint32_t)peernumber >= g->numfrozen) {
return -2;
}

*last_active = g->frozen[peernumber].last_active;
return 0;
}

/* List all the (frozen, if frozen is true) peers in the group chat.
*
* Copies the names of the peers to the name[length][MAX_NAME_LENGTH] array.
*
Expand All @@ -1157,35 +1198,38 @@ int group_peername(const Group_Chats *g_c, uint32_t groupnumber, int peernumber,
* return -1 on failure.
*/
int group_names(const Group_Chats *g_c, uint32_t groupnumber, uint8_t names[][MAX_NAME_LENGTH], uint16_t lengths[],
uint16_t length)
uint16_t length, bool frozen)
{
Group_c *g = get_group_c(g_c, groupnumber);

if (!g) {
return -1;
}

const uint32_t num = frozen ? g->numfrozen : g->numpeers;

unsigned int i;

for (i = 0; i < g->numpeers && i < length; ++i) {
lengths[i] = group_peername(g_c, groupnumber, i, names[i]);
for (i = 0; i < num && i < length; ++i) {
lengths[i] = group_peername(g_c, groupnumber, i, names[i], frozen);
}

return i;
}

/* Return the number of peers in the group chat on success.
/* Return the number of (frozen, if frozen is true) peers in the group chat on
* success.
* return -1 if groupnumber is invalid.
*/
int group_number_peers(const Group_Chats *g_c, uint32_t groupnumber)
int group_number_peers(const Group_Chats *g_c, uint32_t groupnumber, bool frozen)
{
Group_c *g = get_group_c(g_c, groupnumber);

if (!g) {
return -1;
}

return g->numpeers;
return frozen ? g->numfrozen : g->numpeers;
}

/* return 1 if the peernumber corresponds to ours.
Expand Down Expand Up @@ -1597,18 +1641,18 @@ static int group_name_send(const Group_Chats *g_c, uint32_t groupnumber, const u
}

/* send message to announce leaving group
* return true on success
* return false on failure
* return 0 on success
* return -1 on failure
*/
bool group_leave(const Group_Chats *g_c, uint32_t groupnumber)
static int group_leave(const Group_Chats *g_c, uint32_t groupnumber)
{
Group_c *g = get_group_c(g_c, groupnumber);

if (!g) {
return false;
return -1;
}

return group_kill_peer_send(g_c, groupnumber, g->peer_number) == 0;
return group_kill_peer_send(g_c, groupnumber, g->peer_number);
}


Expand Down Expand Up @@ -2900,7 +2944,7 @@ void send_name_all_groups(Group_Chats *g_c)
}
}

#define SAVED_PEER_SIZE_CONSTANT (2 * CRYPTO_PUBLIC_KEY_SIZE + 2 + 1)
#define SAVED_PEER_SIZE_CONSTANT (2 * CRYPTO_PUBLIC_KEY_SIZE + sizeof(uint16_t) + sizeof(uint64_t) + 1)

static uint32_t saved_peer_size(const Group_Peer *peer)
{
Expand All @@ -2918,6 +2962,9 @@ static uint8_t *save_peer(const Group_Peer *peer, uint8_t *data)
host_to_lendian_bytes16(data, peer->peer_number);
data += sizeof(uint16_t);

host_to_lendian_bytes64(data, peer->last_active);
data += sizeof(uint64_t);

*data = peer->nick_len;
++data;

Expand Down Expand Up @@ -3098,6 +3145,9 @@ static State_Load_Status load_conferences(Group_Chats *g_c, const uint8_t *data,
lendian_bytes_to_host16(&peer->peer_number, data);
data += sizeof(uint16_t);

lendian_bytes_to_host64(&peer->last_active, data);
data += sizeof(uint64_t);

peer->nick_len = *data;
++data;

Expand Down Expand Up @@ -3189,7 +3239,7 @@ void do_groupchats(Group_Chats *g_c, void *userdata)
void kill_groupchats(Group_Chats *g_c)
{
for (uint16_t i = 0; i < g_c->num_chats; ++i) {
del_groupchat(g_c, i);
del_groupchat(g_c, i, false);
}

m_callback_conference_invite(g_c->m, nullptr);
Expand Down
Loading