--- src/gui-wizard-gtk/wizard.c | 9 +++++++-- src/include/run_event.h | 8 ++++++++ src/include/workflow.h | 1 + src/lib/run_event.c | 23 +++++++++++++++++++++++ src/lib/workflow.c | 41 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 80 insertions(+), 2 deletions(-)
diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c index 0891756..2907611 100644 --- a/src/gui-wizard-gtk/wizard.c +++ b/src/gui-wizard-gtk/wizard.c @@ -2464,10 +2464,15 @@ static void set_auto_event_chain(GtkButton *button, gpointer user_data) static void add_workflow_buttons(GtkBox *box, GHashTable *workflows, GCallback func) { gtk_container_foreach(GTK_CONTAINER(box), &remove_child_widget, NULL); - GList *keys = g_hash_table_get_keys(g_workflow_list); + + GHashTable *workflow_table = load_workflow_config_data_from_list( + list_possible_events_glist(g_dump_dir_name, "workflow"), + WORKFLOWS_DIR); + + GList *keys = g_hash_table_get_keys(workflow_table); while(keys) { - workflow_t *w = g_hash_table_lookup(g_workflow_list, keys->data); + workflow_t *w = g_hash_table_lookup(workflow_table, keys->data); char *btn_label = xasprintf("<b>%s</b>\n%s", wf_get_screen_name(w), wf_get_description(w)); GtkWidget *button = gtk_button_new_with_label(btn_label); GList *children = gtk_container_get_children(GTK_CONTAINER(button)); diff --git a/src/include/run_event.h b/src/include/run_event.h index bf94b5c..0afebc6 100644 --- a/src/include/run_event.h +++ b/src/include/run_event.h @@ -223,6 +223,14 @@ int run_event_stdio_ask_yes_no_yesforever(const char *msg, const char *key, void */ char *run_event_stdio_ask_password(const char *msg, void *param);
+/* + * Returns a list of possible events for given problem directory + * + * @param problem_dir_name the name of the problem directory + * @param pfx the prefix of the events "report", "workflow" + */ +GList *list_possible_events_glist(const char *problem_dir_name, + const char *pfx); #ifdef __cplusplus } #endif diff --git a/src/include/workflow.h b/src/include/workflow.h index e60d6b5..db8c65d 100644 --- a/src/include/workflow.h +++ b/src/include/workflow.h @@ -43,5 +43,6 @@ void wf_set_screen_name(workflow_t *w, const char* screen_name); void wf_set_description(workflow_t *w, const char* description); void wf_set_long_desc(workflow_t *w, const char* long_desc); void wf_add_event(workflow_t *w, event_config_t *ec); +GHashTable *load_workflow_config_data_from_list(GList *wf_names, const char *path);
#endif diff --git a/src/lib/run_event.c b/src/lib/run_event.c index c8ccfa5..a60913e 100644 --- a/src/lib/run_event.c +++ b/src/lib/run_event.c @@ -684,6 +684,29 @@ char *list_possible_events(struct dump_dir *dd, const char *dump_dir_name, const return strbuf_free_nobuf(result); }
+GList *list_possible_events_glist(const char *problem_dir_name, + const char *pfx) +{ + struct dump_dir *dd = dd_opendir(problem_dir_name, DD_OPEN_READONLY); + GList *l = NULL; + char *events = list_possible_events(dd, problem_dir_name, pfx); + char *start = events; + char *end = strchr(events, '\n'); + + while(end) + { + *end = '\0'; + l = g_list_append(l, xstrdup(start)); + start = end + 1; + end = strchr(start, '\n'); + } + + dd_close(dd); + free(events); + + return l; +} + void run_event_stdio_alert(const char *msg, void *param) { alert(msg); diff --git a/src/lib/workflow.c b/src/lib/workflow.c index 1fba64c..35fa904 100644 --- a/src/lib/workflow.c +++ b/src/lib/workflow.c @@ -72,6 +72,47 @@ workflow_t *get_workflow(const char *name) return g_hash_table_lookup(g_workflow_list, name); }
+static gint file_obj_cmp(file_obj_t *file, const char *filename) +{ + gint cmp = strcmp(file->filename, filename); + return cmp; +} + +static void load_workflow_config(const char *name, + GList *available_wfs, + GHashTable *wf_list) +{ + GList *wf_file = g_list_find_custom(available_wfs, name, (GCompareFunc)file_obj_cmp); + if (wf_file) + { + file_obj_t *file = (file_obj_t *)wf_file->data; + workflow_t *workflow = new_workflow(file->filename); + load_workflow_description_from_file(workflow, file->fullpath); + VERB1 log("Adding '%s' to workflows\n", file->filename); + g_hash_table_insert(wf_list, file->filename, workflow); + } +} + +GHashTable *load_workflow_config_data_from_list(GList *wf_names, + const char *path) +{ + GList *wfs = wf_names; + GHashTable *wf_list = g_hash_table_new_full( + g_str_hash, + g_str_equal, + g_free, + (GDestroyNotify) free_workflow + ); + GList *workflow_files = get_file_list(path, "xml"); + while(wfs) + { + load_workflow_config((const char *)wfs->data, workflow_files, wf_list); + wfs = g_list_next(wfs); + } + + return wf_list; +} + GHashTable *load_workflow_config_data(const char *path) { if (g_workflow_list)
crash-catcher@lists.fedorahosted.org