From e85e9dbb999f1fccd2083224cc52eebe29915bfe Mon Sep 17 00:00:00 2001 From: "Coren[m]" Date: Sun, 24 Nov 2013 21:11:54 +0100 Subject: group_namelistchange(): for ui reasons, divulge the peernumber and the nature of the change (add, del, name change). tox.*, Messenger.*, group_chats.*: - expand interface of callback by peernumber/change groupchats.c: - call callback in addpeer/delpeer/setnick with peernumber and flag nTox.c: - print_groupchatpeers(): print as many names on a line as possible, not one peer per line - print_groupnamelistchange(): only print the change, if possible (i.e. "new peer", "peer's new name") - added command "/p" to print the list of peers --- toxcore/Messenger.c | 6 +++--- toxcore/Messenger.h | 4 ++-- toxcore/group_chats.c | 8 ++++---- toxcore/group_chats.h | 10 ++++++++-- toxcore/tox.c | 2 +- toxcore/tox.h | 9 +++++++-- 6 files changed, 25 insertions(+), 14 deletions(-) (limited to 'toxcore') diff --git a/toxcore/Messenger.c b/toxcore/Messenger.c index cc52c069..1a7fc230 100644 --- a/toxcore/Messenger.c +++ b/toxcore/Messenger.c @@ -785,7 +785,7 @@ void m_callback_group_message(Messenger *m, void (*function)(Messenger *m, int, * It gets called every time the name list changes(new peer/name, deleted peer) * Function(Tox *tox, int groupnumber, void *userdata) */ -void m_callback_group_namelistchange(Messenger *m, void (*function)(Messenger *m, int, void *), void *userdata) +void m_callback_group_namelistchange(Messenger *m, void (*function)(Messenger *m, int, int, uint8_t, void *), void *userdata) { m->group_namelistchange = function; m->group_namelistchange_userdata = userdata; @@ -812,7 +812,7 @@ static void group_message_function(Group_Chat *chat, int peer_number, uint8_t *m (*m->group_message)(m, i, peer_number, message, length, m->group_message_userdata); } -static void group_namelistchange_function(Group_Chat *chat, void *userdata) +static void group_namelistchange_function(Group_Chat *chat, int peer, uint8_t change, void *userdata) { Messenger *m = userdata; int i = get_chat_num(m, chat); @@ -820,7 +820,7 @@ static void group_namelistchange_function(Group_Chat *chat, void *userdata) return; if (m->group_namelistchange) - (*m->group_namelistchange)(m, i, m->group_namelistchange_userdata); + (*m->group_namelistchange)(m, i, peer, change, m->group_namelistchange_userdata); } diff --git a/toxcore/Messenger.h b/toxcore/Messenger.h index bf8a0572..6fc23db4 100644 --- a/toxcore/Messenger.h +++ b/toxcore/Messenger.h @@ -198,7 +198,7 @@ typedef struct Messenger { void *group_invite_userdata; void (*group_message)(struct Messenger *m, int, int, uint8_t *, uint16_t, void *); void *group_message_userdata; - void (*group_namelistchange)(struct Messenger *m, int, void *); + void (*group_namelistchange)(struct Messenger *m, int, int, uint8_t, void *); void *group_namelistchange_userdata; void (*file_sendrequest)(struct Messenger *m, int, uint8_t, uint64_t, uint8_t *, uint16_t, void *); @@ -462,7 +462,7 @@ void m_callback_group_message(Messenger *m, void (*function)(Messenger *m, int, * It gets called every time the name list changes(new peer/name, deleted peer) * Function(Tox *tox, int groupnumber, void *userdata) */ -void m_callback_group_namelistchange(Messenger *m, void (*function)(Messenger *m, int, void *), void *userdata); +void m_callback_group_namelistchange(Messenger *m, void (*function)(Messenger *m, int, int, uint8_t, void *), void *userdata); /* Creates a new groupchat and puts it in the chats array. * diff --git a/toxcore/group_chats.c b/toxcore/group_chats.c index 7e18a334..a20ec555 100644 --- a/toxcore/group_chats.c +++ b/toxcore/group_chats.c @@ -219,7 +219,7 @@ static int addpeer(Group_Chat *chat, uint8_t *client_id) ++chat->numpeers; if (chat->peer_namelistchange != NULL) - (*chat->peer_namelistchange)(chat, chat->group_namelistchange_userdata); + (*chat->peer_namelistchange)(chat, chat->numpeers - 1, CHAT_CHANGE_PEER_ADD, chat->group_namelistchange_userdata); return (chat->numpeers - 1); } @@ -255,7 +255,7 @@ static int delpeer(Group_Chat *chat, int peernum) chat->group = temp; if (chat->peer_namelistchange != NULL) - (*chat->peer_namelistchange)(chat, chat->group_namelistchange_userdata); + (*chat->peer_namelistchange)(chat, peernum, CHAT_CHANGE_PEER_DEL, chat->group_namelistchange_userdata); return 0; } @@ -291,7 +291,7 @@ static void setnick(Group_Chat *chat, int peernum, uint8_t *contents, uint16_t c chat->group[peernum].nick[contents_len - 1] = 0; chat->group[peernum].nick_len = contents_len; if (chat->peer_namelistchange != NULL) - (*chat->peer_namelistchange)(chat, chat->group_namelistchange_userdata); + (*chat->peer_namelistchange)(chat, peernum, CHAT_CHANGE_PEER_NAME, chat->group_namelistchange_userdata); } /* min time between pings sent to one peer in seconds */ @@ -625,7 +625,7 @@ void callback_groupmessage(Group_Chat *chat, void (*function)(Group_Chat *chat, chat->group_message_userdata = userdata; } -void callback_namelistchange(Group_Chat *chat, void (*function)(Group_Chat *chat, void *), void *userdata) +void callback_namelistchange(Group_Chat *chat, void (*function)(Group_Chat *chat, int peer, uint8_t change, void *), void *userdata) { chat->peer_namelistchange = function; chat->group_namelistchange_userdata = userdata; diff --git a/toxcore/group_chats.h b/toxcore/group_chats.h index 2235a6e3..65f573fb 100644 --- a/toxcore/group_chats.h +++ b/toxcore/group_chats.h @@ -65,7 +65,7 @@ typedef struct Group_Chat { uint32_t message_number; void (*group_message)(struct Group_Chat *m, int, uint8_t *, uint16_t, void *); void *group_message_userdata; - void (*peer_namelistchange)(struct Group_Chat *m, void *); + void (*peer_namelistchange)(struct Group_Chat *m, int peer, uint8_t change, void *); void *group_namelistchange_userdata; uint64_t last_sent_ping; @@ -105,7 +105,13 @@ void callback_groupmessage(Group_Chat *chat, void (*function)(Group_Chat *chat, * * format of function is: function(Group_Chat *chat, userdata) */ -void callback_namelistchange(Group_Chat *chat, void (*function)(Group_Chat *chat, void *), void *userdata); +typedef enum { + CHAT_CHANGE_PEER_ADD, + CHAT_CHANGE_PEER_DEL, + CHAT_CHANGE_PEER_NAME, +} CHAT_CHANGE; + +void callback_namelistchange(Group_Chat *chat, void (*function)(Group_Chat *chat, int peer, uint8_t change, void *), void *userdata); /* * Send a message to the group. diff --git a/toxcore/tox.c b/toxcore/tox.c index 4ba17e34..d5bc1c35 100644 --- a/toxcore/tox.c +++ b/toxcore/tox.c @@ -422,7 +422,7 @@ void tox_callback_group_message(Tox *tox, void (*function)(Messenger *tox, int, * Function(Tox *tox, int groupnumber, void *userdata) */ -void tox_callback_group_namelistchange(Tox *tox, void (*function)(Tox *tox, int, void *), void *userdata) +void tox_callback_group_namelistchange(Tox *tox, void (*function)(Tox *tox, int, int, uint8_t, void *), void *userdata) { Messenger *m = tox; m_callback_group_namelistchange(m, function, userdata); diff --git a/toxcore/tox.h b/toxcore/tox.h index fedc2c8a..08727d2a 100644 --- a/toxcore/tox.h +++ b/toxcore/tox.h @@ -366,10 +366,15 @@ void tox_callback_group_message(Tox *tox, void (*function)(Tox *tox, int, int, u /* Set callback function for peer name list changes. * * It gets called every time the name list changes(new peer/name, deleted peer) - * Function(Tox *tox, int groupnumber, void *userdata) + * Function(Tox *tox, int groupnumber, int peernumber, TOX_CHAT_CHANGE change, void *userdata) */ +typedef enum { + TOX_CHAT_CHANGE_PEER_ADD, + TOX_CHAT_CHANGE_PEER_DEL, + TOX_CHAT_CHANGE_PEER_NAME, +} TOX_CHAT_CHANGE; -void tox_callback_group_namelistchange(Tox *tox, void (*function)(Tox *tox, int, void *), void *userdata); +void tox_callback_group_namelistchange(Tox *tox, void (*function)(Tox *tox, int, int, uint8_t, void *), void *userdata); /* Creates a new groupchat and puts it in the chats array. * -- cgit v1.2.3 From 56079c92c3647299c74ffc0d1271fe1135a86b9d Mon Sep 17 00:00:00 2001 From: "Coren[m]" Date: Mon, 25 Nov 2013 19:01:13 +0100 Subject: Mimic more exactly what delpeer() does in the callback. If the deleted peer wasn't last, send a name-change update for the overwritten peer. --- toxcore/group_chats.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'toxcore') diff --git a/toxcore/group_chats.c b/toxcore/group_chats.c index a20ec555..8c3fe210 100644 --- a/toxcore/group_chats.c +++ b/toxcore/group_chats.c @@ -254,8 +254,12 @@ static int delpeer(Group_Chat *chat, int peernum) chat->group = temp; - if (chat->peer_namelistchange != NULL) - (*chat->peer_namelistchange)(chat, peernum, CHAT_CHANGE_PEER_DEL, chat->group_namelistchange_userdata); + if (chat->peer_namelistchange != NULL) { + (*chat->peer_namelistchange)(chat, chat->numpeers, CHAT_CHANGE_PEER_DEL, chat->group_namelistchange_userdata); + + if (chat->numpeers != (uint32_t)peernum) + (*chat->peer_namelistchange)(chat, peernum, CHAT_CHANGE_PEER_NAME, chat->group_namelistchange_userdata); + } return 0; } @@ -290,6 +294,7 @@ static void setnick(Group_Chat *chat, int peernum, uint8_t *contents, uint16_t c /* Force null termination */ chat->group[peernum].nick[contents_len - 1] = 0; chat->group[peernum].nick_len = contents_len; + if (chat->peer_namelistchange != NULL) (*chat->peer_namelistchange)(chat, peernum, CHAT_CHANGE_PEER_NAME, chat->group_namelistchange_userdata); } -- cgit v1.2.3 From 0b0848d9aca9e2587a3c294477cae820777b1d60 Mon Sep 17 00:00:00 2001 From: "Coren[m]" Date: Mon, 25 Nov 2013 19:18:11 +0100 Subject: setnick(): don't callback when an identical nickname is set again --- toxcore/group_chats.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'toxcore') diff --git a/toxcore/group_chats.c b/toxcore/group_chats.c index 8c3fe210..d1782c71 100644 --- a/toxcore/group_chats.c +++ b/toxcore/group_chats.c @@ -290,6 +290,11 @@ static void setnick(Group_Chat *chat, int peernum, uint8_t *contents, uint16_t c if (contents_len > MAX_NICK_BYTES || contents_len == 0) return; + /* same name as already stored? */ + if ((chat->group[peernum].nick_len == contents_len) && + !memcmp(chat->group[peernum].nick, contents, contents_len)) + return; + memcpy(chat->group[peernum].nick, contents, contents_len); /* Force null termination */ chat->group[peernum].nick[contents_len - 1] = 0; -- cgit v1.2.3