Ack. Pushed.
On 04/26/2013 10:57 AM, Jakub Filak wrote:
Solution texts are saved in not-reportable item. Solution URLs are
saved
in reported_to.
Closes #156
Signed-off-by: Jakub Filak <jfilak(a)redhat.com>
---
src/plugins/ureport.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 81 insertions(+), 6 deletions(-)
diff --git a/src/plugins/ureport.c b/src/plugins/ureport.c
index 764c7aa..74f1304 100644
--- a/src/plugins/ureport.c
+++ b/src/plugins/ureport.c
@@ -51,6 +51,7 @@ struct ureport_server_response {
char *message;
char *bthash;
GList *reported_to_list;
+ char *solution;
};
void free_ureport_server_response(struct ureport_server_response *resp)
@@ -58,6 +59,7 @@ void free_ureport_server_response(struct ureport_server_response
*resp)
if (!resp)
return;
+ free(resp->solution);
g_list_free_full(resp->reported_to_list, g_free);
free(resp->bthash);
free(resp->message);
@@ -65,6 +67,68 @@ void free_ureport_server_response(struct ureport_server_response
*resp)
free(resp);
}
+static char *parse_solution_from_json_list(struct json_object *list, GList
**reported_to)
+{
+ json_object *list_elem, *struct_elem;
+ const char *cause, *note, *url;
+ struct strbuf *solution_buf = strbuf_new();
+
+ const unsigned length = json_object_array_length(list);
+
+ const char *one_format = _("Your problem seems to be caused by
%s\n\n%s\n");
+ if (length > 1)
+ {
+ strbuf_append_str(solution_buf, _("Your problem seems to be caused by one
of the following:\n"));
+ one_format = "\n* %s\n\n%s\n";
+ }
+
+ bool empty = true;
+ for (unsigned i = 0; i < length; ++i)
+ {
+ list_elem = json_object_array_get_idx(list, i);
+ if (!list_elem)
+ continue;
+
+ struct_elem = json_object_object_get(list_elem, "cause");
+ if (!struct_elem)
+ continue;
+
+ cause = json_object_get_string(struct_elem);
+ if (!cause)
+ continue;
+
+ struct_elem = json_object_object_get(list_elem, "note");
+ if (!struct_elem)
+ continue;
+
+ note = json_object_get_string(struct_elem);
+ if (!note)
+ continue;
+
+ empty = false;
+ strbuf_append_strf(solution_buf, one_format, cause, note);
+
+ struct_elem = json_object_object_get(list_elem, "url");
+ if (!struct_elem)
+ continue;
+
+ url = json_object_get_string(struct_elem);
+ if (url)
+ {
+ char *reported_to_line = xasprintf("%s: URL=%s", cause, url);
+ *reported_to = g_list_append(*reported_to, reported_to_line);
+ }
+ }
+
+ if (empty)
+ {
+ strbuf_free(solution_buf);
+ return NULL;
+ }
+
+ return strbuf_free_nobuf(solution_buf);
+}
+
/* reported_to json element should be a list of structures
{ "reporter": "Bugzilla",
"type": "url",
@@ -166,6 +230,10 @@ static struct ureport_server_response
*ureport_server_parse_json(json_object *js
if (reported_to_list)
out_response->reported_to_list =
parse_reported_to_from_json_list(reported_to_list);
+ json_object *solutions = json_object_object_get(json, "solutions");
+ if (solutions)
+ out_response->solution = parse_solution_from_json_list(solutions,
&(out_response->reported_to_list));
+
return out_response;
}
@@ -381,28 +449,35 @@ int main(int argc, char **argv)
VERB1 log("is known: %s", response->value);
ret = 0; /* "success" */
+ dd = dd_opendir(dump_dir_path, /* flags */ 0);
+ if (!dd)
+ xfunc_die();
+
if (response->bthash)
{
- dd = dd_opendir(dump_dir_path, /* flags */ 0);
- if (!dd)
- xfunc_die();
-
char *msg = xasprintf("uReport: BTHASH=%s", response->bthash);
add_reported_to(dd, msg);
free(msg);
+ }
+ if (response->reported_to_list)
+ {
for (GList *e = response->reported_to_list; e; e = g_list_next(e))
add_reported_to(dd, e->data);
-
- dd_close(dd);
}
+ if (response->solution)
+ dd_save_text(dd, FILENAME_NOT_REPORTABLE, response->solution);
+
+ dd_close(dd);
+
/* If a reported problem is not known then emit NEEDMORE */
if (strcmp("true", response->value) == 0)
{
log(_("This problem has already been reported."));
if (response->message)
log(response->message);
+
ret = EXIT_STOP_EVENT_RUN;
}
}
--
Richard Marko