* the next event is run if the previous one was susccessful and we the next event doesn't require reivew of data
Signed-off-by: Jakub Filak <[email protected]> --- src/gui-wizard-gtk/wizard.c | 139 +++++++++++++++++++++++++++++-------------- 1 file changed, 94 insertions(+), 45 deletions(-) diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c index 205d85a..34ca39f 100644 --- a/src/gui-wizard-gtk/wizard.c +++ b/src/gui-wizard-gtk/wizard.c @@ -194,6 +194,9 @@ static void clear_warnings(void); static void show_warnings(void); static void add_warning(const char *warning); static bool check_minimal_bt_rating(const char *event_name); +static const char *get_next_processed_event(GList **events_list); +static const char *setup_next_processed_event(GList **events_list); +static void setup_and_start_even_run(const char *event_name); static void wrap_fixer(GtkWidget *widget, gpointer data_unused) { @@ -1411,6 +1414,20 @@ static char *run_event_gtk_ask_password(const char *msg, void *args) return ask_helper(msg, args, true); } +static bool do_event_need_review(const char *event_name) +{ + event_config_t *event_cfg = get_event_config(event_name); + return !event_cfg || !event_cfg->ec_skip_review; +} + +static void start_event_run(const char *event_name, + GtkWidget *page, + GtkTextView *tv_log, + GtkLabel *status_label, + const char *start_msg, + const char *error_msg, + const char *success_msg); + static gboolean consume_cmd_output(GIOChannel *source, GIOCondition condition, gpointer data) { struct analyze_event_data *evd = data; @@ -1473,15 +1490,6 @@ static gboolean consume_cmd_output(GIOChannel *source, GIOCondition condition, g VERB1 log("done running event on '%s': %d", g_dump_dir_name, retval); append_to_textview(evd->tv_log, "\n"); - if (retval) - { - gtk_label_set_text(evd->status_label, evd->error_msg); - /* If we were running -e EV1 -e EV2, stop if EV1 failed: */ - terminate_event_chain(); - } - else - gtk_label_set_text(evd->status_label, evd->success_msg); - /* Free child output buffer */ strbuf_free(cmd_output); cmd_output = NULL; @@ -1493,17 +1501,48 @@ static gboolean consume_cmd_output(GIOChannel *source, GIOCondition condition, g gtk_widget_set_sensitive(g_btn_close, true); gtk_widget_set_sensitive(g_btn_next, true); - /*g_source_remove(evd->event_source_id);*/ - close(evd->fd); - free_run_event_state(evd->run_state); - strbuf_free(evd->event_log); - free(evd); - problem_data_reload_from_dump_dir(); update_gui_state_from_problem_data(); - /* Inform abrt-gui that it is a good idea to rescan the directory */ - kill(getppid(), SIGCHLD); + if (retval) + { + gtk_label_set_text(evd->status_label, evd->error_msg); + /* If we were running -e EV1 -e EV2, stop if EV1 failed: */ + terminate_event_chain(); + } + else + { + gtk_label_set_text(evd->status_label, evd->success_msg); + + if (!g_expert_mode) + { + const char *event = setup_next_processed_event(&g_auto_event_list); + if (event) + { + if (do_event_need_review(event)) + /* do not forward user directly to review page because */ + /* we want to show to user the results of finished events and we */ + /* don't have Back button */ + /* push back event to the begining of the chain */ + g_auto_event_list = g_list_prepend(g_auto_event_list, (gpointer)event); + else + { + free(g_event_selected); + g_event_selected = xstrdup(event); + setup_and_start_even_run(g_event_selected); + } + } + } + + /*g_source_remove(evd->event_source_id);*/ + close(evd->fd); + free_run_event_state(evd->run_state); + strbuf_free(evd->event_log); + free(evd); + + /* Inform abrt-gui that it is a good idea to rescan the directory */ + kill(getppid(), SIGCHLD); + } /* this event was the last event from the chain */ if (is_reporting_finished()) @@ -1860,9 +1899,24 @@ static void highlight_forbidden(void) static gint select_next_page_no(gint current_page_no, gpointer data); +static void setup_and_start_even_run(const char *event_name) +{ + start_event_run(event_name, + pages[PAGENO_EVENT_PROGRESS].page_widget, + g_tv_event_log, + g_lbl_event_log, + _("Processing..."), + g_expert_mode ? _("Processing failed. You can try another operation if available.") + : _("Processing failed. Nothing more can be done. Thank you!"), + /* this event is the last event from the chain */ + is_reporting_finished() ? _("Reporting finished. Thank you!") + : _("Processing finished, please proceed to the next step.") + ); +} + static const char *get_next_processed_event(GList **events_list) { - if (!events_list) + if (!events_list || !*events_list) return NULL; const char *event_name = (const char *)(*events_list)->data; @@ -1881,6 +1935,23 @@ static const char *get_next_processed_event(GList **events_list) return event_name; } +static const char *setup_next_processed_event(GList **events_list) +{ + const char *event = get_next_processed_event(&g_auto_event_list); + if (!event) + { + free(g_event_selected); + g_event_selected = NULL; + /* No next event, go to progress page and finish */ + gtk_label_set_text(g_lbl_event_log, "Reporting finished. Thank you!"); + update_gui_on_finished_reporting(); + return NULL; + } + + VERB1 log("selected -e EVENT:%s", event); + return event; +} + static void on_page_prepare(GtkNotebook *assistant, GtkWidget *page, gpointer user_data) { //int page_no = gtk_assistant_get_current_page(g_assistant); @@ -1958,18 +2029,7 @@ static void on_page_prepare(GtkNotebook *assistant, GtkWidget *page, gpointer us && g_event_selected[0] ) { clear_warnings(); - - start_event_run(g_event_selected, - pages[PAGENO_EVENT_PROGRESS].page_widget, - g_tv_event_log, - g_lbl_event_log, - _("Processing..."), - g_expert_mode ? _("Processing failed. You can try another operation if available.") - : _("Processing failed. Nothing more can be done. Thank you!"), - /* this event is the last event from the chain */ - is_reporting_finished() ? _("Reporting finished. Thank you!") - : _("Processing finished, please proceed to the next step.") - ); + setup_and_start_even_run(g_event_selected); } } } @@ -1987,25 +2047,15 @@ static gint select_next_page_no(gint current_page_no, gpointer data) { if (!g_expert_mode) { - free(g_event_selected); - - const char *event = get_next_processed_event(&g_auto_event_list); + const char *event = setup_next_processed_event(&g_auto_event_list); if (!event) { - g_event_selected = NULL; - /* No next event, go to progress page and finish */ current_page_no = pages[PAGENO_EVENT_PROGRESS].page_no - 1; - gtk_label_set_text(g_lbl_event_log, "Reporting finished. Thank you!"); - update_gui_on_finished_reporting(); goto again; } - VERB1 log("selected -e EVENT:%s on page: %d", event, current_page_no); - g_event_selected = xstrdup((char*)event); - /* - * We don't remove the list element, because GTK calls select_next_page_no() - * spuriously (for example, it calls it twice for first page). - */ + free(g_event_selected); + g_event_selected = xstrdup(event); if (check_event_config(g_event_selected) != 0) { @@ -2027,8 +2077,7 @@ static gint select_next_page_no(gint current_page_no, gpointer data) goto again; } - event_config_t *cfg = get_event_config(g_event_selected); - if (cfg && cfg->ec_skip_review) + if (!do_event_need_review(g_event_selected)) { current_page_no = pages[PAGENO_EVENT_PROGRESS].page_no - 1; goto again; -- 1.7.10.4
