Coverage Report

Created: 2024-01-26 01:52

/work/toxcore/events/group_peer_status.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
#include "../tox_pack.h"
16
#include "../tox_unpack.h"
17
18
19
/*****************************************************
20
 *
21
 * :: struct and accessors
22
 *
23
 *****************************************************/
24
25
26
struct Tox_Event_Group_Peer_Status {
27
    uint32_t group_number;
28
    uint32_t peer_id;
29
    Tox_User_Status status;
30
};
31
32
non_null()
33
static void tox_event_group_peer_status_set_group_number(Tox_Event_Group_Peer_Status *group_peer_status,
34
        uint32_t group_number)
35
41
{
36
41
    assert(group_peer_status != nullptr);
37
41
    group_peer_status->group_number = group_number;
38
41
}
39
uint32_t tox_event_group_peer_status_get_group_number(const Tox_Event_Group_Peer_Status *group_peer_status)
40
1
{
41
1
    assert(group_peer_status != nullptr);
42
1
    return group_peer_status->group_number;
43
1
}
44
45
non_null()
46
static void tox_event_group_peer_status_set_peer_id(Tox_Event_Group_Peer_Status *group_peer_status,
47
        uint32_t peer_id)
48
41
{
49
41
    assert(group_peer_status != nullptr);
50
41
    group_peer_status->peer_id = peer_id;
51
41
}
52
uint32_t tox_event_group_peer_status_get_peer_id(const Tox_Event_Group_Peer_Status *group_peer_status)
53
1
{
54
1
    assert(group_peer_status != nullptr);
55
1
    return group_peer_status->peer_id;
56
1
}
57
58
non_null()
59
static void tox_event_group_peer_status_set_status(Tox_Event_Group_Peer_Status *group_peer_status,
60
        Tox_User_Status status)
61
41
{
62
41
    assert(group_peer_status != nullptr);
63
41
    group_peer_status->status = status;
64
41
}
65
Tox_User_Status tox_event_group_peer_status_get_status(const Tox_Event_Group_Peer_Status *group_peer_status)
66
1
{
67
1
    assert(group_peer_status != nullptr);
68
1
    return group_peer_status->status;
69
1
}
70
71
non_null()
72
static void tox_event_group_peer_status_construct(Tox_Event_Group_Peer_Status *group_peer_status)
73
59
{
74
59
    *group_peer_status = (Tox_Event_Group_Peer_Status) {
75
59
        0
76
59
    };
77
59
}
78
non_null()
79
static void tox_event_group_peer_status_destruct(Tox_Event_Group_Peer_Status *group_peer_status, const Memory *mem)
80
58
{
81
58
    return;
82
58
}
83
84
bool tox_event_group_peer_status_pack(
85
    const Tox_Event_Group_Peer_Status *event, Bin_Pack *bp)
86
12
{
87
12
    return bin_pack_array(bp, 3)
88
12
           && bin_pack_u32(bp, event->group_number)
89
12
           && bin_pack_u32(bp, event->peer_id)
90
12
           && tox_user_status_pack(event->status, bp);
91
12
}
92
93
non_null()
94
static bool tox_event_group_peer_status_unpack_into(
95
    Tox_Event_Group_Peer_Status *event, Bin_Unpack *bu)
96
18
{
97
18
    assert(event != nullptr);
98
18
    if (!bin_unpack_array_fixed(bu, 3, nullptr)) {
99
2
        return false;
100
2
    }
101
102
16
    return bin_unpack_u32(bu, &event->group_number)
103
16
           && bin_unpack_u32(bu, &event->peer_id)
104
16
           && tox_user_status_unpack(&event->status, bu);
105
18
}
106
107
108
/*****************************************************
109
 *
110
 * :: new/free/add/get/size/unpack
111
 *
112
 *****************************************************/
