Coverage Report

Created: 2024-01-26 01:52

/work/toxcore/events/conference_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_Conference_Message {
29
    uint32_t conference_number;
30
    uint32_t peer_number;
31
    Tox_Message_Type type;
32
    uint8_t *message;
33
    uint32_t message_length;
34
};
35
36
non_null()
37
static void tox_event_conference_message_set_conference_number(Tox_Event_Conference_Message *conference_message,
38
        uint32_t conference_number)
39
2
{
40
2
    assert(conference_message != nullptr);
41
2
    conference_message->conference_number = conference_number;
42
2
}
43
uint32_t tox_event_conference_message_get_conference_number(const Tox_Event_Conference_Message *conference_message)
44
2
{
45
2
    assert(conference_message != nullptr);
46
2
    return conference_message->conference_number;
47
2
}
48
49
non_null()
50
static void tox_event_conference_message_set_peer_number(Tox_Event_Conference_Message *conference_message,
51
        uint32_t peer_number)
52
2
{
53
2
    assert(conference_message != nullptr);
54
2
    conference_message->peer_number = peer_number;
55
2
}
56
uint32_t tox_event_conference_message_get_peer_number(const Tox_Event_Conference_Message *conference_message)
57
2
{
58
2
    assert(conference_message != nullptr);
59
2
    return conference_message->peer_number;
60
2
}
61
62
non_null()
63
static void tox_event_conference_message_set_type(Tox_Event_Conference_Message *conference_message,
64
        Tox_Message_Type type)
65
2
{
66
2
    assert(conference_message != nullptr);
67
2
    conference_message->type = type;
68
2
}
69
Tox_Message_Type tox_event_conference_message_get_type(const Tox_Event_Conference_Message *conference_message)
70
2
{
71
2
    assert(conference_message != nullptr);
72
2
    return conference_message->type;
73
2
}
74
75
non_null(1) nullable(2)
76
static bool tox_event_conference_message_set_message(Tox_Event_Conference_Message *conference_message,
77
        const uint8_t *message, uint32_t message_length)
78
2
{
79
2
    assert(conference_message != nullptr);
80
81
2
    if (conference_message->message != nullptr) {
82
0
        free(conference_message->message);
83
0
        conference_message->message = nullptr;
84
0
        conference_message->message_length = 0;
85
0
    }
86
87
2
    if (message == nullptr) {
88
0
        assert(message_length == 0);
89
0
        return true;
90
0
    }
91
92
2
    uint8_t *message_copy = (uint8_t *)malloc(message_length);
93
94
2
    if (message_copy == nullptr) {
95
0
        return false;
96
0
    }
97
98
2
    memcpy(message_copy, message, message_length);
99
2
    conference_message->message = message_copy;
100
2
    conference_message->message_length = message_length;
101
2
    return true;
102
2
}
103
uint32_t tox_event_conference_message_get_message_length(const Tox_Event_Conference_Message *conference_message)
104
2
{
105
2
    assert(conference_message != nullptr);
106
2
    return conference_message->message_length;
107
2
}
108
const uint8_t *tox_event_conference_message_get_message(const Tox_Event_Conference_Message *conference_message)
109
2
{
110
2
    assert(conference_message != nullptr);
111
2
    return conference_message->message;
112
2
}
113
114
non_null()
115
static void tox_event_conference_message_construct(Tox_Event_Conference_Message *conference_message)
116
13
{
117
13
    *conference_message = (Tox_Event_Conference_Message) {
118
13
        0
119
13
    };
120
13
}
121
non_null()
122
static void tox_event_conference_message_destruct(Tox_Event_Conference_Message *conference_message, const Memory *mem)
123
13
{
124
13
    free(conference_message->message);
125
13
}
126
127
bool tox_event_conference_message_pack(
128
    const Tox_Event_Conference_Message *event, Bin_Pack *bp)
129
2
{
130
2
    return bin_pack_array(bp, 4)
131
2
           && bin_pack_u32(bp, event->conference_number)
132
2
           && bin_pack_u32(bp, event->peer_number)
133
2
           && tox_message_type_pack(event->type, bp)
134
2
           && bin_pack_bin(bp, event->message, event->message_length);
135
2
}
136
137
non_null()
138
static bool tox_event_conference_message_unpack_into(
139
    Tox_Event_Conference_Message *event, Bin_Unpack *bu)
