diff --git a/src/chat.c b/src/chat.c index 7776fc0..fbd6353 100644 --- a/src/chat.c +++ b/src/chat.c @@ -563,28 +563,36 @@ static void chat_onFileData(ToxWindow *self, Tox *m, int32_t num, uint8_t filenu Friends.list[num].file_receiver[filenum].bytes_recv += length; } -static void chat_onGroupInvite(ToxWindow *self, Tox *m, int32_t friendnumber, const char *group_pub_key) +static void chat_onGroupInvite(ToxWindow *self, Tox *m, int32_t friendnumber, const char *group_pub_key, uint16_t length) { if (self->num != friendnumber) return; + if (Friends.list[friendnumber].group_invite.key != NULL) + free(Friends.list[friendnumber].group_invite.key); + + char *k = malloc(length); + + if (k == NULL) + exit_toxic_err("Failed in chat_onGroupInvite", FATALERR_MEMORY); + + memcpy(k, group_pub_key, length); + Friends.list[friendnumber].group_invite.key = k; + Friends.list[friendnumber].group_invite.pending = true; + Friends.list[friendnumber].group_invite.length = length; + char name[TOX_MAX_NAME_LENGTH]; get_nick_truncate(m, name, friendnumber); - line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "%s has invited you to a group chat.", name); - line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Type \"/join\" to join the chat."); - - memcpy(Friends.list[friendnumber].groupchat_key, group_pub_key, - sizeof(Friends.list[friendnumber].groupchat_key)); - Friends.list[friendnumber].groupchat_pending = true; - - sound_notify(self, generic_message, NT_WNDALERT_2, NULL); - + if (self->active_box != -1) box_silent_notify2(self, NT_WNDALERT_2 | NT_NOFOCUS, self->active_box, "invites you to join group chat"); else box_silent_notify(self, NT_WNDALERT_2 | NT_NOFOCUS, &self->active_box, name, "invites you to join group chat"); + + line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "%s has invited you to a group chat.", name); + line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Type \"/join\" to join the chat."); } /* Av Stuff */ diff --git a/src/chat_commands.c b/src/chat_commands.c index 62d8b62..4f3f11f 100644 --- a/src/chat_commands.c +++ b/src/chat_commands.c @@ -123,14 +123,15 @@ void cmd_join_group(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*ar return; } - const char *groupkey = Friends.list[self->num].groupchat_key; + const char *groupkey = Friends.list[self->num].group_invite.key; + uint16_t length = Friends.list[self->num].group_invite.length; - if (!Friends.list[self->num].groupchat_pending) { + if (!Friends.list[self->num].group_invite.pending) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "No pending group chat invite."); return; } - int groupnum = tox_join_groupchat(m, self->num, (uint8_t *) groupkey); + int groupnum = tox_join_groupchat(m, self->num, (uint8_t *) groupkey, length); if (groupnum == -1) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Group chat instance failed to initialize."); diff --git a/src/friendlist.c b/src/friendlist.c index 2812887..04f422a 100644 --- a/src/friendlist.c +++ b/src/friendlist.c @@ -112,6 +112,13 @@ static void realloc_blocklist(int n) void kill_friendlist(void) { + int i; + + for (i = 0; i <= Friends.max_idx; ++i) { + if (Friends.list[i].group_invite.key != NULL) + free(Friends.list[i].group_invite.key); + } + realloc_blocklist(0); realloc_friends(0); } @@ -478,7 +485,7 @@ static void friendlist_onFileSendRequest(ToxWindow *self, Tox *m, int32_t num, u } } -static void friendlist_onGroupInvite(ToxWindow *self, Tox *m, int32_t num, const char *group_pub_key) +static void friendlist_onGroupInvite(ToxWindow *self, Tox *m, int32_t num, const char *group_pub_key, uint16_t length) { if (num >= Friends.max_idx) return; @@ -521,6 +528,9 @@ static void delete_friend(Tox *m, int32_t f_num) } } + if (Friends.list[f_num].group_invite.key != NULL) + free(Friends.list[f_num].group_invite.key); + tox_del_friend(m, f_num); memset(&Friends.list[f_num], 0, sizeof(ToxicFriend)); diff --git a/src/friendlist.h b/src/friendlist.h index 2bee240..3d0df12 100644 --- a/src/friendlist.h +++ b/src/friendlist.h @@ -48,13 +48,17 @@ struct LastOnline { char hour_min_str[TIME_STR_SIZE]; /* holds 12/24-hour time string e.g. "10:43 PM" */ }; +struct GroupChatInvite { + char *key; + uint16_t length; + bool pending; +}; + typedef struct { char name[TOXIC_MAX_NAME_LENGTH]; int namelength; char statusmsg[TOX_MAX_STATUSMESSAGE_LENGTH]; uint16_t statusmsg_len; - char groupchat_key[TOX_CLIENT_ID_SIZE]; - bool groupchat_pending; char pub_key[TOX_CLIENT_ID_SIZE]; int32_t num; int chatwin; @@ -65,6 +69,7 @@ typedef struct { uint8_t status; struct LastOnline last_online; struct FileReceiver file_receiver[MAX_FILES]; + struct GroupChatInvite group_invite; uint8_t active_file_receivers; } ToxicFriend; diff --git a/src/toxic.h b/src/toxic.h index 709a715..4b12214 100644 --- a/src/toxic.h +++ b/src/toxic.h @@ -101,7 +101,7 @@ void on_statusmessagechange(Tox *m, int32_t friendnumber, const uint8_t *string, void on_friendadded(Tox *m, int32_t friendnumber, bool sort); void on_groupmessage(Tox *m, int groupnumber, int peernumber, const uint8_t *message, uint16_t length, void *userdata); void on_groupaction(Tox *m, int groupnumber, int peernumber, const uint8_t *action, uint16_t length, void *userdata); -void on_groupinvite(Tox *m, int32_t friendnumber, const uint8_t *group_pub_key, void *userdata); +void on_groupinvite(Tox *m, int32_t friendnumber, const uint8_t *group_pub_key, uint16_t length, void *userdata); void on_group_namelistchange(Tox *m, int groupnumber, int peernumber, uint8_t change, void *userdata); void on_file_sendrequest(Tox *m, int32_t friendnumber, uint8_t filenumber, uint64_t filesize, const uint8_t *pathname, uint16_t pathname_length, void *userdata); diff --git a/src/windows.c b/src/windows.c index 85946a5..c981efa 100644 --- a/src/windows.c +++ b/src/windows.c @@ -164,13 +164,13 @@ void on_groupaction(Tox *m, int groupnumber, int peernumber, const uint8_t *acti } } -void on_groupinvite(Tox *m, int32_t friendnumber, const uint8_t *group_pub_key, void *userdata) +void on_groupinvite(Tox *m, int32_t friendnumber, const uint8_t *group_pub_key, uint16_t length, void *userdata) { int i; for (i = 0; i < MAX_WINDOWS_NUM; ++i) { if (windows[i].onGroupInvite != NULL) - windows[i].onGroupInvite(&windows[i], m, friendnumber, (const char *) group_pub_key); + windows[i].onGroupInvite(&windows[i], m, friendnumber, (const char *) group_pub_key, length); } } diff --git a/src/windows.h b/src/windows.h index 70d22f3..de63a80 100644 --- a/src/windows.h +++ b/src/windows.h @@ -115,7 +115,7 @@ struct ToxWindow { void(*onAction)(ToxWindow *, Tox *, int32_t, const char *, uint16_t); void(*onGroupMessage)(ToxWindow *, Tox *, int, int, const char *, uint16_t); void(*onGroupAction)(ToxWindow *, Tox *, int, int, const char *, uint16_t); - void(*onGroupInvite)(ToxWindow *, Tox *, int32_t, const char *); + void(*onGroupInvite)(ToxWindow *, Tox *, int32_t, const char *, uint16_t); void(*onGroupNamelistChange)(ToxWindow *, Tox *, int, int, uint8_t); void(*onFileSendRequest)(ToxWindow *, Tox *, int32_t, uint8_t, uint64_t, const char *, uint16_t); void(*onFileControl)(ToxWindow *, Tox *, int32_t, uint8_t, uint8_t, uint8_t, const char *, uint16_t);