Signed-off-by: Jakub Filak <[email protected]>
---
 src/gui-wizard-gtk/wizard.c |  126 ++++++++++++++++++++++++++++---------------
 1 file changed, 82 insertions(+), 44 deletions(-)

diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
index 713e3d2..dbef3ae 100644
--- a/src/gui-wizard-gtk/wizard.c
+++ b/src/gui-wizard-gtk/wizard.c
@@ -62,8 +62,6 @@ static GtkTextView *g_tv_event_log;
 /* List of event_gui_data's */
 
 /* List of event_gui_data's */
-static GList *g_list_selected_reporters;
-
 static GtkContainer *g_container_details1;
 static GtkContainer *g_container_details2;
 
@@ -192,6 +190,11 @@ static struct strbuf *cmd_output = NULL;
 
 /* Utility functions */
 
+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 void wrap_fixer(GtkWidget *widget, gpointer data_unused)
 {
     if (GTK_IS_CONTAINER(widget))
@@ -705,6 +708,12 @@ static void event_rb_was_toggled(GtkButton *button, 
gpointer user_data)
             free(g_event_selected);
             g_event_selected = xstrdup(evdata->event_name);
             check_event_config(evdata->event_name);
+
+            clear_warnings();
+            const bool good_rating = check_minimal_bt_rating(g_event_selected);
+            show_warnings();
+
+            gtk_widget_set_sensitive(g_btn_next, good_rating);
         }
     }
 }
@@ -1693,10 +1702,29 @@ static void clear_warnings(void)
     gtk_container_foreach(GTK_CONTAINER(g_box_warning_labels), 
&remove_child_widget, NULL);
 }
 
