Coverage Report

Created: 2026-10-24 08:16

/work/toxcore/tox_dispatch.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_dispatch.h"
6
7
#include <stdint.h>
8
#include <stdlib.h>
9
10
#include "attributes.h"
11
#include "ccompat.h"
12
#include "events/events_alloc.h" // IWYU pragma: keep
13
#include "tox_event.h"
14
#include "tox_events.h"
15
16
struct Tox_Dispatch {
17
    tox_events_conference_connected_cb *_Nullable conference_connected_callback;
18
    tox_events_conference_invite_cb *_Nullable conference_invite_callback;
19
    tox_events_conference_message_cb *_Nullable conference_message_callback;
20
    tox_events_conference_peer_list_changed_cb *_Nullable conference_peer_list_changed_callback;
21
    tox_events_conference_peer_name_cb *_Nullable conference_peer_name_callback;
22
    tox_events_conference_title_cb *_Nullable conference_title_callback;
23
    tox_events_file_chunk_request_cb *_Nullable file_chunk_request_callback;
24
    tox_events_file_recv_cb *_Nullable file_recv_callback;
25
    tox_events_file_recv_chunk_cb *_Nullable file_recv_chunk_callback;
26
    tox_events_file_recv_control_cb *_Nullable file_recv_control_callback;
27
    tox_events_friend_connection_status_cb *_Nullable friend_connection_status_callback;
28
    tox_events_friend_lossless_packet_cb *_Nullable friend_lossless_packet_callback;
29
    tox_events_friend_lossy_packet_cb *_Nullable friend_lossy_packet_callback;
30
    tox_events_friend_message_cb *_Nullable friend_message_callback;
31
    tox_events_friend_name_cb *_Nullable friend_name_callback;
32
    tox_events_friend_read_receipt_cb *_Nullable friend_read_receipt_callback;
33
    tox_events_friend_request_cb *_Nullable friend_request_callback;
34
    tox_events_friend_status_cb *_Nullable friend_status_callback;
35
    tox_events_friend_status_message_cb *_Nullable friend_status_message_callback;
36
    tox_events_friend_typing_cb *_Nullable friend_typing_callback;
37
    tox_events_self_connection_status_cb *_Nullable self_connection_status_callback;
38
    tox_events_group_peer_name_cb *_Nullable group_peer_name_callback;
39
    tox_events_group_peer_status_cb *_Nullable group_peer_status_callback;
40
    tox_events_group_topic_cb *_Nullable group_topic_callback;
41
    tox_events_group_privacy_state_cb *_Nullable group_privacy_state_callback;
42
    tox_events_group_voice_state_cb *_Nullable group_voice_state_callback;
43
    tox_events_group_topic_lock_cb *_Nullable group_topic_lock_callback;
44
    tox_events_group_peer_limit_cb *_Nullable group_peer_limit_callback;
45
    tox_events_group_password_cb *_Nullable group_password_callback;
46
    tox_events_group_message_cb *_Nullable group_message_callback;
47
    tox_events_group_private_message_cb *_Nullable group_private_message_callback;
48
    tox_events_group_custom_packet_cb *_Nullable group_custom_packet_callback;
49
    tox_events_group_custom_private_packet_cb *_Nullable group_custom_private_packet_callback;
50
    tox_events_group_invite_cb *_Nullable group_invite_callback;
51
    tox_events_group_peer_join_cb *_Nullable group_peer_join_callback;
52
    tox_events_group_peer_exit_cb *_Nullable group_peer_exit_callback;
53
    tox_events_group_self_join_cb *_Nullable group_self_join_callback;
54
    tox_events_group_join_fail_cb *_Nullable group_join_fail_callback;
55
    tox_events_group_moderation_cb *_Nullable group_moderation_callback;
56
    tox_events_dht_nodes_response_cb *_Nullable dht_nodes_response_callback;
57
};
58
59
Tox_Dispatch *_Nullable tox_dispatch_new(Tox_Err_Dispatch_New *_Nullable error)
60
1.06k
{
61
1.06k
    Tox_Dispatch *dispatch = (Tox_Dispatch *)calloc(1, sizeof(Tox_Dispatch));
62
63
1.06k
    if (dispatch == nullptr) {
64
0
        if (error != nullptr) {
65
0
            *error = TOX_ERR_DISPATCH_NEW_MALLOC;
66
0
        }
67
68
0
        return nullptr;
69
0
    }
70
71
1.06k
    *dispatch = (Tox_Dispatch) {
72
1.06k
        nullptr
73
1.06k
    };
74
75
1.06k
    if (error != nullptr) {
76
1
        *error = TOX_ERR_DISPATCH_NEW_OK;
77
1
    }
78
79
1.06k
    return dispatch;
80
1.06k
}
81
82
void tox_dispatch_free(Tox_Dispatch *_Nullable dispatch)
83
1.06k
{
84
1.06k
    free(dispatch);
85
1.06k
}
86
87
void tox_events_callback_conference_connected(
88
    Tox_Dispatch *_Nonnull dispatch, tox_events_conference_connected_cb *_Nullable callback)
