aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--epan/column.c28
-rw-r--r--epan/column.h3
-rw-r--r--epan/prefs.c3
-rw-r--r--gtk/menus.c16
-rw-r--r--gtk/menus.h3
-rw-r--r--gtk/new_packet_list.c45
-rw-r--r--gtk/new_packet_list.h1
-rw-r--r--gtk/packet_list_store.c8
-rw-r--r--gtk/prefs_column.c1
9 files changed, 104 insertions, 4 deletions
diff --git a/epan/column.c b/epan/column.c
index e3ffceade2..b1b0504500 100644
--- a/epan/column.c
+++ b/epan/column.c
@@ -683,6 +683,34 @@ set_column_visible(const gint col, gboolean visible)
cfmt->visible = visible;
}
+gboolean
+get_column_resolved(const gint col)
+{
+ GList *clp = g_list_nth(prefs.col_list, col);
+ fmt_data *cfmt;
+
+ if (!clp) /* Invalid column requested */
+ return TRUE;
+
+ cfmt = (fmt_data *) clp->data;
+
+ return(cfmt->resolved);
+}
+
+void
+set_column_resolved(const gint col, gboolean resolved)
+{
+ GList *clp = g_list_nth(prefs.col_list, col);
+ fmt_data *cfmt;
+
+ if (!clp) /* Invalid column requested */
+ return;
+
+ cfmt = (fmt_data *) clp->data;
+
+ cfmt->resolved = resolved;
+}
+
const gchar *
get_column_custom_field(const gint col)
{
diff --git a/epan/column.h b/epan/column.h
index a30a889b42..e402eeaaae 100644
--- a/epan/column.h
+++ b/epan/column.h
@@ -34,6 +34,7 @@ typedef struct _fmt_data {
gchar *fmt;
gchar *custom_field;
gboolean visible;
+ gboolean resolved;
} fmt_data;
const gchar *col_format_to_string(const gint);
@@ -44,6 +45,8 @@ gint get_column_format_from_str(const gchar *);
gchar *get_column_title(const gint);
gboolean get_column_visible(const gint);
void set_column_visible(const gint, gboolean);
+gboolean get_column_resolved(const gint);
+void set_column_resolved(const gint, gboolean);
const gchar *get_column_custom_field(const gint);
const gchar *get_column_width_string(const gint, const gint);
const char *get_column_longest_string(const gint);
diff --git a/epan/prefs.c b/epan/prefs.c
index 4249786f28..49b9c20e7f 100644
--- a/epan/prefs.c
+++ b/epan/prefs.c
@@ -1085,6 +1085,7 @@ init_prefs(void) {
cfmt->title = g_strdup(col_fmt[i * 2]);
cfmt->fmt = g_strdup(col_fmt[(i * 2) + 1]);
cfmt->visible = TRUE;
+ cfmt->resolved = TRUE;
cfmt->custom_field = NULL;
prefs.col_list = g_list_append(prefs.col_list, cfmt);
}
@@ -1989,6 +1990,7 @@ set_pref(gchar *pref_name, gchar *value, void *private_data _U_)
cfmt->custom_field = NULL;
}
cfmt->visible = prefs_is_column_hidden (cols_hidden_list, prefs_fmt) ? FALSE : TRUE;
+ cfmt->resolved = TRUE;
g_free (prefs_fmt);
col_l_elt = col_l_elt->next;
prefs.col_list = g_list_append(prefs.col_list, cfmt);
@@ -3255,6 +3257,7 @@ copy_prefs(e_prefs *dest, e_prefs *src)
dest_cfmt->custom_field = NULL;
}
dest_cfmt->visible = src_cfmt->visible;
+ dest_cfmt->resolved = src_cfmt->resolved;
dest->col_list = g_list_append(dest->col_list, dest_cfmt);
}
dest->num_cols = src->num_cols;
diff --git a/gtk/menus.c b/gtk/menus.c
index 2c20d1da47..2b22583583 100644
--- a/gtk/menus.c
+++ b/gtk/menus.c
@@ -797,6 +797,10 @@ static GtkItemFactoryEntry packet_list_heading_items[] =
{"/<separator>", NULL, NULL, 0, "<Separator>", NULL,},
+ {"/Show Resolved", NULL, GTK_MENU_FUNC(new_packet_list_column_menu_cb), COLUMN_SELECTED_TOGGLE_RESOLVED, "<CheckItem>", NULL,},
+
+ {"/<separator>", NULL, NULL, 0, "<Separator>", NULL,},
+
{"/Align Left", NULL, GTK_MENU_FUNC(new_packet_list_column_menu_cb), COLUMN_SELECTED_ALIGN_LEFT, "<StockItem>", GTK_STOCK_JUSTIFY_LEFT,},
{"/Align Center", NULL, GTK_MENU_FUNC(new_packet_list_column_menu_cb), COLUMN_SELECTED_ALIGN_CENTER, "<StockItem>", GTK_STOCK_JUSTIFY_CENTER,},
{"/Align Right", NULL, GTK_MENU_FUNC(new_packet_list_column_menu_cb), COLUMN_SELECTED_ALIGN_RIGHT, "<StockItem>", GTK_STOCK_JUSTIFY_RIGHT,},
@@ -3393,6 +3397,18 @@ rebuild_visible_columns_menu (void)
#endif
void
+menus_set_column_resolved (gboolean resolved, gboolean can_resolve)
+{
+ GtkWidget *menu;
+
+ menu = gtk_item_factory_get_widget(packet_list_heading_factory, "/Show Resolved");
+ g_object_set_data(G_OBJECT(menu), "skip-update", (void *)1);
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), resolved && can_resolve);
+ set_menu_sensitivity(packet_list_heading_factory, "/Show Resolved", can_resolve);
+ g_object_set_data(G_OBJECT(menu), "skip-update", NULL);
+}
+
+void
menus_set_column_align_default (gboolean right_justify)
{
GtkWidget *submenu, *menu_item_child;
diff --git a/gtk/menus.h b/gtk/menus.h
index d1e35a8ff1..069da80e04 100644
--- a/gtk/menus.h
+++ b/gtk/menus.h
@@ -117,6 +117,9 @@ extern GtkWidget *popup_menu_object;
column justification. */
void menus_set_column_align_default (gboolean right_justify);
+/* Update the packet list heading menu to indicate if column can be resolved. */
+void menus_set_column_resolved (gboolean resolved, gboolean can_resolve);
+
/* Enable or disable menu items based on whether a tree row is selected
and and on whether a "Match Selected" can be done. */
void set_menus_for_selected_tree_row(capture_file *cf);
diff --git a/gtk/new_packet_list.c b/gtk/new_packet_list.c
index 4dbef78ae4..ffcb5bb46d 100644
--- a/gtk/new_packet_list.c
+++ b/gtk/new_packet_list.c
@@ -160,7 +160,7 @@ right_justify_column (gint col)
case COL_CUSTOM:
hfi = proto_registrar_get_byname(cfile.cinfo.col_custom_field[col]);
/* Check if this is a valid field and we have no strings lookup table */
- if ((hfi != NULL) && (hfi->strings == NULL)) {
+ if ((hfi != NULL) && ((hfi->strings == NULL) || !get_column_resolved(col))) {
/* Check for bool, framenum and decimal/octal integer types */
if ((hfi->type == FT_BOOLEAN) || (hfi->type == FT_FRAMENUM) ||
(((hfi->display == BASE_DEC) || (hfi->display == BASE_OCT)) &&
@@ -177,6 +177,32 @@ right_justify_column (gint col)
return right_justify;
}
+static gboolean
+resolve_column (gint col)
+{
+ header_field_info *hfi;
+ gboolean resolve = FALSE;
+
+ switch (cfile.cinfo.col_fmt[col]) {
+
+ case COL_CUSTOM:
+ hfi = proto_registrar_get_byname(cfile.cinfo.col_custom_field[col]);
+ /* Check if this is a valid field and we have no strings lookup table */
+ if ((hfi != NULL) && (hfi->strings != NULL) &&
+ /* Check for bool, framenum and decimal/octal integer types */
+ ((hfi->type == FT_BOOLEAN) || (hfi->type == FT_FRAMENUM) ||
+ IS_FT_INT(hfi->type) || IS_FT_UINT(hfi->type))) {
+ resolve = TRUE;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return resolve;
+}
+
static void
col_title_change_ok (GtkWidget *w, gpointer parent_w)
{
@@ -408,7 +434,18 @@ new_packet_list_remove_column (gint col_id, GtkTreeViewColumn *col _U_)
}
void
-new_packet_list_column_menu_cb (GtkWidget *w _U_, gpointer user_data _U_, COLUMN_SELECTED_E action)
+new_packet_list_toggle_resolved (GtkWidget *w, gint col_id)
+{
+ /* We have to check for skip-update because we get an emit in menus_set_column_resolved() */
+ if (g_object_get_data(G_OBJECT(w), "skip-update") == NULL) {
+ set_column_resolved (col_id, get_column_resolved (col_id) ? FALSE : TRUE);
+
+ new_packet_list_recreate();
+ }
+}
+
+void
+new_packet_list_column_menu_cb (GtkWidget *w, gpointer user_data _U_, COLUMN_SELECTED_E action)
{
GtkTreeViewColumn *col = (GtkTreeViewColumn *)
g_object_get_data(G_OBJECT(packetlist->view), E_MPACKET_LIST_COLUMN_KEY);
@@ -425,6 +462,9 @@ new_packet_list_column_menu_cb (GtkWidget *w _U_, gpointer user_data _U_, COLUMN
gtk_tree_view_column_set_sort_indicator(col, FALSE);
gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(packetlist), 0, GTK_SORT_ASCENDING);
break;
+ case COLUMN_SELECTED_TOGGLE_RESOLVED:
+ new_packet_list_toggle_resolved (w, col_id);
+ break;
case COLUMN_SELECTED_ALIGN_LEFT:
new_packet_list_xalign_column (col_id, col, COLUMN_XALIGN_LEFT);
break;
@@ -464,6 +504,7 @@ new_packet_list_column_button_pressed_cb (GtkWidget *widget, GdkEvent *event, gp
gboolean right_justify = right_justify_column (col_id);
menus_set_column_align_default (right_justify);
+ menus_set_column_resolved (get_column_resolved (col_id), resolve_column (col_id));
g_object_set_data(G_OBJECT(packetlist->view), E_MPACKET_LIST_COLUMN_KEY, col);
popup_menu_handler (widget, event, menu);
}
diff --git a/gtk/new_packet_list.h b/gtk/new_packet_list.h
index 6df8f66f4d..68f5d5bfba 100644
--- a/gtk/new_packet_list.h
+++ b/gtk/new_packet_list.h
@@ -34,6 +34,7 @@ typedef enum {
COLUMN_SELECTED_SORT_ASCENDING,
COLUMN_SELECTED_SORT_DESCENDING,
COLUMN_SELECTED_SORT_NONE,
+ COLUMN_SELECTED_TOGGLE_RESOLVED,
COLUMN_SELECTED_ALIGN_LEFT,
COLUMN_SELECTED_ALIGN_CENTER,
COLUMN_SELECTED_ALIGN_RIGHT,
diff --git a/gtk/packet_list_store.c b/gtk/packet_list_store.c
index 426b75f778..1e4beda6a8 100644
--- a/gtk/packet_list_store.c
+++ b/gtk/packet_list_store.c
@@ -738,8 +738,12 @@ packet_list_change_record(PacketList *packet_list, guint row, gint col, column_i
if(!packet_list->string_pool)
packet_list->string_pool = g_string_chunk_new(32);
-
- str = g_string_chunk_insert_const (packet_list->string_pool, (const gchar *)cinfo->col_data[col]);
+ if (!get_column_resolved (col) && cinfo->col_expr.col_expr_val[col]) {
+ /* Use the unresolved value in col_expr_val */
+ str = g_string_chunk_insert_const (packet_list->string_pool, (const gchar *)cinfo->col_expr.col_expr_val[col]);
+ } else {
+ str = g_string_chunk_insert_const (packet_list->string_pool, (const gchar *)cinfo->col_data[col]);
+ }
record->fdata->col_text[col] = str;
break;
}
diff --git a/gtk/prefs_column.c b/gtk/prefs_column.c
index 23e57e3284..a36dd0b205 100644
--- a/gtk/prefs_column.c
+++ b/gtk/prefs_column.c
@@ -340,6 +340,7 @@ column_prefs_add_custom(gint fmt, const gchar *title, const gchar *custom_field)
cfmt->title = g_strdup(title);
cfmt->fmt = g_strdup(col_format_to_string(fmt));
cfmt->custom_field = g_strdup(custom_field);
+ cfmt->resolved = TRUE;
if (custom_field) {
cfmt->visible = TRUE;