Coverage Report

Created: 2024-01-26 01:52

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