Coverage Report

Created: 2026-10-24 08:16

/work/toxcore/events/group_peer_limit.c
Line
Count
Source (jump to first uncovered line)
1
/* SPDX-License-Identifier: GPL-3.0-or-later
2
 * Copyright © 2023-2026 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
#include "../tox_struct.h"
18
19
/*****************************************************
20
 *
21
 * :: struct and accessors
22
 *
23
 *****************************************************/
24
25
struct Tox_Event_Group_Peer_Limit {
26
    uint32_t group_number;
27
    uint32_t peer_limit;
28
};
29
30
static void tox_event_group_peer_limit_set_group_number(Tox_Event_Group_Peer_Limit *_Nonnull group_peer_limit, uint32_t group_number)
31
12
{
32
12
    assert(group_peer_limit != nullptr);
33
12
    group_peer_limit->group_number = group_number;
34
12
}
35
uint32_t tox_event_group_peer_limit_get_group_number(const Tox_Event_Group_Peer_Limit *group_peer_limit)
36
0
{
37
0
    assert(group_peer_limit != nullptr);
38
0
    return group_peer_limit->group_number;
39
0
}
40
41
static void tox_event_group_peer_limit_set_peer_limit(Tox_Event_Group_Peer_Limit *_Nonnull group_peer_limit, uint32_t peer_limit)
42
12
{
43
12
    assert(group_peer_limit != nullptr);
44
12
    group_peer_limit->peer_limit = peer_limit;
45
12
}
46
uint32_t tox_event_group_peer_limit_get_peer_limit(const Tox_Event_Group_Peer_Limit *group_peer_limit)
47
8
{
48
8
    assert(group_peer_limit != nullptr);
49
8
    return group_peer_limit->peer_limit;
50
8
}
51
52
static void tox_event_group_peer_limit_construct(Tox_Event_Group_Peer_Limit *_Nonnull group_peer_limit)
53
25
{
54
25
    *group_peer_limit = (Tox_Event_Group_Peer_Limit) {
55
25
        0
56
25
    };
57
25
}
58
static void tox_event_group_peer_limit_destruct(Tox_Event_Group_Peer_Limit *_Nonnull group_peer_limit, const Memory *_Nonnull mem)
59
25
{
60
25
    return;
61
25
}
62
63
bool tox_event_group_peer_limit_pack(
64
    const Tox_Event_Group_Peer_Limit *event, Bin_Pack *bp)
65
22
{
66
22
    return bin_pack_array(bp, 2)
67
22
           && bin_pack_u32(bp, event->group_number)
68
22
           && bin_pack_u32(bp, event->peer_limit);
69
22
}
70
71
static bool tox_event_group_peer_limit_unpack_into(Tox_Event_Group_Peer_Limit *_Nonnull event, Bin_Unpack *_Nonnull bu)
72
13
{
73
13
    assert(event != nullptr);
74
13
    if (!bin_unpack_array_fixed(bu, 2, nullptr)) {
75
1
        return false;
76
1
    }
77
78
12
    return bin_unpack_u32(bu, &event->group_number)
79
12
           && bin_unpack_u32(bu, &event->peer_limit);
80
13
}
81
82
/*****************************************************
83
 *
84
 * :: new/free/add/get/size/unpack
85
 *
86
 *****************************************************/
87
88
const Tox_Event_Group_Peer_Limit *tox_event_get_group_peer_limit(const Tox_Event *event)
89
0
{
90
0
    return event->type == TOX_EVENT_GROUP_PEER_LIMIT ? event->data.group_peer_limit : nullptr;
91
0
}
92
93
Tox_Event_Group_Peer_Limit *tox_event_group_peer_limit_new(const Memory *mem)
94
26
{
95
26
    Tox_Event_Group_Peer_Limit *const group_peer_limit =
96
26
        (Tox_Event_Group_Peer_Limit *)mem_alloc(mem, sizeof(Tox_Event_Group_Peer_Limit));
97
98
26
    if (group_peer_limit == nullptr) {
99
1
        return nullptr;
100
1
    }
101
102
25
    tox_event_group_peer_limit_construct(group_peer_limit);
103
25
    return group_peer_limit;
104
26
}
105
106
void tox_event_group_peer_limit_free(Tox_Event_Group_Peer_Limit *group_peer_limit, const Memory *mem)
107
26
{
108
26
    if (group_peer_limit != nullptr) {
109
25
        tox_event_group_peer_limit_destruct(group_peer_limit, mem);
110
25
    }
111
26
    mem_delete(mem, group_peer_limit);
112
26
}
113
114
static Tox_Event_Group_Peer_Limit *_Nullable tox_events_add_group_peer_limit(Tox_Events *_Nonnull events, const Memory *_Nonnull mem)
115
12
{
116
12
    Tox_Event_Group_Peer_Limit *const group_peer_limit = tox_event_group_peer_limit_new(mem);
117
118
12
    if (group_peer_limit == nullptr) {
119
0
        return nullptr;
120
0
    }
121
122
12
    Tox_Event event;
123
12
    event.type = TOX_EVENT_GROUP_PEER_LIMIT;
124
12
    event.data.group_peer_limit = group_peer_limit;
125
126
12
    if (!tox_events_add(events, &event)) {
127
0
        tox_event_group_peer_limit_free(group_peer_limit, mem);
128
0
        return nullptr;
129
0
    }
130
12
    return group_peer_limit;
131
12
}
132
133
bool tox_event_group_peer_limit_unpack(
134
    Tox_Event_Group_Peer_Limit **event, Bin_Unpack *bu, const Memory *mem)
135
14
{
136
14
    assert(event != nullptr);
137
14
    assert(*event == nullptr);
138
14
    *event = tox_event_group_peer_limit_new(mem);
139
140
14
    if (*event == nullptr) {
141
1
        return false;
142
1
    }
143
144
13
    return tox_event_group_peer_limit_unpack_into(*event, bu);
145
14
}
146
147
static Tox_Event_Group_Peer_Limit *_Nullable tox_event_group_peer_limit_alloc(Tox_Events_State *_Nonnull state)
148
12
{
149
12
    if (state->events == nullptr) {
150
0
        return nullptr;
151
0
    }
152
153
12
    Tox_Event_Group_Peer_Limit *group_peer_limit = tox_events_add_group_peer_limit(state->events, state->mem);
154
155
12
    if (group_peer_limit == nullptr) {
156
0
        state->error = TOX_ERR_EVENTS_ITERATE_MALLOC;
157
0
        return nullptr;
158
0
    }
159
160
12
    return group_peer_limit;
161
12
}
162
163
/*****************************************************
164
 *
165
 * :: event handler
166
 *
167
 *****************************************************/
168
169
void tox_events_handle_group_peer_limit(
170
    Tox *_Nonnull tox,
171
    uint32_t group_number,
172
    uint32_t peer_limit,
173
    void *_Nullable user_data)
174
12
{
175
12
    Tox_Events_State *state = tox_events_alloc(user_data);
176
12
    Tox_Event_Group_Peer_Limit *group_peer_limit = tox_event_group_peer_limit_alloc(state);
177
178
12
    if (group_peer_limit == nullptr) {
179
0
        return;
180
0
    }
181
182
12
    tox_event_group_peer_limit_set_group_number(group_peer_limit, group_number);
183
12
    tox_event_group_peer_limit_set_peer_limit(group_peer_limit, peer_limit);
184
12
}
185
186
void tox_events_handle_group_peer_limit_dispatch(Tox *tox, const Tox_Event_Group_Peer_Limit *event, void *user_data)
187
0
{
188
0
    if (tox->group_peer_limit_callback == nullptr) {
189
0
        return;
190
0
    }
191
192
0
    tox_unlock(tox);
193
0
    tox->group_peer_limit_callback(tox, event->group_number, event->peer_limit, user_data);
194
0
    tox_lock(tox);
195
0
}