aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxen
diff options
context:
space:
mode:
authorEwan Mellor <ewan@xensource.com>2007-03-29 15:06:12 +0100
committerEwan Mellor <ewan@xensource.com>2007-03-29 15:06:12 +0100
commit4967c65c8ccc56dabc34ad37b5fadefc095adb7a (patch)
tree045fa76f89b7afc89fc81ea2b2c33ab1c8f5cb1a /tools/libxen
parent0491c8a6d26d25392b3b2458bea2b006bea88c7d (diff)
downloadxen-4967c65c8ccc56dabc34ad37b5fadefc095adb7a.tar.gz
xen-4967c65c8ccc56dabc34ad37b5fadefc095adb7a.tar.bz2
xen-4967c65c8ccc56dabc34ad37b5fadefc095adb7a.zip
This patch adds serialization of sets with strings. I recursified the
serialization. Only sets with strings are supported so far. Signed-off-by: Stefan Berger <stefanb@us.ibm.com>
Diffstat (limited to 'tools/libxen')
-rw-r--r--tools/libxen/src/xen_common.c132
1 files changed, 80 insertions, 52 deletions
diff --git a/tools/libxen/src/xen_common.c b/tools/libxen/src/xen_common.c
index 2daa0ad14d..60cbf16132 100644
--- a/tools/libxen/src/xen_common.c
+++ b/tools/libxen/src/xen_common.c
@@ -1217,11 +1217,88 @@ static void parse_result(xen_session *session, const char *result,
}
-static char *
-make_body(const char *method_name, abstract_value params[], int param_count)
+static void
+make_body_add_type(enum abstract_typename typename, abstract_value *v,
+ xmlNode *params_node)
{
char buf[20];
+ switch (typename)
+ {
+ case STRING:
+ add_param(params_node, "string", v->u.string_val);
+ break;
+
+ case INT:
+ snprintf(buf, sizeof(buf), "%"PRId64, v->u.int_val);
+ add_param(params_node, "string", buf);
+ break;
+
+ case FLOAT:
+ snprintf(buf, sizeof(buf), "%lf", v->u.float_val);
+ add_param(params_node, "double", buf);
+ break;
+
+ case BOOL:
+ add_param(params_node, "boolean", v->u.bool_val ? "1" : "0");
+ break;
+
+ case VOID:
+ add_param(params_node, "string", "");
+ break;
+
+ case ENUM:
+ add_param(params_node, "string",
+ v->type->enum_marshaller(v->u.enum_val));
+ break;
+ case SET:
+ {
+ const struct abstract_type *member_type = v->type->child;
+ arbitrary_set *set_val = v->u.struct_val;
+ abstract_value v;
+ xmlNode *data_node = add_param_struct(params_node);
+
+ for (size_t i = 0; i < set_val->size; i++)
+ {
+ switch (member_type->typename) {
+ case STRING:
+ v.u.string_val = (char *)set_val->contents[i];
+ make_body_add_type(member_type->typename, &v, data_node);
+ break;
+ default:
+ assert(false);
+ }
+ }
+ }
+ break;
+
+ case STRUCT:
+ {
+ size_t member_count = v->type->member_count;
+
+ xmlNode *struct_node = add_param_struct(params_node);
+
+ for (size_t i = 0; i < member_count; i++)
+ {
+ const struct struct_member *mem = v->type->members + i;
+ const char *key = mem->key;
+ void *struct_value = v->u.struct_val;
+
+ add_struct_value(mem->type, struct_value + mem->offset,
+ add_struct_member, key, struct_node);
+ }
+ }
+ break;
+
+ default:
+ assert(false);
+ }
+}
+
+
+static char *
+make_body(const char *method_name, abstract_value params[], int param_count)
+{
xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0");
xmlNode *methodCall = xmlNewNode(NULL, BAD_CAST "methodCall");
xmlDocSetRootElement(doc, methodCall);
@@ -1235,56 +1312,7 @@ make_body(const char *method_name, abstract_value params[], int param_count)
for (int p = 0; p < param_count; p++)
{
abstract_value *v = params + p;
- switch (v->type->typename)
- {
- case STRING:
- add_param(params_node, "string", v->u.string_val);
- break;
-
- case INT:
- snprintf(buf, sizeof(buf), "%"PRId64, v->u.int_val);
- add_param(params_node, "string", buf);
- break;
-
- case FLOAT:
- snprintf(buf, sizeof(buf), "%lf", v->u.float_val);
- add_param(params_node, "double", buf);
- break;
-
- case BOOL:
- add_param(params_node, "boolean", v->u.bool_val ? "1" : "0");
- break;
-
- case VOID:
- add_param(params_node, "string", "");
- break;
-
- case ENUM:
- add_param(params_node, "string",
- v->type->enum_marshaller(v->u.enum_val));
- break;
-
- case STRUCT:
- {
- size_t member_count = v->type->member_count;
-
- xmlNode *struct_node = add_param_struct(params_node);
-
- for (size_t i = 0; i < member_count; i++)
- {
- const struct struct_member *mem = v->type->members + i;
- const char *key = mem->key;
- void *struct_value = v->u.struct_val;
-
- add_struct_value(mem->type, struct_value + mem->offset,
- add_struct_member, key, struct_node);
- }
- }
- break;
-
- default:
- assert(false);
- }
+ make_body_add_type(v->type->typename, v, params_node);
}
xmlBufferPtr buffer = xmlBufferCreate();