diff options
-rw-r--r-- | cfile.h | 1 | ||||
-rw-r--r-- | file.c | 1 | ||||
-rw-r--r-- | gtk/main.c | 4 | ||||
-rw-r--r-- | gtk/main.h | 10 | ||||
-rw-r--r-- | gtk/menus.c | 111 | ||||
-rw-r--r-- | gtk/new_packet_list.c | 178 | ||||
-rw-r--r-- | gtk/new_packet_list.h | 19 |
7 files changed, 213 insertions, 111 deletions
@@ -59,6 +59,7 @@ typedef struct _capture_file { int displayed_count; /* Number of displayed frames */ int marked_count; /* Number of marked frames */ int ignored_count; /* Number of ignored frames */ + int ref_time_count; /* Number of time referenced frames */ gboolean drops_known; /* TRUE if we know how many packets were dropped */ guint32 drops; /* Dropped packets */ nstime_t elapsed_time; /* Elapsed time */ @@ -320,6 +320,7 @@ cf_open(capture_file *cf, const char *fname, gboolean is_tempfile, int *err) cf->displayed_count = 0; cf->marked_count = 0; cf->ignored_count = 0; + cf->ref_time_count = 0; cf->drops_known = FALSE; cf->drops = 0; cf->snap = wtap_snapshot_length(cf->wth); diff --git a/gtk/main.c b/gtk/main.c index 31d25d9e0e..983954ec8f 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -690,14 +690,16 @@ copy_selected_plist_cb(GtkWidget *w _U_, gpointer data _U_, COPY_SELECTED_E acti /* mark as reference time frame */ -static void +void set_frame_reftime(gboolean set, frame_data *frame, gint row) { if (row == -1) return; if (set) { frame->flags.ref_time=1; + cfile.ref_time_count++; } else { frame->flags.ref_time=0; + cfile.ref_time_count--; } cf_reftime_packets(&cfile); #ifdef NEW_PACKET_LIST diff --git a/gtk/main.h b/gtk/main.h index 3025b3547a..f2b14d42ac 100644 --- a/gtk/main.h +++ b/gtk/main.h @@ -136,7 +136,7 @@ typedef enum { COPY_SELECTED_VALUE /**< "Copy Value" */ } COPY_SELECTED_E; -/** User highlited item in details window and then right clicked and selected the copy option +/** User highlighted item in details window and then right clicked and selected the copy option * * @param widget parent widget * @param data parent widget @@ -144,6 +144,14 @@ typedef enum { */ extern void copy_selected_plist_cb(GtkWidget *w _U_, gpointer data, COPY_SELECTED_E action); +/** Set or remove a time reference on this frame + * + * @param TRUE = set time ref, FALSE=unset time ref + * @param pointer to frame + * @param row number + */ +extern void set_frame_reftime(gboolean set, frame_data *frame, gint row); + /** User requested the colorize function * by menu or context menu of protocol tree. * diff --git a/gtk/menus.c b/gtk/menus.c index b13f479832..39f85dc9ce 100644 --- a/gtk/menus.c +++ b/gtk/menus.c @@ -510,50 +510,48 @@ static GtkItemFactoryEntry menu_items[] = 0, "<StockItem>", GTK_STOCK_PASTE,}, #endif {"/Edit/<separator>", NULL, NULL, 0, "<Separator>", NULL,}, - {"/Edit/_Find Packet...", "<control>F", - GTK_MENU_FUNC(find_frame_cb), 0, "<StockItem>", GTK_STOCK_FIND,}, - {"/Edit/Find Ne_xt", "<control>N", GTK_MENU_FUNC(find_next_cb), 0, NULL, NULL,}, - {"/Edit/Find Pre_vious", "<control>B", GTK_MENU_FUNC(find_previous_cb), 0, NULL, NULL,}, - {"/Edit/<separator>", NULL, NULL, 0, "<Separator>", NULL,}, + {"/Edit/_Find Packet...", "<control>F", GTK_MENU_FUNC(find_frame_cb), 0, "<StockItem>", GTK_STOCK_FIND,}, + {"/Edit/Find Ne_xt", "<control>N", GTK_MENU_FUNC(find_next_cb), 0, NULL, NULL,}, + {"/Edit/Find Pre_vious", "<control>B", GTK_MENU_FUNC(find_previous_cb), 0, NULL, NULL,}, #ifdef NEW_PACKET_LIST - {"/Edit/_Mark Packet (toggle)", "<control>M", GTK_MENU_FUNC(new_packet_list_mark_frame_cb), - 0, NULL, NULL,}, + {"/Edit/<separator>", NULL, NULL, 0, "<Separator>", NULL,}, + {"/Edit/_Mark Packet (toggle)", "<control>M", GTK_MENU_FUNC(new_packet_list_mark_frame_cb),0, NULL, NULL,}, + {"/Edit/Mark All Displayed Packets (toggle)", "<shift><control>M", GTK_MENU_FUNC(new_packet_list_mark_all_displayed_frames_cb), 0, NULL, NULL,}, + {"/Edit/Unmark All Packets", "<alt><control>M", GTK_MENU_FUNC(new_packet_list_unmark_all_frames_cb), 0, NULL, NULL,}, + {"/Edit/Find Next Mark", "<shift><control>N", GTK_MENU_FUNC(find_next_mark_cb), 0, NULL, NULL,}, + {"/Edit/Find Previous Mark", "<shift><control>B", GTK_MENU_FUNC(find_prev_mark_cb), 0, NULL, NULL,}, + {"/Edit/<separator>", NULL, NULL, 0, "<Separator>", NULL,}, + {"/Edit/_Ignore Packet (toggle)", "<control>D", GTK_MENU_FUNC(new_packet_list_ignore_frame_cb), 0, NULL, NULL,}, + {"/Edit/Ignore All Displayed Packets (toggle)","<shift><control>D", GTK_MENU_FUNC(new_packet_list_ignore_all_displayed_frames_cb), 0, NULL, NULL,}, + {"/Edit/U_n-Ignore All Packets", "<alt><control>D", GTK_MENU_FUNC(new_packet_list_unignore_all_frames_cb), 0, NULL, NULL,}, + {"/Edit/<separator>", NULL, NULL, 0, "<Separator>", NULL,}, + {"/Edit/Set Time Reference (toggle)", "<control>T", GTK_MENU_FUNC(reftime_frame_cb), REFTIME_TOGGLE, "<StockItem>", WIRESHARK_STOCK_TIME,}, + {"/Edit/Un-Time Reference All Packets", "<alt><control>T", GTK_MENU_FUNC(new_packet_list_untime_reference_all_frames_cb), 0, NULL, NULL,}, + {"/Edit/Find Next Time Reference", "<alt><control>N", GTK_MENU_FUNC(reftime_frame_cb), REFTIME_FIND_NEXT, NULL, NULL,}, + {"/Edit/Find Previous Time Reference", "<alt><control>B", GTK_MENU_FUNC(reftime_frame_cb), REFTIME_FIND_PREV, NULL, NULL,}, #else + {"/Edit/<separator>", NULL, NULL, 0, "<Separator>", NULL,}, {"/Edit/_Mark Packet (toggle)", "<control>M", GTK_MENU_FUNC(packet_list_mark_frame_cb), 0, NULL, NULL,}, -#endif /* NEW_PACKET_LIST */ {"/Edit/Find Next Mark", "<shift><control>N", GTK_MENU_FUNC(find_next_mark_cb), 0, NULL, NULL,}, {"/Edit/Find Previous Mark", "<shift><control>B", GTK_MENU_FUNC(find_prev_mark_cb), 0, NULL, NULL,}, -#ifdef NEW_PACKET_LIST - {"/Edit/Mark _All Displayed Packets", "<control>A", GTK_MENU_FUNC(new_packet_list_mark_all_frames_cb), 0, NULL, NULL,}, - {"/Edit/_Unmark All Packets", "<control>D", GTK_MENU_FUNC(new_packet_list_unmark_all_frames_cb), 0, NULL, NULL,}, -#else {"/Edit/Mark _All Displayed Packets", "<control>A", GTK_MENU_FUNC(packet_list_mark_all_frames_cb), 0, NULL, NULL,}, {"/Edit/_Unmark All Packets", "<control>D", GTK_MENU_FUNC(packet_list_unmark_all_frames_cb), 0, NULL, NULL,}, -#endif /* NEW_PACKET_LIST */ {"/Edit/<separator>", NULL, NULL, 0, "<Separator>", NULL,}, -#ifdef NEW_PACKET_LIST - {"/Edit/_Ignore Packet (toggle)", "<control>X", GTK_MENU_FUNC(new_packet_list_ignore_frame_cb), - 0, NULL, NULL,}, - {"/Edit/Ignore All Displayed Packets", "<alt><shift><control>X", GTK_MENU_FUNC(new_packet_list_ignore_all_frames_cb), - 0, NULL, NULL,}, - {"/Edit/U_n-Ignore All Packets", "<shift><control>X", GTK_MENU_FUNC(new_packet_list_unignore_all_frames_cb), - 0, NULL, NULL,}, -#else {"/Edit/_Ignore Packet (toggle)", "<control>X", GTK_MENU_FUNC(packet_list_ignore_frame_cb), 0, NULL, NULL,}, {"/Edit/Ignore All Displayed Packets", "<alt><shift><control>X", GTK_MENU_FUNC(packet_list_ignore_all_frames_cb), 0, NULL, NULL,}, {"/Edit/U_n-Ignore All Packets", "<shift><control>X", GTK_MENU_FUNC(packet_list_unignore_all_frames_cb), 0, NULL, NULL,}, -#endif /* NEW_PACKET_LIST */ {"/Edit/<separator>", NULL, NULL, 0, "<Separator>", NULL,}, {"/Edit/Set Time Reference (toggle)", "<control>T", GTK_MENU_FUNC(reftime_frame_cb), REFTIME_TOGGLE, "<StockItem>", WIRESHARK_STOCK_TIME,}, - {"/Edit/Find Next Reference", "<alt><shift><control>N", GTK_MENU_FUNC(reftime_frame_cb), REFTIME_FIND_NEXT, NULL, NULL,}, - {"/Edit/Find Previous Reference", "<alt><shift><control>B", GTK_MENU_FUNC(reftime_frame_cb), REFTIME_FIND_PREV, NULL, NULL,}, + {"/Edit/Find Next Time Reference", "<alt><shift><control>N", GTK_MENU_FUNC(reftime_frame_cb), REFTIME_FIND_NEXT, NULL, NULL,}, + {"/Edit/Find Previous Time Reference", "<alt><shift><control>B", GTK_MENU_FUNC(reftime_frame_cb), REFTIME_FIND_PREV, NULL, NULL,}, +#endif /* NEW_PACKET_LIST */ {"/Edit/<separator>", NULL, NULL, 0, "<Separator>", NULL,}, {"/Edit/_Configuration Profiles...", "<shift><control>A", GTK_MENU_FUNC(profile_dialog_cb), 0, NULL, NULL,}, {"/Edit/_Preferences...", "<shift><control>P", GTK_MENU_FUNC(prefs_page_cb), @@ -2837,36 +2835,61 @@ packet_is_ssl(epan_dissect_t* edt) void set_menus_for_selected_packet(capture_file *cf) { - gboolean is_ssl = packet_is_ssl(cf->edt); - set_menu_sensitivity(main_menu_factory, "/Edit/Mark Packet (toggle)", + /* Making the menu context-sensitive allows for easier selection of the desired item and has + the added benefit with large captures of avoiding needless looping through huge lists + for marked, ignored, or time-referenced packets. + + When all the packets are currently displayed, there is no benefit to marking or ignoring + all the frames even if the File>Merge function is used, because the marked and ignored + packet attributes are scrubbed in the merged display list. */ + + gboolean is_ssl = packet_is_ssl(cf->edt); + + set_menu_sensitivity(main_menu_factory, "/Edit/Mark Packet (toggle)", cf->current_frame != NULL); set_menu_sensitivity(packet_list_menu_factory, "/Mark Packet (toggle)", cf->current_frame != NULL); - set_menu_sensitivity(main_menu_factory, "/Edit/Find Next Mark", - cf->current_frame != NULL); - set_menu_sensitivity(main_menu_factory, "/Edit/Find Previous Mark", - cf->current_frame != NULL); - set_menu_sensitivity(main_menu_factory, "/Edit/Mark All Displayed Packets", - cf->current_frame != NULL); - set_menu_sensitivity(main_menu_factory, "/Edit/Unmark All Packets", - cf->current_frame != NULL); + set_menu_sensitivity(main_menu_factory, "/Edit/Mark All Displayed Packets (toggle)", + cf->displayed_count > 0 && cf->displayed_count != cf->count); + /* Unlike un-gnore, do not allow unmark of all frames when no frames are displayed */ + set_menu_sensitivity(main_menu_factory, "/Edit/Unmark All Packets", + cf->current_frame != NULL && cf->marked_count > 0); + set_menu_sensitivity(main_menu_factory, "/Edit/Find Next Mark", + cf->current_frame != NULL ? + cf->marked_count > 0 && !(cf->marked_count == 1 && cf->current_frame->flags.marked==TRUE) : + FALSE ); + set_menu_sensitivity(main_menu_factory, "/Edit/Find Previous Mark", + cf->current_frame != NULL ? + cf->marked_count > 0 && !(cf->marked_count == 1 && cf->current_frame->flags.marked==TRUE) : + FALSE ); + set_menu_sensitivity(main_menu_factory, "/Edit/Ignore Packet (toggle)", cf->current_frame != NULL); - set_menu_sensitivity(main_menu_factory, "/Edit/Ignore All Displayed Packets", - cf->current_frame != NULL); - set_menu_sensitivity(main_menu_factory, "/Edit/Un-Ignore All Packets", - cf->current_frame != NULL); - set_menu_sensitivity(packet_list_menu_factory, "/Ignore Packet (toggle)", + set_menu_sensitivity(packet_list_menu_factory, "/Ignore Packet (toggle)", cf->current_frame != NULL); + set_menu_sensitivity(main_menu_factory, "/Edit/Ignore All Displayed Packets (toggle)", + cf->displayed_count > 0 && cf->displayed_count != cf->count); + /* Allow un-ignore of all frames even with no frames currently displayed */ + set_menu_sensitivity(main_menu_factory, "/Edit/Un-Ignore All Packets", + cf->ignored_count > 0); + set_menu_sensitivity(main_menu_factory, "/Edit/Set Time Reference (toggle)", cf->current_frame != NULL); + set_menu_sensitivity(main_menu_factory, "/Edit/Un-Time Reference All Packets", + cf->ref_time_count > 0); + set_menu_sensitivity(packet_list_menu_factory, "/Set Time Reference (toggle)", cf->current_frame != NULL); - set_menu_sensitivity(main_menu_factory, "/Edit/Find Next Reference", - cf->current_frame != NULL); - set_menu_sensitivity(main_menu_factory, "/Edit/Find Previous Reference", - cf->current_frame != NULL); - set_menu_sensitivity(main_menu_factory, "/View/Resize All Columns", + set_menu_sensitivity(main_menu_factory, "/Edit/Find Next Time Reference", + cf->current_frame != NULL ? + cf->ref_time_count > 0 && !(cf->ref_time_count == 1 && cf->current_frame->flags.ref_time==TRUE) : + FALSE ); + set_menu_sensitivity(main_menu_factory, "/Edit/Find Previous Time Reference", + cf->current_frame != NULL ? + cf->ref_time_count > 0 && !(cf->ref_time_count == 1 && cf->current_frame->flags.ref_time==TRUE) : + FALSE ); + + set_menu_sensitivity(main_menu_factory, "/View/Resize All Columns", cf->current_frame != NULL); set_menu_sensitivity(main_menu_factory, "/View/Collapse All", cf->current_frame != NULL); diff --git a/gtk/new_packet_list.c b/gtk/new_packet_list.c index 3198df9f77..cfa051e3e6 100644 --- a/gtk/new_packet_list.c +++ b/gtk/new_packet_list.c @@ -1202,58 +1202,6 @@ new_packet_list_queue_draw(void) cf_select_packet(&cfile, row); } -/* call this after last set_frame_mark is done */ -static void -mark_frames_ready(void) -{ - file_save_update_dynamics(); - packets_bar_update(); - new_packet_list_queue_draw(); -} - -static void -set_frame_mark(gboolean set, frame_data *fdata) -{ - if (set) - cf_mark_frame(&cfile, fdata); - else - cf_unmark_frame(&cfile, fdata); -} - -static void -set_frame_ignore(gboolean set, frame_data *fdata) -{ - if (set) - cf_ignore_frame(&cfile, fdata); - else - cf_unignore_frame(&cfile, fdata); -} - -static void -mark_all_frames(gboolean set) -{ - frame_data *fdata; - - /* XXX: we might need a progressbar here */ - for (fdata = cfile.plist_start; fdata != NULL; fdata = fdata->next) { - if( fdata->flags.passed_dfilter ) - set_frame_mark(set, fdata); - } - mark_frames_ready(); -} - -void -new_packet_list_mark_all_frames_cb(GtkWidget *w _U_, gpointer data _U_) -{ - mark_all_frames(TRUE); -} - -void -new_packet_list_unmark_all_frames_cb(GtkWidget *w _U_, gpointer data _U_) -{ - mark_all_frames(FALSE); -} - /* Set the selection mode of the packet list window. */ void new_packet_list_set_sel_browse(gboolean val, gboolean force_set) @@ -1300,6 +1248,25 @@ new_packet_list_set_font(PangoFontDescription *font) gtk_widget_modify_font(packetlist->view, font); } + +/* call this after last set_frame_mark is done */ +static void +mark_frames_ready(void) +{ + file_save_update_dynamics(); + packets_bar_update(); + new_packet_list_queue_draw(); +} + +static void +set_frame_mark(gboolean set, frame_data *fdata) +{ + if (set) + cf_mark_frame(&cfile, fdata); + else + cf_unmark_frame(&cfile, fdata); +} + void new_packet_list_mark_frame_cb(GtkWidget *w _U_, gpointer data _U_) { @@ -1317,6 +1284,57 @@ new_packet_list_mark_frame_cb(GtkWidget *w _U_, gpointer data _U_) mark_frames_ready(); } +static void +mark_all_displayed_frames(gboolean set) +{ + /* XXX: we might need a progressbar here */ + frame_data *fdata; + for (fdata = cfile.plist_start; fdata != NULL; fdata = fdata->next) { + if( fdata->flags.passed_dfilter ) + set_frame_mark(set, fdata); + } +} + +void +new_packet_list_mark_all_displayed_frames_cb(GtkWidget *w _U_, gpointer data _U_) +{ + if(cfile.displayed_count < cfile.count){ + if (cf_find_packet_marked(&cfile, SD_FORWARD)) { + mark_all_displayed_frames(FALSE); + }else { + mark_all_displayed_frames(TRUE); + } + mark_frames_ready(); + } +} + +static void +unmark_all_frames() +{ + /* XXX: we might need a progressbar here */ + frame_data *fdata; + for (fdata = cfile.plist_start; fdata != NULL && cfile.marked_count > 0; fdata = fdata->next) { + set_frame_mark(FALSE, fdata); + } +} + +void +new_packet_list_unmark_all_frames_cb(GtkWidget *w _U_, gpointer data _U_) +{ + unmark_all_frames(); + mark_frames_ready(); +} + + +static void +set_frame_ignore(gboolean set, frame_data *fdata) +{ + if (set) + cf_ignore_frame(&cfile, fdata); + else + cf_unignore_frame(&cfile, fdata); +} + void new_packet_list_ignore_frame_cb(GtkWidget *w _U_, gpointer data _U_) { @@ -1329,36 +1347,78 @@ new_packet_list_ignore_frame_cb(GtkWidget *w _U_, gpointer data _U_) /* model is filled with the current model as a convenience. */ gtk_tree_selection_get_selected(selection, &model, &iter); record = new_packet_list_get_record(model, &iter); - set_frame_ignore(!record->fdata->flags.ignored, record->fdata); redissect_packets(); } static void -ignore_all_frames(gboolean set) +ignore_all_displayed_frames(gboolean set) { frame_data *fdata; /* XXX: we might need a progressbar here */ for (fdata = cfile.plist_start; fdata != NULL; fdata = fdata->next) { - if( fdata->flags.passed_dfilter ) - set_frame_ignore(set, fdata); + if( fdata->flags.passed_dfilter ) + set_frame_ignore(set, fdata); } redissect_packets(); } void -new_packet_list_ignore_all_frames_cb(GtkWidget *w _U_, gpointer data _U_) +new_packet_list_ignore_all_displayed_frames_cb(GtkWidget *w _U_, gpointer data _U_) +{ + if(cfile.displayed_count < cfile.count){ + frame_data *fdata; + /* Due to performance impact with large captures, don't check the filtered list for + an ignored frame; just check the first. If a ignored frame exists but isn't first and + the user wants to unignore all the displayed frames, they will just re-exec the shortcut. */ + fdata = cfile.first_displayed; + if (fdata->flags.ignored==TRUE) { + ignore_all_displayed_frames(FALSE); + } else { + ignore_all_displayed_frames(TRUE); + } + } +} + +static void +unignore_all_frames() { - ignore_all_frames(TRUE); + frame_data *fdata; + + /* XXX: we might need a progressbar here */ + for (fdata = cfile.plist_start; fdata != NULL && cfile.ignored_count > 0; fdata = fdata->next) { + set_frame_ignore(FALSE, fdata); + } + redissect_packets(); } void new_packet_list_unignore_all_frames_cb(GtkWidget *w _U_, gpointer data _U_) { - ignore_all_frames(FALSE); + unignore_all_frames(); +} + + +static void +untime_reference_all_frames() +{ + /* XXX: we might need a progressbar here */ + frame_data *fdata; + for (fdata = cfile.plist_start; fdata != NULL && cfile.ref_time_count > 0; fdata = fdata->next) { + if (fdata->flags.ref_time == 1) { + set_frame_reftime(FALSE, fdata, cfile.current_row); + } + } +} + +void +new_packet_list_untime_reference_all_frames_cb(GtkWidget *w _U_, gpointer data _U_) +{ + untime_reference_all_frames(); } + guint new_packet_list_get_column_id (gint col_num) { diff --git a/gtk/new_packet_list.h b/gtk/new_packet_list.h index fbca9de3cf..bc9cddf979 100644 --- a/gtk/new_packet_list.h +++ b/gtk/new_packet_list.h @@ -67,19 +67,19 @@ extern void new_packet_list_set_font(PangoFontDescription *font); */ extern void new_packet_list_mark_frame_cb(GtkWidget *widget, gpointer data); -/** Mark all packets in the list. +/** Mark/unmark all displayed packets. * * @param widget parent widget (unused) * @param data unused */ -void new_packet_list_mark_all_frames_cb(GtkWidget *w _U_, gpointer data _U_); +extern void new_packet_list_mark_all_displayed_frames_cb(GtkWidget *w _U_, gpointer data _U_); -/** Unmark all packets in the list. +/** UnMark all packets in the capture. * * @param widget parent widget (unused) * @param data unused */ -void new_packet_list_unmark_all_frames_cb(GtkWidget *w _U_, gpointer data _U_); +extern void new_packet_list_unmark_all_frames_cb(GtkWidget *w _U_, gpointer data _U_); /** Ignore the currently selected packet. * @@ -88,12 +88,12 @@ void new_packet_list_unmark_all_frames_cb(GtkWidget *w _U_, gpointer data _U_); */ extern void new_packet_list_ignore_frame_cb(GtkWidget *widget, gpointer data); -/** Ignore all packets in the list. +/** Ignore/Unignore all displayed packets. * * @param widget parent widget (unused) * @param data unused */ -extern void new_packet_list_ignore_all_frames_cb(GtkWidget *w _U_, gpointer data _U_); +extern void new_packet_list_ignore_all_displayed_frames_cb(GtkWidget *w _U_, gpointer data _U_); /** Un-ignore all packets in the list. * @@ -102,6 +102,13 @@ extern void new_packet_list_ignore_all_frames_cb(GtkWidget *w _U_, gpointer data */ extern void new_packet_list_unignore_all_frames_cb(GtkWidget *w _U_, gpointer data _U_); +/** Un-Time Reference all packets in the capture. + * + * @param widget parent widget (unused) + * @param data unused + */ +extern void new_packet_list_untime_reference_all_frames_cb(GtkWidget *w _U_, gpointer data _U_); + /* Different modes of copying summary data */ typedef enum { CS_TEXT, /* Packet summary data (tab separated) */ |