Coverage Report

Created: 2025-10-08 19:34

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