140
11
{
141
11
    assert(event != nullptr);
142
11
    if (!bin_unpack_array_fixed(bu, 4, nullptr)) {
143
2
        return false;
144
2
    }
145
146
9
    return bin_unpack_u32(bu, &event->conference_number)
147
9
           && bin_unpack_u32(bu, &event->peer_number)
148
9
           && tox_message_type_unpack(&event->type, bu)
149
9
           && bin_unpack_bin(bu, &event->message, &event->message_length);
150
11
}
151
152
153
/*****************************************************
154
 *
155
 * :: new/free/add/get/size/unpack
156
 *
157
 *****************************************************/
158
159
const Tox_Event_Conference_Message *tox_event_get_conference_message(const Tox_Event *event)
160
0
{
161
0
    return event->type == TOX_EVENT_CONFERENCE_MESSAGE ? event->data.conference_message : nullptr;
162
0
}
163
164
Tox_Event_Conference_Message *tox_event_conference_message_new(const Memory *mem)
165
14
{
166
14
    Tox_Event_Conference_Message *const conference_message =
167
14
        (Tox_Event_Conference_Message *)mem_alloc(mem, sizeof(Tox_Event_Conference_Message));
168
169
14
    if (conference_message == nullptr) {
170
1
        return nullptr;
171
1
    }
172
173
13
    tox_event_conference_message_construct(conference_message);
174
13
    return conference_message;
175
14
}
176
177
void tox_event_conference_message_free(Tox_Event_Conference_Message *conference_message, const Memory *mem)
178
14
{
179
14
    if (conference_message != nullptr) {
180
13
        tox_event_conference_message_destruct(conference_message, mem);
181
13
    }
182
14
    mem_delete(mem, conference_message);
183
14
}
184
185
non_null()
186
static Tox_Event_Conference_Message *tox_events_add_conference_message(Tox_Events *events, const Memory *mem)
187
2
{
188
2
    Tox_Event_Conference_Message *const conference_message = tox_event_conference_message_new(mem);
189
190
2
    if (conference_message == nullptr) {
191
0
        return nullptr;
192
0
    }
193
194
2
    Tox_Event event;
195
2
    event.type = TOX_EVENT_CONFERENCE_MESSAGE;
196
2
    event.data.conference_message = conference_message;
197
198
2
    tox_events_add(events, &event);
199
2
    return conference_message;
200
2
}
201
202
bool tox_event_conference_message_unpack(
203
    Tox_Event_Conference_Message **event, Bin_Unpack *bu, const Memory *mem)
204
12
{
205
12
    assert(event != nullptr);
206
12
    assert(*event == nullptr);
207
12
    *event = tox_event_conference_message_new(mem);
208
209
12
    if (*event == nullptr) {
210
1
        return false;
211
1
    }
212
213
11
    return tox_event_conference_message_unpack_into(*event, bu);
214
12
}
215
216
non_null()
217
static Tox_Event_Conference_Message *tox_event_conference_message_alloc(void *user_data)
218
2
{
219
2
    Tox_Events_State *state = tox_events_alloc(user_data);
220
2
    assert(state != nullptr);
221
222
2
    if (state->events == nullptr) {
223
0
        return nullptr;
224
0
    }
225
226
2
    Tox_Event_Conference_Message *conference_message = tox_events_add_conference_message(state->events, state->mem);
227
228
2
    if (conference_message == nullptr) {
229
0
        state->error = TOX_ERR_EVENTS_ITERATE_MALLOC;
230
0
        return nullptr;
231
0
    }
232
233
2
    return conference_message;
234
2
}
235
236
237
/*****************************************************
238
 *
239
 * :: event handler
240
 *
241
 *****************************************************/
242
243
244
void tox_events_handle_conference_message(Tox *tox, uint32_t conference_number, uint32_t peer_number, Tox_Message_Type type, const uint8_t *message, size_t length,
245
        void *user_data)
246
2
{
247
2
    Tox_Event_Conference_Message *conference_message = tox_event_conference_message_alloc(user_data);
248
249
2
    if (conference_message == nullptr) {
250
0
        return;
251
0
    }
252
253
2
    tox_event_conference_message_set_conference_number(conference_message, conference_number);
254
2
    tox_event_conference_message_set_peer_number(conference_message, peer_number);
255
2
    tox_event_conference_message_set_type(conference_message, type);
256
2
    tox_event_conference_message_set_message(conference_message, message, length);
257
2
}