Coverage Report

Created: 2025-10-08 19:34

/work/toxcore/events/friend_read_receipt.c
Line
Count
Source (jump to first uncovered line)
1
/* SPDX-License-Identifier: GPL-3.0-or-later
2
 * Copyright © 2023-2025 The TokTok team.
3
 */
4
5
#include "events_alloc.h"
6
7
#include <assert.h>
8
9
#include "../attributes.h"
10
#include "../bin_pack.h"
11
#include "../bin_unpack.h"
12
#include "../ccompat.h"
13
#include "../mem.h"
14
#include "../tox.h"
15
#include "../tox_event.h"
16
#include "../tox_events.h"
17
18
/*****************************************************
19
 *
20
 * :: struct and accessors
21
 *
22
 *****************************************************/
23
24
struct Tox_Event_Friend_Read_Receipt {
25
    uint32_t friend_number;
26
    uint32_t message_id;
27
};
28
29
static void tox_event_friend_read_receipt_set_friend_number(Tox_Event_Friend_Read_Receipt *_Nonnull friend_read_receipt, uint32_t friend_number)
30
66.0k
{
31
66.0k
    assert(friend_read_receipt != nullptr);
32
66.0k
    friend_read_receipt->friend_number = friend_number;
33
66.0k
}
34
uint32_t tox_event_friend_read_receipt_get_friend_number(const Tox_Event_Friend_Read_Receipt *friend_read_receipt)
35
0
{
36
0
    assert(friend_read_receipt != nullptr);
37
0
    return friend_read_receipt->friend_number;
38
0
}
39
40
static void tox_event_friend_read_receipt_set_message_id(Tox_Event_Friend_Read_Receipt *_Nonnull friend_read_receipt, uint32_t message_id)
41
66.0k
{
42
66.0k
    assert(friend_read_receipt != nullptr);
43
66.0k
    friend_read_receipt->message_id = message_id;
44
66.0k
}
45
uint32_t tox_event_friend_read_receipt_get_message_id(const Tox_Event_Friend_Read_Receipt *friend_read_receipt)
46
0
{
47
0
    assert(friend_read_receipt != nullptr);
48
0
    return friend_read_receipt->message_id;
49
0
}
50
51
static void tox_event_friend_read_receipt_construct(Tox_Event_Friend_Read_Receipt *_Nonnull friend_read_receipt)
52
66.0k
{
53
66.0k
    *friend_read_receipt = (Tox_Event_Friend_Read_Receipt) {
54
66.0k
        0
55
66.0k
    };
56
66.0k
}
57
static void tox_event_friend_read_receipt_destruct(Tox_Event_Friend_Read_Receipt *_Nonnull friend_read_receipt, const Memory *_Nonnull mem)
58
66.0k
{
59
66.0k
    return;
60
66.0k
}
61
62
bool tox_event_friend_read_receipt_pack(
63
    const Tox_Event_Friend_Read_Receipt *event, Bin_Pack *bp)
64
36
{
65
36
    return bin_pack_array(bp, 2)
66
36
           && bin_pack_u32(bp, event->friend_number)
67
36
           && bin_pack_u32(bp, event->message_id);
68
36
}
69
70
static bool tox_event_friend_read_receipt_unpack_into(Tox_Event_Friend_Read_Receipt *_Nonnull event, Bin_Unpack *_Nonnull bu)
71
31
{
72
31
    assert(event != nullptr);
73
31
    if (!bin_unpack_array_fixed(bu, 2, nullptr)) {
74
1
        return false;
75
1
    }
76
77
30
    return bin_unpack_u32(bu, &event->friend_number)
78
30
           && bin_unpack_u32(bu, &event->message_id);
79
31
}
80
81
/*****************************************************
82
 *
83
 * :: new/free/add/get/size/unpack
84
 *
85
 *****************************************************/