89
781
{
90
781
    dispatch->conference_connected_callback = callback;
91
781
}
92
void tox_events_callback_conference_invite(
93
    Tox_Dispatch *_Nonnull dispatch, tox_events_conference_invite_cb *_Nullable callback)
94
756
{
95
756
    dispatch->conference_invite_callback = callback;
96
756
}
97
void tox_events_callback_conference_message(
98
    Tox_Dispatch *_Nonnull dispatch, tox_events_conference_message_cb *_Nullable callback)
99
743
{
100
743
    dispatch->conference_message_callback = callback;
101
743
}
102
void tox_events_callback_conference_peer_list_changed(
103
    Tox_Dispatch *_Nonnull dispatch, tox_events_conference_peer_list_changed_cb *_Nullable callback)
104
749
{
105
749
    dispatch->conference_peer_list_changed_callback = callback;
106
749
}
107
void tox_events_callback_conference_peer_name(
108
    Tox_Dispatch *_Nonnull dispatch, tox_events_conference_peer_name_cb *_Nullable callback)
109
725
{
110
725
    dispatch->conference_peer_name_callback = callback;
111
725
}
112
void tox_events_callback_conference_title(
113
    Tox_Dispatch *_Nonnull dispatch, tox_events_conference_title_cb *_Nullable callback)
114
725
{
115
725
    dispatch->conference_title_callback = callback;
116
725
}
117
void tox_events_callback_file_chunk_request(
118
    Tox_Dispatch *_Nonnull dispatch, tox_events_file_chunk_request_cb *_Nullable callback)
119
728
{
120
728
    dispatch->file_chunk_request_callback = callback;
121
728
}
122
void tox_events_callback_file_recv(
123
    Tox_Dispatch *_Nonnull dispatch, tox_events_file_recv_cb *_Nullable callback)
124
729
{
125
729
    dispatch->file_recv_callback = callback;
126
729
}
127
void tox_events_callback_file_recv_chunk(
128
    Tox_Dispatch *_Nonnull dispatch, tox_events_file_recv_chunk_cb *_Nullable callback)
129
728
{
130
728
    dispatch->file_recv_chunk_callback = callback;
131
728
}
132
void tox_events_callback_file_recv_control(
133
    Tox_Dispatch *_Nonnull dispatch, tox_events_file_recv_control_cb *_Nullable callback)
134
727
{
135
727
    dispatch->file_recv_control_callback = callback;
136
727
}
137
void tox_events_callback_friend_connection_status(
138
    Tox_Dispatch *_Nonnull dispatch, tox_events_friend_connection_status_cb *_Nullable callback)
139
727
{
140
727
    dispatch->friend_connection_status_callback = callback;
141
727
}
142
void tox_events_callback_friend_lossless_packet(
143
    Tox_Dispatch *_Nonnull dispatch, tox_events_friend_lossless_packet_cb *_Nullable callback)
144
725
{
145
725
    dispatch->friend_lossless_packet_callback = callback;
146
725
}
147
void tox_events_callback_friend_lossy_packet(
148
    Tox_Dispatch *_Nonnull dispatch, tox_events_friend_lossy_packet_cb *_Nullable callback)
