#endif
/* Update the progress bar this many times when reading a file. */
#define N_PROGBAR_UPDATES 100
-/* We read around 200k/100ms domt update the progress bar more often than that */
+/* We read around 200k/100ms don't update the progress bar more often than that */
#define MIN_QUANTUM 200000
#define MIN_NUMBER_OF_PACKET 1500
cf->count = 0;
cf->displayed_count = 0;
cf->marked_count = 0;
+ cf->ignored_count = 0;
cf->drops_known = FALSE;
cf->drops = 0;
cf->snap = wtap_snapshot_length(cf->wth);
}
/* an out of memory exception occured, wait for a user button press to exit */
-void outofmemory_cb(gpointer dialog _U_, gint btn _U_, gpointer data _U_)
+static void outofmemory_cb(gpointer dialog _U_, gint btn _U_, gpointer data _U_)
{
main_window_exit();
}
}
cf_read_status_t
-cf_read(capture_file *cf)
+cf_read(capture_file *cf, gboolean from_save)
{
int err;
gchar *err_info;
reset_tap_listeners();
- cf_callback_invoke(cf_cb_file_read_start, cf);
-
name_ptr = get_basename(cf->filename);
+ if (from_save == FALSE)
+ cf_callback_invoke(cf_cb_file_read_started, cf);
+ else
+ cf_callback_invoke(cf_cb_file_save_started, (gpointer)name_ptr);
+
/* Find the size of the file. */
size = wtap_file_size(cf->wth, NULL);
*/
if ((progbar == NULL) && !(count % MIN_NUMBER_OF_PACKET)){
progbar_val = calc_progbar_val( cf, size, data_offset);
- progbar = delayed_create_progress_dlg("Loading", name_ptr,
- TRUE, &stop_flag, &start_time, progbar_val);
+ if (from_save == FALSE)
+ progbar = delayed_create_progress_dlg("Loading", name_ptr,
+ TRUE, &stop_flag, &start_time, progbar_val);
+ else
+ progbar = delayed_create_progress_dlg("Saving", name_ptr,
+ TRUE, &stop_flag, &start_time, progbar_val);
}
/* Update the progress bar, but do it only N_PROGBAR_UPDATES times;
#else
packet_list_thaw();
#endif
-
- cf_callback_invoke(cf_cb_file_read_finished, cf);
+ if (from_save == FALSE)
+ cf_callback_invoke(cf_cb_file_read_finished, cf);
+ else
+ cf_callback_invoke(cf_cb_file_save_finished, cf);
/* If we have any displayed packets to select, select the first of those
packets by making the first row the selected row. */
#ifdef NEW_PACKET_LIST
new_packet_list_check_end();
- new_packet_list_freeze();
+ /* Don't freeze/thaw the list when doing live capture */
+ /*new_packet_list_freeze();*/
#else
packet_list_check_end();
packet_list_freeze();
/* Sleep(100); */
};
#ifdef NEW_PACKET_LIST
- new_packet_list_thaw();
+ /* Don't freeze/thaw the list when doing live capture */
+ /*new_packet_list_thaw();*/
#else
packet_list_thaw();
#endif
cf->count, cf->state, *err);*/
#ifdef NEW_PACKET_LIST
- new_packet_list_thaw();
+ /* Don't freeze/thaw the list when doing live capture */
+ /*new_packet_list_thaw();*/
+ /* With the new packet list the first packet
+ * isn't automatically selected.
+ */
+ if(!cf->current_frame)
+ new_packet_list_select_first_row();
#else
/* XXX - this causes "flickering" of the list */
packet_list_thaw();
#ifdef NEW_PACKET_LIST
new_packet_list_check_end();
- new_packet_list_freeze();
+ /* Don't freeze/thaw the list when doing live capture */
+ /*new_packet_list_freeze();*/
#else
packet_list_check_end();
packet_list_freeze();
}
#ifdef NEW_PACKET_LIST
- new_packet_list_thaw();
+ /* Don't freeze/thaw the list when doing live capture */
+ /*new_packet_list_thaw();*/
#else
packet_list_thaw();
#endif
} else {
/* The file we read is a temporary file from a live capture;
we don't mention its name. */
- displayname = "(Untitled)";
+ if (cf->source) {
+ displayname = cf->source;
+ } else {
+ displayname = "(Untitled)";
+ }
}
return displayname;
}
+void cf_set_tempfile_source(capture_file *cf, gchar *source) {
+ if (cf->source) {
+ g_free(cf->source);
+ }
+
+ if (source) {
+ cf->source = g_strdup(source);
+ } else {
+ cf->source = g_strdup("");
+ }
+}
+
+const gchar *cf_get_tempfile_source(capture_file *cf) {
+ if (!cf->source) {
+ return "";
+ }
+
+ return cf->source;
+}
+
/* XXX - use a macro instead? */
int
cf_get_packet_count(capture_file *cf)
/* just add some value here until we know if it is being displayed or not */
fdata->cum_bytes = cum_bytes + fdata->pkt_len;
- /* If we don't have the time stamp of the first packet in the
- capture, it's because this is the first packet. Save the time
- stamp of this packet as the time stamp of the first packet. */
- if (nstime_is_unset(&first_ts)) {
- first_ts = fdata->abs_ts;
- }
- /* if this frames is marked as a reference time frame, reset
- firstsec and firstusec to this frame */
- if(fdata->flags.ref_time){
- first_ts = fdata->abs_ts;
- }
-
- /* If we don't have the time stamp of the previous displayed packet,
- it's because this is the first displayed packet. Save the time
- stamp of this packet as the time stamp of the previous displayed
- packet. */
- if (nstime_is_unset(&prev_dis_ts)) {
- prev_dis_ts = fdata->abs_ts;
- }
-
- /* Get the time elapsed between the first packet and this packet. */
- nstime_delta(&fdata->rel_ts, &fdata->abs_ts, &first_ts);
-
- /* If it's greater than the current elapsed time, set the elapsed time
- to it (we check for "greater than" so as not to be confused by
- time moving backwards). */
- if ((gint32)cf->elapsed_time.secs < fdata->rel_ts.secs
- || ((gint32)cf->elapsed_time.secs == fdata->rel_ts.secs && (gint32)cf->elapsed_time.nsecs < fdata->rel_ts.nsecs)) {
- cf->elapsed_time = fdata->rel_ts;
- }
-
- /* Get the time elapsed between the previous displayed packet and
- this packet. */
- nstime_delta(&fdata->del_dis_ts, &fdata->abs_ts, &prev_dis_ts);
+ frame_data_set_before_dissect(fdata, &cf->elapsed_time,
+ &first_ts, &prev_dis_ts, &prev_cap_ts);
/* If either
if( (fdata->flags.passed_dfilter) || (fdata->flags.ref_time) )
{
- /* This frame either passed the display filter list or is marked as
- a time reference frame. All time reference frames are displayed
- even if they dont pass the display filter */
- if(fdata->flags.ref_time){
- /* if this was a TIME REF frame we should reset the cul bytes field */
- cum_bytes = fdata->pkt_len;
- fdata->cum_bytes = cum_bytes;
- } else {
- /* increase cum_bytes with this packets length */
- cum_bytes += fdata->pkt_len;
- }
+ frame_data_set_after_dissect(fdata, &cum_bytes, &prev_dis_ts);
epan_dissect_fill_in_columns(&edt, FALSE, TRUE);
if (fdata->flags.marked) {
packet_list_set_colors(row, &prefs.gui_marked_fg, &prefs.gui_marked_bg);
}
-
- /* Set the time of the previous displayed frame to the time of this
- frame. */
- prev_dis_ts = fdata->abs_ts;
+ if (fdata->flags.ignored) {
+ packet_list_set_colors(row, &prefs.gui_ignored_fg, &prefs.gui_ignored_bg);
+ }
cf->displayed_count++;
}
const char *filter_new = dftext ? dftext : "";
const char *filter_old = cf->dfilter ? cf->dfilter : "";
dfilter_t *dfcode;
+ GTimeVal start_time;
/* if new filter equals old one, do nothing unless told to do so */
if (!force && strcmp(filter_new, filter_old) == 0) {
/* We have a valid filter. Replace the current filter. */
g_free(cf->dfilter);
cf->dfilter = dftext;
+ g_get_current_time(&start_time);
+
/* Now rescan the packet list, applying the new filter, but not
throwing away information constructed on a previous pass. */
cf->first_displayed = NULL;
cf->last_displayed = NULL;
- reset_elapsed();
-
/* We currently don't display any packets */
cf->displayed_count = 0;
if (!add_to_packet_list)
new_packet_list_recreate_visible_rows();
+ /* Compute the time it took to filter the file */
+ compute_elapsed(&start_time);
+
new_packet_list_thaw();
if (selected_frame_num == -1) {
/* Either the frame that was selected passed the filter, or we've
found the nearest displayed frame to that frame. Select it, make
it the focus row, and make it visible. */
+ /* Set to invalid to force update of packet list and packet details */
+ cf->current_row = -1;
if (selected_frame_num == 0) {
new_packet_list_select_first_row();
}else{
the display list. */
nstime_set_unset(&first_ts);
nstime_set_unset(&prev_dis_ts);
+ nstime_set_unset(&prev_cap_ts);
cum_bytes = 0;
/* Update the progress bar when it gets to this value. */
/* Fill in the column information if we're printing the summary
information. */
if (args->print_args->print_summary) {
+ col_custom_prime_edt(&edt, &cf->cinfo);
epan_dissect_run(&edt, pseudo_header, pd, fdata, &cf->cinfo);
epan_dissect_fill_in_columns(&edt, FALSE, TRUE);
} else
if having custom columns. */
proto_tree_needed = have_custom_cols(&cf->cinfo);
epan_dissect_init(&edt, proto_tree_needed, proto_tree_needed);
+ col_custom_prime_edt(&edt, &cf->cinfo);
epan_dissect_run(&edt, pseudo_header, pd, fdata, &cf->cinfo);
epan_dissect_fill_in_columns(&edt, FALSE, TRUE);
if having custom columns. */
proto_tree_needed = have_custom_cols(&cf->cinfo);
epan_dissect_init(&edt, proto_tree_needed, proto_tree_needed);
+ col_custom_prime_edt(&edt, &cf->cinfo);
epan_dissect_run(&edt, pseudo_header, pd, fdata, &cf->cinfo);
epan_dissect_fill_in_columns(&edt, FALSE, TRUE);
gchar status_str[100];
int progbar_nextstep;
int progbar_quantum;
- char *title;
+ const char *title;
start_fd = cf->current_frame;
if (start_fd != NULL) {
if (prefs.gui_find_wrap)
{
- simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK,
- "%sBeginning of capture exceeded!%s\n\n"
- "Search is continued from the end of the capture.",
- simple_dialog_primary_start(), simple_dialog_primary_end());
+ simple_status("Search reached the beginning. Continuing at end.");
fdata = cf->plist_end; /* wrap around */
}
else
{
- simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK,
- "%sBeginning of capture exceeded!%s\n\n"
- "Try searching forwards.",
- simple_dialog_primary_start(), simple_dialog_primary_end());
+ simple_status("Search reached the beginning.");
fdata = start_fd; /* stay on previous packet */
}
}
if (fdata == NULL) {
if (prefs.gui_find_wrap)
{
- simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK,
- "%sEnd of capture exceeded!%s\n\n"
- "Search is continued from the start of the capture.",
- simple_dialog_primary_start(), simple_dialog_primary_end());
+ simple_status("Search reached the end. Continuing at beginning.");
fdata = cf->plist_start; /* wrap around */
}
else
{
- simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK,
- "%sEnd of capture exceeded!%s\n\n"
- "Try searching backwards.",
- simple_dialog_primary_start(), simple_dialog_primary_end());
+ simple_status("Search reached the end.");
fdata = start_fd; /* stay on previous packet */
}
}
if (fdata == NULL) {
/* we didn't find a packet with that packet number */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "There is no packet with the packet number %u.", fnumber);
+ simple_status("There is no packet number %u.", fnumber);
return FALSE; /* we failed to go to that packet */
}
if (!fdata->flags.passed_dfilter) {
/* that packet currently isn't displayed */
/* XXX - add it to the set of displayed packets? */
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- "The packet number %u isn't currently being displayed.", fnumber);
+ simple_status("Packet number %u isn't displayed.", fnumber);
return FALSE; /* we failed to go to that packet */
}
/* We don't need the columns here. */
cf->edt = epan_dissect_new(TRUE, TRUE);
+ tap_build_interesting(cf->edt);
epan_dissect_run(cf->edt, &cf->pseudo_header, cf->pd, cf->current_frame,
NULL);
}
}
+/*
+ * Ignore a particular frame.
+ */
+void
+cf_ignore_frame(capture_file *cf, frame_data *frame)
+{
+ if (! frame->flags.ignored) {
+ frame->flags.ignored = TRUE;
+ if (cf->count > cf->ignored_count)
+ cf->ignored_count++;
+ }
+}
+
+/*
+ * Un-ignore a particular frame.
+ */
+void
+cf_unignore_frame(capture_file *cf, frame_data *frame)
+{
+ if (frame->flags.ignored) {
+ frame->flags.ignored = FALSE;
+ if (cf->ignored_count > 0)
+ cf->ignored_count--;
+ }
+}
+
typedef struct {
wtap_dumper *pdh;
const char *fname;
wtap_dumper *pdh;
save_callback_args_t callback_args;
- cf_callback_invoke(cf_cb_file_safe_started, (gpointer) fname);
+ cf_callback_invoke(cf_cb_file_save_started, (gpointer)fname);
/* don't write over an existing file. */
/* this should've been already checked by our caller, just to be sure... */
packet_range_process_init(range);
-
if (packet_range_process_all(range) && save_format == cf->cd_t) {
/* We're not filtering packets, and we're saving it in the format
it's already in, so we can just move or copy the raw data. */
}
}
- cf_callback_invoke(cf_cb_file_safe_finished, NULL);
+ cf_callback_invoke(cf_cb_file_save_finished, NULL);
if (packet_range_process_all(range)) {
/* We saved the entire capture, not just some packets from it.
if ((cf_open(cf, fname, FALSE, &err)) == CF_OK) {
/* XXX - report errors if this fails?
What should we return if it fails or is aborted? */
- switch (cf_read(cf)) {
+
+ switch (cf_read(cf, TRUE)) {
case CF_READ_OK:
case CF_READ_ERROR:
correctly for the "no capture file open" state). */
break;
}
- cf_callback_invoke(cf_cb_file_safe_reload_finished, NULL);
+ cf_callback_invoke(cf_cb_file_save_reload_finished, cf);
}
}
return CF_OK;
fail:
- cf_callback_invoke(cf_cb_file_safe_failed, NULL);
+ cf_callback_invoke(cf_cb_file_save_failed, NULL);
return CF_ERROR;
}
is_tempfile = cf->is_tempfile;
cf->is_tempfile = FALSE;
if (cf_open(cf, filename, is_tempfile, &err) == CF_OK) {
- switch (cf_read(cf)) {
+ switch (cf_read(cf, FALSE)) {
case CF_READ_OK:
case CF_READ_ERROR:
we should free up our copy. */
g_free(filename);
}
+
+/*
+ * Editor modelines
+ *
+ * Local Variables:
+ * c-basic-offset: 2
+ * tab-width: 2
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * ex: set shiftwidth=2 tabstop=2 expandtab
+ * :indentSize=2:tabSize=2:noTabs=true:
+ */