Make 'Apply as filter'/'Prepare filter' work for new packet list.

svn path=/trunk/; revision=29419
This commit is contained in:
Kovarththanan Rajaratnam 2009-08-14 19:35:01 +00:00
parent 4d5d306372
commit af00c3e6da
5 changed files with 46 additions and 34 deletions

View File

@ -494,41 +494,47 @@ selected_ptree_ref_cb(GtkWidget *widget _U_, gpointer data _U_)
}
}
#ifndef NEW_PACKET_LIST
static gchar *
get_filter_from_packet_list_row_and_column(gpointer data)
{
gint row = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(data), E_MPACKET_LIST_ROW_KEY));
gint column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(data), E_MPACKET_LIST_COL_KEY));
frame_data *fdata = (frame_data *) packet_list_get_row_data(row);
epan_dissect_t edt;
gint row = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(data), E_MPACKET_LIST_ROW_KEY));
gint column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(data), E_MPACKET_LIST_COL_KEY));
frame_data *fdata;
gchar *buf=NULL;
int err;
gchar *err_info;
#ifdef NEW_PACKET_LIST
fdata = (frame_data *) new_packet_list_get_row_data(row);
#else
fdata = (frame_data *) packet_list_get_row_data(row);
#endif
if (fdata != NULL) {
if (!wtap_seek_read(cfile.wth, fdata->file_off, &cfile.pseudo_header,
cfile.pd, fdata->cap_len, &err, &err_info)) {
simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
cf_read_error_message(err, err_info), cfile.filename);
return NULL;
}
/* proto tree, visible. We need a proto tree if there's custom columns */
epan_dissect_init(&edt, have_custom_cols(&cfile.cinfo), FALSE);
col_custom_prime_edt(&edt, &cfile.cinfo);
epan_dissect_run(&edt, &cfile.pseudo_header, cfile.pd, fdata,
&cfile.cinfo);
epan_dissect_fill_in_columns(&edt, TRUE);
epan_dissect_t edt;
if (strlen(cfile.cinfo.col_expr.col_expr[column]) != 0 &&
strlen(cfile.cinfo.col_expr.col_expr_val[column]) != 0) {
/* leak a little but safer than ep_ here*/
buf = se_strdup_printf("%s == %s", cfile.cinfo.col_expr.col_expr[column],
cfile.cinfo.col_expr.col_expr_val[column]);
}
if (!wtap_seek_read(cfile.wth, fdata->file_off, &cfile.pseudo_header,
cfile.pd, fdata->cap_len, &err, &err_info)) {
simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
cf_read_error_message(err, err_info), cfile.filename);
return NULL;
}
/* proto tree, visible. We need a proto tree if there's custom columns */
epan_dissect_init(&edt, have_custom_cols(&cfile.cinfo), FALSE);
col_custom_prime_edt(&edt, &cfile.cinfo);
epan_dissect_cleanup(&edt);
epan_dissect_run(&edt, &cfile.pseudo_header, cfile.pd, fdata,
&cfile.cinfo);
epan_dissect_fill_in_columns(&edt, TRUE);
if (strlen(cfile.cinfo.col_expr.col_expr[column]) != 0 &&
strlen(cfile.cinfo.col_expr.col_expr_val[column]) != 0) {
/* leak a little but safer than ep_ here*/
buf = se_strdup_printf("%s == %s", cfile.cinfo.col_expr.col_expr[column],
cfile.cinfo.col_expr.col_expr_val[column]);
}
epan_dissect_cleanup(&edt);
}
return buf;
@ -541,7 +547,6 @@ match_selected_plist_cb(GtkWidget *w _U_, gpointer data, MATCH_SELECTED_E action
action,
get_filter_from_packet_list_row_and_column(data));
}
#endif /* NEW_PACKET_LIST */
/* This function allows users to right click in the details window and copy the text
* information to the operating systems clipboard.

View File

@ -159,7 +159,6 @@ extern void copy_selected_plist_cb(GtkWidget *w _U_, gpointer data, COPY_SELECTE
*/
extern void colorize_selected_ptree_cb(GtkWidget *w, gpointer data, guint8 filt_nr);
#ifndef NEW_PACKET_LIST
/** User requested one of "Apply as Filter" or "Prepare a Filter" functions
* by context menu of packet list.
*
@ -168,7 +167,6 @@ extern void colorize_selected_ptree_cb(GtkWidget *w, gpointer data, guint8 filt_
* @param action the function to use
*/
extern void match_selected_plist_cb(GtkWidget *widget, gpointer data, MATCH_SELECTED_E action);
#endif /* NEW_PACKET_LIST */
/** User requested "Quit" by menu or toolbar.
*

View File

@ -754,7 +754,6 @@ static GtkItemFactoryEntry packet_list_menu_items[] =
{"/<separator>", NULL, NULL, 0, "<Separator>", NULL,},
{"/Apply as Filter", NULL, NULL, 0, "<Branch>", NULL,},
#ifndef NEW_PACKET_LIST
{"/Apply as Filter/_Selected", NULL, GTK_MENU_FUNC(match_selected_plist_cb),
MATCH_SELECTED_REPLACE|MATCH_SELECTED_APPLY_NOW, NULL, NULL,},
{"/Apply as Filter/_Not Selected", NULL, GTK_MENU_FUNC(match_selected_plist_cb),
@ -780,7 +779,6 @@ static GtkItemFactoryEntry packet_list_menu_items[] =
MATCH_SELECTED_AND_NOT, NULL, NULL,},
{"/Prepare a Filter/... o_r not Selected", NULL, GTK_MENU_FUNC(match_selected_plist_cb),
MATCH_SELECTED_OR_NOT, NULL, NULL,},
#endif /* NEW_PACKET_LIST */
{"/Conversation Filter", NULL, NULL, 0, "<Branch>",NULL,},
{"/Conversation Filter/Ethernet", NULL, GTK_MENU_FUNC(conversation_cb),
CONV_ETHER, NULL, NULL,},
@ -2306,12 +2304,17 @@ popup_menu_handler(GtkWidget *widget, GdkEvent *event, gpointer data)
if (widget == g_object_get_data(G_OBJECT(popup_menu_object), E_MPACKET_LIST_KEY) &&
((GdkEventButton *)event)->button != 1) {
#ifdef NEW_PACKET_LIST
if (new_packet_list_get_event_row_column(widget, (GdkEventButton *)event, &row, &column)) {
gint physical_row;
if (new_packet_list_get_event_row_column((GdkEventButton *)event, &physical_row, &row, &column)) {
#else
if (packet_list_get_event_row_column(widget, (GdkEventButton *)event, &row, &column)) {
#endif
g_object_set_data(G_OBJECT(popup_menu_object), E_MPACKET_LIST_ROW_KEY,
#ifdef NEW_PACKET_LIST
GINT_TO_POINTER(physical_row));
#else
GINT_TO_POINTER(row));
#endif
g_object_set_data(G_OBJECT(popup_menu_object), E_MPACKET_LIST_COL_KEY,
GINT_TO_POINTER(column));
#ifdef NEW_PACKET_LIST

View File

@ -427,8 +427,8 @@ new_packet_list_select_cb(GtkTreeView *tree_view, gpointer data _U_)
}
gboolean
new_packet_list_get_event_row_column(GtkWidget *w _U_, GdkEventButton *event_button,
gint *row, gint *column)
new_packet_list_get_event_row_column(GdkEventButton *event_button,
gint *physical_row, gint *row, gint *column)
{
GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(packetlist->view));
GtkTreePath *path;
@ -441,6 +441,7 @@ new_packet_list_get_event_row_column(GtkWidget *w _U_, GdkEventButton *event_but
GtkTreeIter iter;
GList *cols;
gint *indices;
PacketListRecord *record;
/* Fetch indices */
gtk_tree_model_get_iter(model, &iter, path);
@ -450,6 +451,10 @@ new_packet_list_get_event_row_column(GtkWidget *w _U_, GdkEventButton *event_but
*row = indices[0] + 1;
gtk_tree_path_free(path);
/* Fetch physical row */
record = new_packet_list_get_record(model, &iter);
*physical_row = record->fdata->num;
/* Fetch column */
/* XXX -doesn't work if columns are re-arranged? */
cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(packetlist->view));

View File

@ -28,9 +28,10 @@
#ifdef NEW_PACKET_LIST
#include <gtk/gtk.h>
GtkWidget *new_packet_list_create(void);
void new_packet_list_resize_columns_cb(GtkWidget *widget _U_, gpointer data _U_);
gboolean new_packet_list_get_event_row_column(GtkWidget *w, GdkEventButton *event_button, gint *row, gint *column);
gboolean new_packet_list_get_event_row_column(GdkEventButton *event_button, gint *physical_row, gint *row, gint *column);
/** Set the font of the packet list window.
*