diff options
author | Ulf Lamping <ulf.lamping@web.de> | 2004-06-20 09:35:51 +0000 |
---|---|---|
committer | Ulf Lamping <ulf.lamping@web.de> | 2004-06-20 09:35:51 +0000 |
commit | f098b908328920f057d81872aa6c6b1797e416d8 (patch) | |
tree | 8559aeafc777ec548f3bcdab803773b2c7a397bd | |
parent | 7812b42c24f1bf1663716fd7be5779986d07ca49 (diff) |
preview: add 3 seconds timeout, and show the information got so far.
This will prevent getting the preview information take a lot of time for
*very* long capture files. However, on a Pentium-M 1.6 even a 35MB
capture file will not timeout in this 3 second interval.
svn path=/trunk/; revision=11192
-rw-r--r-- | gtk/file_dlg.c | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/gtk/file_dlg.c b/gtk/file_dlg.c index 549a76184e..2bc6987496 100644 --- a/gtk/file_dlg.c +++ b/gtk/file_dlg.c @@ -1,7 +1,7 @@ /* file_dlg.c * Dialog boxes for handling files * - * $Id: file_dlg.c,v 1.116 2004/06/20 07:28:02 guy Exp $ + * $Id: file_dlg.c,v 1.117 2004/06/20 09:35:51 ulfl Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -102,7 +102,9 @@ static GtkWidget *file_save_as_w; #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> #endif -#define SUM_STR_MAX 1024 + +#define PREVIEW_STR_MAX 200 +#define PREVIEW_TIMEOUT_SECS 3 static double secs_usecs( guint32 s, guint32 us) @@ -118,11 +120,11 @@ preview_set_filename(GtkWidget *prev, const gchar *cf_name) GtkWidget *label; wtap *wth; const struct wtap_pkthdr *phdr; - int err; + int err = 0; gchar *err_info; struct stat cf_stat; long data_offset; - gchar string_buff[SUM_STR_MAX]; + gchar string_buff[PREVIEW_STR_MAX]; unsigned int packet = 0; double start_time = 0; /* seconds, with msec resolution */ double stop_time = 0; /* seconds, with msec resolution */ @@ -130,6 +132,10 @@ preview_set_filename(GtkWidget *prev, const gchar *cf_name) time_t ti_time; struct tm *ti_tm; unsigned int elapsed_time; + time_t time_preview; + time_t time_current; + gboolean is_breaked = FALSE; + guint64 filesize; label = OBJECT_GET_DATA(prev, PREVIEW_FILENAME_KEY); gtk_label_set_text(GTK_LABEL(label), get_basename((char *)cf_name)); @@ -168,16 +174,17 @@ preview_set_filename(GtkWidget *prev, const gchar *cf_name) } /* size */ - g_snprintf(string_buff, SUM_STR_MAX, "%" PRIu64 " bytes", - (guint64)cf_stat.st_size); + filesize = cf_stat.st_size; + g_snprintf(string_buff, PREVIEW_STR_MAX, "%" PRIu64 " bytes", filesize); label = OBJECT_GET_DATA(prev, PREVIEW_SIZE_KEY); gtk_label_set_text(GTK_LABEL(label), string_buff); /* type */ - g_snprintf(string_buff, SUM_STR_MAX, "%s", wtap_file_type_string(wtap_file_type(wth))); + g_snprintf(string_buff, PREVIEW_STR_MAX, "%s", wtap_file_type_string(wtap_file_type(wth))); label = OBJECT_GET_DATA(prev, PREVIEW_FORMAT_KEY); gtk_label_set_text(GTK_LABEL(label), string_buff); + time(&time_preview); while ( (wtap_read(wth, &err, &err_info, &data_offset)) ) { phdr = wtap_phdr(wth); cur_time = secs_usecs(phdr->ts.tv_sec, phdr->ts.tv_usec); @@ -192,10 +199,17 @@ preview_set_filename(GtkWidget *prev, const gchar *cf_name) stop_time = cur_time; } packet++; + if(packet%100) { + time(&time_current); + if(time_current-time_preview >= PREVIEW_TIMEOUT_SECS) { + is_breaked = TRUE; + break; + } + } } if(err != 0) { - g_snprintf(string_buff, SUM_STR_MAX, "error after reading %u packets", packet); + g_snprintf(string_buff, PREVIEW_STR_MAX, "error after reading %u packets", packet); label = OBJECT_GET_DATA(prev, PREVIEW_PACKETS_KEY); gtk_label_set_text(GTK_LABEL(label), string_buff); wtap_close(wth); @@ -203,14 +217,18 @@ preview_set_filename(GtkWidget *prev, const gchar *cf_name) } /* packet count */ - g_snprintf(string_buff, SUM_STR_MAX, "%u", packet); + if(is_breaked) { + g_snprintf(string_buff, PREVIEW_STR_MAX, "more than %u packets (preview timeout)", packet); + } else { + g_snprintf(string_buff, PREVIEW_STR_MAX, "%u", packet); + } label = OBJECT_GET_DATA(prev, PREVIEW_PACKETS_KEY); gtk_label_set_text(GTK_LABEL(label), string_buff); /* first packet */ ti_time = (long)start_time; ti_tm = localtime( &ti_time ); - g_snprintf(string_buff, SUM_STR_MAX, + g_snprintf(string_buff, PREVIEW_STR_MAX, "%04d-%02d-%02d %02d:%02d:%02d", ti_tm->tm_year + 1900, ti_tm->tm_mon + 1, @@ -224,12 +242,15 @@ preview_set_filename(GtkWidget *prev, const gchar *cf_name) /* elapsed time */ elapsed_time = (unsigned int)(stop_time-start_time); if(elapsed_time/86400) { - g_snprintf(string_buff, SUM_STR_MAX, "%02u days %02u:%02u:%02u", + g_snprintf(string_buff, PREVIEW_STR_MAX, "%02u days %02u:%02u:%02u", elapsed_time/86400, elapsed_time%86400/3600, elapsed_time%3600/60, elapsed_time%60); } else { - g_snprintf(string_buff, SUM_STR_MAX, "%02u:%02u:%02u", + g_snprintf(string_buff, PREVIEW_STR_MAX, "%02u:%02u:%02u", elapsed_time%86400/3600, elapsed_time%3600/60, elapsed_time%60); } + if(is_breaked) { + g_snprintf(string_buff, PREVIEW_STR_MAX, "unknown"); + } label = OBJECT_GET_DATA(prev, PREVIEW_ELAPSED_KEY); gtk_label_set_text(GTK_LABEL(label), string_buff); |