149
725
{
150
725
    dispatch->friend_lossy_packet_callback = callback;
151
725
}
152
void tox_events_callback_friend_message(
153
    Tox_Dispatch *_Nonnull dispatch, tox_events_friend_message_cb *_Nullable callback)
154
728
{
155
728
    dispatch->friend_message_callback = callback;
156
728
}
157
void tox_events_callback_friend_name(
158
    Tox_Dispatch *_Nonnull dispatch, tox_events_friend_name_cb *_Nullable callback)
159
725
{
160
725
    dispatch->friend_name_callback = callback;
161
725
}
162
void tox_events_callback_friend_read_receipt(
163
    Tox_Dispatch *_Nonnull dispatch, tox_events_friend_read_receipt_cb *_Nullable callback)
164
726
{
165
726
    dispatch->friend_read_receipt_callback = callback;
166
726
}
167
void tox_events_callback_friend_request(
168
    Tox_Dispatch *_Nonnull dispatch, tox_events_friend_request_cb *_Nullable callback)
169
860
{
170
860
    dispatch->friend_request_callback = callback;
171
860
}
172
void tox_events_callback_friend_status(
173
    Tox_Dispatch *_Nonnull dispatch, tox_events_friend_status_cb *_Nullable callback)
174
726
{
175
726
    dispatch->friend_status_callback = callback;
176
726
}
177
void tox_events_callback_friend_status_message(
178
    Tox_Dispatch *_Nonnull dispatch, tox_events_friend_status_message_cb *_Nullable callback)
179
725
{
180
725
    dispatch->friend_status_message_callback = callback;
181
725
}
182
void tox_events_callback_friend_typing(
183
    Tox_Dispatch *_Nonnull dispatch, tox_events_friend_typing_cb *_Nullable callback)
184
725
{
185
725
    dispatch->friend_typing_callback = callback;
186
725
}
187
void tox_events_callback_self_connection_status(
188
    Tox_Dispatch *_Nonnull dispatch, tox_events_self_connection_status_cb *_Nullable callback)
189
726
{
190
726
    dispatch->self_connection_status_callback = callback;
191
726
}
192
void tox_events_callback_group_peer_name(
193
    Tox_Dispatch *_Nonnull dispatch, tox_events_group_peer_name_cb *_Nullable callback)
194
696
{
195
696
    dispatch->group_peer_name_callback = callback;
196
696
}
197
void tox_events_callback_group_peer_status(
198
    Tox_Dispatch *_Nonnull dispatch, tox_events_group_peer_status_cb *_Nullable callback)
199
696
{
200
696
    dispatch->group_peer_status_callback = callback;
201
696
}
202
void tox_events_callback_group_topic(
203
    Tox_Dispatch *_Nonnull dispatch, tox_events_group_topic_cb *_Nullable callback)
204
703
{
205
703
    dispatch->group_topic_callback = callback;
206
703
}
207
void tox_events_callback_group_privacy_state(
208
    Tox_Dispatch *_Nonnull dispatch, tox_events_group_privacy_state_cb *_Nullable callback)
209
699
{
210
699
    dispatch->group_privacy_state_callback = callback;
211
699
}
212
void tox_events_callback_group_voice_state(
213
    Tox_Dispatch *_Nonnull dispatch, tox_events_group_voice_state_cb *_Nullable callback)
214
704
{
215
704
    dispatch->group_voice_state_callback = callback;
216
704
}
217
void tox_events_callback_group_topic_lock(
218
    Tox_Dispatch *_Nonnull dispatch, tox_events_group_topic_lock_cb *_Nullable callback)
219
702
{
220
702
    dispatch->group_topic_lock_callback = callback;
221
702
}
222
void tox_events_callback_group_peer_limit(
223
    Tox_Dispatch *_Nonnull dispatch, tox_events_group_peer_limit_cb *_Nullable callback)
224
699
{
225
699
    dispatch->group_peer_limit_callback = callback;
226
699
}
227
void tox_events_callback_group_password(
228
    Tox_Dispatch *_Nonnull dispatch, tox_events_group_password_cb *_Nullable callback)
