Coverage Report

Created: 2024-01-26 01:52

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