Coverage Report

Created: 2024-01-26 01:52

/work/toxcore/events/group_message.c
Line
Count
Source (jump to first uncovered line)
1
/* SPDX-License-Identifier: GPL-3.0-or-later
2
 * Copyright © 2023-2024 The TokTok team.
3
 */
4
5
#include "events_alloc.h"
6
7
#include <assert.h>
8
#include <stdlib.h>
9
#include <string.h>
10
11
#include "../bin_pack.h"
12
#include "../bin_unpack.h"
13
#include "../ccompat.h"
14
#include "../mem.h"
15
#include "../tox.h"
16
#include "../tox_events.h"
17
#include "../tox_pack.h"
18
#include "../tox_unpack.h"
19
20
21
/*****************************************************
22
 *
23
 * :: struct and accessors
24
 *
25
 *****************************************************/
26
27
28
struct Tox_Event_Group_Message {
29
    uint32_t group_number;
30
    uint32_t peer_id;
31
    Tox_Message_Type type;
32
    uint8_t *message;
33
    uint32_t message_length;
34
    uint32_t message_id;
35
};
36
37
non_null()
38
static void tox_event_group_message_set_group_number(Tox_Event_Group_Message *group_message,
39
        uint32_t group_number)
40
9.32k
{
41
9.32k
    assert(group_message != nullptr);
42
9.32k
    group_message->group_number = group_number;
43
9.32k
}
44
uint32_t tox_event_group_message_get_group_number(const Tox_Event_Group_Message *group_message)
45
1
{
46
1
    assert(group_message != nullptr);
47
1
    return group_message->group_number;
48
1
}
49
50
non_null()
51
static void tox_event_group_message_set_peer_id(Tox_Event_Group_Message *group_message,
52
        uint32_t peer_id)
53
9.32k
{
54
9.32k
    assert(group_message != nullptr);
55
9.32k
    group_message->peer_id = peer_id;
56
9.32k
}
57
uint32_t tox_event_group_message_get_peer_id(const Tox_Event_Group_Message *group_message)
58
1
{
59
1
    assert(group_message != nullptr);
60
1
    return group_message->peer_id;
61
1
}
62
63
non_null()
64
static void tox_event_group_message_set_type(Tox_Event_Group_Message *group_message,
65
        Tox_Message_Type type)
66
9.32k
{
67
9.32k
    assert(group_message != nullptr);
68
9.32k
    group_message->type = type;
69
9.32k
}
70
Tox_Message_Type tox_event_group_message_get_type(const Tox_Event_Group_Message *group_message)
71
0
{
72
0
    assert(group_message != nullptr);
73
0
    return group_message->type;
74
0
}
75
76
non_null(1) nullable(2)
77
static bool tox_event_group_message_set_message(Tox_Event_Group_Message *group_message,
78
        const uint8_t *message, uint32_t message_length)
79
9.32k
{
80
9.32k
    assert(group_message != nullptr);
81
82
9.32k
    if (group_message->message != nullptr) {
83
0
        free(group_message->message);
84
0
        group_message->message = nullptr;
85
0
        group_message->message_length = 0;
86
0
    }
87
88
9.32k
    if (message == nullptr) {
89
0
        assert(message_length == 0);
90
0
        return true;
91
0
    }
92
93
9.32k
    uint8_t *message_copy = (uint8_t *)malloc(message_length);
94
95
9.32k
    if (message_copy == nullptr) {
96
0
        return false;
97
0
    }
98
99
9.32k
    memcpy(message_copy, message, message_length);
100
9.32k
    group_message->message = message_copy;
101
9.32k
    group_message->message_length = message_length;
102
9.32k
    return true;
103
9.32k
}
104
uint32_t tox_event_group_message_get_message_length(const Tox_Event_Group_Message *group_message)
105
9.30k
{
106
9.30k
    assert(group_message != nullptr);
107
9.30k
    return group_message->message_length;
108
9.30k
}
109
const uint8_t *tox_event_group_message_get_message(const Tox_Event_Group_Message *group_message)
110
9.30k
{
111
9.30k
    assert(group_message != nullptr);
112
9.30k
    return group_message->message;
113
9.30k
}
114
115
non_null()
116
static void tox_event_group_message_set_message_id(Tox_Event_Group_Message *group_message,
117
        uint32_t message_id)
118
9.32k
{
119
9.32k
    assert(group_message != nullptr);
120
9.32k
    group_message->message_id = message_id;
121
9.32k
}
122
uint32_t tox_event_group_message_get_message_id(const Tox_Event_Group_Message *group_message)
123
1
{
124
1
    assert(group_message != nullptr);
125
1
    return group_message->message_id;
126
1
}
127
128
non_null()
129
static void tox_event_group_message_construct(Tox_Event_Group_Message *group_message)
130
9.36k
{
131
9.36k
    *group_message = (Tox_Event_Group_Message) {
132
9.36k
        0
133
9.36k
    };
134
9.36k
}
135
non_null()
136
static void tox_event_group_message_destruct(Tox_Event_Group_Message *group_message, const Memory *mem)
137
9.36k
{
138
9.36k
    free(group_message->message);
139
9.36k
}
140
141
bool tox_event_group_message_pack(
142
    const Tox_Event_Group_Message *event, Bin_Pack *bp)