113
114
const Tox_Event_Group_Peer_Status *tox_event_get_group_peer_status(const Tox_Event *event)
115
0
{
116
0
    return event->type == TOX_EVENT_GROUP_PEER_STATUS ? event->data.group_peer_status : nullptr;
117
0
}
118
119
Tox_Event_Group_Peer_Status *tox_event_group_peer_status_new(const Memory *mem)
120
61
{
121
61
    Tox_Event_Group_Peer_Status *const group_peer_status =
122
61
        (Tox_Event_Group_Peer_Status *)mem_alloc(mem, sizeof(Tox_Event_Group_Peer_Status));
123
124
61
    if (group_peer_status == nullptr) {
125
2
        return nullptr;
126
2
    }
127
128
59
    tox_event_group_peer_status_construct(group_peer_status);
129
59
    return group_peer_status;
130
61
}
131
132
void tox_event_group_peer_status_free(Tox_Event_Group_Peer_Status *group_peer_status, const Memory *mem)
133
59
{
134
59
    if (group_peer_status != nullptr) {
135
58
        tox_event_group_peer_status_destruct(group_peer_status, mem);
136
58
    }
137
59
    mem_delete(mem, group_peer_status);
138
59
}
139
140
non_null()
141
static Tox_Event_Group_Peer_Status *tox_events_add_group_peer_status(Tox_Events *events, const Memory *mem)
142
42
{
143
42
    Tox_Event_Group_Peer_Status *const group_peer_status = tox_event_group_peer_status_new(mem);
144
145
42
    if (group_peer_status == nullptr) {
146
1
        return nullptr;
147
1
    }
148
149
41
    Tox_Event event;
150
41
    event.type = TOX_EVENT_GROUP_PEER_STATUS;
151
41
    event.data.group_peer_status = group_peer_status;
152
153
41
    tox_events_add(events, &event);
154
41
    return group_peer_status;
155
42
}
156
157
bool tox_event_group_peer_status_unpack(
158
    Tox_Event_Group_Peer_Status **event, Bin_Unpack *bu, const Memory *mem)
159
19
{
160
19
    assert(event != nullptr);
161
19
    assert(*event == nullptr);
162
19
    *event = tox_event_group_peer_status_new(mem);
163
164
19
    if (*event == nullptr) {
165
1
        return false;
166
1
    }
167
168
18
    return tox_event_group_peer_status_unpack_into(*event, bu);
169
19
}
170
171
non_null()
172
static Tox_Event_Group_Peer_Status *tox_event_group_peer_status_alloc(void *user_data)
173
43
{
174
43
    Tox_Events_State *state = tox_events_alloc(user_data);
175
43
    assert(state != nullptr);
176
177
43
    if (state->events == nullptr) {
178
1
        return nullptr;
179
1
    }
180
181
42
    Tox_Event_Group_Peer_Status *group_peer_status = tox_events_add_group_peer_status(state->events, state->mem);
182
183
42
    if (group_peer_status == nullptr) {
184
1
        state->error = TOX_ERR_EVENTS_ITERATE_MALLOC;
185
1
        return nullptr;
186
1
    }
187
188
41
    return group_peer_status;
189
42
}
190
191
192
/*****************************************************
193
 *
194
 * :: event handler
195
 *
196
 *****************************************************/
197
198
199
void tox_events_handle_group_peer_status(Tox *tox, uint32_t group_number, uint32_t peer_id, Tox_User_Status status,
200
        void *user_data)
201
43
{
202
43
    Tox_Event_Group_Peer_Status *group_peer_status = tox_event_group_peer_status_alloc(user_data);
203
204
43
    if (group_peer_status == nullptr) {
205
2
        return;
206
2
    }
207
208
41
    tox_event_group_peer_status_set_group_number(group_peer_status, group_number);
209
41
    tox_event_group_peer_status_set_peer_id(group_peer_status, peer_id);
210
41
    tox_event_group_peer_status_set_status(group_peer_status, status);
211
41
}