diff options
author | Denys Vlasenko <dvlasenk@redhat.com> | 2011-06-01 17:57:31 +0200 |
---|---|---|
committer | Denys Vlasenko <dvlasenk@redhat.com> | 2011-06-01 17:57:31 +0200 |
commit | 2fa751f6d98995e73db4d0edd0d22b9560281644 (patch) | |
tree | cc5ed9575493d38d19db783324d329d2e43fe94d /src/lib | |
parent | f4e4a76f3ca70f0bad636e324c43d3da993df854 (diff) | |
download | abrt-2fa751f6d98995e73db4d0edd0d22b9560281644.tar.gz abrt-2fa751f6d98995e73db4d0edd0d22b9560281644.tar.xz abrt-2fa751f6d98995e73db4d0edd0d22b9560281644.zip |
wizard: hook selection checkboxes to reporters.
Checkboxes are controlled by the following elements in .xml:
<requires-items> ITEM1,ITEM2 </requires-items>
<exclude-items-by-default> ITEM1,ITEM2 </exclude-items-by-default>
<exclude-items-always> ITEM1,ITEM2 </exclude-items-always>
<exclude-binary-items> yes / no </exclude-binary-items>
<include-items-by-default> ITEM1,ITEM2 </include-items-by-default>
exclude-items-by-default and exclude-items-always can be "*"
meaning "all". include-items-by-default specifies which items
are included (checked) is exclude-items-by-default is "*".
Else, all are checked by default.
the set of iters NOT included is passed in $EXCLUDE_FROM_REPORT
variable. bugzilla, kerneloops, mailx, print and rhtsupport
are made aware of this variable.
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/event_config.c | 13 | ||||
-rw-r--r-- | src/lib/event_xml_parser.c | 45 | ||||
-rw-r--r-- | src/lib/problem_data.c | 79 | ||||
-rw-r--r-- | src/lib/report.c | 2 | ||||
-rw-r--r-- | src/lib/run_event.c | 2 |
5 files changed, 120 insertions, 21 deletions
diff --git a/src/lib/event_config.c b/src/lib/event_config.c index 9f48af54..38da44ef 100644 --- a/src/lib/event_config.c +++ b/src/lib/event_config.c @@ -46,19 +46,22 @@ void free_event_option(event_option_t *p) void free_event_config(event_config_t *p) { - GList *opt; - if (!p) return; + free(p->screen_name); - //free(p->title); - //free(p->action); free(p->description); free(p->long_descr); - free(p->creates_elements); + free(p->ec_creates_items); + free(p->ec_requires_items); + free(p->ec_exclude_items_by_default); + free(p->ec_include_items_by_default); + free(p->ec_exclude_items_always); + GList *opt; for (opt = p->options; opt; opt = opt->next) free_event_option(opt->data); g_list_free(p->options); + free(p); } diff --git a/src/lib/event_xml_parser.c b/src/lib/event_xml_parser.c index 5bf5f411..b2037cd9 100644 --- a/src/lib/event_xml_parser.c +++ b/src/lib/event_xml_parser.c @@ -25,12 +25,19 @@ #define LONG_DESCR_ELEMENT "long-description" #define ALLOW_EMPTY_ELEMENT "allow-empty" #define NOTE_HTML_ELEMENT "note-html" -#define CREATES_ELEMENT "creates-elements" +#define CREATES_ELEMENT "creates-items" #define OPTION_ELEMENT "option" //#define ACTION_ELEMENT "action" #define NAME_ELEMENT "name" #define DEFAULT_VALUE_ELEMENT "default-value" +#define REQUIRES_ELEMENT "requires-items" +#define EXCL_BY_DEFAULT_ELEMENT "exclude-items-by-default" +#define INCL_BY_DEFAULT_ELEMENT "include-items-by-default" +#define EXCL_ALWAYS_ELEMENT "exclude-items-always" +#define EXCL_BINARY_ELEMENT "exclude-binary-items" + + struct my_parse_data { event_config_t *event_config; @@ -305,9 +312,9 @@ static void text(GMarkupParseContext *context, */ if (strcmp(inner_element, CREATES_ELEMENT) == 0) { - VERB2 log("creates_elements:'%s'", text_copy); - free(ui->creates_elements); - ui->creates_elements = text_copy; + VERB2 log("ec_creates_items:'%s'", text_copy); + free(ui->ec_creates_items); + ui->ec_creates_items = text_copy; return; } if (strcmp(inner_element, NAME_ELEMENT) == 0) @@ -363,6 +370,36 @@ static void text(GMarkupParseContext *context, } return; } + if (strcmp(inner_element, REQUIRES_ELEMENT) == 0) + { + free(ui->ec_requires_items); + ui->ec_requires_items = text_copy; + return; + } + if (strcmp(inner_element, EXCL_BY_DEFAULT_ELEMENT) == 0) + { + free(ui->ec_exclude_items_by_default); + ui->ec_exclude_items_by_default = text_copy; + return; + } + if (strcmp(inner_element, INCL_BY_DEFAULT_ELEMENT) == 0) + { + free(ui->ec_include_items_by_default); + ui->ec_include_items_by_default = text_copy; + return; + } + if (strcmp(inner_element, EXCL_ALWAYS_ELEMENT) == 0) + { + free(ui->ec_exclude_items_always); + ui->ec_exclude_items_always = text_copy; + return; + } + if (strcmp(inner_element, EXCL_BINARY_ELEMENT) == 0) + { + ui->ec_exclude_binary_items = string_to_bool(text_copy); + free(text_copy); + return; + } } free(text_copy); } diff --git a/src/lib/problem_data.c b/src/lib/problem_data.c index 87821afd..7ef1f681 100644 --- a/src/lib/problem_data.c +++ b/src/lib/problem_data.c @@ -265,7 +265,7 @@ static char* is_text_file(const char *name, ssize_t *sz) return NULL; /* it's binary */ } -void load_problem_data_from_dump_dir(problem_data_t *problem_data, struct dump_dir *dd) +void load_problem_data_from_dump_dir(problem_data_t *problem_data, struct dump_dir *dd, char **excluding) { char *short_name; char *full_name; @@ -273,6 +273,12 @@ void load_problem_data_from_dump_dir(problem_data_t *problem_data, struct dump_d dd_init_next_file(dd); while (dd_get_next_file(dd, &short_name, &full_name)) { + if (excluding && is_in_string_list(short_name, excluding)) + { + //log("Excluded:'%s'", short_name); + goto next; + } + ssize_t sz = 4*1024; char *text = NULL; bool editable = is_editable_file(short_name); @@ -287,20 +293,15 @@ void load_problem_data_from_dump_dir(problem_data_t *problem_data, struct dump_d full_name, CD_FLAG_BIN + CD_FLAG_ISNOTEDITABLE ); - free(short_name); - free(full_name); - continue; + goto next; } } char *content; if (sz < 4*1024) /* did is_text_file read entire file? */ { + /* yes */ content = text; - /* Strip '\n' from one-line elements: */ - char *nl = strchr(content, '\n'); - if (nl && nl[1] == '\0') - *nl = '\0'; } else { @@ -308,6 +309,10 @@ void load_problem_data_from_dump_dir(problem_data_t *problem_data, struct dump_d free(text); content = dd_load_text(dd, short_name); } + /* Strip '\n' from one-line elements: */ + char *nl = strchr(content, '\n'); + if (nl && nl[1] == '\0') + *nl = '\0'; int flags = 0; @@ -335,16 +340,70 @@ void load_problem_data_from_dump_dir(problem_data_t *problem_data, struct dump_d content, flags ); + free(content); + next: free(short_name); free(full_name); - free(content); } } problem_data_t *create_problem_data_from_dump_dir(struct dump_dir *dd) { problem_data_t *problem_data = new_problem_data(); - load_problem_data_from_dump_dir(problem_data, dd); + load_problem_data_from_dump_dir(problem_data, dd, NULL); + return problem_data; +} + +/* + * Returns NULL-terminated char *vector[]. Result itself must be freed, + * but do no free list elements. IOW: do free(result), but never free(result[i])! + * If comma_separated_list is NULL or "", returns NULL. + */ +static char **build_exclude_vector(const char *comma_separated_list) +{ + char **exclude_items = NULL; + if (comma_separated_list && comma_separated_list[0]) + { + /* even w/o commas, we'll need two elements: + * exclude_items[0] = "name" + * exclude_items[1] = NULL + */ + unsigned cnt = 2; + + const char *cp = comma_separated_list; + while (*cp) + if (*cp++ == ',') + cnt++; + + /* We place the string directly after the char *vector[cnt]: */ + exclude_items = xzalloc(cnt * sizeof(exclude_items[0]) + (cp - comma_separated_list) + 1); + char *p = strcpy((char*)&exclude_items[cnt], comma_separated_list); + + char **pp = exclude_items; + *pp++ = p; + while (*p) + { + if (*p++ == ',') + { + p[-1] = '\0'; + *pp++ = p; + } + } + } + + return exclude_items; +} + +problem_data_t *create_problem_data_for_reporting(const char *dump_dir_name) +{ + char **exclude_items = build_exclude_vector(getenv("EXCLUDE_FROM_REPORT")); + struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0); + if (!dd) + return NULL; /* dd_opendir already emitted error msg */ + problem_data_t *problem_data = new_problem_data(); + load_problem_data_from_dump_dir(problem_data, dd, exclude_items); + dd_close(dd); + free(exclude_items); return problem_data; } diff --git a/src/lib/report.c b/src/lib/report.c index 07299e48..137f7b16 100644 --- a/src/lib/report.c +++ b/src/lib/report.c @@ -114,7 +114,7 @@ int report_problem_in_memory(problem_data_t *pd, int flags) if (dd) { if (flags & LIBREPORT_RELOAD_DATA) - load_problem_data_from_dump_dir(pd, dd); + load_problem_data_from_dump_dir(pd, dd, NULL); dd_delete(dd); } } diff --git a/src/lib/run_event.c b/src/lib/run_event.c index 856f3264..0d291287 100644 --- a/src/lib/run_event.c +++ b/src/lib/run_event.c @@ -500,7 +500,7 @@ int run_event_on_problem_data(struct run_event_state *state, problem_data_t *dat free(dir_name); if (dd) { - load_problem_data_from_dump_dir(data, dd); + load_problem_data_from_dump_dir(data, dd, NULL); dd_delete(dd); } |