Pushed, thanks! Now we don't have to worry that our code will be twice
as large with every optional argument;)
On Thu, May 30, 2013 at 11:50:05 +0200, Jakub Filak wrote:
Related to rhbz#963020
Signed-off-by: Jakub Filak <jfilak(a)redhat.com>
---
src/lib/abrt_xmlrpc.c | 69 ++++++++++++++++++++++++++++++++++++++
src/lib/abrt_xmlrpc.h | 11 ++++++
src/plugins/rhbz.c | 92 +++++++++++++--------------------------------------
3 files changed, 103 insertions(+), 69 deletions(-)
diff --git a/src/lib/abrt_xmlrpc.c b/src/lib/abrt_xmlrpc.c
index 545f6b8..b531d25 100644
--- a/src/lib/abrt_xmlrpc.c
+++ b/src/lib/abrt_xmlrpc.c
@@ -141,6 +141,75 @@ xmlrpc_value *abrt_xmlrpc_call_full_va(xmlrpc_env *env, struct
abrt_xmlrpc *ax,
return result;
}
+xmlrpc_value *abrt_xmlrpc_array_new(xmlrpc_env *env)
+{
+ xmlrpc_value *params = xmlrpc_array_new(env);
+ if (env->fault_occurred)
+ abrt_xmlrpc_die(env);
+
+ return params;
+}
+
+void abrt_xmlrpc_array_append_string(xmlrpc_env *env, xmlrpc_value *array, const char
*value)
+{
+ xmlrpc_value *val = xmlrpc_string_new(env, value);
+ if (env->fault_occurred)
+ abrt_xmlrpc_die(env);
+
+ xmlrpc_array_append_item(env, array, val);
+ if (env->fault_occurred)
+ abrt_xmlrpc_die(env);
+
+ xmlrpc_DECREF(val);
+}
+
+xmlrpc_value *abrt_xmlrpc_params_new(xmlrpc_env *env)
+{
+ xmlrpc_value *params = xmlrpc_struct_new(env);
+ if (env->fault_occurred)
+ abrt_xmlrpc_die(env);
+
+ return params;
+}
+
+void abrt_xmlrpc_params_add_string(xmlrpc_env *env, xmlrpc_value *params, const char
*name, const char *value)
+{
+ xmlrpc_value *val = xmlrpc_string_new(env, value);
+ if (env->fault_occurred)
+ abrt_xmlrpc_die(env);
+
+ xmlrpc_struct_set_value(env, params, name, val);
+ if (env->fault_occurred)
+ abrt_xmlrpc_die(env);
+
+ xmlrpc_DECREF(val);
+}
+
+void abrt_xmlrpc_params_add_array(xmlrpc_env *env, xmlrpc_value *params, const char
*name, xmlrpc_value *value)
+{
+ xmlrpc_struct_set_value(env, params, name, value);
+ if (env->fault_occurred)
+ abrt_xmlrpc_die(env);
+}
+
+xmlrpc_value *abrt_xmlrpc_call_params(xmlrpc_env *env, struct abrt_xmlrpc *ax, const
char *method, xmlrpc_value *params)
+{
+ xmlrpc_value *array = xmlrpc_array_new(env);
+ if (env->fault_occurred)
+ abrt_xmlrpc_die(env);
+
+ xmlrpc_array_append_item(env, array, params);
+ if (env->fault_occurred)
+ abrt_xmlrpc_die(env);
+
+ xmlrpc_value *result = NULL;
+ xmlrpc_client_call2(env, ax->ax_client, ax->ax_server_info, method,
+ array, &result);
+
+ xmlrpc_DECREF(array);
+ return result;
+}
+
xmlrpc_value *abrt_xmlrpc_call_full(xmlrpc_env *env, struct abrt_xmlrpc *ax,
const char *method, const char *format, ...)
{
diff --git a/src/lib/abrt_xmlrpc.h b/src/lib/abrt_xmlrpc.h
index 1e1070c..945a887 100644
--- a/src/lib/abrt_xmlrpc.h
+++ b/src/lib/abrt_xmlrpc.h
@@ -35,6 +35,14 @@ struct abrt_xmlrpc {
xmlrpc_server_info *ax_server_info;
};
+xmlrpc_value *abrt_xmlrpc_array_new(xmlrpc_env *env);
+void abrt_xmlrpc_array_append_string(xmlrpc_env *env, xmlrpc_value *array, const char
*value);
+
+xmlrpc_value *abrt_xmlrpc_params_new(xmlrpc_env *env);
+void abrt_xmlrpc_params_add_string(xmlrpc_env *env, xmlrpc_value *params, const char
*name, const char *value);
+void abrt_xmlrpc_params_add_array(xmlrpc_env *env, xmlrpc_value *params, const char
*name, xmlrpc_value *value);
+
+
struct abrt_xmlrpc *abrt_xmlrpc_new_client(const char *url, int ssl_verify);
void abrt_xmlrpc_free_client(struct abrt_xmlrpc *ax);
void abrt_xmlrpc_die(xmlrpc_env *env) __attribute__((noreturn));
@@ -44,6 +52,9 @@ void abrt_xmlrpc_error(xmlrpc_env *env);
xmlrpc_value *abrt_xmlrpc_call(struct abrt_xmlrpc *ax,
const char *method, const char *format, ...);
+xmlrpc_value *abrt_xmlrpc_call_params(xmlrpc_env *env, struct abrt_xmlrpc *ax,
+ const char *method, xmlrpc_value *params);
+
xmlrpc_value *abrt_xmlrpc_call_full(xmlrpc_env *enf, struct abrt_xmlrpc *ax,
const char *method, const char *format, ...);
diff --git a/src/plugins/rhbz.c b/src/plugins/rhbz.c
index 6f81166..2138c5f 100644
--- a/src/plugins/rhbz.c
+++ b/src/plugins/rhbz.c
@@ -585,86 +585,40 @@ int rhbz_new_bug(struct abrt_xmlrpc *ax,
buf[3] = '\0';
}
- xmlrpc_value* result = NULL;
char *status_whiteboard = xasprintf("abrt_hash:%s", duphash);
- if (!group)
- {
- if (arch)
- {
- result = abrt_xmlrpc_call(ax, "Bug.create",
"({s:s,s:s,s:s,s:s,s:s,s:s,s:s})",
- "product", product,
- "component", component,
- "version", version,
- "summary", (summary ? summary :
bzsummary),
- "description", bzcomment,
- "status_whiteboard", status_whiteboard,
- "platform", arch
- );
- }
- else
- {
- result = abrt_xmlrpc_call(ax, "Bug.create",
"({s:s,s:s,s:s,s:s,s:s,s:s})",
- "product", product,
- "component", component,
- "version", version,
- "summary", (summary ? summary :
bzsummary),
- "description", bzcomment,
- "status_whiteboard", status_whiteboard
- );
- }
- }
- else
- {
- xmlrpc_env env;
- xmlrpc_env_init(&env);
+ xmlrpc_env env;
+ xmlrpc_env_init(&env);
- xmlrpc_value *xmlrpc_groups = xmlrpc_array_new(&env);
- if (env.fault_occurred)
- abrt_xmlrpc_die(&env);
+ xmlrpc_value *params = abrt_xmlrpc_params_new(&env);
- for (GList *l = group; l; l = l->next)
- {
- xmlrpc_value *s = xmlrpc_string_new(&env, (char *) l->data);
- if (env.fault_occurred)
- abrt_xmlrpc_die(&env);
+ abrt_xmlrpc_params_add_string(&env, params, "product", product);
+ abrt_xmlrpc_params_add_string(&env, params, "component", component);
+ abrt_xmlrpc_params_add_string(&env, params, "version", version);
+ abrt_xmlrpc_params_add_string(&env, params, "summary", (summary ?
summary : bzsummary));
+ abrt_xmlrpc_params_add_string(&env, params, "description",
bzcomment);
+ abrt_xmlrpc_params_add_string(&env, params, "status_whiteboard",
status_whiteboard);
- xmlrpc_array_append_item(&env, xmlrpc_groups, s);
- if (env.fault_occurred)
- abrt_xmlrpc_die(&env);
+ if(arch)
+ abrt_xmlrpc_params_add_string(&env, params, "platform", arch);
- xmlrpc_DECREF(s);
- }
+ if (group)
+ {
+ xmlrpc_value *xmlrpc_groups = abrt_xmlrpc_array_new(&env);
- if (arch)
- {
- result = abrt_xmlrpc_call(ax, "Bug.create",
"({s:s,s:s,s:s,s:s,s:s,s:s,s:s,s:A})",
- "product", product,
- "component", component,
- "version", version,
- "summary", (summary ? summary :
bzsummary),
- "description", bzcomment,
- "status_whiteboard", status_whiteboard,
- "platform", arch,
- "groups", xmlrpc_groups
- );
+ for (GList *l = group; l; l = l->next)
+ abrt_xmlrpc_array_append_string(&env, xmlrpc_groups, l->data);
+
+ abrt_xmlrpc_params_add_array(&env, params, "groups",
xmlrpc_groups);
- }
- else
- {
- result = abrt_xmlrpc_call(ax, "Bug.create",
"({s:s,s:s,s:s,s:s,s:s,s:s,s:A})",
- "product", product,
- "component", component,
- "version", version,
- "summary", (summary ? summary :
bzsummary),
- "description", bzcomment,
- "status_whiteboard", status_whiteboard,
- "groups", xmlrpc_groups
- );
- }
xmlrpc_DECREF(xmlrpc_groups);
}
+ xmlrpc_value* result = abrt_xmlrpc_call_params(&env, ax, "Bug.create",
params);
+
+ xmlrpc_DECREF(params);
+ xmlrpc_env_clean(&env);
+
free(status_whiteboard);
free(summary);
--
1.8.1.4