On 07/20/2012 02:22 PM, Jakub Filak wrote:
> * unification of implementaion of report-gtk and report-cli
> 
> Signed-off-by: Jakub Filak <[email protected]>
> ---
>  src/cli/cli-report.c        |   29 ++++++++---------
>  src/gui-wizard-gtk/wizard.c |   55 +++++---------------------------
>  src/include/event_config.h  |   22 +++++++++++++
>  src/lib/event_config.c      |   73 
> +++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 117 insertions(+), 62 deletions(-)
> 
> diff --git a/src/cli/cli-report.c b/src/cli/cli-report.c
> index 117c6fb..988bfc7 100644
> --- a/src/cli/cli-report.c
> +++ b/src/cli/cli-report.c
> @@ -857,12 +857,7 @@ int report(const char *dump_dir_name, int flags)
>      }
>      else
>      {
> -        const char *rating_str = 
> problem_data_get_content_or_NULL(problem_data, FILENAME_RATING);
> -//COMPAT, remove after 2.1 release
> -        if (!rating_str)
> -            rating_str = problem_data_get_content_or_NULL(problem_data, 
> "rating");
> -
> -        unsigned i, rating = rating_str ? xatou(rating_str) : 4;
> +        unsigned i;
>          GList *li;
>          char wanted_reporters[255];
>  
> @@ -890,18 +885,21 @@ int report(const char *dump_dir_name, int flags)
>              if (!is_number_in_string(i, wanted_reporters))
>                  continue;
>  
> -            if (config && (rating < config->ec_minimal_rating))
> -            {
> -                puts(_("Reporting disabled because the backtrace is 
> unusable"));
> +            char *usability_description = NULL;
> +            char *usability_detail = NULL;
> +            const bool usable_rating = 
> check_problem_rating_usability(config, problem_data,
> +                                                                      
> &usability_description,
> +                                                                      
> &usability_detail);
>  
> -                const char *package = 
> problem_data_get_content_or_NULL(problem_data, FILENAME_PACKAGE);
> -                if (package && package[0])
> -                    printf(_("Please try to install debuginfo manually using 
> the command: \"debuginfo-install %s\" and try again\n"), package);
> +            if (!usable_rating)
> +            {
> +                printf("%s\n", usability_description);
> +                printf("%s\n", usability_detail);
>  
> -                plugins++;
>                  errors++;
> -                continue;
> +                goto next_plugin;
>              }
> +
>              ask_for_missing_settings(reporter_name);
>  
>              /*
> @@ -914,7 +912,10 @@ int report(const char *dump_dir_name, int flags)
>              errors += run_events(dump_dir_name, cur_event, "Reporting");
>              g_list_free(cur_event);
>  
> +next_plugin:
>              plugins++;
> +            free(usability_description);
> +            free(usability_detail);
>          }
>      }
>  
> diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
> index c93ff42..a32aafa 100644
> --- a/src/gui-wizard-gtk/wizard.c
> +++ b/src/gui-wizard-gtk/wizard.c
> @@ -1644,61 +1644,20 @@ static bool check_minimal_bt_rating(const char 
> *event_name)
>  
>      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)
> +    else if (prefixcmp(event_name, "report") != 0)
>      {
> -        VERB1 log("No checks for bactrace rating because event '%s' doesn't 
> report.", event_name);
> +        VERB2 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
> -     * but so far only oopses don't have rating, so for now we
> -     * skip the "kernel" manually
> -     */
> -    const char *analyzer = problem_data_get_content_or_NULL(g_cd, 
> FILENAME_ANALYZER);
> -//FIXME: say "no" to special casing!
> -    if (event_cfg && analyzer && strcmp(analyzer, "Kerneloops") != 0)
> +    char *description = NULL;
> +    acceptable_rating = check_problem_rating_usability(event_cfg, g_cd, 
> &description, NULL);
> +    if (description)
>      {
> -        const char *rating_str = problem_data_get_content_or_NULL(g_cd, 
> FILENAME_RATING);
> -//COMPAT, remove after 2.1 release
> -        if (!rating_str)
> -            rating_str = problem_data_get_content_or_NULL(g_cd, "rating");
> -
> -        if (rating_str)
> -        {
> -            char *endptr;
> -            errno = 0;
> -            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."));
> -                acceptable_rating = false;
> -            }
> -            else
> -            {
> -                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 */
> -                {
> -                    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;
> -                }
> -            }
> -        }
> +        add_warning(description);
> +        free(description);
>      }
>  
>      return acceptable_rating;
> diff --git a/src/include/event_config.h b/src/include/event_config.h
> index 6644b42..15ebf52 100644
> --- a/src/include/event_config.h
> +++ b/src/include/event_config.h
> @@ -21,6 +21,7 @@
>  
>  #include <stdbool.h>
>  #include <glib.h>
> +#include "problem_data.h"
>  
>  #ifdef __cplusplus
>  extern "C" {
> @@ -103,6 +104,27 @@ void unexport_event_config(GList *env_list);
>  
>  GHashTable *validate_event(const char *event_name);
>  
> +/*
> + * Checks usability of problem's backtrace rating against required rating 
> level
> + * from event configuration.
> + *
> + * @param cfg an event configuration
> + * @param pd a checked problem data
> + * @param description an output parameter for a description of rating
> + * usability. If the variable holds NULL after function call no description 
> is
> + * available. The description can be provided even if backtrace rating is
> + * acceptable. Can be NULL.
> + * @param detail an output parameter for a more details about rating 
> usability.
> + * If the variable holds NULL after function call no description is 
> available.
> + * The detail can be provided even if backtrace rating is acceptable. Can be
> + * NULL.
> + * @returns true if rating is usable or above usable; otherwise false
> + */
> +bool check_problem_rating_usability(const event_config_t *cfg,
> +                                    problem_data_t       *pd,
> +                                    char                 **description,
> +                                    char                 **detail);
> +
>  #ifdef __cplusplus
>  }
>  #endif
> diff --git a/src/lib/event_config.c b/src/lib/event_config.c
> index 85c0e80..9bf0d5f 100644
> --- a/src/lib/event_config.c
> +++ b/src/lib/event_config.c
> @@ -367,3 +367,76 @@ GHashTable *validate_event(const char *event_name)
>  
>      return NULL;
>  }
> +
> +/*
> + * This function checks if a value of problem's backtrace rating is 
> acceptable
> + * for event according to event's required rating value.
> + *
> + * The solved problem seems to be pretty straightforward but there are some
> + * pitfalls.
> + *
> + * 1. Is rating acceptable if event doesn't have configuration?
> + * 2. Is rating acceptable if problem's data doesn't contains rating value?
> + * 3. Is rating acceptable if rating value is not a number?
> + * 4. What message show to user if there is a concern about usability?
> + */
> +bool check_problem_rating_usability(const event_config_t *cfg,
> +                                    problem_data_t *pd,
> +                                    char **description,
> +                                    char **detail)
> +{
> +    char *tmp_desc = NULL;
> +    char *tmp_detail = NULL;
> +
> +    bool result = false;
> +
> +    const char *rating_str = problem_data_get_content_or_NULL(pd, 
> FILENAME_RATING);
> +    if (!cfg || !rating_str)
> +        goto finish;

You can do "if (!cfg) goto finish;" even before getting FILENAME_RATING.

> +    const long minimal_rating = cfg->ec_minimal_rating;
> +    char *endptr;
> +    errno = 0;
> +    const long rating = strtol(rating_str, &endptr, 10);
> +    if (errno != 0 || endptr == rating_str || *endptr != '\0')
> +    {
> +        tmp_desc = xasprintf("%s '%s'.", _("Reporting disabled because the 
> rating does not contain a number."), rating_str);
> +        tmp_detail = xstrdup(_("Please report this problem to ABRT."));

Maybe "Please report this problem to ABRT project developers"   ?

> +
> +        result = false;
> +    }
> +    else if (rating == minimal_rating) /* bt is usable, but not complete, so 
> show a warning */

What if minimal_rating == highest possible rating?
Will we _always_ say "The backtrace is incomplete" in this case?

> +    {
> +        tmp_desc = xstrdup(_("The backtrace is incomplete, please make sure 
> you provide the steps to reproduce."));
> +        tmp_detail = xstrdup(_("The backtrace probably can't help to a 
> developer in searching for bug."));
> +
> +        result = true;
> +    }
> +    else if (rating < minimal_rating)
> +    {
> +        tmp_desc = xstrdup(_("Reporting disabled because the backtrace is 
> unusable."));
> +
> +        const char *package = problem_data_get_content_or_NULL(pd, 
> FILENAME_PACKAGE);
> +        if (package && package[0])
> +            tmp_detail = xasprintf(_("Please try to install debuginfo 
> manually using the command: \"debuginfo-install %s\" and try again."), 
> package);
> +        else
> +            tmp_detail = xstrdup(_("A proppert debuginfo is probably missing 
> or the coredump is corrupted."));

s/proppert/proper/

> +
> +        result = false;
> +    }
> +    else /* rating > minimal_rating */
> +        result = true;
> +
> +finish:
> +    if (description)
> +        *description = tmp_desc;
> +    else
> +        free(tmp_desc);
> +
> +    if (detail)
> +        *detail = tmp_detail;
> +    else
> +        free(tmp_detail);
> +
> +    return result;
> +}

Reply via email to