aboutsummaryrefslogtreecommitdiffstats
path: root/gtk/decode_as_dlg.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2003-09-07 00:47:57 +0000
committerGuy Harris <guy@alum.mit.edu>2003-09-07 00:47:57 +0000
commitf6c0519c0aaaff1e6db663771848da12ae250ea2 (patch)
tree9156d2c34113e90ee2fc141f9f77e1c63fd14bf2 /gtk/decode_as_dlg.c
parentc26004150bfe357f4cf3017d9c48a489bba62591 (diff)
Support string dissector tables in the Tethereal "decode as" stuff.
Make the Ethereal "decode as" stuff not blow up with string dissector tables. Selectors for uint dissector tables are unsigned, not signed. svn path=/trunk/; revision=8408
Diffstat (limited to 'gtk/decode_as_dlg.c')
-rw-r--r--gtk/decode_as_dlg.c129
1 files changed, 93 insertions, 36 deletions
diff --git a/gtk/decode_as_dlg.c b/gtk/decode_as_dlg.c
index d403fc887b..5dd826756b 100644
--- a/gtk/decode_as_dlg.c
+++ b/gtk/decode_as_dlg.c
@@ -1,6 +1,6 @@
/* decode_as_dlg.c
*
- * $Id: decode_as_dlg.c,v 1.31 2003/03/01 13:08:59 deniel Exp $
+ * $Id: decode_as_dlg.c,v 1.32 2003/09/07 00:47:57 guy Exp $
*
* Routines to modify dissector tables on the fly.
*
@@ -97,7 +97,7 @@ enum srcdst_type {
* Columns for a "Display" list
*/
#define E_LIST_D_TABLE 0
-#define E_LIST_D_PORT 1
+#define E_LIST_D_SELECTOR 1
#define E_LIST_D_INITIAL 2
#define E_LIST_D_CURRENT 3
#define E_LIST_D_MAX E_LIST_D_CURRENT
@@ -151,8 +151,13 @@ static enum action_type requested_action = -1;
struct dissector_delete_item {
/* The name of the dissector table */
const gchar *ddi_table_name;
- /* The port number in the dissector table */
- guint ddi_port;
+ /* The type of the selector in that dissector table */
+ ftenum_t ddi_selector_type;
+ /* The selector in the dissector table */
+ union {
+ guint sel_uint;
+ char *sel_string;
+ } ddi_selector;
};
/*
@@ -188,14 +193,32 @@ GSList *dissector_reset_list = NULL;
* @param user_data Unused.
*/
static void
-decode_build_reset_list (gchar *table_name, gpointer key,
- gpointer value _U_, gpointer user_data _U_)
+decode_build_reset_list (gchar *table_name, ftenum_t selector_type,
+ gpointer key, gpointer value _U_,
+ gpointer user_data _U_)
{
dissector_delete_item_t *item;
item = g_malloc(sizeof(dissector_delete_item_t));
item->ddi_table_name = table_name;
- item->ddi_port = GPOINTER_TO_UINT(key);
+ item->ddi_selector_type = selector_type;
+ switch (selector_type) {
+
+ case FT_UINT8:
+ case FT_UINT16:
+ case FT_UINT24:
+ case FT_UINT32:
+ item->ddi_selector.sel_uint = GPOINTER_TO_UINT(key);
+ break;
+
+ case FT_STRING:
+ case FT_STRINGZ:
+ item->ddi_selector.sel_string = key;
+ break;
+
+ default:
+ g_assert_not_reached();
+ }
dissector_reset_list = g_slist_prepend(dissector_reset_list, item);
}
@@ -224,8 +247,8 @@ decode_build_reset_list (gchar *table_name, gpointer key,
* should be stored.
*/
static void
-decode_build_show_list (gchar *table_name, gpointer key,
- gpointer value, gpointer user_data)
+decode_build_show_list (gchar *table_name, ftenum_t selector_type,
+ gpointer key, gpointer value, gpointer user_data)
{
#if GTK_MAJOR_VERSION < 2
GtkCList *clist;
@@ -258,42 +281,59 @@ decode_build_show_list (gchar *table_name, gpointer key,
initial_proto_name = dissector_handle_get_short_name(initial);
text[E_LIST_D_TABLE] = get_dissector_table_ui_name(table_name);
- switch (get_dissector_table_base(table_name)) {
-
- case BASE_DEC:
- sprintf(string1, "%u", GPOINTER_TO_UINT(key));
- break;
+ switch (selector_type) {
- case BASE_HEX:
- switch (get_dissector_table_type(table_name)) {
+ case FT_UINT8:
+ case FT_UINT16:
+ case FT_UINT24:
+ case FT_UINT32:
+ switch (get_dissector_table_base(table_name)) {
- case FT_UINT8:
- sprintf(string1, "0x%02x", GPOINTER_TO_UINT(key));
+ case BASE_DEC:
+ sprintf(string1, "%u", GPOINTER_TO_UINT(key));
break;
- case FT_UINT16:
- sprintf(string1, "0x%04x", GPOINTER_TO_UINT(key));
- break;
+ case BASE_HEX:
+ switch (get_dissector_table_selector_type(table_name)) {
- case FT_UINT24:
- sprintf(string1, "0x%06x", GPOINTER_TO_UINT(key));
- break;
+ case FT_UINT8:
+ sprintf(string1, "0x%02x", GPOINTER_TO_UINT(key));
+ break;
- case FT_UINT32:
- sprintf(string1, "0x%08x", GPOINTER_TO_UINT(key));
+ case FT_UINT16:
+ sprintf(string1, "0x%04x", GPOINTER_TO_UINT(key));
+ break;
+
+ case FT_UINT24:
+ sprintf(string1, "0x%06x", GPOINTER_TO_UINT(key));
+ break;
+
+ case FT_UINT32:
+ sprintf(string1, "0x%08x", GPOINTER_TO_UINT(key));
+ break;
+
+ default:
+ g_assert_not_reached();
+ break;
+ }
break;
- default:
- g_assert_not_reached();
+ case BASE_OCT:
+ sprintf(string1, "%#o", GPOINTER_TO_UINT(key));
break;
}
+ text[E_LIST_D_SELECTOR] = string1;
break;
- case BASE_OCT:
- sprintf(string1, "%#o", GPOINTER_TO_UINT(key));
+ case FT_STRING:
+ case FT_STRINGZ:
+ text[E_LIST_D_SELECTOR] = key;
+ break;
+
+ default:
+ g_assert_not_reached();
break;
}
- text[E_LIST_D_PORT] = string1;
text[E_LIST_D_INITIAL] = initial_proto_name;
text[E_LIST_D_CURRENT] = current_proto_name;
#if GTK_MAJOR_VERSION < 2
@@ -301,7 +341,7 @@ decode_build_show_list (gchar *table_name, gpointer key,
#else
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, E_LIST_D_TABLE, text[E_LIST_D_TABLE],
- E_LIST_D_PORT, text[E_LIST_D_PORT],
+ E_LIST_D_SELECTOR, text[E_LIST_D_SELECTOR],
E_LIST_D_INITIAL, text[E_LIST_D_INITIAL],
E_LIST_D_CURRENT, text[E_LIST_D_CURRENT], -1);
#endif
@@ -344,7 +384,24 @@ decode_show_reset_cb (GtkWidget *reset_bt _U_, gpointer parent_w)
for (tmp = dissector_reset_list; tmp; tmp = g_slist_next(tmp)) {
item = tmp->data;
- dissector_reset(item->ddi_table_name, item->ddi_port);
+ switch (item->ddi_selector_type) {
+
+ case FT_UINT8:
+ case FT_UINT16:
+ case FT_UINT24:
+ case FT_UINT32:
+ dissector_reset(item->ddi_table_name, item->ddi_selector.sel_uint);
+ break;
+
+ case FT_STRING:
+ case FT_STRINGZ:
+ dissector_reset_string(item->ddi_table_name,
+ item->ddi_selector.sel_string);
+ break;
+
+ default:
+ g_assert_not_reached();
+ }
g_free(item);
}
g_slist_free(dissector_reset_list);
@@ -538,7 +595,7 @@ decode_show_cb (GtkWidget * w _U_, gpointer data _U_)
* buffer.
*/
static void
-decode_change_one_dissector(gchar *table_name, gint selector, GtkWidget *list)
+decode_change_one_dissector(gchar *table_name, guint selector, GtkWidget *list)
{
dissector_handle_t handle;
gchar *abbrev;
@@ -644,7 +701,7 @@ decode_simple (GtkWidget *notebook_pg)
gchar *string;
#endif
gchar *table_name;
- gint value;
+ guint value;
list = OBJECT_GET_DATA(notebook_pg, E_PAGE_LIST);
if (requested_action == E_DECODE_NO)
@@ -660,7 +717,7 @@ decode_simple (GtkWidget *notebook_pg)
#endif
table_name = OBJECT_GET_DATA(notebook_pg, E_PAGE_TABLE);
- value = GPOINTER_TO_INT(OBJECT_GET_DATA(notebook_pg, E_PAGE_VALUE));
+ value = GPOINTER_TO_UINT(OBJECT_GET_DATA(notebook_pg, E_PAGE_VALUE));
decode_change_one_dissector(table_name, value, list);
}