229
699
{
230
699
    dispatch->group_password_callback = callback;
231
699
}
232
void tox_events_callback_group_message(
233
    Tox_Dispatch *_Nonnull dispatch, tox_events_group_message_cb *_Nullable callback)
234
698
{
235
698
    dispatch->group_message_callback = callback;
236
698
}
237
void tox_events_callback_group_private_message(
238
    Tox_Dispatch *_Nonnull dispatch, tox_events_group_private_message_cb *_Nullable callback)
239
697
{
240
697
    dispatch->group_private_message_callback = callback;
241
697
}
242
void tox_events_callback_group_custom_packet(
243
    Tox_Dispatch *_Nonnull dispatch, tox_events_group_custom_packet_cb *_Nullable callback)
244
696
{
245
696
    dispatch->group_custom_packet_callback = callback;
246
696
}
247
void tox_events_callback_group_custom_private_packet(
248
    Tox_Dispatch *_Nonnull dispatch, tox_events_group_custom_private_packet_cb *_Nullable callback)
249
696
{
250
696
    dispatch->group_custom_private_packet_callback = callback;
251
696
}
252
void tox_events_callback_group_invite(
253
    Tox_Dispatch *_Nonnull dispatch, tox_events_group_invite_cb *_Nullable callback)
254
698
{
255
698
    dispatch->group_invite_callback = callback;
256
698
}
257
void tox_events_callback_group_peer_join(
258
    Tox_Dispatch *_Nonnull dispatch, tox_events_group_peer_join_cb *_Nullable callback)
259
720
{
260
720
    dispatch->group_peer_join_callback = callback;
261
720
}
262
void tox_events_callback_group_peer_exit(
263
    Tox_Dispatch *_Nonnull dispatch, tox_events_group_peer_exit_cb *_Nullable callback)
264
696
{
265
696
    dispatch->group_peer_exit_callback = callback;
266
696
}
267
void tox_events_callback_group_self_join(
268
    Tox_Dispatch *_Nonnull dispatch, tox_events_group_self_join_cb *_Nullable callback)
269
713
{
270
713
    dispatch->group_self_join_callback = callback;
271
713
}
272
void tox_events_callback_group_join_fail(
273
    Tox_Dispatch *_Nonnull dispatch, tox_events_group_join_fail_cb *_Nullable callback)
274
698
{
275
698
    dispatch->group_join_fail_callback = callback;
276
698
}
277
void tox_events_callback_group_moderation(
278
    Tox_Dispatch *_Nonnull dispatch, tox_events_group_moderation_cb *_Nullable callback)
279
703
{
280
703
    dispatch->group_moderation_callback = callback;
281
703
}
282
void tox_events_callback_dht_nodes_response(
283
    Tox_Dispatch *_Nonnull dispatch, tox_events_dht_nodes_response_cb *_Nullable callback)
284
30
{
285
30
    dispatch->dht_nodes_response_callback = callback;
286
30
}
287
288
static void tox_dispatch_invoke_event(const Tox_Dispatch *_Nonnull dispatch, const Tox_Event *_Nonnull event, void *_Nullable user_data)
289
356k
{
290
356k
    switch (event->type) {
291
50
        case TOX_EVENT_CONFERENCE_CONNECTED: {
292
50
            if (dispatch->conference_connected_callback != nullptr) {
293
45
                dispatch->conference_connected_callback(event->data.conference_connected, user_data);
294
45
            }
295
296
50
            break;
297
0
        }
298
299
40
        case TOX_EVENT_CONFERENCE_INVITE: {
300
40
            if (dispatch->conference_invite_callback != nullptr) {
301
40
                dispatch->conference_invite_callback(event->data.conference_invite, user_data);
302
40
            }
303
304
40
            break;
305
0
        }
306
307
29
        case TOX_EVENT_CONFERENCE_MESSAGE: {
308
29
            if (dispatch->conference_message_callback != nullptr) {
309
28
                dispatch->conference_message_callback(event->data.conference_message, user_data);
310
28
            }
311
312
29
            break;
313
0
        }
314
315
401
        case TOX_EVENT_CONFERENCE_PEER_LIST_CHANGED: {
316
401
            if (dispatch->conference_peer_list_changed_callback != nullptr) {
317
346
                dispatch->conference_peer_list_changed_callback(event->data.conference_peer_list_changed, user_data);
318
346
            }
319
320
401
            break;
321
0
        }
322
323
13
        case TOX_EVENT_CONFERENCE_PEER_NAME: {
324
13
            if (dispatch->conference_peer_name_callback != nullptr) {
325
10
                dispatch->conference_peer_name_callback(event->data.conference_peer_name, user_data);
326
10
            }
327
328
13
            break;
329
0
        }
330
331
34
        case TOX_EVENT_CONFERENCE_TITLE: {
332
34
            if (dispatch->conference_title_callback != nullptr) {
333
34
                dispatch->conference_title_callback(event->data.conference_title, user_data);
334
34
            }
335
336
34
            break;
337
0
        }
338
339
1.20k
        case TOX_EVENT_FILE_CHUNK_REQUEST: {
340
1.20k
            if (dispatch->file_chunk_request_callback != nullptr) {
341
1.20k
                dispatch->file_chunk_request_callback(event->data.file_chunk_request, user_data);
342
1.20k
            }
343
344
1.20k
            break;
345
0
        }
346
347
1.16k
        case TOX_EVENT_FILE_RECV_CHUNK: {
348
1.16k
            if (dispatch->file_recv_chunk_callback != nullptr) {
349
1.16k
                dispatch->file_recv_chunk_callback(event->data.file_recv_chunk, user_data);
350
1.16k
            }
351
352
1.16k
            break;
353
0
        }
354
355
17
        case TOX_EVENT_FILE_RECV_CONTROL: {
356
17
            if (dispatch->file_recv_control_callback != nullptr) {
357
15
                dispatch->file_recv_control_callback(event->data.file_recv_control, user_data);
358
15
            }
359
360
17
            break;
361
0
        }
362
363
23
        case TOX_EVENT_FILE_RECV: {
364
23
            if (dispatch->file_recv_callback != nullptr) {
365
23
                dispatch->file_recv_callback(event->data.file_recv, user_data);
366
23
            }
367
368
23
            break;
369
0
        }
370
371
468
        case TOX_EVENT_FRIEND_CONNECTION_STATUS: {
372
468
            if (dispatch->friend_connection_status_callback != nullptr) {
373
23
                dispatch->friend_connection_status_callback(event->data.friend_connection_status, user_data);
374
23
            }
375
376
468
            break;
377
0
        }
378
379
11
        case TOX_EVENT_FRIEND_LOSSLESS_PACKET: {
380
11
            if (dispatch->friend_lossless_packet_callback != nullptr) {
381
10
                dispatch->friend_lossless_packet_callback(event->data.friend_lossless_packet, user_data);
382
10
            }
383
384
11
            break;
385
0
        }
386
387
14
        case TOX_EVENT_FRIEND_LOSSY_PACKET: {
388
14
            if (dispatch->friend_lossy_packet_callback != nullptr) {
389
13
                dispatch->friend_lossy_packet_callback(event->data.friend_lossy_packet, user_data);
390
13
            }
391
392
14
            break;
393
0
        }
394
395
82.7k
        case TOX_EVENT_FRIEND_MESSAGE: {
396
82.7k
            if (dispatch->friend_message_callback != nullptr) {
397
80.0k
                dispatch->friend_message_callback(event->data.friend_message, user_data);
398
80.0k
            }
399
400
82.7k
            break;
401
0
        }
402
403
445
        case TOX_EVENT_FRIEND_NAME: {
404
445
            if (dispatch->friend_name_callback != nullptr) {
405
12
                dispatch->friend_name_callback(event->data.friend_name, user_data);
406
12
            }
407
408
445
            break;
409
0
        }
410
411
81.7k
        case TOX_EVENT_FRIEND_READ_RECEIPT: {
412
81.7k
            if (dispatch->friend_read_receipt_callback != nullptr) {
413
19
                dispatch->friend_read_receipt_callback(event->data.friend_read_receipt, user_data);
414
19
            }
415
416
81.7k
            break;
417
0
        }
418
419
147
        case TOX_EVENT_FRIEND_REQUEST: {
420
147
            if (dispatch->friend_request_callback != nullptr) {
421
146
                dispatch->friend_request_callback(event->data.friend_request, user_data);
422
146
            }
423
424
147
            break;
425
0
        }
426
427
444
        case TOX_EVENT_FRIEND_STATUS: {
428
444
            if (dispatch->friend_status_callback != nullptr) {
429
14
                dispatch->friend_status_callback(event->data.friend_status, user_data);
430
14
            }
431
432
444
            break;
433
0
        }
434
435
442
        case TOX_EVENT_FRIEND_STATUS_MESSAGE: {
436
442
            if (dispatch->friend_status_message_callback != nullptr) {
437
10
                dispatch->friend_status_message_callback(event->data.friend_status_message, user_data);
438
10
            }
439
440
442
            break;
441
0
        }
442
443
448
        case TOX_EVENT_FRIEND_TYPING: {
444
448
            if (dispatch->friend_typing_callback != nullptr) {
445
15
                dispatch->friend_typing_callback(event->data.friend_typing, user_data);
446
15
            }
447
448
448
            break;
449
0
        }
450
451
449
        case TOX_EVENT_SELF_CONNECTION_STATUS: {
452
449
            if (dispatch->self_connection_status_callback != nullptr) {
453
114
                dispatch->self_connection_status_callback(event->data.self_connection_status, user_data);
454
114
            }
455
456
449
            break;
457
0
        }
458
459
12
        case TOX_EVENT_GROUP_PEER_NAME: {
460
12
            if (dispatch->group_peer_name_callback != nullptr) {
461
11
                dispatch->group_peer_name_callback(event->data.group_peer_name, user_data);
462
11
            }
463
464
12
            break;
465
0
        }
466
467
12
        case TOX_EVENT_GROUP_PEER_STATUS: {
468
12
            if (dispatch->group_peer_status_callback != nullptr) {
469
11
                dispatch->group_peer_status_callback(event->data.group_peer_status, user_data);
470
11
            }
471
472
12
            break;
473
0
        }
474
475
43
        case TOX_EVENT_GROUP_TOPIC: {
476
43
            if (dispatch->group_topic_callback != nullptr) {
477
42
                dispatch->group_topic_callback(event->data.group_topic, user_data);
478
42
            }
479
480
43
            break;
481
0
        }
482
483
20
        case TOX_EVENT_GROUP_PRIVACY_STATE: {
484
20
            if (dispatch->group_privacy_state_callback != nullptr) {
485
14
                dispatch->group_privacy_state_callback(event->data.group_privacy_state, user_data);
486
14
            }
487
488
20
            break;
489
0
        }
490
491
35
        case TOX_EVENT_GROUP_VOICE_STATE: {
492
35
            if (dispatch->group_voice_state_callback != nullptr) {
493
35
                dispatch->group_voice_state_callback(event->data.group_voice_state, user_data);
494
35
            }
495
496
35
            break;
497
0
        }
498
499
23
        case TOX_EVENT_GROUP_TOPIC_LOCK: {
500
23
            if (dispatch->group_topic_lock_callback != nullptr) {
501
18
                dispatch->group_topic_lock_callback(event->data.group_topic_lock, user_data);
502
18
            }
503
504
23
            break;
505
0
        }
506
507
23
        case TOX_EVENT_GROUP_PEER_LIMIT: {
508
23
            if (dispatch->group_peer_limit_callback != nullptr) {
509
19
                dispatch->group_peer_limit_callback(event->data.group_peer_limit, user_data);
510
19
            }
511
512
23
            break;
513
0
        }
514
515
25
        case TOX_EVENT_GROUP_PASSWORD: {
516
25
            if (dispatch->group_password_callback != nullptr) {
517
22
                dispatch->group_password_callback(event->data.group_password, user_data);
518
22
            }
519
520
25
            break;
521
0
        }
522
523
125
        case TOX_EVENT_GROUP_MESSAGE: {
524
125
            if (dispatch->group_message_callback != nullptr) {
525
113
                dispatch->group_message_callback(event->data.group_message, user_data);
526
113
            }
527
528
125
            break;
529
0
        }
530
531
21
        case TOX_EVENT_GROUP_PRIVATE_MESSAGE: {
532
21
            if (dispatch->group_private_message_callback != nullptr) {
533
21
                dispatch->group_private_message_callback(event->data.group_private_message, user_data);
534
21
            }
535
536
21
            break;
537
0
        }
538
539
12
        case TOX_EVENT_GROUP_CUSTOM_PACKET: {
540
12
            if (dispatch->group_custom_packet_callback != nullptr) {
541
12
                dispatch->group_custom_packet_callback(event->data.group_custom_packet, user_data);
542
12
            }
543
544
12
            break;
545
0
        }
546
547
14
        case TOX_EVENT_GROUP_CUSTOM_PRIVATE_PACKET: {
548
14
            if (dispatch->group_custom_private_packet_callback != nullptr) {
549
14
                dispatch->group_custom_private_packet_callback(event->data.group_custom_private_packet, user_data);
550
14
            }
551
552
14
            break;
553
0
        }
554
555
14
        case TOX_EVENT_GROUP_INVITE: {
556
14
            if (dispatch->group_invite_callback != nullptr) {
557
14
                dispatch->group_invite_callback(event->data.group_invite, user_data);
558
14
            }
559
560
14
            break;
561
0
        }
562
563
96
        case TOX_EVENT_GROUP_PEER_JOIN: {
564
96
            if (dispatch->group_peer_join_callback != nullptr) {
565
89
                dispatch->group_peer_join_callback(event->data.group_peer_join, user_data);
566
89
            }
567
568
96
            break;
569
0
        }
570
571
25
        case TOX_EVENT_GROUP_PEER_EXIT: {
572
25
            if (dispatch->group_peer_exit_callback != nullptr) {
573
16
                dispatch->group_peer_exit_callback(event->data.group_peer_exit, user_data);
574
16
            }
575
576
25
            break;
577
0
        }
578
579
41
        case TOX_EVENT_GROUP_SELF_JOIN: {
580
41
            if (dispatch->group_self_join_callback != nullptr) {
581
32
                dispatch->group_self_join_callback(event->data.group_self_join, user_data);
582
32
            }
583
584
41
            break;
585
0
        }
586
587
21
        case TOX_EVENT_GROUP_JOIN_FAIL: {
588
21
            if (dispatch->group_join_fail_callback != nullptr) {
589
21
                dispatch->group_join_fail_callback(event->data.group_join_fail, user_data);
590
21
            }
591
592
21
            break;
593
0
        }
594
595
86
        case TOX_EVENT_GROUP_MODERATION: {
596
86
            if (dispatch->group_moderation_callback != nullptr) {
597
65
                dispatch->group_moderation_callback(event->data.group_moderation, user_data);
598
65
            }
599
600
86
            break;
601
0
        }
602
603
185k
        case TOX_EVENT_DHT_NODES_RESPONSE: {
604
185k
            if (dispatch->dht_nodes_response_callback != nullptr) {
605
101k
                dispatch->dht_nodes_response_callback(event->data.dht_nodes_response, user_data);
606
101k
            }
607
608
185k
            break;
609
0
        }
610
611
0
        case TOX_EVENT_INVALID: {
612
0
            break;
613
0
        }
614
356k
    }
615
356k
}
616
617
void tox_dispatch_invoke(const Tox_Dispatch *_Nonnull dispatch, const Tox_Events *_Nonnull events,
618
                         void *_Nullable user_data)
619
5.81k
{
620
5.81k
    const uint32_t size = tox_events_get_size(events);
621
362k
    for (uint32_t i = 0; i < size; ++i) {
622
356k
        const Tox_Event *event = &events->events[i];
623
356k
        tox_dispatch_invoke_event(dispatch, event, user_data);
624
356k
    }
625
5.81k
}