86
87
const Tox_Event_Friend_Read_Receipt *tox_event_get_friend_read_receipt(const Tox_Event *event)
88
0
{
89
0
    return event->type == TOX_EVENT_FRIEND_READ_RECEIPT ? event->data.friend_read_receipt : nullptr;
90
0
}
91
92
Tox_Event_Friend_Read_Receipt *tox_event_friend_read_receipt_new(const Memory *mem)
93
66.0k
{
94
66.0k
    Tox_Event_Friend_Read_Receipt *const friend_read_receipt =
95
66.0k
        (Tox_Event_Friend_Read_Receipt *)mem_alloc(mem, sizeof(Tox_Event_Friend_Read_Receipt));
96
97
66.0k
    if (friend_read_receipt == nullptr) {
98
1
        return nullptr;
99
1
    }
100
101
66.0k
    tox_event_friend_read_receipt_construct(friend_read_receipt);
102
66.0k
    return friend_read_receipt;
103
66.0k
}
104
105
void tox_event_friend_read_receipt_free(Tox_Event_Friend_Read_Receipt *friend_read_receipt, const Memory *mem)
106
66.0k
{
107
66.0k
    if (friend_read_receipt != nullptr) {
108
66.0k
        tox_event_friend_read_receipt_destruct(friend_read_receipt, mem);
109
66.0k
    }
110
66.0k
    mem_delete(mem, friend_read_receipt);
111
66.0k
}
112
113
static Tox_Event_Friend_Read_Receipt *tox_events_add_friend_read_receipt(Tox_Events *_Nonnull events, const Memory *_Nonnull mem)
114
66.0k
{
115
66.0k
    Tox_Event_Friend_Read_Receipt *const friend_read_receipt = tox_event_friend_read_receipt_new(mem);
116
117
66.0k
    if (friend_read_receipt == nullptr) {
118
0
        return nullptr;
119
0
    }
120
121
66.0k
    Tox_Event event;
122
66.0k
    event.type = TOX_EVENT_FRIEND_READ_RECEIPT;
123
66.0k
    event.data.friend_read_receipt = friend_read_receipt;
124
125
66.0k
    if (!tox_events_add(events, &event)) {
126
0
        tox_event_friend_read_receipt_free(friend_read_receipt, mem);
127
0
        return nullptr;
128
0
    }
129
66.0k
    return friend_read_receipt;
130
66.0k
}
131
132
bool tox_event_friend_read_receipt_unpack(
133
    Tox_Event_Friend_Read_Receipt **event, Bin_Unpack *bu, const Memory *mem)
134
32
{
135
32
    assert(event != nullptr);
136
32
    assert(*event == nullptr);
137
32
    *event = tox_event_friend_read_receipt_new(mem);
138
139
32
    if (*event == nullptr) {
140
1
        return false;
141
1
    }
142
143
31
    return tox_event_friend_read_receipt_unpack_into(*event, bu);
144
32
}
145
146
static Tox_Event_Friend_Read_Receipt *tox_event_friend_read_receipt_alloc(void *_Nonnull user_data)
147
66.0k
{
148
66.0k
    Tox_Events_State *state = tox_events_alloc(user_data);
149
66.0k
    assert(state != nullptr);
150
151
66.0k
    if (state->events == nullptr) {
152
0
        return nullptr;
153
0
    }
154
155
66.0k
    Tox_Event_Friend_Read_Receipt *friend_read_receipt = tox_events_add_friend_read_receipt(state->events, state->mem);
156
157
66.0k
    if (friend_read_receipt == nullptr) {
158
0
        state->error = TOX_ERR_EVENTS_ITERATE_MALLOC;
159
0
        return nullptr;
160
0
    }
161
162
66.0k
    return friend_read_receipt;
163
66.0k
}
164
165
/*****************************************************
166
 *
167
 * :: event handler
168
 *
169
 *****************************************************/
170
171
void tox_events_handle_friend_read_receipt(
172
    Tox *tox, uint32_t friend_number, uint32_t message_id,
173
    void *user_data)
174
66.0k
{
175
66.0k
    Tox_Event_Friend_Read_Receipt *friend_read_receipt = tox_event_friend_read_receipt_alloc(user_data);
176
177
66.0k
    if (friend_read_receipt == nullptr) {
178
0
        return;
179
0
    }
180
181
66.0k
    tox_event_friend_read_receipt_set_friend_number(friend_read_receipt, friend_number);
182
66.0k
    tox_event_friend_read_receipt_set_message_id(friend_read_receipt, message_id);
183
66.0k
}