-static void check_bt_rating_and_allow_send(void)
+/* TODO : this function should not set a warning directly, it makes the 
function unusable for add_event_buttons(); */
+static bool check_minimal_bt_rating(const char *event_name)
 {
-    int minimal_rating = 0;
-    bool send = true;
+    bool acceptable_rating = true;
+    event_config_t *event_cfg = NULL;
+
+    if (!event_name)
+        error_msg_and_die(_("Cannot check backtrace rating because of invalid 
event name"));
+    else if(strncmp("report", event_name, sizeof("report")-1) != 0)
+    {
+        VERB1 log("No checks for bactrace rating because event '%s' doesn't 
report.", event_name);
+        return acceptable_rating;
+    }
+    else
+    {
+        event_cfg = get_event_config(event_name);
+
+        if (!event_cfg)
+        {
+            VERB1 log("Cannot check backtrace rating because of not defined 
configuration for event '%s'", event_name);
+            return acceptable_rating;
+        }
+    }
 
     /*
      * FIXME: this should be bind to a reporter not to a compoment
@@ -1705,7 +1733,7 @@ static void check_bt_rating_and_allow_send(void)
      */
     const char *analyzer = get_problem_item_content_or_NULL(g_cd, 
FILENAME_ANALYZER);
 //FIXME: say "no" to special casing!
-    if (analyzer && strcmp(analyzer, "Kerneloops") != 0)
+    if (event_cfg && analyzer && strcmp(analyzer, "Kerneloops") != 0)
     {
         const char *rating_str = get_problem_item_content_or_NULL(g_cd, 
FILENAME_RATING);
 //COMPAT, remove after 2.1 release
@@ -1719,41 +1747,27 @@ static void check_bt_rating_and_allow_send(void)
             long rating = strtol(rating_str, &endptr, 10);
             if (errno != 0 || endptr == rating_str || *endptr != '\0')
             {
-                add_warning(_("Reporting disabled because the rating does not 
contain a number '%s'."));
-                send = false;
+                add_warning(_("Reporting disabled because the rating does not 
contain a number."));
+                acceptable_rating = false;
             }
-
-            GList *li = g_list_selected_reporters;
-            while (li != NULL)
+            else
             {
-                /* need to obey the highest minimal rating of all selected 
reporters
-                 * FIXME: check this when selecting the reporter and allow 
select
-                 * only usable ones
-                 */
-                event_config_t *cfg = get_event_config((const char *)li->data);
-                if (cfg->ec_minimal_rating > minimal_rating)
+                VERB1 log("Checking current rating %ld to required rating 
%ld.", rating, event_cfg->ec_minimal_rating);
+                if (rating == event_cfg->ec_minimal_rating) /* bt is usable, 
but not complete, so show a warning */
                 {
-                    minimal_rating = cfg->ec_minimal_rating;
-                    VERB1 log("%s reporter sets the minimal rating to: %i", 
(const char *)li->data, minimal_rating);
+                    add_warning(_("The backtrace is incomplete, please make 
sure you provide the steps to reproduce."));
+                }
+                else if (rating < event_cfg->ec_minimal_rating)
+                {
+                    add_warning(_("Reporting disabled because the backtrace is 
unusable."));
+                    //FIXME: see CreporterAssistant: 394 for ideas
+                    acceptable_rating = false;
                 }
-
-                li = g_list_next(li);
-            };
-
-            if (rating == minimal_rating) /* bt is usable, but not complete, 
so show a warning */
-            {
-                add_warning(_("The backtrace is incomplete, please make sure 
you provide the steps to reproduce."));
-            }
-
-            if (rating < minimal_rating)
-            {
-                //FIXME: see CreporterAssistant: 394 for ideas
-                add_warning(_("Reporting disabled because the backtrace is 
unusable."));
-                send = false;
             }
         }
     }
-    gtk_widget_set_sensitive(g_btn_next, send);
+
+    return acceptable_rating;
 }
 
 static void on_bt_approve_toggle(GtkToggleButton *togglebutton, gpointer 
user_data)
@@ -1928,6 +1942,27 @@ static void highlight_forbidden(void)
 
 static gint select_next_page_no(gint current_page_no, gpointer data);
 
+static const char *get_next_processed_event(GList **events_list)
+{
+    if (!events_list)
+        return NULL;
+
+    const char *event_name = (const char *)(*events_list)->data;
+
+    clear_warnings();
+    const bool acceptable = check_minimal_bt_rating(event_name);
+    show_warnings();
+
+    if (!acceptable)
+    {
+        *events_list = NULL;
+        return NULL;
+    }
+
+    *events_list = g_list_next(*events_list);
+    return event_name;
+}
+
 static void on_page_prepare(GtkNotebook *assistant, GtkWidget *page, gpointer 
user_data)
 {
     //int page_no = gtk_assistant_get_current_page(g_assistant);
@@ -1960,7 +1995,6 @@ static void on_page_prepare(GtkNotebook *assistant, 
GtkWidget *page, gpointer us
     if (pages[PAGENO_EDIT_ELEMENTS].page_widget == page)
     {
         clear_warnings();
-        check_bt_rating_and_allow_send();
         highlight_forbidden();
         show_warnings();
     }
@@ -2013,13 +2047,9 @@ static void on_page_prepare(GtkNotebook *assistant, 
GtkWidget *page, gpointer us
                     _("Processing failed. You can try another operation if 
available."),
                     _("Processing finished, please proceed to the next step.")
             );
-
-            if (g_auto_event_list)
-            {
-                g_auto_event_list = g_auto_event_list->next;
-                VERB1 log("next -e EVENT:%s", g_auto_event_list ? 
(char*)g_auto_event_list->data : "NULL");
-            }
         }
+        else
+            gtk_label_set_text(g_lbl_event_log, _("Thank you!"));
     }
 }
 
@@ -2048,9 +2078,18 @@ static gint select_next_page_no(gint current_page_no, 
gpointer data)
     {
         if (!g_expert_mode)
         {
-            VERB1 log("selected -e EVENT:%s on page: %d", 
(char*)g_auto_event_list->data, current_page_no);
             free(g_event_selected);
-            g_event_selected = xstrdup((char*)g_auto_event_list->data);
+
+            const char *event = get_next_processed_event(&g_auto_event_list);
+            if (!event)
+            {
+                g_event_selected = NULL;
+                current_page_no = pages[PAGENO_EVENT_PROGRESS].page_no - 1;
+                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).
@@ -2063,7 +2102,6 @@ static gint select_next_page_no(gint current_page_no, 
gpointer data)
 
             current_page_no = pages[PAGENO_EVENT_SELECTOR].page_no + 1;
             goto event_was_selected;
-
         }
     }
 
-- 
1.7.10.2

Reply via email to