1 /* dissector_tables_dlg.c
2 * dissector_tables_dlg 2010 Anders Broman
4 * Wireshark - Network traffic analyzer
5 * By Gerald Combs <gerald@wireshark.org>
6 * Copyright 1998 Gerald Combs
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28 #include <epan/packet.h>
31 #include "ui/gtk/gui_utils.h"
32 #include "ui/gtk/dlg_utils.h"
33 #include "ui/gtk/dissector_tables_dlg.h"
35 static GtkWidget *dissector_tables_dlg_w = NULL;
46 win_destroy_cb(GtkWindow *win _U_, gpointer data _U_)
49 if (dissector_tables_dlg_w != NULL) {
50 window_destroy(dissector_tables_dlg_w);
51 dissector_tables_dlg_w = NULL;
58 * For a dissector table, put
59 * its short name and its
60 * descriptive name in the treeview.
63 struct dissector_tables_tree_info {
69 typedef struct dissector_tables_tree_info dissector_tables_tree_info_t;
72 ui_sort_func(GtkTreeModel *model,
79 /* The col to get data from is in userdata */
80 gint data_column = GPOINTER_TO_INT(user_data);
82 gtk_tree_model_get(model, a, data_column, &stra, -1);
83 gtk_tree_model_get(model, b, data_column, &strb, -1);
85 return strcmp(stra, strb);
90 * Struct to hold the pointer to the trees
91 * for dissector tables.
93 struct dissector_tables_trees {
94 GtkWidget *str_tree_wgt;
95 GtkWidget *uint_tree_wgt;
96 GtkWidget *custom_tree_wgt;
97 GtkWidget *heuristic_tree_wgt;
100 typedef struct dissector_tables_trees dissector_tables_trees_t;
103 proto_add_to_list(dissector_tables_tree_info_t *tree_info,
106 const gchar *proto_name)
108 gtk_tree_store_insert_with_values(store, &tree_info->new_iter, &tree_info->iter, G_MAXINT,
109 TABLE_UI_NAME_COL, str,
110 TABLE_SHORT_NAME_COL, proto_name,
115 decode_proto_add_to_list (const gchar *table_name _U_, ftenum_t selector_type,
116 gpointer key, gpointer value, gpointer user_data)
119 const gchar *proto_name;
120 dtbl_entry_t *dtbl_entry;
121 dissector_handle_t handle;
124 dissector_tables_tree_info_t *tree_info;
126 tree_info = (dissector_tables_tree_info_t *)user_data;
127 dtbl_entry = (dtbl_entry_t*)value;
128 handle = dtbl_entry_get_handle(dtbl_entry);
129 proto_name = dissector_handle_get_short_name(handle);
131 store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(tree_info->tree)));
133 switch (selector_type) {
139 port = GPOINTER_TO_UINT(key);
140 /* Hack: Use fixed width rj str so alpha sort (strcmp) will sort field numerically */
141 str = g_strdup_printf ("%10d", port);
142 proto_add_to_list(tree_info, store, str, proto_name);
151 proto_add_to_list(tree_info, store, str, proto_name);
156 str = (gchar*)dissector_handle_get_dissector_name(handle);
159 str = (gchar*)"<Unknown>";
161 proto_add_to_list(tree_info, store, str, proto_name);
165 g_assert_not_reached();
171 table_name_add_to_list(dissector_tables_tree_info_t *tree_info,
172 GtkWidget *tree_view,
173 const char *table_name,
178 tree_info->tree = tree_view;
179 store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view))); /* Get store */
181 gtk_tree_store_insert_with_values(store, &tree_info->iter, NULL, G_MAXINT,
182 TABLE_UI_NAME_COL, ui_name,
183 TABLE_SHORT_NAME_COL, table_name,
188 display_heur_dissector_table_entries(const char *table_name _U_,
189 struct heur_dtbl_entry *dtbl_entry, gpointer user_data)
191 dissector_tables_tree_info_t *tree_info = (dissector_tables_tree_info_t*)user_data;
194 if (dtbl_entry->protocol) {
196 store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(tree_info->tree))); /* Get store */
197 proto_add_to_list(tree_info, store,
198 (gchar *)proto_get_protocol_long_name(dtbl_entry->protocol),
199 proto_get_protocol_short_name(dtbl_entry->protocol));
201 g_warning("no protocol info");
208 display_heur_dissector_table_names(const char *table_name, struct heur_dissector_list *list, gpointer w)
210 dissector_tables_trees_t *dis_tbl_trees;
211 dissector_tables_tree_info_t *tree_info;
213 tree_info = g_new(dissector_tables_tree_info_t, 1);
214 dis_tbl_trees = (dissector_tables_trees_t*)w;
216 table_name_add_to_list(tree_info, dis_tbl_trees->heuristic_tree_wgt, "", table_name);
219 heur_dissector_table_foreach(table_name, display_heur_dissector_table_entries, tree_info);
225 display_dissector_table_names(const char *table_name, const char *ui_name, void *w)
227 dissector_tables_trees_t *dis_tbl_trees;
228 dissector_tables_tree_info_t *tree_info;
229 ftenum_t selector_type = get_dissector_table_selector_type(table_name);
231 tree_info = g_new(dissector_tables_tree_info_t, 1);
232 dis_tbl_trees = (dissector_tables_trees_t*)w;
234 switch (selector_type) {
239 table_name_add_to_list(tree_info, dis_tbl_trees->uint_tree_wgt, table_name, ui_name);
245 table_name_add_to_list(tree_info, dis_tbl_trees->str_tree_wgt, table_name, ui_name);
249 table_name_add_to_list(tree_info, dis_tbl_trees->custom_tree_wgt, table_name, ui_name);
254 dissector_table_foreach(table_name, decode_proto_add_to_list, tree_info);
264 GtkTreeView *tree_view;
265 GtkTreeViewColumn *column;
266 GtkCellRenderer *renderer;
267 GtkTreeSortable *sortable;
269 /* Create the store */
270 store = gtk_tree_store_new (N_COLUMNS, /* Total number of columns */
271 G_TYPE_STRING, /* Table */
272 G_TYPE_STRING); /* Table */
275 tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
276 tree_view = GTK_TREE_VIEW(tree);
277 sortable = GTK_TREE_SORTABLE(store);
279 /* Speed up the list display */
280 gtk_tree_view_set_fixed_height_mode(tree_view, TRUE);
282 /* Setup the sortable columns */
283 gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW (tree), FALSE);
285 /* The view now holds a reference. We can get rid of our own reference */
286 g_object_unref (G_OBJECT (store));
288 /* Create the first column, associating the "text" attribute of the
289 * cell_renderer to the first column of the model */
290 renderer = gtk_cell_renderer_text_new ();
291 column = gtk_tree_view_column_new_with_attributes ("UI name", renderer, "text", TABLE_UI_NAME_COL, NULL);
292 gtk_tree_sortable_set_sort_func(sortable, TABLE_UI_NAME_COL,
293 ui_sort_func, GINT_TO_POINTER(TABLE_UI_NAME_COL), NULL);
294 gtk_tree_view_column_set_sort_column_id(column, TABLE_UI_NAME_COL);
295 gtk_tree_view_column_set_resizable(column, TRUE);
296 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
297 gtk_tree_view_column_set_min_width(column, 80);
298 gtk_tree_view_column_set_fixed_width(column, 330);
299 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
301 renderer = gtk_cell_renderer_text_new ();
302 column = gtk_tree_view_column_new_with_attributes ("Short name", renderer, "text", TABLE_SHORT_NAME_COL, NULL);
303 gtk_tree_sortable_set_sort_func(sortable, TABLE_SHORT_NAME_COL,
304 ui_sort_func, GINT_TO_POINTER(TABLE_SHORT_NAME_COL), NULL);
305 gtk_tree_view_column_set_sort_column_id(column, TABLE_SHORT_NAME_COL);
306 gtk_tree_view_column_set_resizable(column, TRUE);
307 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
308 gtk_tree_view_column_set_min_width(column, 80);
309 gtk_tree_view_column_set_fixed_width(column, 100);
310 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
317 dissector_tables_dlg_init(void)
319 dissector_tables_trees_t dis_tbl_trees;
323 GtkWidget *scrolled_window;
324 GtkTreeSortable *sortable;
325 GtkWidget *temp_page, *tmp;
327 dissector_tables_dlg_w = dlg_window_new("Dissector tables"); /* transient_for top_level */
328 gtk_window_set_destroy_with_parent (GTK_WINDOW(dissector_tables_dlg_w), TRUE);
329 gtk_window_set_default_size(GTK_WINDOW(dissector_tables_dlg_w), 700, 300);
331 vbox=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE);
332 gtk_container_add(GTK_CONTAINER(dissector_tables_dlg_w), vbox);
333 gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
335 main_nb = gtk_notebook_new();
336 gtk_box_pack_start(GTK_BOX(vbox), main_nb, TRUE, TRUE, 0);
339 temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
340 tmp = gtk_label_new("String tables");
341 gtk_widget_show(tmp);
342 hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
343 gtk_box_pack_start(GTK_BOX (hbox), tmp, TRUE, TRUE, 0);
344 gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
346 scrolled_window = scrolled_window_new(NULL, NULL);
347 dis_tbl_trees.str_tree_wgt = init_table();
348 gtk_widget_show(dis_tbl_trees.str_tree_wgt);
349 gtk_container_add(GTK_CONTAINER(scrolled_window), dis_tbl_trees.str_tree_wgt);
350 gtk_box_pack_start(GTK_BOX(temp_page), scrolled_window, TRUE, TRUE, 0);
351 gtk_widget_show(scrolled_window);
354 temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
355 tmp = gtk_label_new("Integer tables");
356 gtk_widget_show(tmp);
357 hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
358 gtk_box_pack_start(GTK_BOX (hbox), tmp, TRUE, TRUE, 0);
359 gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
361 scrolled_window = scrolled_window_new(NULL, NULL);
362 dis_tbl_trees.uint_tree_wgt = init_table();
363 gtk_widget_show(dis_tbl_trees.uint_tree_wgt);
364 gtk_container_add(GTK_CONTAINER(scrolled_window), dis_tbl_trees.uint_tree_wgt);
365 gtk_box_pack_start(GTK_BOX(temp_page), scrolled_window, TRUE, TRUE, 0);
366 gtk_widget_show(scrolled_window);
369 temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
370 tmp = gtk_label_new("Custom tables");
371 gtk_widget_show(tmp);
372 hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
373 gtk_box_pack_start(GTK_BOX (hbox), tmp, TRUE, TRUE, 0);
374 gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
376 scrolled_window = scrolled_window_new(NULL, NULL);
377 dis_tbl_trees.custom_tree_wgt = init_table();
378 gtk_widget_show(dis_tbl_trees.custom_tree_wgt);
379 gtk_container_add(GTK_CONTAINER(scrolled_window), dis_tbl_trees.custom_tree_wgt);
380 gtk_box_pack_start(GTK_BOX(temp_page), scrolled_window, TRUE, TRUE, 0);
381 gtk_widget_show(scrolled_window);
383 /* heuristic tables */
384 temp_page = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
385 tmp = gtk_label_new("Heuristic tables");
386 gtk_widget_show(tmp);
387 hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3, FALSE);
388 gtk_box_pack_start(GTK_BOX(hbox), tmp, TRUE, TRUE, 0);
389 gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), temp_page, hbox);
391 scrolled_window = scrolled_window_new(NULL, NULL);
392 dis_tbl_trees.heuristic_tree_wgt = init_table();
393 gtk_widget_show(dis_tbl_trees.heuristic_tree_wgt);
394 gtk_container_add(GTK_CONTAINER(scrolled_window), dis_tbl_trees.heuristic_tree_wgt);
395 gtk_box_pack_start(GTK_BOX(temp_page), scrolled_window, TRUE, TRUE, 0);
396 gtk_widget_show(scrolled_window);
398 /* We must display TOP LEVEL Widget before calling init_table() */
399 gtk_widget_show_all(dissector_tables_dlg_w);
400 g_signal_connect(dissector_tables_dlg_w, "destroy", G_CALLBACK(win_destroy_cb), NULL);
402 /* Fill the table with data */
403 dissector_all_tables_foreach_table(display_dissector_table_names, &dis_tbl_trees, NULL);
405 dissector_all_heur_tables_foreach_table(display_heur_dissector_table_names, (gpointer)&dis_tbl_trees, NULL);
407 sortable = GTK_TREE_SORTABLE(gtk_tree_view_get_model(GTK_TREE_VIEW(dis_tbl_trees.str_tree_wgt)));
408 gtk_tree_sortable_set_sort_column_id(sortable, TABLE_UI_NAME_COL, GTK_SORT_ASCENDING);
410 sortable = GTK_TREE_SORTABLE(gtk_tree_view_get_model(GTK_TREE_VIEW(dis_tbl_trees.uint_tree_wgt)));
411 gtk_tree_sortable_set_sort_column_id(sortable, TABLE_UI_NAME_COL, GTK_SORT_ASCENDING);
413 sortable = GTK_TREE_SORTABLE(gtk_tree_view_get_model(GTK_TREE_VIEW(dis_tbl_trees.custom_tree_wgt)));
414 gtk_tree_sortable_set_sort_column_id(sortable, TABLE_UI_NAME_COL, GTK_SORT_ASCENDING);
416 sortable = GTK_TREE_SORTABLE(gtk_tree_view_get_model(GTK_TREE_VIEW(dis_tbl_trees.heuristic_tree_wgt)));
417 gtk_tree_sortable_set_sort_column_id(sortable, TABLE_UI_NAME_COL, GTK_SORT_ASCENDING);
422 dissector_tables_dlg_cb(GtkWidget *w _U_, gpointer d _U_)
424 if (dissector_tables_dlg_w) {
425 reactivate_window(dissector_tables_dlg_w);
427 dissector_tables_dlg_init();
432 * Editor modelines - http://www.wireshark.org/tools/modelines.html
437 * indent-tabs-mode: nil
440 * vi: set shiftwidth=4 tabstop=8 expandtab:
441 * :indentSize=4:tabSize=8:noTabs=true: