From 139ee1f1925d5546872f28ceb2e5d2805624d202 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Wed, 15 Aug 2018 08:51:01 +0200 Subject: [PATCH] qemu: qapi: Allow selecting specifically optional schema entries in virQEMUQAPISchemaTraverse Add a new modifier character '*' which will select given schema entry only when it is optional (denoted by the presence of the 'default' key). Signed-off-by: Peter Krempa Reviewed-by: John Ferlan --- src/qemu/qemu_qapi.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu_qapi.c b/src/qemu/qemu_qapi.c index 1492c0c757..427809e9e3 100644 --- a/src/qemu/qemu_qapi.c +++ b/src/qemu/qemu_qapi.c @@ -107,6 +107,7 @@ virQEMUQAPISchemaTraverse(const char *baseName, virHashTablePtr schema) { virJSONValuePtr base; + virJSONValuePtr obj; const char *metatype; const char *querystr; char modifier; @@ -134,14 +135,20 @@ virQEMUQAPISchemaTraverse(const char *baseName, if (!c_isalpha(modifier)) querystr++; - if (modifier == '+') + if (modifier == '+') { baseName = virQEMUQAPISchemaObjectGetType("variants", querystr, "case", base); - else - baseName = virQEMUQAPISchemaObjectGetType("members", - querystr, - "name", base); + } else { + obj = virQEMUQAPISchemaObjectGet("members", querystr, + "name", base); + + if (modifier == '*' && + !virJSONValueObjectHasKey(obj, "default")) + return NULL; + + baseName = virQEMUQAPISchemaTypeFromObject(obj); + } if (!baseName) return NULL; @@ -177,6 +184,8 @@ virQEMUQAPISchemaTraverse(const char *baseName, * attribute: selects whether arguments or return type should be introspected * ("arg-type" or "ret-type" for commands, "arg-type" for events) * subattribute: specifies member name of object types + * *subattribute: same as above but must be optional (has a property named + * 'default' field in the schema) * +variant_discriminator: In the case of unionized objects, select a * specific case to introspect. * -- 2.47.2