Coverage Report

Created: 2026-10-24 08:16

/work/toxcore/events/group_peer_join.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_Join {
26
    uint32_t group_number;
27
    uint32_t peer_id;
28
};
29
30
static void tox_event_group_peer_join_set_group_number(Tox_Event_Group_Peer_Join *_Nonnull group_peer_join, uint32_t group_number)
31
68
{
32
68
    assert(group_peer_join != nullptr);
33
68
    group_peer_join->group_number = group_number;
34
68
}
35
uint32_t tox_event_group_peer_join_get_group_number(const Tox_Event_Group_Peer_Join *group_peer_join)
36
26
{
37
26
    assert(group_peer_join != nullptr);
38
26
    return group_peer_join->group_number;
39
26
}
40
41
static void tox_event_group_peer_join_set_peer_id(Tox_Event_Group_Peer_Join *_Nonnull group_peer_join, uint32_t peer_id)
42
68
{
43
68
    assert(group_peer_join != nullptr);
44
68
    group_peer_join->peer_id = peer_id;
45
68
}
46
uint32_t tox_event_group_peer_join_get_peer_id(const Tox_Event_Group_Peer_Join *group_peer_join)
47
44
{
48
44
    assert(group_peer_join != nullptr);
49
44
    return group_peer_join->peer_id;
50
44
}
51
52
static void tox_event_group_peer_join_construct(Tox_Event_Group_Peer_Join *_Nonnull group_peer_join)
53
113
{
54
113
    *group_peer_join = (Tox_Event_Group_Peer_Join) {
55
113
        0
56
113
    };
57
113
}
58
static void tox_event_group_peer_join_destruct(Tox_Event_Group_Peer_Join *_Nonnull group_peer_join, const Memory *_Nonnull mem)
59
113
{
60
113
    return;
61
113
}
62
63
bool tox_event_group_peer_join_pack(
64
    const Tox_Event_Group_Peer_Join *event, Bin_Pack *bp)
65
56
{
66
56
    return bin_pack_array(bp, 2)
67
56
           && bin_pack_u32(bp, event->group_number)
68
56
           && bin_pack_u32(bp, event->peer_id);
69
56
}
70
71
static bool tox_event_group_peer_join_unpack_into(Tox_Event_Group_Peer_Join *_Nonnull event, Bin_Unpack *_Nonnull bu)
72
45
{
73
45
    assert(event != nullptr);
74
45
    if (!bin_unpack_array_fixed(bu, 2, nullptr)) {
75
2
        return false;
76
2
    }
77
78
43
    return bin_unpack_u32(bu, &event->group_number)
79
43
           && bin_unpack_u32(bu, &event->peer_id);
80
45
}
81
82
/*****************************************************
83
 *
84
 * :: new/free/add/get/size/unpack
85
 *
86
 *****************************************************/
87
88
const Tox_Event_Group_Peer_Join *tox_event_get_group_peer_join(const Tox_Event *event)
89
0
{
90
0
    return event->type == TOX_EVENT_GROUP_PEER_JOIN ? event->data.group_peer_join : nullptr;
91
0
}
92
93
Tox_Event_Group_Peer_Join *tox_event_group_peer_join_new(const Memory *mem)
94
114
{
95
114
    Tox_Event_Group_Peer_Join *const group_peer_join =
96
114
        (Tox_Event_Group_Peer_Join *)mem_alloc(mem, sizeof(Tox_Event_Group_Peer_Join));
97
98
114
    if (group_peer_join == nullptr) {
99
1
        return nullptr;
100
1
    }
101
102
113
    tox_event_group_peer_join_construct(group_peer_join);
103
113
    return group_peer_join;
104
114
}
105
106
void tox_event_group_peer_join_free(Tox_Event_Group_Peer_Join *group_peer_join, const Memory *mem)
107
114
{
108
114
    if (group_peer_join != nullptr) {
109
113
        tox_event_group_peer_join_destruct(group_peer_join, mem);
110
113
    }
111
114
    mem_delete(mem, group_peer_join);
112
114
}
113
114
static Tox_Event_Group_Peer_Join *_Nullable tox_events_add_group_peer_join(Tox_Events *_Nonnull events, const Memory *_Nonnull mem)
115
68
{
116
68
    Tox_Event_Group_Peer_Join *const group_peer_join = tox_event_group_peer_join_new(mem);
117
118
68
    if (group_peer_join == nullptr) {
119
0
        return nullptr;
120
0
    }
121
122
68
    Tox_Event event;
123
68
    event.type = TOX_EVENT_GROUP_PEER_JOIN;
124
68
    event.data.group_peer_join = group_peer_join;
125
126
68
    if (!tox_events_add(events, &event)) {
127
0
        tox_event_group_peer_join_free(group_peer_join, mem);
128
0
        return nullptr;
129
0
    }
130
68
    return group_peer_join;
131
68
}
132
133
bool tox_event_group_peer_join_unpack(
134
    Tox_Event_Group_Peer_Join **event, Bin_Unpack *bu, const Memory *mem)
135
46
{
136
46
    assert(event != nullptr);
137
46
    assert(*event == nullptr);
138
46
    *event = tox_event_group_peer_join_new(mem);
139
140
46
    if (*event == nullptr) {
141
1
        return false;
142
1
    }
143
144
45
    return tox_event_group_peer_join_unpack_into(*event, bu);
145
46
}
146
147
static Tox_Event_Group_Peer_Join *_Nullable tox_event_group_peer_join_alloc(Tox_Events_State *_Nonnull state)
148
68
{
149
68
    if (state->events == nullptr) {
150
0
        return nullptr;
151
0
    }
152
153
68
    Tox_Event_Group_Peer_Join *group_peer_join = tox_events_add_group_peer_join(state->events, state->mem);
154
155
68
    if (group_peer_join == nullptr) {
156
0
        state->error = TOX_ERR_EVENTS_ITERATE_MALLOC;
157
0
        return nullptr;
158
0
    }
159
160
68
    return group_peer_join;
161
68
}
162
163
/*****************************************************
164
 *
165
 * :: event handler
166
 *
167
 *****************************************************/
168
169
void tox_events_handle_group_peer_join(
170
    Tox *_Nonnull tox,
171
    uint32_t group_number,
172
    uint32_t peer_id,
173
    void *_Nullable user_data)
174
68
{
175
68
    Tox_Events_State *state = tox_events_alloc(user_data);
176
68
    Tox_Event_Group_Peer_Join *group_peer_join = tox_event_group_peer_join_alloc(state);
177
178
68
    if (group_peer_join == nullptr) {
179
0
        return;
180
0
    }
181
182
68
    tox_event_group_peer_join_set_group_number(group_peer_join, group_number);
183
68
    tox_event_group_peer_join_set_peer_id(group_peer_join, peer_id);
184
68
}
185
186
void tox_events_handle_group_peer_join_dispatch(Tox *tox, const Tox_Event_Group_Peer_Join *event, void *user_data)
187
0
{
188
0
    if (tox->group_peer_join_callback == nullptr) {
189
0
        return;
190
0
    }
191
192
0
    tox_unlock(tox);
193
0
    tox->group_peer_join_callback(tox, event->group_number, event->peer_id, user_data);
194
0
    tox_lock(tox);
195
0
}