ws_pipe: don't check for negative number using DWORD.
[metze/wireshark/wip.git] / epan / funnel.c
1 /*
2  *  funnel.c
3  *
4  * EPAN's GUI mini-API
5  *
6  * (c) 2006, Luis E. Garcia Ontanon <luis@ontanon.org>
7  *
8  * Wireshark - Network traffic analyzer
9  * By Gerald Combs <gerald@wireshark.org>
10  * Copyright 1998 Gerald Combs
11  *
12  * SPDX-License-Identifier: GPL-2.0-or-later
13  */
14
15 #include "config.h"
16
17 #include <epan/funnel.h>
18
19 typedef struct _funnel_menu_t {
20     char *name;
21     register_stat_group_t group;
22     funnel_menu_callback callback;
23     gpointer callback_data;
24     gboolean retap;
25     struct _funnel_menu_t* next;
26 } funnel_menu_t;
27
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;
34
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; }
37
38 static void funnel_insert_menu (funnel_menu_t** menu_list, funnel_menu_t *menu)
39 {
40     if (!(*menu_list))  {
41         *menu_list = menu;
42     } else {
43         funnel_menu_t* c;
44         for (c = *menu_list; c->next; c = c->next);
45         c->next = menu;
46     }
47 }
48
49 static void funnel_remove_menu (funnel_menu_t ** menu_list, funnel_menu_t *menu)
50 {
51     funnel_menu_t *m = *menu_list, *p = NULL;
52
53     while (m) {
54         if (m->callback == menu->callback) {
55             if (p) {
56                 p->next = m->next;
57             } else {
58                 *menu_list = m->next;
59             }
60             g_free(m->name);
61             g_free(m);
62             if (p) {
63                 m = p->next;
64             } else {
65                 m = *menu_list ? (*menu_list)->next : NULL;
66             }
67         } else {
68             p = m;
69             m = m->next;
70         }
71     }
72 }
73
74 static void funnel_clear_menu (funnel_menu_t** menu_list)
75 {
76     funnel_menu_t *m;
77
78     while (*menu_list) {
79         m = *menu_list;
80         *menu_list = m->next;
81         g_free(m->name);
82         g_free(m);
83     }
84     *menu_list = NULL;
85 }
86
87 void funnel_register_menu(const char *name,
88                           register_stat_group_t group,
89                           funnel_menu_callback callback,
90                           gpointer callback_data,
91                           gboolean retap)
92 {
93     funnel_menu_t* m = (funnel_menu_t *)g_malloc(sizeof(funnel_menu_t));
94     m->name = g_strdup(name);
95     m->group = group;
96     m->callback = callback;
97     m->callback_data = callback_data;
98     m->retap = retap;
99     m->next = NULL;
100
101     funnel_insert_menu(&registered_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);
106     }
107 }
108
109 void funnel_deregister_menus(funnel_menu_callback callback)
110 {
111     funnel_menu_t* m = (funnel_menu_t *)g_malloc0(sizeof(funnel_menu_t));
112     m->callback = callback;
113
114     funnel_remove_menu(&registered_menus, m);
115     funnel_insert_menu(&removed_menus, m);
116 }
117
118 void funnel_register_all_menus(funnel_registration_cb_t r_cb)
119 {
120     funnel_menu_t* c;
121     for (c = registered_menus; c; c = c->next) {
122         r_cb(c->name,c->group,c->callback,c->callback_data,c->retap);
123     }
124     menus_registered = TRUE;
125 }
126
127 void funnel_reload_menus(funnel_deregistration_cb_t d_cb,
128                          funnel_registration_cb_t r_cb)
129 {
130     funnel_menu_t* c;
131     for (c = removed_menus; c; c = c->next) {
132         d_cb(c->callback);
133     }
134     for (c = added_menus; c; c = c->next) {
135         r_cb(c->name,c->group,c->callback,c->callback_data,c->retap);
136     }
137
138     funnel_clear_menu(&removed_menus);
139     funnel_clear_menu(&added_menus);
140 }
141
142 /*
143  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
144  *
145  * Local variables:
146  * c-basic-offset: 4
147  * tab-width: 8
148  * indent-tabs-mode: nil
149  * End:
150  *
151  * vi: set shiftwidth=4 tabstop=8 expandtab:
152  * :indentSize=4:tabSize=8:noTabs=true:
153  */