Coverage Report

Created: 2025-10-08 19:34

/work/toxcore/tox_event.c
Line
Count
Source (jump to first uncovered line)
1
/* SPDX-License-Identifier: GPL-3.0-or-later
2
 * Copyright © 2022-2025 The TokTok team.
3
 */
4
5
#include "tox_event.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_events.h"
15
16
const char *tox_event_type_to_string(Tox_Event_Type type)
17
0
{
18
0
    switch (type) {
19
0
        case TOX_EVENT_SELF_CONNECTION_STATUS:
20
0
            return "TOX_EVENT_SELF_CONNECTION_STATUS";
21
22
0
        case TOX_EVENT_FRIEND_REQUEST:
23
0
            return "TOX_EVENT_FRIEND_REQUEST";
24
25
0
        case TOX_EVENT_FRIEND_CONNECTION_STATUS:
26
0
            return "TOX_EVENT_FRIEND_CONNECTION_STATUS";
27
28
0
        case TOX_EVENT_FRIEND_LOSSY_PACKET:
29
0
            return "TOX_EVENT_FRIEND_LOSSY_PACKET";
30
31
0
        case TOX_EVENT_FRIEND_LOSSLESS_PACKET:
32
0
            return "TOX_EVENT_FRIEND_LOSSLESS_PACKET";
33
34
0
        case TOX_EVENT_FRIEND_NAME:
35
0
            return "TOX_EVENT_FRIEND_NAME";
36
37
0
        case TOX_EVENT_FRIEND_STATUS:
38
0
            return "TOX_EVENT_FRIEND_STATUS";
39
40
0
        case TOX_EVENT_FRIEND_STATUS_MESSAGE:
41
0
            return "TOX_EVENT_FRIEND_STATUS_MESSAGE";
42
43
0
        case TOX_EVENT_FRIEND_MESSAGE:
44
0
            return "TOX_EVENT_FRIEND_MESSAGE";
45
46
0
        case TOX_EVENT_FRIEND_READ_RECEIPT:
47
0
            return "TOX_EVENT_FRIEND_READ_RECEIPT";
48
49
0
        case TOX_EVENT_FRIEND_TYPING:
50
0
            return "TOX_EVENT_FRIEND_TYPING";
51
52
0
        case TOX_EVENT_FILE_CHUNK_REQUEST:
53
0
            return "TOX_EVENT_FILE_CHUNK_REQUEST";
54
55
0
        case TOX_EVENT_FILE_RECV:
56
0
            return "TOX_EVENT_FILE_RECV";
57
58
0
        case TOX_EVENT_FILE_RECV_CHUNK:
59
0
            return "TOX_EVENT_FILE_RECV_CHUNK";
60
61
0
        case TOX_EVENT_FILE_RECV_CONTROL:
62
0
            return "TOX_EVENT_FILE_RECV_CONTROL";
63
64
0
        case TOX_EVENT_CONFERENCE_INVITE:
65
0
            return "TOX_EVENT_CONFERENCE_INVITE";
66
67
0
        case TOX_EVENT_CONFERENCE_CONNECTED:
68
0
            return "TOX_EVENT_CONFERENCE_CONNECTED";
69
70
0
        case TOX_EVENT_CONFERENCE_PEER_LIST_CHANGED:
71
0
            return "TOX_EVENT_CONFERENCE_PEER_LIST_CHANGED";
72
73
0
        case TOX_EVENT_CONFERENCE_PEER_NAME:
74
0
            return "TOX_EVENT_CONFERENCE_PEER_NAME";
75
76
0
        case TOX_EVENT_CONFERENCE_TITLE:
77
0
            return "TOX_EVENT_CONFERENCE_TITLE";
78
79
0
        case TOX_EVENT_CONFERENCE_MESSAGE:
80
0
            return "TOX_EVENT_CONFERENCE_MESSAGE";
81
82
0
        case TOX_EVENT_GROUP_PEER_NAME:
83
0
            return "TOX_EVENT_GROUP_PEER_NAME";
84
85
0
        case TOX_EVENT_GROUP_PEER_STATUS:
86
0
            return "TOX_EVENT_GROUP_PEER_STATUS";
87
88
0
        case TOX_EVENT_GROUP_TOPIC:
89
0
            return "TOX_EVENT_GROUP_TOPIC";
90
91
0
        case TOX_EVENT_GROUP_PRIVACY_STATE:
92
0
            return "TOX_EVENT_GROUP_PRIVACY_STATE";
93
94
0
        case TOX_EVENT_GROUP_VOICE_STATE:
95
0
            return "TOX_EVENT_GROUP_VOICE_STATE";
96
97
0
        case TOX_EVENT_GROUP_TOPIC_LOCK:
98
0
            return "TOX_EVENT_GROUP_TOPIC_LOCK";
99
100
0
        case TOX_EVENT_GROUP_PEER_LIMIT:
101
0
            return "TOX_EVENT_GROUP_PEER_LIMIT";
102
103
0
        case TOX_EVENT_GROUP_PASSWORD:
104
0
            return "TOX_EVENT_GROUP_PASSWORD";
105
106
0
        case TOX_EVENT_GROUP_MESSAGE:
107
0
            return "TOX_EVENT_GROUP_MESSAGE";
108
109
0
        case TOX_EVENT_GROUP_PRIVATE_MESSAGE:
110
0
            return "TOX_EVENT_GROUP_PRIVATE_MESSAGE";
111
112
0
        case TOX_EVENT_GROUP_CUSTOM_PACKET:
113
0
            return "TOX_EVENT_GROUP_CUSTOM_PACKET";
114
115
0
        case TOX_EVENT_GROUP_CUSTOM_PRIVATE_PACKET:
116
0
            return "TOX_EVENT_GROUP_CUSTOM_PRIVATE_PACKET";
117
118
0
        case TOX_EVENT_GROUP_INVITE:
119
0
            return "TOX_EVENT_GROUP_INVITE";
120
121
0
        case TOX_EVENT_GROUP_PEER_JOIN:
122
0
            return "TOX_EVENT_GROUP_PEER_JOIN";
123
124
0
        case TOX_EVENT_GROUP_PEER_EXIT:
125
0
            return "TOX_EVENT_GROUP_PEER_EXIT";
126
127
0
        case TOX_EVENT_GROUP_SELF_JOIN:
128
0
            return "TOX_EVENT_GROUP_SELF_JOIN";
129
130
0
        case TOX_EVENT_GROUP_JOIN_FAIL:
131
0
            return "TOX_EVENT_GROUP_JOIN_FAIL";
132
133
0
        case TOX_EVENT_GROUP_MODERATION:
134
0
            return "TOX_EVENT_GROUP_MODERATION";
135
136
0
        case TOX_EVENT_DHT_NODES_RESPONSE:
137
0
            return "TOX_EVENT_DHT_NODES_RESPONSE";
138
139
0
        case TOX_EVENT_INVALID:
140
0
            return "TOX_EVENT_INVALID";
141
0
    }
142
143
0
    return "<invalid Tox_Event_Type>";
144
0
}
145
146
Tox_Event_Type tox_event_get_type(const Tox_Event *event)
147
5
{
148
5
    assert(event != nullptr);
149
5
    return event->type;
150
5
}
151
152
bool tox_event_construct(Tox_Event *event, Tox_Event_Type type, const Memory *mem)
153
0
{
154
0
    event->type = type;
155
0
    event->data.value = nullptr;
156
157
0
    switch (type) {
158
0
        case TOX_EVENT_CONFERENCE_CONNECTED: {
159
0
            event->data.conference_connected = tox_event_conference_connected_new(mem);
160
0
            break;
161
0
        }
162
163
0
        case TOX_EVENT_CONFERENCE_INVITE: {
164
0
            event->data.conference_invite = tox_event_conference_invite_new(mem);
165
0
            break;
166
0
        }
167
168
0
        case TOX_EVENT_CONFERENCE_MESSAGE: {
169
0
            event->data.conference_message = tox_event_conference_message_new(mem);
170
0
            break;
171
0
        }
172
173
0
        case TOX_EVENT_CONFERENCE_PEER_LIST_CHANGED: {
174
0
            event->data.conference_peer_list_changed = tox_event_conference_peer_list_changed_new(mem);
175
0
            break;
176
0
        }
177
178
0
        case TOX_EVENT_CONFERENCE_PEER_NAME: {
179
0
            event->data.conference_peer_name = tox_event_conference_peer_name_new(mem);
180
0
            break;
181
0
        }
182
183
0
        case TOX_EVENT_CONFERENCE_TITLE: {
184
0
            event->data.conference_title = tox_event_conference_title_new(mem);
185
0
            break;
186
0
        }
187
188
0
        case TOX_EVENT_FILE_CHUNK_REQUEST: {
189
0
            event->data.file_chunk_request = tox_event_file_chunk_request_new(mem);
190
0
            break;
191
0
        }
192
193
0
        case TOX_EVENT_FILE_RECV_CHUNK: {
194
0
            event->data.file_recv_chunk = tox_event_file_recv_chunk_new(mem);
195
0
            break;
196
0
        }
197
198
0
        case TOX_EVENT_FILE_RECV_CONTROL: {
199
0
            event->data.file_recv_control = tox_event_file_recv_control_new(mem);
200
0
            break;
201
0
        }
202
203
0
        case TOX_EVENT_FILE_RECV: {
204
0
            event->data.file_recv = tox_event_file_recv_new(mem);
205
0
            break;
206
0
        }
207
208
0
        case TOX_EVENT_FRIEND_CONNECTION_STATUS: {
209
0
            event->data.friend_connection_status = tox_event_friend_connection_status_new(mem);
210
0
            break;
211
0
        }
212
213
0
        case TOX_EVENT_FRIEND_LOSSLESS_PACKET: {
214
0
            event->data.friend_lossless_packet = tox_event_friend_lossless_packet_new(mem);
215
0
            break;
216
0
        }
217
218
0
        case TOX_EVENT_FRIEND_LOSSY_PACKET: {
219
0
            event->data.friend_lossy_packet = tox_event_friend_lossy_packet_new(mem);
220
0
            break;
221
0
        }
222
223
0
        case TOX_EVENT_FRIEND_MESSAGE: {
224
0
            event->data.friend_message = tox_event_friend_message_new(mem);
225
0
            break;
226
0
        }
227
228
0
        case TOX_EVENT_FRIEND_NAME: {
229
0
            event->data.friend_name = tox_event_friend_name_new(mem);
230
0
            break;
231
0
        }
232
233
0
        case TOX_EVENT_FRIEND_READ_RECEIPT: {
234
0
            event->data.friend_read_receipt = tox_event_friend_read_receipt_new(mem);
235
0
            break;
236
0
        }
237
238
0
        case TOX_EVENT_FRIEND_REQUEST: {
239
0
            event->data.friend_request = tox_event_friend_request_new(mem);
240
0
            break;
241
0
        }
242
243
0
        case TOX_EVENT_FRIEND_STATUS: {
244
0
            event->data.friend_status = tox_event_friend_status_new(mem);
245
0
            break;
246
0
        }
247
248
0
        case TOX_EVENT_FRIEND_STATUS_MESSAGE: {
249
0
            event->data.friend_status_message = tox_event_friend_status_message_new(mem);
250
0
            break;
251
0
        }
252
253
0
        case TOX_EVENT_FRIEND_TYPING: {
254
0
            event->data.friend_typing = tox_event_friend_typing_new(mem);
255
0
            break;
256
0
        }
257
258
0
        case TOX_EVENT_SELF_CONNECTION_STATUS: {
259
0
            event->data.self_connection_status = tox_event_self_connection_status_new(mem);
260
0
            break;
261
0
        }
262
263
0
        case TOX_EVENT_GROUP_PEER_NAME: {
264
0
            event->data.group_peer_name = tox_event_group_peer_name_new(mem);
265
0
            break;
266
0
        }
267
268
0
        case TOX_EVENT_GROUP_PEER_STATUS: {
269
0
            event->data.group_peer_status = tox_event_group_peer_status_new(mem);
270
0
            break;
271
0
        }
272
273
0
        case TOX_EVENT_GROUP_TOPIC: {
274
0
            event->data.group_topic = tox_event_group_topic_new(mem);
275
0
            break;
276
0
        }
277
278
0
        case TOX_EVENT_GROUP_PRIVACY_STATE: {
279
0
            event->data.group_privacy_state = tox_event_group_privacy_state_new(mem);
280
0
            break;
281
0
        }
282
283
0
        case TOX_EVENT_GROUP_VOICE_STATE: {
284
0
            event->data.group_voice_state = tox_event_group_voice_state_new(mem);
285
0
            break;
286
0
        }
287
288
0
        case TOX_EVENT_GROUP_TOPIC_LOCK: {
289
0
            event->data.group_topic_lock = tox_event_group_topic_lock_new(mem);
290
0
            break;
291
0
        }
292
293
0
        case TOX_EVENT_GROUP_PEER_LIMIT: {
294
0
            event->data.group_peer_limit = tox_event_group_peer_limit_new(mem);
295
0
            break;
296
0
        }
297
298
0
        case TOX_EVENT_GROUP_PASSWORD: {
299
0
            event->data.group_password = tox_event_group_password_new(mem);
300
0
            break;
301
0
        }
302
303
0
        case TOX_EVENT_GROUP_MESSAGE: {
304
0
            event->data.group_message = tox_event_group_message_new(mem);
305
0
            break;
306
0
        }
307
308
0
        case TOX_EVENT_GROUP_PRIVATE_MESSAGE: {
309
0
            event->data.group_private_message = tox_event_group_private_message_new(mem);
310
0
            break;
311
0
        }
312
313
0
        case TOX_EVENT_GROUP_CUSTOM_PACKET: {
314
0
            event->data.group_custom_packet = tox_event_group_custom_packet_new(mem);
315
0
            break;
316
0
        }
317
318
0
        case TOX_EVENT_GROUP_CUSTOM_PRIVATE_PACKET: {
319
0
            event->data.group_custom_private_packet = tox_event_group_custom_private_packet_new(mem);
320
0
            break;
321
0
        }
322
323
0
        case TOX_EVENT_GROUP_INVITE: {
324
0
            event->data.group_invite = tox_event_group_invite_new(mem);
325
0
            break;
326
0
        }
327
328
0
        case TOX_EVENT_GROUP_PEER_JOIN: {
329
0
            event->data.group_peer_join = tox_event_group_peer_join_new(mem);
330
0
            break;
331
0
        }
332
333
0
        case TOX_EVENT_GROUP_PEER_EXIT: {
334
0
            event->data.group_peer_exit = tox_event_group_peer_exit_new(mem);
335
0
            break;
336
0
        }
337
338
0
        case TOX_EVENT_GROUP_SELF_JOIN: {
339
0
            event->data.group_self_join = tox_event_group_self_join_new(mem);
340
0
            break;
341
0
        }
342
343
0
        case TOX_EVENT_GROUP_JOIN_FAIL: {
344
0
            event->data.group_join_fail = tox_event_group_join_fail_new(mem);
345
0
            break;
346
0
        }
347
348
0
        case TOX_EVENT_GROUP_MODERATION: {
349
0
            event->data.group_moderation = tox_event_group_moderation_new(mem);
350
0
            break;
351
0
        }
352
353
0
        case TOX_EVENT_DHT_NODES_RESPONSE: {
354
0
            event->data.dht_nodes_response = tox_event_dht_nodes_response_new(mem);
355
0
            break;
356
0
        }
357
358
0
        case TOX_EVENT_INVALID: {
359
0
            return false;
360
0
        }
361
0
    }
362
363
0
    return event->data.value != nullptr;
364
0
}
365
366
void tox_event_destruct(Tox_Event *event, const Memory *mem)
367
463k
{
368
463k
    if (event == nullptr) {
369
0
        return;
370
0
    }
371
372
463k
    switch (event->type) {
373
53
        case TOX_EVENT_CONFERENCE_CONNECTED: {
374
53
            tox_event_conference_connected_free(event->data.conference_connected, mem);
375
53
            break;
376
0
        }
377
378
62
        case TOX_EVENT_CONFERENCE_INVITE: {
379
62
            tox_event_conference_invite_free(event->data.conference_invite, mem);
380
62
            break;
381
0
        }
382
383
24
        case TOX_EVENT_CONFERENCE_MESSAGE: {
384
24
            tox_event_conference_message_free(event->data.conference_message, mem);
385
24
            break;
386
0
        }
387
388
753
        case TOX_EVENT_CONFERENCE_PEER_LIST_CHANGED: {
389
753
            tox_event_conference_peer_list_changed_free(event->data.conference_peer_list_changed, mem);
390
753
            break;
391
0
        }
392
393
21
        case TOX_EVENT_CONFERENCE_PEER_NAME: {
394
21
            tox_event_conference_peer_name_free(event->data.conference_peer_name, mem);
395
21
            break;
396
0
        }
397
398
55
        case TOX_EVENT_CONFERENCE_TITLE: {
399
55
            tox_event_conference_title_free(event->data.conference_title, mem);
400
55
            break;
401
0
        }
402
403
76.7k
        case TOX_EVENT_FILE_CHUNK_REQUEST: {
404
76.7k
            tox_event_file_chunk_request_free(event->data.file_chunk_request, mem);
405
76.7k
            break;
406
0
        }
407
408
76.5k
        case TOX_EVENT_FILE_RECV_CHUNK: {
409
76.5k
            tox_event_file_recv_chunk_free(event->data.file_recv_chunk, mem);
410
76.5k
            break;
411
0
        }
412
413
40
        case TOX_EVENT_FILE_RECV_CONTROL: {
414
40
            tox_event_file_recv_control_free(event->data.file_recv_control, mem);
415
40
            break;
416
0
        }
417
418
34
        case TOX_EVENT_FILE_RECV: {
419
34
            tox_event_file_recv_free(event->data.file_recv, mem);
420
34
            break;
421
0
        }
422
423
1.11k
        case TOX_EVENT_FRIEND_CONNECTION_STATUS: {
424
1.11k
            tox_event_friend_connection_status_free(event->data.friend_connection_status, mem);
425
1.11k
            break;
426
0
        }
427
428
27
        case TOX_EVENT_FRIEND_LOSSLESS_PACKET: {
429
27
            tox_event_friend_lossless_packet_free(event->data.friend_lossless_packet, mem);
430
27
            break;
431
0
        }
432
433
31
        case TOX_EVENT_FRIEND_LOSSY_PACKET: {
434
31
            tox_event_friend_lossy_packet_free(event->data.friend_lossy_packet, mem);
435
31
            break;
436
0
        }
437
438
66.0k
        case TOX_EVENT_FRIEND_MESSAGE: {
439
66.0k
            tox_event_friend_message_free(event->data.friend_message, mem);
440
66.0k
            break;
441
0
        }
442
443
1.01k
        case TOX_EVENT_FRIEND_NAME: {
444
1.01k
            tox_event_friend_name_free(event->data.friend_name, mem);
445
1.01k
            break;
446
0
        }
447
448
66.0k
        case TOX_EVENT_FRIEND_READ_RECEIPT: {
449
66.0k
            tox_event_friend_read_receipt_free(event->data.friend_read_receipt, mem);
450
66.0k
            break;
451
0
        }
452
453
163
        case TOX_EVENT_FRIEND_REQUEST: {
454
163
            tox_event_friend_request_free(event->data.friend_request, mem);
455
163
            break;
456
0
        }
457
458
1.01k
        case TOX_EVENT_FRIEND_STATUS: {
459
1.01k
            tox_event_friend_status_free(event->data.friend_status, mem);
460
1.01k
            break;
461
0
        }
462
463
1.00k
        case TOX_EVENT_FRIEND_STATUS_MESSAGE: {
464
1.00k
            tox_event_friend_status_message_free(event->data.friend_status_message, mem);
465
1.00k
            break;
466
0
        }
467
468
1.04k
        case TOX_EVENT_FRIEND_TYPING: {
469
1.04k
            tox_event_friend_typing_free(event->data.friend_typing, mem);
470
1.04k
            break;
471
0
        }
472
473
961
        case TOX_EVENT_SELF_CONNECTION_STATUS: {
474
961
            tox_event_self_connection_status_free(event->data.self_connection_status, mem);
475
961
            break;
476
0
        }
477
478
62
        case TOX_EVENT_GROUP_PEER_NAME: {
479
62
            tox_event_group_peer_name_free(event->data.group_peer_name, mem);
480
62
            break;
481
0
        }
482
483
61
        case TOX_EVENT_GROUP_PEER_STATUS: {
484
61
            tox_event_group_peer_status_free(event->data.group_peer_status, mem);
485
61
            break;
486
0
        }
487
488
639
        case TOX_EVENT_GROUP_TOPIC: {
489
639
            tox_event_group_topic_free(event->data.group_topic, mem);
490
639
            break;
491
0
        }
492
493
116
        case TOX_EVENT_GROUP_PRIVACY_STATE: {
494
116
            tox_event_group_privacy_state_free(event->data.group_privacy_state, mem);
495
116
            break;
496
0
        }
497
498
66
        case TOX_EVENT_GROUP_VOICE_STATE: {
499
66
            tox_event_group_voice_state_free(event->data.group_voice_state, mem);
500
66
            break;
501
0
        }
502
503
79
        case TOX_EVENT_GROUP_TOPIC_LOCK: {
504
79
            tox_event_group_topic_lock_free(event->data.group_topic_lock, mem);
505
79
            break;
506
0
        }
507
508
62
        case TOX_EVENT_GROUP_PEER_LIMIT: {
509
62
            tox_event_group_peer_limit_free(event->data.group_peer_limit, mem);
510
62
            break;
511
0
        }
512
513
69
        case TOX_EVENT_GROUP_PASSWORD: {
514
69
            tox_event_group_password_free(event->data.group_password, mem);
515
69
            break;
516
0
        }
517
518
9.36k
        case TOX_EVENT_GROUP_MESSAGE: {
519
9.36k
            tox_event_group_message_free(event->data.group_message, mem);
520
9.36k
            break;
521
0
        }
522
523
33
        case TOX_EVENT_GROUP_PRIVATE_MESSAGE: {
524
33
            tox_event_group_private_message_free(event->data.group_private_message, mem);
525
33
            break;
526
0
        }
527
528
18
        case TOX_EVENT_GROUP_CUSTOM_PACKET: {
529
18
            tox_event_group_custom_packet_free(event->data.group_custom_packet, mem);
530
18
            break;
531
0
        }
532
533
22
        case TOX_EVENT_GROUP_CUSTOM_PRIVATE_PACKET: {
534
22
            tox_event_group_custom_private_packet_free(event->data.group_custom_private_packet, mem);
535
22
            break;
536
0
        }
537
538
132
        case TOX_EVENT_GROUP_INVITE: {
539
132
            tox_event_group_invite_free(event->data.group_invite, mem);
540
132
            break;
541
0
        }
542
543
281
        case TOX_EVENT_GROUP_PEER_JOIN: {
544
281
            tox_event_group_peer_join_free(event->data.group_peer_join, mem);
545
281
            break;
546
0
        }
547
548
65
        case TOX_EVENT_GROUP_PEER_EXIT: {
549
65
            tox_event_group_peer_exit_free(event->data.group_peer_exit, mem);
550
65
            break;
551
0
        }
552
553
150
        case TOX_EVENT_GROUP_SELF_JOIN: {
554
150
            tox_event_group_self_join_free(event->data.group_self_join, mem);
555
150
            break;
556
0
        }
557
558
31
        case TOX_EVENT_GROUP_JOIN_FAIL: {
559
31
            tox_event_group_join_fail_free(event->data.group_join_fail, mem);
560
31
            break;
561
0
        }
562
563
179
        case TOX_EVENT_GROUP_MODERATION: {
564
179
            tox_event_group_moderation_free(event->data.group_moderation, mem);
565
179
            break;
566
0
        }
567
568
158k
        case TOX_EVENT_DHT_NODES_RESPONSE: {
569
158k
            tox_event_dht_nodes_response_free(event->data.dht_nodes_response, mem);
570
158k
            break;
571
0
        }
572
573
82
        case TOX_EVENT_INVALID: {
574
82
            break;
575
0
        }
576
463k
    }
577
578
463k
    event->data.value = nullptr;
579
463k
}
580
581
static bool tox_event_type_pack(Tox_Event_Type type, Bin_Pack *_Nonnull bp)
582
1.89k
{
583
1.89k
    return bin_pack_u32(bp, (uint32_t)type);
584
1.89k
}
585
586
static bool tox_event_data_pack(Tox_Event_Type type, const Tox_Event_Data *_Nonnull data, Bin_Pack *_Nonnull bp)
587
1.89k
{
588
1.89k
    switch (type) {
589
46
        case TOX_EVENT_CONFERENCE_CONNECTED:
590
46
            return tox_event_conference_connected_pack(data->conference_connected, bp);
591
592
24
        case TOX_EVENT_CONFERENCE_INVITE:
593
24
            return tox_event_conference_invite_pack(data->conference_invite, bp);
594
595
20
        case TOX_EVENT_CONFERENCE_MESSAGE:
596
20
            return tox_event_conference_message_pack(data->conference_message, bp);
597
598
156
        case TOX_EVENT_CONFERENCE_PEER_LIST_CHANGED:
599
156
            return tox_event_conference_peer_list_changed_pack(data->conference_peer_list_changed, bp);
600
601
20
        case TOX_EVENT_CONFERENCE_PEER_NAME:
602
20
            return tox_event_conference_peer_name_pack(data->conference_peer_name, bp);
603
604
66
        case TOX_EVENT_CONFERENCE_TITLE:
605
66
            return tox_event_conference_title_pack(data->conference_title, bp);
606
607
116
        case TOX_EVENT_FILE_CHUNK_REQUEST:
608
116
            return tox_event_file_chunk_request_pack(data->file_chunk_request, bp);
609
610
20
        case TOX_EVENT_FILE_RECV_CHUNK:
611
20
            return tox_event_file_recv_chunk_pack(data->file_recv_chunk, bp);
612
613
26
        case TOX_EVENT_FILE_RECV_CONTROL:
614
26
            return tox_event_file_recv_control_pack(data->file_recv_control, bp);
615
616
36
        case TOX_EVENT_FILE_RECV:
617
36
            return tox_event_file_recv_pack(data->file_recv, bp);
618
619
54
        case TOX_EVENT_FRIEND_CONNECTION_STATUS:
620
54
            return tox_event_friend_connection_status_pack(data->friend_connection_status, bp);
621
622
20
        case TOX_EVENT_FRIEND_LOSSLESS_PACKET:
623
20
            return tox_event_friend_lossless_packet_pack(data->friend_lossless_packet, bp);
624
625
26
        case TOX_EVENT_FRIEND_LOSSY_PACKET:
626
26
            return tox_event_friend_lossy_packet_pack(data->friend_lossy_packet, bp);
627
628
27
        case TOX_EVENT_FRIEND_MESSAGE:
629
27
            return tox_event_friend_message_pack(data->friend_message, bp);
630
631
36
        case TOX_EVENT_FRIEND_NAME:
632
36
            return tox_event_friend_name_pack(data->friend_name, bp);
633
634
36
        case TOX_EVENT_FRIEND_READ_RECEIPT:
635
36
            return tox_event_friend_read_receipt_pack(data->friend_read_receipt, bp);
636
637
20
        case TOX_EVENT_FRIEND_REQUEST:
638
20
            return tox_event_friend_request_pack(data->friend_request, bp);
639
640
34
        case TOX_EVENT_FRIEND_STATUS:
641
34
            return tox_event_friend_status_pack(data->friend_status, bp);
642
643
34
        case TOX_EVENT_FRIEND_STATUS_MESSAGE:
644
34
            return tox_event_friend_status_message_pack(data->friend_status_message, bp);
645
646
44
        case TOX_EVENT_FRIEND_TYPING:
647
44
            return tox_event_friend_typing_pack(data->friend_typing, bp);
648
649
270
        case TOX_EVENT_SELF_CONNECTION_STATUS:
650
270
            return tox_event_self_connection_status_pack(data->self_connection_status, bp);
651
652
20
        case TOX_EVENT_GROUP_PEER_NAME:
653
20
            return tox_event_group_peer_name_pack(data->group_peer_name, bp);
654
655
20
        case TOX_EVENT_GROUP_PEER_STATUS:
656
20
            return tox_event_group_peer_status_pack(data->group_peer_status, bp);
657
658
20
        case TOX_EVENT_GROUP_TOPIC:
659
20
            return tox_event_group_topic_pack(data->group_topic, bp);
660
661
20
        case TOX_EVENT_GROUP_PRIVACY_STATE:
662
20
            return tox_event_group_privacy_state_pack(data->group_privacy_state, bp);
663
664
36
        case TOX_EVENT_GROUP_VOICE_STATE:
665
36
            return tox_event_group_voice_state_pack(data->group_voice_state, bp);
666
667
20
        case TOX_EVENT_GROUP_TOPIC_LOCK:
668
20
            return tox_event_group_topic_lock_pack(data->group_topic_lock, bp);
669
670
22
        case TOX_EVENT_GROUP_PEER_LIMIT:
671
22
            return tox_event_group_peer_limit_pack(data->group_peer_limit, bp);
672
673
36
        case TOX_EVENT_GROUP_PASSWORD:
674
36
            return tox_event_group_password_pack(data->group_password, bp);
675
676
20
        case TOX_EVENT_GROUP_MESSAGE:
677
20
            return tox_event_group_message_pack(data->group_message, bp);
678
679
38
        case TOX_EVENT_GROUP_PRIVATE_MESSAGE:
680
38
            return tox_event_group_private_message_pack(data->group_private_message, bp);
681
682
20
        case TOX_EVENT_GROUP_CUSTOM_PACKET:
683
20
            return tox_event_group_custom_packet_pack(data->group_custom_packet, bp);
684
685
24
        case TOX_EVENT_GROUP_CUSTOM_PRIVATE_PACKET:
686
24
            return tox_event_group_custom_private_packet_pack(data->group_custom_private_packet, bp);
687
688
54
        case TOX_EVENT_GROUP_INVITE:
689
54
            return tox_event_group_invite_pack(data->group_invite, bp);
690
691
56
        case TOX_EVENT_GROUP_PEER_JOIN:
692
56
            return tox_event_group_peer_join_pack(data->group_peer_join, bp);
693
694
28
        case TOX_EVENT_GROUP_PEER_EXIT:
695
28
            return tox_event_group_peer_exit_pack(data->group_peer_exit, bp);
696
697
38
        case TOX_EVENT_GROUP_SELF_JOIN:
698
38
            return tox_event_group_self_join_pack(data->group_self_join, bp);
699
700
26
        case TOX_EVENT_GROUP_JOIN_FAIL:
701
26
            return tox_event_group_join_fail_pack(data->group_join_fail, bp);
702
703
28
        case TOX_EVENT_GROUP_MODERATION:
704
28
            return tox_event_group_moderation_pack(data->group_moderation, bp);
705
706
240
        case TOX_EVENT_DHT_NODES_RESPONSE:
707
240
            return tox_event_dht_nodes_response_pack(data->dht_nodes_response, bp);
708
709
0
        case TOX_EVENT_INVALID:
710
0
            return false;
711
1.89k
    }
712
713
0
    return false;
714
1.89k
}
715
716
bool tox_event_pack(const Tox_Event *event, Bin_Pack *bp)
717
1.89k
{
718
1.89k
    assert(event->type != TOX_EVENT_INVALID);
719
720
1.89k
    return bin_pack_array(bp, 2)
721
1.89k
           && tox_event_type_pack(event->type, bp)
722
1.89k
           && tox_event_data_pack(event->type, &event->data, bp);
723
1.89k
}
724
725
static bool tox_event_type_from_int(uint32_t value, Tox_Event_Type *_Nonnull out_enum)
726
1.68k
{
727
1.68k
    switch (value) {
728
180
        case TOX_EVENT_SELF_CONNECTION_STATUS: {
729
180
            *out_enum = TOX_EVENT_SELF_CONNECTION_STATUS;
730
180
            return true;
731
0
        }
732
733
27
        case TOX_EVENT_FRIEND_REQUEST: {
734
27
            *out_enum = TOX_EVENT_FRIEND_REQUEST;
735
27
            return true;
736
0
        }
737
738
41
        case TOX_EVENT_FRIEND_CONNECTION_STATUS: {
739
41
            *out_enum = TOX_EVENT_FRIEND_CONNECTION_STATUS;
740
41
            return true;
741
0
        }
742
743
27
        case TOX_EVENT_FRIEND_LOSSY_PACKET: {
744
27
            *out_enum = TOX_EVENT_FRIEND_LOSSY_PACKET;
745
27
            return true;
746
0
        }
747
748
21
        case TOX_EVENT_FRIEND_LOSSLESS_PACKET: {
749
21
            *out_enum = TOX_EVENT_FRIEND_LOSSLESS_PACKET;
750
21
            return true;
751
0
        }
752
753
29
        case TOX_EVENT_FRIEND_NAME: {
754
29
            *out_enum = TOX_EVENT_FRIEND_NAME;
755
29
            return true;
756
0
        }
757
758
31
        case TOX_EVENT_FRIEND_STATUS: {
759
31
            *out_enum = TOX_EVENT_FRIEND_STATUS;
760
31
            return true;
761
0
        }
762
763
21
        case TOX_EVENT_FRIEND_STATUS_MESSAGE: {
764
21
            *out_enum = TOX_EVENT_FRIEND_STATUS_MESSAGE;
765
21
            return true;
766
0
        }
767
768
16
        case TOX_EVENT_FRIEND_MESSAGE: {
769
16
            *out_enum = TOX_EVENT_FRIEND_MESSAGE;
770
16
            return true;
771
0
        }
772
773
32
        case TOX_EVENT_FRIEND_READ_RECEIPT: {
774
32
            *out_enum = TOX_EVENT_FRIEND_READ_RECEIPT;
775
32
            return true;
776
0
        }
777
778
42
        case TOX_EVENT_FRIEND_TYPING: {
779
42
            *out_enum = TOX_EVENT_FRIEND_TYPING;
780
42
            return true;
781
0
        }
782
783
232
        case TOX_EVENT_FILE_CHUNK_REQUEST: {
784
232
            *out_enum = TOX_EVENT_FILE_CHUNK_REQUEST;
785
232
            return true;
786
0
        }
787
788
32
        case TOX_EVENT_FILE_RECV: {
789
32
            *out_enum = TOX_EVENT_FILE_RECV;
790
32
            return true;
791
0
        }
792
793
26
        case TOX_EVENT_FILE_RECV_CHUNK: {
794
26
            *out_enum = TOX_EVENT_FILE_RECV_CHUNK;
795
26
            return true;
796
0
        }
797
798
38
        case TOX_EVENT_FILE_RECV_CONTROL: {
799
38
            *out_enum = TOX_EVENT_FILE_RECV_CONTROL;
800
38
            return true;
801
0
        }
802
803
25
        case TOX_EVENT_CONFERENCE_INVITE: {
804
25
            *out_enum = TOX_EVENT_CONFERENCE_INVITE;
805
25
            return true;
806
0
        }
807
808
24
        case TOX_EVENT_CONFERENCE_CONNECTED: {
809
24
            *out_enum = TOX_EVENT_CONFERENCE_CONNECTED;
810
24
            return true;
811
0
        }
812
813
112
        case TOX_EVENT_CONFERENCE_PEER_LIST_CHANGED: {
814
112
            *out_enum = TOX_EVENT_CONFERENCE_PEER_LIST_CHANGED;
815
112
            return true;
816
0
        }
817
818
19
        case TOX_EVENT_CONFERENCE_PEER_NAME: {
819
19
            *out_enum = TOX_EVENT_CONFERENCE_PEER_NAME;
820
19
            return true;
821
0
        }
822
823
55
        case TOX_EVENT_CONFERENCE_TITLE: {
824
55
            *out_enum = TOX_EVENT_CONFERENCE_TITLE;
825
55
            return true;
826
0
        }
827
828
22
        case TOX_EVENT_CONFERENCE_MESSAGE: {
829
22
            *out_enum = TOX_EVENT_CONFERENCE_MESSAGE;
830
22
            return true;
831
0
        }
832
833
24
        case TOX_EVENT_GROUP_PEER_NAME: {
834
24
            *out_enum = TOX_EVENT_GROUP_PEER_NAME;
835
24
            return true;
836
0
        }
837
838
23
        case TOX_EVENT_GROUP_PEER_STATUS: {
839
23
            *out_enum = TOX_EVENT_GROUP_PEER_STATUS;
840
23
            return true;
841
0
        }
842
843
21
        case TOX_EVENT_GROUP_TOPIC: {
844
21
            *out_enum = TOX_EVENT_GROUP_TOPIC;
845
21
            return true;
846
0
        }
847
848
27
        case TOX_EVENT_GROUP_PRIVACY_STATE: {
849
27
            *out_enum = TOX_EVENT_GROUP_PRIVACY_STATE;
850
27
            return true;
851
0
        }
852
853
50
        case TOX_EVENT_GROUP_VOICE_STATE: {
854
50
            *out_enum = TOX_EVENT_GROUP_VOICE_STATE;
855
50
            return true;
856
0
        }
857
858
26
        case TOX_EVENT_GROUP_TOPIC_LOCK: {
859
26
            *out_enum = TOX_EVENT_GROUP_TOPIC_LOCK;
860
26
            return true;
861
0
        }
862
863
14
        case TOX_EVENT_GROUP_PEER_LIMIT: {
864
14
            *out_enum = TOX_EVENT_GROUP_PEER_LIMIT;
865
14
            return true;
866
0
        }
867
868
26
        case TOX_EVENT_GROUP_PASSWORD: {
869
26
            *out_enum = TOX_EVENT_GROUP_PASSWORD;
870
26
            return true;
871
0
        }
872
873
38
        case TOX_EVENT_GROUP_MESSAGE: {
874
38
            *out_enum = TOX_EVENT_GROUP_MESSAGE;
875
38
            return true;
876
0
        }
877
878
32
        case TOX_EVENT_GROUP_PRIVATE_MESSAGE: {
879
32
            *out_enum = TOX_EVENT_GROUP_PRIVATE_MESSAGE;
880
32
            return true;
881
0
        }
882
883
15
        case TOX_EVENT_GROUP_CUSTOM_PACKET: {
884
15
            *out_enum = TOX_EVENT_GROUP_CUSTOM_PACKET;
885
15
            return true;
886
0
        }
887
888
20
        case TOX_EVENT_GROUP_CUSTOM_PRIVATE_PACKET: {
889
20
            *out_enum = TOX_EVENT_GROUP_CUSTOM_PRIVATE_PACKET;
890
20
            return true;
891
0
        }
892
893
43
        case TOX_EVENT_GROUP_INVITE: {
894
43
            *out_enum = TOX_EVENT_GROUP_INVITE;
895
43
            return true;
896
0
        }
897
898
46
        case TOX_EVENT_GROUP_PEER_JOIN: {
899
46
            *out_enum = TOX_EVENT_GROUP_PEER_JOIN;
900
46
            return true;
901
0
        }
902
903
57
        case TOX_EVENT_GROUP_PEER_EXIT: {
904
57
            *out_enum = TOX_EVENT_GROUP_PEER_EXIT;
905
57
            return true;
906
0
        }
907
908
50
        case TOX_EVENT_GROUP_SELF_JOIN: {
909
50
            *out_enum = TOX_EVENT_GROUP_SELF_JOIN;
910
50
            return true;
911
0
        }
912
913
28
        case TOX_EVENT_GROUP_JOIN_FAIL: {
914
28
            *out_enum = TOX_EVENT_GROUP_JOIN_FAIL;
915
28
            return true;
916
0
        }
917
918
43
        case TOX_EVENT_GROUP_MODERATION: {
919
43
            *out_enum = TOX_EVENT_GROUP_MODERATION;
920
43
            return true;
921
0
        }
922
923
43
        case TOX_EVENT_DHT_NODES_RESPONSE: {
924
43
            *out_enum = TOX_EVENT_DHT_NODES_RESPONSE;
925
43
            return true;
926
0
        }
927
928
1
        case TOX_EVENT_INVALID: {
929
1
            *out_enum = TOX_EVENT_INVALID;
930
1
            return true;
931
0
        }
932
933
5
        default: {
934
5
            *out_enum = TOX_EVENT_INVALID;
935
5
            return false;
936
0
        }
937
1.68k
    }
938
1.68k
}
939
940
static bool tox_event_type_unpack(Tox_Event_Type *_Nonnull val, Bin_Unpack *_Nonnull bu)
941
1.69k
{
942
1.69k
    uint32_t u32;
943
1.69k
    return bin_unpack_u32(bu, &u32)
944
1.69k
           && tox_event_type_from_int(u32, val);
945
1.69k
}
946
947
static bool tox_event_data_unpack(Tox_Event_Type type, Tox_Event_Data *_Nonnull data, Bin_Unpack *_Nonnull bu, const Memory *_Nonnull mem)
948
1.67k
{
949
1.67k
    switch (type) {
950
24
        case TOX_EVENT_CONFERENCE_CONNECTED:
951
24
            return tox_event_conference_connected_unpack(&data->conference_connected, bu, mem);
952
953
25
        case TOX_EVENT_CONFERENCE_INVITE:
954
25
            return tox_event_conference_invite_unpack(&data->conference_invite, bu, mem);
955
956
22
        case TOX_EVENT_CONFERENCE_MESSAGE:
957
22
            return tox_event_conference_message_unpack(&data->conference_message, bu, mem);
958
959
112
        case TOX_EVENT_CONFERENCE_PEER_LIST_CHANGED:
960
112
            return tox_event_conference_peer_list_changed_unpack(&data->conference_peer_list_changed, bu, mem);
961
962
19
        case TOX_EVENT_CONFERENCE_PEER_NAME:
963
19
            return tox_event_conference_peer_name_unpack(&data->conference_peer_name, bu, mem);
964
965
55
        case TOX_EVENT_CONFERENCE_TITLE:
966
55
            return tox_event_conference_title_unpack(&data->conference_title, bu, mem);
967
968
232
        case TOX_EVENT_FILE_CHUNK_REQUEST:
969
232
            return tox_event_file_chunk_request_unpack(&data->file_chunk_request, bu, mem);
970
971
26
        case TOX_EVENT_FILE_RECV_CHUNK:
972
26
            return tox_event_file_recv_chunk_unpack(&data->file_recv_chunk, bu, mem);
973
974
38
        case TOX_EVENT_FILE_RECV_CONTROL:
975
38
            return tox_event_file_recv_control_unpack(&data->file_recv_control, bu, mem);
976
977
32
        case TOX_EVENT_FILE_RECV:
978
32
            return tox_event_file_recv_unpack(&data->file_recv, bu, mem);
979
980
41
        case TOX_EVENT_FRIEND_CONNECTION_STATUS:
981
41
            return tox_event_friend_connection_status_unpack(&data->friend_connection_status, bu, mem);
982
983
21
        case TOX_EVENT_FRIEND_LOSSLESS_PACKET:
984
21
            return tox_event_friend_lossless_packet_unpack(&data->friend_lossless_packet, bu, mem);
985
986
27
        case TOX_EVENT_FRIEND_LOSSY_PACKET:
987
27
            return tox_event_friend_lossy_packet_unpack(&data->friend_lossy_packet, bu, mem);
988
989
16
        case TOX_EVENT_FRIEND_MESSAGE:
990
16
            return tox_event_friend_message_unpack(&data->friend_message, bu, mem);
991
992
29
        case TOX_EVENT_FRIEND_NAME:
993
29
            return tox_event_friend_name_unpack(&data->friend_name, bu, mem);
994
995
32
        case TOX_EVENT_FRIEND_READ_RECEIPT:
996
32
            return tox_event_friend_read_receipt_unpack(&data->friend_read_receipt, bu, mem);
997
998
27
        case TOX_EVENT_FRIEND_REQUEST:
999
27
            return tox_event_friend_request_unpack(&data->friend_request, bu, mem);
1000
1001
21
        case TOX_EVENT_FRIEND_STATUS_MESSAGE:
1002
21
            return tox_event_friend_status_message_unpack(&data->friend_status_message, bu, mem);
1003
1004
31
        case TOX_EVENT_FRIEND_STATUS:
1005
31
            return tox_event_friend_status_unpack(&data->friend_status, bu, mem);
1006
1007
42
        case TOX_EVENT_FRIEND_TYPING:
1008
42
            return tox_event_friend_typing_unpack(&data->friend_typing, bu, mem);
1009
1010
180
        case TOX_EVENT_SELF_CONNECTION_STATUS:
1011
180
            return tox_event_self_connection_status_unpack(&data->self_connection_status, bu, mem);
1012
1013
24
        case TOX_EVENT_GROUP_PEER_NAME:
1014
24
            return tox_event_group_peer_name_unpack(&data->group_peer_name, bu, mem);
1015
1016
23
        case TOX_EVENT_GROUP_PEER_STATUS:
1017
23
            return tox_event_group_peer_status_unpack(&data->group_peer_status, bu, mem);
1018
1019
21
        case TOX_EVENT_GROUP_TOPIC:
1020
21
            return tox_event_group_topic_unpack(&data->group_topic, bu, mem);
1021
1022
27
        case TOX_EVENT_GROUP_PRIVACY_STATE:
1023
27
            return tox_event_group_privacy_state_unpack(&data->group_privacy_state, bu, mem);
1024
1025
50
        case TOX_EVENT_GROUP_VOICE_STATE:
1026
50
            return tox_event_group_voice_state_unpack(&data->group_voice_state, bu, mem);
1027
1028
26
        case TOX_EVENT_GROUP_TOPIC_LOCK:
1029
26
            return tox_event_group_topic_lock_unpack(&data->group_topic_lock, bu, mem);
1030
1031
14
        case TOX_EVENT_GROUP_PEER_LIMIT:
1032
14
            return tox_event_group_peer_limit_unpack(&data->group_peer_limit, bu, mem);
1033
1034
26
        case TOX_EVENT_GROUP_PASSWORD:
1035
26
            return tox_event_group_password_unpack(&data->group_password, bu, mem);
1036
1037
38
        case TOX_EVENT_GROUP_MESSAGE:
1038
38
            return tox_event_group_message_unpack(&data->group_message, bu, mem);
1039
1040
32
        case TOX_EVENT_GROUP_PRIVATE_MESSAGE:
1041
32
            return tox_event_group_private_message_unpack(&data->group_private_message, bu, mem);
1042
1043
15
        case TOX_EVENT_GROUP_CUSTOM_PACKET:
1044
15
            return tox_event_group_custom_packet_unpack(&data->group_custom_packet, bu, mem);
1045
1046
20
        case TOX_EVENT_GROUP_CUSTOM_PRIVATE_PACKET:
1047
20
            return tox_event_group_custom_private_packet_unpack(&data->group_custom_private_packet, bu, mem);
1048
1049
43
        case TOX_EVENT_GROUP_INVITE:
1050
43
            return tox_event_group_invite_unpack(&data->group_invite, bu, mem);
1051
1052
46
        case TOX_EVENT_GROUP_PEER_JOIN:
1053
46
            return tox_event_group_peer_join_unpack(&data->group_peer_join, bu, mem);
1054
1055
57
        case TOX_EVENT_GROUP_PEER_EXIT:
1056
57
            return tox_event_group_peer_exit_unpack(&data->group_peer_exit, bu, mem);
1057
1058
50
        case TOX_EVENT_GROUP_SELF_JOIN:
1059
50
            return tox_event_group_self_join_unpack(&data->group_self_join, bu, mem);
1060
1061
28
        case TOX_EVENT_GROUP_JOIN_FAIL:
1062
28
            return tox_event_group_join_fail_unpack(&data->group_join_fail, bu, mem);
1063
1064
43
        case TOX_EVENT_GROUP_MODERATION:
1065
43
            return tox_event_group_moderation_unpack(&data->group_moderation, bu, mem);
1066
1067
43
        case TOX_EVENT_DHT_NODES_RESPONSE:
1068
43
            return tox_event_dht_nodes_response_unpack(&data->dht_nodes_response, bu, mem);
1069
1070
1
        case TOX_EVENT_INVALID:
1071
1
            return false;
1072
1.67k
    }
1073
1074
0
    return false;
1075
1.67k
}
1076
1077
bool tox_event_unpack_into(Tox_Event *event, Bin_Unpack *bu, const Memory *mem)
1078
1.76k
{
1079
1.76k
    return bin_unpack_array_fixed(bu, 2, nullptr)  //
1080
1.76k
           && tox_event_type_unpack(&event->type, bu)  //
1081
1.76k
           && tox_event_data_unpack(event->type, &event->data, bu, mem);
1082
1.76k
}