From a6f2e9539b9f73e40076fe85d8f1152b279142e7 Mon Sep 17 00:00:00 2001 From: "Gregory Mullen (grayhatter)" Date: Sat, 20 Aug 2016 15:25:26 -0700 Subject: [PATCH] Make Message received receipts stateless --- other/apidsl/tox.in.h | 2 +- toxcore/Messenger.c | 16 ++++++++-------- toxcore/Messenger.h | 3 +-- toxcore/tox.c | 4 ++-- toxcore/tox.h | 2 +- 5 files changed, 13 insertions(+), 14 deletions(-) diff --git a/other/apidsl/tox.in.h b/other/apidsl/tox.in.h index b1b68117..4c9c4972 100644 --- a/other/apidsl/tox.in.h +++ b/other/apidsl/tox.in.h @@ -1435,7 +1435,7 @@ namespace friend { * This event is triggered when the friend receives the message sent with * ${send.message} with the corresponding message ID. */ - event read_receipt { + event read_receipt const { /** * @param friend_number The friend number of the friend who received the message. * @param message_id The message ID as returned from ${send.message} diff --git a/toxcore/Messenger.c b/toxcore/Messenger.c index ac54f34f..b87e61c6 100644 --- a/toxcore/Messenger.c +++ b/toxcore/Messenger.c @@ -344,7 +344,7 @@ static int friend_received_packet(const Messenger *m, int32_t friendnumber, uint m->friendlist[friendnumber].friendcon_id), number); } -static int do_receipts(Messenger *m, int32_t friendnumber) +static int do_receipts(Messenger *m, int32_t friendnumber, void *userdata) { if (friend_not_valid(m, friendnumber)) return -1; @@ -357,8 +357,9 @@ static int do_receipts(Messenger *m, int32_t friendnumber) if (friend_received_packet(m, friendnumber, receipts->packet_num) == -1) break; - if (m->read_receipt) - (*m->read_receipt)(m, friendnumber, receipts->msg_id, m->read_receipt_userdata); + if (m->read_receipt) { + (*m->read_receipt)(m, friendnumber, receipts->msg_id, userdata); + } free(receipts); m->friendlist[friendnumber].receipts_start = temp_r; @@ -796,10 +797,9 @@ void m_callback_typingchange(Messenger *m, void(*function)(Messenger *m, uint32_ m->friend_typingchange = function; } -void m_callback_read_receipt(Messenger *m, void (*function)(Messenger *m, uint32_t, uint32_t, void *), void *userdata) +void m_callback_read_receipt(Messenger *m, void (*function)(Messenger *m, uint32_t, uint32_t, void *)) { m->read_receipt = function; - m->read_receipt_userdata = userdata; } void m_callback_connectionstatus(Messenger *m, void (*function)(Messenger *m, uint32_t, unsigned int, void *), @@ -2168,7 +2168,7 @@ static int handle_packet(void *object, int i, uint8_t *temp, uint16_t len, void return 0; } -void do_friends(Messenger *m) +static void do_friends(Messenger *m, void *userdata) { uint32_t i; uint64_t temp_time = unix_time(); @@ -2217,7 +2217,7 @@ void do_friends(Messenger *m) } check_friend_tcp_udp(m, i); - do_receipts(m, i); + do_receipts(m, i, userdata); do_reqchunk_filecb(m, i); m->friendlist[i].last_seen_time = (uint64_t) time(NULL); @@ -2311,7 +2311,7 @@ void do_messenger(Messenger *m, void *userdata) do_net_crypto(m->net_crypto, userdata); do_onion_client(m->onion_c); do_friend_connections(m->fr_c); - do_friends(m); + do_friends(m, userdata); connection_status_cb(m, userdata); #ifdef TOX_LOGGER diff --git a/toxcore/Messenger.h b/toxcore/Messenger.h index 0141f1ea..6ac06f2f 100644 --- a/toxcore/Messenger.h +++ b/toxcore/Messenger.h @@ -242,7 +242,6 @@ struct Messenger { void (*friend_userstatuschange)(struct Messenger *m, uint32_t, unsigned int, void *); void (*friend_typingchange)(struct Messenger *m, uint32_t, _Bool, void *); void (*read_receipt)(struct Messenger *m, uint32_t, uint32_t, void *); - void *read_receipt_userdata; void (*friend_connectionstatuschange)(struct Messenger *m, uint32_t, unsigned int, void *); void *friend_connectionstatuschange_userdata; void (*friend_connectionstatuschange_internal)(struct Messenger *m, uint32_t, uint8_t, void *); @@ -507,7 +506,7 @@ void m_callback_typingchange(Messenger *m, void(*function)(Messenger *m, uint32_ * Since core doesn't track ids for you, receipt may not correspond to any message. * In that case, you should discard it. */ -void m_callback_read_receipt(Messenger *m, void (*function)(Messenger *m, uint32_t, uint32_t, void *), void *userdata); +void m_callback_read_receipt(Messenger *m, void (*function)(Messenger *m, uint32_t, uint32_t, void *)); /* Set the callback for connection status changes. * function(uint32_t friendnumber, uint8_t status) diff --git a/toxcore/tox.c b/toxcore/tox.c index 2cccf125..b1308d90 100644 --- a/toxcore/tox.c +++ b/toxcore/tox.c @@ -890,10 +890,10 @@ uint32_t tox_friend_send_message(Tox *tox, uint32_t friend_number, TOX_MESSAGE_T return message_id; } -void tox_callback_friend_read_receipt(Tox *tox, tox_friend_read_receipt_cb *function, void *user_data) +void tox_callback_friend_read_receipt(Tox *tox, tox_friend_read_receipt_cb *function) { Messenger *m = tox; - m_callback_read_receipt(m, function, user_data); + m_callback_read_receipt(m, function); } void tox_callback_friend_request(Tox *tox, tox_friend_request_cb *function, void *user_data) diff --git a/toxcore/tox.h b/toxcore/tox.h index e392ecff..16e83207 100644 --- a/toxcore/tox.h +++ b/toxcore/tox.h @@ -1531,7 +1531,7 @@ typedef void tox_friend_read_receipt_cb(Tox *tox, uint32_t friend_number, uint32 * This event is triggered when the friend receives the message sent with * tox_friend_send_message with the corresponding message ID. */ -void tox_callback_friend_read_receipt(Tox *tox, tox_friend_read_receipt_cb *callback, void *user_data); +void tox_callback_friend_read_receipt(Tox *tox, tox_friend_read_receipt_cb *callback); /*******************************************************************************