6 * (c) 2006, Luis E. Garcia Ontanon <luis@ontanon.org>
8 * Wireshark - Network traffic analyzer
9 * By Gerald Combs <gerald@wireshark.org>
10 * Copyright 1998 Gerald Combs
12 * SPDX-License-Identifier: GPL-2.0-or-later
17 #include <epan/funnel.h>
19 typedef struct _funnel_menu_t {
21 register_stat_group_t group;
22 funnel_menu_callback callback;
23 gpointer callback_data;
25 struct _funnel_menu_t* next;
28 /* XXX This assumes one main window and one capture file. */
29 static const funnel_ops_t* ops = NULL;
30 static funnel_menu_t* registered_menus = NULL;
31 static funnel_menu_t* added_menus = NULL;
32 static funnel_menu_t* removed_menus = NULL;
33 static gboolean menus_registered = FALSE;
35 const funnel_ops_t* funnel_get_funnel_ops(void) { return ops; }
36 void funnel_set_funnel_ops(const funnel_ops_t* o) { ops = o; }
38 static void funnel_insert_menu (funnel_menu_t** menu_list, funnel_menu_t *menu)
44 for (c = *menu_list; c->next; c = c->next);
49 static void funnel_remove_menu (funnel_menu_t ** menu_list, funnel_menu_t *menu)
51 funnel_menu_t *m = *menu_list, *p = NULL;
54 if (m->callback == menu->callback) {
65 m = *menu_list ? (*menu_list)->next : NULL;
74 static void funnel_clear_menu (funnel_menu_t** menu_list)
87 void funnel_register_menu(const char *name,
88 register_stat_group_t group,
89 funnel_menu_callback callback,
90 gpointer callback_data,
93 funnel_menu_t* m = (funnel_menu_t *)g_malloc(sizeof(funnel_menu_t));
94 m->name = g_strdup(name);
96 m->callback = callback;
97 m->callback_data = callback_data;
101 funnel_insert_menu(®istered_menus, m);
102 if (menus_registered) {
103 funnel_menu_t* m_r = (funnel_menu_t *)g_memdup(m, sizeof *m);
104 m_r->name = g_strdup(name);
105 funnel_insert_menu(&added_menus, m_r);
109 void funnel_deregister_menus(funnel_menu_callback callback)
111 funnel_menu_t* m = (funnel_menu_t *)g_malloc0(sizeof(funnel_menu_t));
112 m->callback = callback;
114 funnel_remove_menu(®istered_menus, m);
115 funnel_insert_menu(&removed_menus, m);
118 void funnel_register_all_menus(funnel_registration_cb_t r_cb)
121 for (c = registered_menus; c; c = c->next) {
122 r_cb(c->name,c->group,c->callback,c->callback_data,c->retap);
124 menus_registered = TRUE;
127 void funnel_reload_menus(funnel_deregistration_cb_t d_cb,
128 funnel_registration_cb_t r_cb)
131 for (c = removed_menus; c; c = c->next) {
134 for (c = added_menus; c; c = c->next) {
135 r_cb(c->name,c->group,c->callback,c->callback_data,c->retap);
138 funnel_clear_menu(&removed_menus);
139 funnel_clear_menu(&added_menus);
143 * Editor modelines - http://www.wireshark.org/tools/modelines.html
148 * indent-tabs-mode: nil
151 * vi: set shiftwidth=4 tabstop=8 expandtab:
152 * :indentSize=4:tabSize=8:noTabs=true: