Coverage Report

Created: 2026-10-24 08:16

/work/toxcore/tox_unpack.c
Line
Count
Source (jump to first uncovered line)
1
/* SPDX-License-Identifier: GPL-3.0-or-later
2
 * Copyright © 2022-2026 The TokTok team.
3
 */
4
5
#include "tox_unpack.h"
6
7
#include <stdint.h>
8
9
#include "attributes.h"
10
#include "bin_unpack.h"
11
#include "tox.h"
12
13
static bool tox_conference_type_from_int(uint32_t value, Tox_Conference_Type *_Nonnull out_enum)
14
21
{
15
21
    switch (value) {
16
12
        case TOX_CONFERENCE_TYPE_TEXT: {
17
12
            *out_enum = TOX_CONFERENCE_TYPE_TEXT;
18
12
            return true;
19
0
        }
20
21
8
        case TOX_CONFERENCE_TYPE_AV: {
22
8
            *out_enum = TOX_CONFERENCE_TYPE_AV;
23
8
            return true;
24
0
        }
25
26
1
        default: {
27
1
            *out_enum = TOX_CONFERENCE_TYPE_TEXT;
28
1
            return false;
29
0
        }
30
21
    }
31
21
}
32
bool tox_conference_type_unpack(Tox_Conference_Type *val, Bin_Unpack *bu)
33
22
{
34
22
    uint32_t u32;
35
22
    return bin_unpack_u32(bu, &u32)
36
22
           && tox_conference_type_from_int(u32, val);
37
22
}
38
39
static bool tox_connection_from_int(uint32_t value, Tox_Connection *_Nonnull out_enum)
40
202
{
41
202
    switch (value) {
42
113
        case TOX_CONNECTION_NONE: {
43
113
            *out_enum = TOX_CONNECTION_NONE;
44
113
            return true;
45
0
        }
46
47
58
        case TOX_CONNECTION_TCP: {
48
58
            *out_enum = TOX_CONNECTION_TCP;
49
58
            return true;
50
0
        }
51
52
30
        case TOX_CONNECTION_UDP: {
53
30
            *out_enum = TOX_CONNECTION_UDP;
54
30
            return true;
55
0
        }
56
57
1
        default: {
58
1
            *out_enum = TOX_CONNECTION_NONE;
59
1
            return false;
60
0
        }
61
202
    }
62
202
}
63
64
bool tox_connection_unpack(Tox_Connection *val, Bin_Unpack *bu)
65
205
{
66
205
    uint32_t u32;
67
205
    return bin_unpack_u32(bu, &u32)
68
205
           && tox_connection_from_int(u32, val);
69
205
}
70
71
static bool tox_file_control_from_int(uint32_t value, Tox_File_Control *_Nonnull out_enum)
72
29
{
73
29
    switch (value) {
74
11
        case TOX_FILE_CONTROL_RESUME: {
75
11
            *out_enum = TOX_FILE_CONTROL_RESUME;
76
11
            return true;
77
0
        }
78
79
10
        case TOX_FILE_CONTROL_PAUSE: {
80
10
            *out_enum = TOX_FILE_CONTROL_PAUSE;
81
10
            return true;
82
0
        }
83
84
7
        case TOX_FILE_CONTROL_CANCEL: {
85
7
            *out_enum = TOX_FILE_CONTROL_CANCEL;
86
7
            return true;
87
0
        }
88
89
1
        default: {
90
1
            *out_enum = TOX_FILE_CONTROL_RESUME;
91
1
            return false;
92
0
        }
93
29
    }
94
29
}
95
96
bool tox_file_control_unpack(Tox_File_Control *val, Bin_Unpack *bu)
97
31
{
98
31
    uint32_t u32;
99
31
    return bin_unpack_u32(bu, &u32)
100
31
           && tox_file_control_from_int(u32, val);
101
31
}
102
103
static bool tox_message_type_from_int(uint32_t value, Tox_Message_Type *_Nonnull out_enum)
104
82
{
105
82
    switch (value) {
106
30
        case TOX_MESSAGE_TYPE_NORMAL: {
107
30
            *out_enum = TOX_MESSAGE_TYPE_NORMAL;
108
30
            return true;
109
0
        }
110
111
49
        case TOX_MESSAGE_TYPE_ACTION: {
112
49
            *out_enum = TOX_MESSAGE_TYPE_ACTION;
113
49
            return true;
114
0
        }
115
116
3
        default: {
117
3
            *out_enum = TOX_MESSAGE_TYPE_NORMAL;
118
3
            return false;
119
0
        }
120
82
    }
121
82
}
122
123
bool tox_message_type_unpack(Tox_Message_Type *val, Bin_Unpack *bu)
124
88
{
125
88
    uint32_t u32;
126
88
    return bin_unpack_u32(bu, &u32)
127
88
           && tox_message_type_from_int(u32, val);
128
88
}
129
130
static bool tox_user_status_from_int(uint32_t value, Tox_User_Status *_Nonnull out_enum)
131
39
{
132
39
    switch (value) {
133
15
        case TOX_USER_STATUS_NONE: {
134
15
            *out_enum = TOX_USER_STATUS_NONE;
135
15
            return true;
136
0
        }
137
138
12
        case TOX_USER_STATUS_AWAY: {
139
12
            *out_enum = TOX_USER_STATUS_AWAY;
140
12
            return true;
141
0
        }
142
143
11
        case TOX_USER_STATUS_BUSY: {
144
11
            *out_enum = TOX_USER_STATUS_BUSY;
145
11
            return true;
146
0
        }
147
148
1
        default: {
149
1
            *out_enum = TOX_USER_STATUS_NONE;
150
1
            return false;
151
0
        }
152
39
    }
153
39
}
154
155
bool tox_user_status_unpack(Tox_User_Status *val, Bin_Unpack *bu)
156
43
{
157
43
    uint32_t u32;
158
43
    return bin_unpack_u32(bu, &u32)
159
43
           && tox_user_status_from_int(u32, val);
160
43
}
161
162
static bool tox_group_privacy_state_from_int(uint32_t value, Tox_Group_Privacy_State *_Nonnull out_enum)
163
21
{
164
21
    switch (value) {
165
10
        case TOX_GROUP_PRIVACY_STATE_PUBLIC: {
166
10
            *out_enum = TOX_GROUP_PRIVACY_STATE_PUBLIC;
167
10
            return true;
168
0
        }
169
10
        case TOX_GROUP_PRIVACY_STATE_PRIVATE: {
170
10
            *out_enum = TOX_GROUP_PRIVACY_STATE_PRIVATE;
171
10
            return true;
172
0
        }
173
1
        default: {
174
1
            *out_enum = TOX_GROUP_PRIVACY_STATE_PUBLIC;
175
1
            return false;
176
0
        }
177
21
    }
178
21
}
179
bool tox_group_privacy_state_unpack(Tox_Group_Privacy_State *val, Bin_Unpack *bu)
180
22
{
181
22
    uint32_t u32;
182
22
    return bin_unpack_u32(bu, &u32)
183
22
           && tox_group_privacy_state_from_int(u32, val);
184
22
}
185
static bool tox_group_voice_state_from_int(uint32_t value, Tox_Group_Voice_State *_Nonnull out_enum)
186
39
{
187
39
    switch (value) {
188
7
        case TOX_GROUP_VOICE_STATE_ALL: {
189
7
            *out_enum = TOX_GROUP_VOICE_STATE_ALL;
190
7
            return true;
191
0
        }
192
21
        case TOX_GROUP_VOICE_STATE_MODERATOR: {
193
21
            *out_enum = TOX_GROUP_VOICE_STATE_MODERATOR;
194
21
            return true;
195
0
        }
196
10
        case TOX_GROUP_VOICE_STATE_FOUNDER: {
197
10
            *out_enum = TOX_GROUP_VOICE_STATE_FOUNDER;
198
10
            return true;
199
0
        }
200
1
        default: {
201
1
            *out_enum = TOX_GROUP_VOICE_STATE_ALL;
202
1
            return false;
203
0
        }
204
39
    }
205
39
}
206
bool tox_group_voice_state_unpack(Tox_Group_Voice_State *val, Bin_Unpack *bu)
207
40
{
208
40
    uint32_t u32;
209
40
    return bin_unpack_u32(bu, &u32)
210
40
           && tox_group_voice_state_from_int(u32, val);
211
40
}
212
213
static bool tox_group_topic_lock_from_int(uint32_t value, Tox_Group_Topic_Lock *_Nonnull out_enum)
214
21
{
215
21
    switch (value) {
216
10
        case TOX_GROUP_TOPIC_LOCK_ENABLED: {
217
10
            *out_enum = TOX_GROUP_TOPIC_LOCK_ENABLED;
218
10
            return true;
219
0
        }
220
10
        case TOX_GROUP_TOPIC_LOCK_DISABLED: {
221
10
            *out_enum = TOX_GROUP_TOPIC_LOCK_DISABLED;
222
10
            return true;
223
0
        }
224
1
        default: {
225
1
            *out_enum = TOX_GROUP_TOPIC_LOCK_ENABLED;
226
1
            return false;
227
0
        }
228
21
    }
229
21
}
230
bool tox_group_topic_lock_unpack(Tox_Group_Topic_Lock *val, Bin_Unpack *bu)
231
22
{
232
22
    uint32_t u32;
233
22
    return bin_unpack_u32(bu, &u32)
234
22
           && tox_group_topic_lock_from_int(u32, val);
235
22
}
236
237
static bool tox_group_join_fail_from_int(uint32_t value, Tox_Group_Join_Fail *_Nonnull out_enum)
238
30
{
239
30
    switch (value) {
240
5
        case TOX_GROUP_JOIN_FAIL_PEER_LIMIT: {
241
5
            *out_enum = TOX_GROUP_JOIN_FAIL_PEER_LIMIT;
242
5
            return true;
243
0
        }
244
10
        case TOX_GROUP_JOIN_FAIL_INVALID_PASSWORD: {
245
10
            *out_enum = TOX_GROUP_JOIN_FAIL_INVALID_PASSWORD;
246
10
            return true;
247
0
        }
248
14
        case TOX_GROUP_JOIN_FAIL_UNKNOWN: {
249
14
            *out_enum = TOX_GROUP_JOIN_FAIL_UNKNOWN;
250
14
            return true;
251
0
        }
252
1
        default: {
253
1
            *out_enum = TOX_GROUP_JOIN_FAIL_PEER_LIMIT;
254
1
            return false;
255
0
        }
256
30
    }
257
30
}
258
bool tox_group_join_fail_unpack(Tox_Group_Join_Fail *val, Bin_Unpack *bu)
259
32
{
260
32
    uint32_t u32;
261
32
    return bin_unpack_u32(bu, &u32)
262
32
           && tox_group_join_fail_from_int(u32, val);
263
32
}
264
265
static bool tox_group_mod_event_from_int(uint32_t value, Tox_Group_Mod_Event *_Nonnull out_enum)
266
31
{
267
31
    switch (value) {
268
6
        case TOX_GROUP_MOD_EVENT_KICK: {
269
6
            *out_enum = TOX_GROUP_MOD_EVENT_KICK;
270
6
            return true;
271
0
        }
272
3
        case TOX_GROUP_MOD_EVENT_OBSERVER: {
273
3
            *out_enum = TOX_GROUP_MOD_EVENT_OBSERVER;
274
3
            return true;
275
0
        }
276
10
        case TOX_GROUP_MOD_EVENT_USER: {
277
10
            *out_enum = TOX_GROUP_MOD_EVENT_USER;
278
10
            return true;
279
0
        }
280
10
        case TOX_GROUP_MOD_EVENT_MODERATOR: {
281
10
            *out_enum = TOX_GROUP_MOD_EVENT_MODERATOR;
282
10
            return true;
283
0
        }
284
2
        default: {
285
2
            *out_enum = TOX_GROUP_MOD_EVENT_KICK;
286
2
            return false;
287
0
        }
288
31
    }
289
31
}
290
bool tox_group_mod_event_unpack(Tox_Group_Mod_Event *val, Bin_Unpack *bu)
291
35
{
292
35
    uint32_t u32;
293
35
    return bin_unpack_u32(bu, &u32)
294
35
           && tox_group_mod_event_from_int(u32, val);
295
35
}
296
297
static bool tox_group_exit_type_from_int(uint32_t value, Tox_Group_Exit_Type *_Nonnull out_enum)
298
48
{
299
48
    switch (value) {
300
7
        case TOX_GROUP_EXIT_TYPE_QUIT: {
301
7
            *out_enum = TOX_GROUP_EXIT_TYPE_QUIT;
302
7
            return true;
303
0
        }
304
18
        case TOX_GROUP_EXIT_TYPE_TIMEOUT: {
305
18
            *out_enum = TOX_GROUP_EXIT_TYPE_TIMEOUT;
306
18
            return true;
307
0
        }
308
3
        case TOX_GROUP_EXIT_TYPE_DISCONNECTED: {
309
3
            *out_enum = TOX_GROUP_EXIT_TYPE_DISCONNECTED;
310
3
            return true;
311
0
        }
312
10
        case TOX_GROUP_EXIT_TYPE_SELF_DISCONNECTED: {
313
10
            *out_enum = TOX_GROUP_EXIT_TYPE_SELF_DISCONNECTED;
314
10
            return true;
315
0
        }
316
6
        case TOX_GROUP_EXIT_TYPE_KICK: {
317
6
            *out_enum = TOX_GROUP_EXIT_TYPE_KICK;
318
6
            return true;
319
0
        }
320
3
        case TOX_GROUP_EXIT_TYPE_SYNC_ERROR: {
321
3
            *out_enum = TOX_GROUP_EXIT_TYPE_SYNC_ERROR;
322
3
            return true;
323
0
        }
324
1
        default: {
325
1
            *out_enum = TOX_GROUP_EXIT_TYPE_QUIT;
326
1
            return false;
327
0
        }
328
48
    }
329
48
}
330
bool tox_group_exit_type_unpack(Tox_Group_Exit_Type *val, Bin_Unpack *bu)
331
49
{
332
49
    uint32_t u32;
333
49
    return bin_unpack_u32(bu, &u32)
334
49
           && tox_group_exit_type_from_int(u32, val);
335
49
}