From d2019bbf9920f65764a715876a9d3de6b957b0a1 Mon Sep 17 00:00:00 2001 From: Jman012 Date: Sun, 16 Feb 2014 13:33:37 -0800 Subject: Added user typing changes in core. --- toxcore/Messenger.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) (limited to 'toxcore/Messenger.c') diff --git a/toxcore/Messenger.c b/toxcore/Messenger.c index 692d3d0e..ee5213a7 100644 --- a/toxcore/Messenger.c +++ b/toxcore/Messenger.c @@ -268,6 +268,7 @@ int m_addfriend(Messenger *m, uint8_t *address, uint8_t *data, uint16_t length) m->friendlist[i].statusmessage = calloc(1, 1); m->friendlist[i].statusmessage_length = 1; m->friendlist[i].userstatus = USERSTATUS_NONE; + m->friendlist[i].is_typing = 0; memcpy(m->friendlist[i].info, data, length); m->friendlist[i].info_size = length; m->friendlist[i].message_id = 0; @@ -315,6 +316,7 @@ int m_addfriend_norequest(Messenger *m, uint8_t *client_id) m->friendlist[i].statusmessage = calloc(1, 1); m->friendlist[i].statusmessage_length = 1; m->friendlist[i].userstatus = USERSTATUS_NONE; + m->friendlist[i].is_typing = 0; m->friendlist[i].message_id = 0; m->friendlist[i].receives_read_receipts = 1; /* Default: YES. */ @@ -615,6 +617,29 @@ USERSTATUS m_get_self_userstatus(Messenger *m) return m->userstatus; } +int m_set_usertyping(Messenger *m, int friendnumber, uint8_t is_typing) +{ + if (is_typing != 0 || is_typing != 1) { + return -1; + } + + if (friend_not_valid(m, friendnumber)) + return -1; + + m->friendlist[friendnumber].user_istyping = is_typing; + m->friendlist[friendnumber].user_istyping_sent = 0; + + return 0; +} + +uint8_t m_get_istyping(Messenger *m, int friendnumber) +{ + if (friend_not_valid(m, friendnumber)) + return -1; + + return m->friendlist[friendnumber].is_typing; +} + static int send_statusmessage(Messenger *m, int friendnumber, uint8_t *status, uint16_t length) { return write_cryptpacket_id(m, friendnumber, PACKET_ID_STATUSMESSAGE, status, length); @@ -626,6 +651,12 @@ static int send_userstatus(Messenger *m, int friendnumber, USERSTATUS status) return write_cryptpacket_id(m, friendnumber, PACKET_ID_USERSTATUS, &stat, sizeof(stat)); } +static int send_user_istyping(Messenger *m, int friendnumber, uint8_t is_typing) +{ + uint8_t typing = is_typing; + return write_cryptpacket_id(m, friendnumber, PACKET_ID_TYPING, &typing, sizeof(typing)); +} + static int send_ping(Messenger *m, int friendnumber) { int ret = write_cryptpacket_id(m, friendnumber, PACKET_ID_PING, 0, 0); @@ -654,6 +685,11 @@ static void set_friend_userstatus(Messenger *m, int friendnumber, USERSTATUS sta m->friendlist[friendnumber].userstatus = status; } +static void set_friend_typing(Messenger *m, int friendnumber, uint8_t is_typing) +{ + m->friendlist[friendnumber].is_typing = is_typing; +} + /* Sets whether we send read receipts for friendnumber. */ void m_set_sends_receipts(Messenger *m, int friendnumber, int yesno) { @@ -707,6 +743,12 @@ void m_callback_userstatus(Messenger *m, void (*function)(Messenger *m, int, USE m->friend_userstatuschange_userdata = userdata; } +void m_callback_typingchange(Messenger *m, void(*function)(Messenger *m, int, uint8_t, void *), void *userdata) +{ + m->friend_typingchange = function; + m->friend_typingchange_userdata = userdata; +} + void m_callback_read_receipt(Messenger *m, void (*function)(Messenger *m, int, uint32_t, void *), void *userdata) { m->read_receipt = function; @@ -1821,6 +1863,11 @@ void do_friends(Messenger *m) if (send_userstatus(m, i, m->userstatus)) m->friendlist[i].userstatus_sent = 1; } + + if (m->friendlist[i].user_istyping_sent == 0) { + if (send_user_istyping(m, i, m->friendlist[i].user_istyping)) + m->friendlist[i].user_istyping_sent = 1; + } if (m->friendlist[i].ping_lastsent + FRIEND_PING_INTERVAL < temp_time) { send_ping(m, i); @@ -1882,6 +1929,19 @@ void do_friends(Messenger *m) set_friend_userstatus(m, i, status); break; } + + case PACKET_ID_TYPING: { + if (data_length != 1) + break; + + uint8_t typing = data[0]; + + if (m->friend_typingchange) + m->friend_typingchange(m, i, typing, m->friend_typingchange_userdata); + + set_friend_typing(m, i, typing); + break; + } case PACKET_ID_MESSAGE: { uint8_t *message_id = data; -- cgit v1.2.3