143
20
{
144
20
    return bin_pack_array(bp, 5)
145
20
           && bin_pack_u32(bp, event->group_number)
146
20
           && bin_pack_u32(bp, event->peer_id)
147
20
           && tox_message_type_pack(event->type, bp)
148
20
           && bin_pack_bin(bp, event->message, event->message_length)
149
20
           && bin_pack_u32(bp, event->message_id);
150
20
}
151
152
non_null()
153
static bool tox_event_group_message_unpack_into(
154
    Tox_Event_Group_Message *event, Bin_Unpack *bu)
155
41
{
156
41
    assert(event != nullptr);
157
41
    if (!bin_unpack_array_fixed(bu, 5, nullptr)) {
158
2
        return false;
159
2
    }
160
161
39
    return bin_unpack_u32(bu, &event->group_number)
162
39
           && bin_unpack_u32(bu, &event->peer_id)
163
39
           && tox_message_type_unpack(&event->type, bu)
164
39
           && bin_unpack_bin(bu, &event->message, &event->message_length)
165
39
           && bin_unpack_u32(bu, &event->message_id);
166
41
}
167
168
169
/*****************************************************
170
 *
171
 * :: new/free/add/get/size/unpack
172
 *
173
 *****************************************************/
174
175
const Tox_Event_Group_Message *tox_event_get_group_message(const Tox_Event *event)
176
0
{
177
0
    return event->type == TOX_EVENT_GROUP_MESSAGE ? event->data.group_message : nullptr;
178
0
}
179
180
Tox_Event_Group_Message *tox_event_group_message_new(const Memory *mem)
181
9.37k
{
182
9.37k
    Tox_Event_Group_Message *const group_message =
183
9.37k
        (Tox_Event_Group_Message *)mem_alloc(mem, sizeof(Tox_Event_Group_Message));
184
185
9.37k
    if (group_message == nullptr) {
186
1
        return nullptr;
187
1
    }
188
189
9.36k
    tox_event_group_message_construct(group_message);
190
9.36k
    return group_message;
191
9.37k
}
192
193
void tox_event_group_message_free(Tox_Event_Group_Message *group_message, const Memory *mem)
194
9.37k
{
195
9.37k
    if (group_message != nullptr) {
196
9.36k
        tox_event_group_message_destruct(group_message, mem);
197
9.36k
    }
198
9.37k
    mem_delete(mem, group_message);
199
9.37k
}
200
201
non_null()
202
static Tox_Event_Group_Message *tox_events_add_group_message(Tox_Events *events, const Memory *mem)
203
9.32k
{
204
9.32k
    Tox_Event_Group_Message *const group_message = tox_event_group_message_new(mem);
205
206
9.32k
    if (group_message == nullptr) {
207
0
        return nullptr;
208
0
    }
209
210
9.32k
    Tox_Event event;
211
9.32k
    event.type = TOX_EVENT_GROUP_MESSAGE;
212
9.32k
    event.data.group_message = group_message;
213
214
9.32k
    tox_events_add(events, &event);
215
9.32k
    return group_message;
216
9.32k
}
217
218
bool tox_event_group_message_unpack(
219
    Tox_Event_Group_Message **event, Bin_Unpack *bu, const Memory *mem)
220
42
{
221
42
    assert(event != nullptr);
222
42
    assert(*event == nullptr);
223
42
    *event = tox_event_group_message_new(mem);
224
225
42
    if (*event == nullptr) {
226
1
        return false;
227
1
    }
228
229
41
    return tox_event_group_message_unpack_into(*event, bu);
230
42
}
231
232
non_null()
233
static Tox_Event_Group_Message *tox_event_group_message_alloc(void *user_data)
234
9.32k
{
235
9.32k
    Tox_Events_State *state = tox_events_alloc(user_data);
236
9.32k
    assert(state != nullptr);
237
238
9.32k
    if (state->events == nullptr) {
239
0
        return nullptr;
240
0
    }
241
242
9.32k
    Tox_Event_Group_Message *group_message = tox_events_add_group_message(state->events, state->mem);
243
244
9.32k
    if (group_message == nullptr) {
245
0
        state->error = TOX_ERR_EVENTS_ITERATE_MALLOC;
246
0
        return nullptr;
247
0
    }
248
249
9.32k
    return group_message;
250
9.32k
}
251
252
253
/*****************************************************
254
 *
255
 * :: event handler
256
 *
257
 *****************************************************/
258
259
260
void tox_events_handle_group_message(Tox *tox, uint32_t group_number, uint32_t peer_id, Tox_Message_Type type, const uint8_t *message, size_t length, uint32_t message_id,
261
        void *user_data)
262
9.32k
{
263
9.32k
    Tox_Event_Group_Message *group_message = tox_event_group_message_alloc(user_data);
264
265
9.32k
    if (group_message == nullptr) {
266
0
        return;
267
0
    }
268
269
9.32k
    tox_event_group_message_set_group_number(group_message, group_number);
270
9.32k
    tox_event_group_message_set_peer_id(group_message, peer_id);
271
9.32k
    tox_event_group_message_set_type(group_message, type);
272
9.32k
    tox_event_group_message_set_message(group_message, message, length);
273
9.32k
    tox_event_group_message_set_message_id(group_message, message_id);
274
9.32k
}