Add an explicit capture_cb_capture_failed indication for the case where

we weren't even able to start a capture, rather than delivering a fake
"capture start" indication and relying on a later "capture file closed"
indication - for a capture that was never opened in the first place - to
handle GUI cleanups.

Don't deliver any GUI indications in cf_close() if we didn't have a
capture file open in the first place.

Clear the status bar and welcome header if that indication is delivered.

If we start a capture from the command line with the -k flag, don't show
the captured packet information unless the capture actually starts.

svn path=/trunk/; revision=41521
This commit is contained in:
Guy Harris 2012-03-13 08:36:25 +00:00
parent fd4894c8f8
commit cd1debf183
5 changed files with 94 additions and 75 deletions

View File

@ -549,16 +549,14 @@ capture_input_closed(capture_options *capture_opts, gchar *msg)
if (msg != NULL) if (msg != NULL)
simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", msg); simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", msg);
/* if we didn't start the capture, do a fake start. */
/* (happens if we got an error message - we won't get a filename then). */
if(capture_opts->state == CAPTURE_PREPARING) { if(capture_opts->state == CAPTURE_PREPARING) {
if(capture_opts->real_time_mode) { /* We didn't start a capture; note that the attempt to start it
capture_callback_invoke(capture_cb_capture_update_started, capture_opts); failed. */
capture_callback_invoke(capture_cb_capture_failed, capture_opts);
} else { } else {
capture_callback_invoke(capture_cb_capture_fixed_started, capture_opts); /* We started a capture; process what's left of the capture file if
} we were in "update list of packets in real time" mode, or process
} all of it if we weren't. */
if(capture_opts->real_time_mode) { if(capture_opts->real_time_mode) {
cf_read_status_t status; cf_read_status_t status;
@ -609,7 +607,6 @@ capture_input_closed(capture_options *capture_opts, gchar *msg)
main_window_quit(); main_window_quit();
break; break;
} }
} else { } else {
/* first of all, we are not doing a capture any more */ /* first of all, we are not doing a capture any more */
capture_callback_invoke(capture_cb_capture_fixed_finished, capture_opts); capture_callback_invoke(capture_cb_capture_fixed_finished, capture_opts);
@ -620,6 +617,7 @@ capture_input_closed(capture_options *capture_opts, gchar *msg)
cf_get_drops_known(capture_opts->cf), cf_get_drops(capture_opts->cf)); cf_get_drops_known(capture_opts->cf), cf_get_drops(capture_opts->cf));
} }
} }
}
if(capture_opts->show_info) if(capture_opts->show_info)
capture_info_close(); capture_info_close();

View File

@ -45,7 +45,8 @@ typedef enum {
capture_cb_capture_fixed_started, capture_cb_capture_fixed_started,
capture_cb_capture_fixed_continue, capture_cb_capture_fixed_continue,
capture_cb_capture_fixed_finished, capture_cb_capture_fixed_finished,
capture_cb_capture_stopping capture_cb_capture_stopping,
capture_cb_capture_failed
} capture_cbs; } capture_cbs;
typedef void (*capture_callback_t) (gint event, capture_options *capture_opts, typedef void (*capture_callback_t) (gint event, capture_options *capture_opts,

9
file.c
View File

@ -364,6 +364,9 @@ fail:
* want the UI to go from "file open" to "file closed" back to * want the UI to go from "file open" to "file closed" back to
* "file open", we want it to go from "old file open" to "new file * "file open", we want it to go from "old file open" to "new file
* open and being read". * open and being read".
*
* XXX - currently, cf_open() calls cf_close(), rather than
* cf_reset_state().
*/ */
static void static void
cf_reset_state(capture_file *cf) cf_reset_state(capture_file *cf)
@ -428,18 +431,16 @@ cf_reset_state(capture_file *cf)
void void
cf_close(capture_file *cf) cf_close(capture_file *cf)
{ {
/* do GUI things even if file is already closed, if(cf->state != FILE_CLOSED) {
* e.g. to cleanup things if a capture couldn't be started */
cf_callback_invoke(cf_cb_file_closing, cf); cf_callback_invoke(cf_cb_file_closing, cf);
/* close things, if not already closed before */ /* close things, if not already closed before */
if(cf->state != FILE_CLOSED) {
color_filters_cleanup(); color_filters_cleanup();
cf_reset_state(cf); cf_reset_state(cf);
cleanup_dissection(); cleanup_dissection();
}
cf_callback_invoke(cf_cb_file_closed, cf); cf_callback_invoke(cf_cb_file_closed, cf);
}
} }
/* an out of memory exception occured, wait for a user button press to exit */ /* an out of memory exception occured, wait for a user button press to exit */

View File

@ -1647,7 +1647,6 @@ main_capture_cb_capture_fixed_finished(capture_options *capture_opts _U_)
main_do_quit(); main_do_quit();
} }
} }
#endif /* HAVE_LIBPCAP */ #endif /* HAVE_LIBPCAP */
static void static void
@ -1791,6 +1790,9 @@ main_capture_callback(gint event, capture_options *capture_opts, gpointer user_d
gtk_osxapplication_set_dock_icon_pixbuf(theApp,gdk_pixbuf_new_from_xpm_data(wsicon64_xpm)); gtk_osxapplication_set_dock_icon_pixbuf(theApp,gdk_pixbuf_new_from_xpm_data(wsicon64_xpm));
#endif #endif
break; break;
case(capture_cb_capture_failed):
g_log(LOG_DOMAIN_MAIN, G_LOG_LEVEL_DEBUG, "Callback: capture failed");
break;
default: default:
g_warning("main_capture_callback: event %u unknown", event); g_warning("main_capture_callback: event %u unknown", event);
g_assert_not_reached(); g_assert_not_reached();
@ -3017,7 +3019,7 @@ main(int argc, char *argv[])
g_free(s); g_free(s);
} }
/* "-k" was specified; start a capture. */ /* "-k" was specified; start a capture. */
show_main_window(TRUE); show_main_window(FALSE);
check_and_warn_user_startup(cf_name); check_and_warn_user_startup(cf_name);
/* If no user interfaces were specified on the command line, /* If no user interfaces were specified on the command line,

View File

@ -899,6 +899,20 @@ statusbar_capture_fixed_finished_cb(capture_options *capture_opts _U_)
gtk_statusbar_pop(GTK_STATUSBAR(packets_bar), packets_ctx); gtk_statusbar_pop(GTK_STATUSBAR(packets_bar), packets_ctx);
} }
static void
statusbar_capture_failed_cb(capture_options *capture_opts _U_)
{
#if 0
capture_file *cf = capture_opts->cf;
#endif
/* Pop the "<live capture in progress>" message off the status bar. */
statusbar_pop_file_msg();
welcome_header_pop_msg();
/* Pop the "<capturing>" message off the status bar */
gtk_statusbar_pop(GTK_STATUSBAR(packets_bar), packets_ctx);
}
#endif /* HAVE_LIBPCAP */ #endif /* HAVE_LIBPCAP */
@ -1011,6 +1025,9 @@ statusbar_capture_callback(gint event, capture_options *capture_opts,
/* Beware: this state won't be called, if the capture child /* Beware: this state won't be called, if the capture child
* closes the capturing on it's own! */ * closes the capturing on it's own! */
break; break;
case(capture_cb_capture_failed):
statusbar_capture_failed_cb(capture_opts);
break;
default: default:
g_warning("statusbar_capture_callback: event %u unknown", event); g_warning("statusbar_capture_callback: event %u unknown", event);
g_assert_not_reached(); g_assert_not_reached();