aboutsummaryrefslogtreecommitdiff
path: root/qapi/qobject-input-visitor.c
diff options
context:
space:
mode:
authorMarkus Armbruster <armbru@redhat.com>2017-02-28 22:27:06 +0100
committerMarkus Armbruster <armbru@redhat.com>2017-03-07 16:07:47 +0100
commit9d1eab4b95819006afc0ee7b88eaa83be5007f39 (patch)
tree97fd93c5f9cb4aa90c697ae69a34e9dcc10aeff0 /qapi/qobject-input-visitor.c
parentf740048323398ebde9575a5730bf6d9f2a237f08 (diff)
qapi: New qobject_input_visitor_new_str() for convenience
Signed-off-by: Markus Armbruster <armbru@redhat.com> Message-Id: <1488317230-26248-21-git-send-email-armbru@redhat.com>
Diffstat (limited to 'qapi/qobject-input-visitor.c')
-rw-r--r--qapi/qobject-input-visitor.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/qapi/qobject-input-visitor.c b/qapi/qobject-input-visitor.c
index 6c5604089b..1a484d54be 100644
--- a/qapi/qobject-input-visitor.c
+++ b/qapi/qobject-input-visitor.c
@@ -18,9 +18,11 @@
#include "qapi/visitor-impl.h"
#include "qemu/queue.h"
#include "qemu-common.h"
+#include "qapi/qmp/qjson.h"
#include "qapi/qmp/types.h"
#include "qapi/qmp/qerror.h"
#include "qemu/cutils.h"
+#include "qemu/option.h"
typedef struct StackObject {
const char *name; /* Name of @obj in its parent, if any */
@@ -656,3 +658,37 @@ Visitor *qobject_input_visitor_new_keyval(QObject *obj)
return &v->visitor;
}
+
+Visitor *qobject_input_visitor_new_str(const char *str,
+ const char *implied_key,
+ Error **errp)
+{
+ bool is_json = str[0] == '{';
+ QObject *obj;
+ QDict *args;
+ Visitor *v;
+
+ if (is_json) {
+ obj = qobject_from_json(str, errp);
+ if (!obj) {
+ /* Work around qobject_from_json() lossage TODO fix that */
+ if (errp && !*errp) {
+ error_setg(errp, "JSON parse error");
+ return NULL;
+ }
+ return NULL;
+ }
+ args = qobject_to_qdict(obj);
+ assert(args);
+ v = qobject_input_visitor_new(QOBJECT(args));
+ } else {
+ args = keyval_parse(str, implied_key, errp);
+ if (!args) {
+ return NULL;
+ }
+ v = qobject_input_visitor_new_keyval(QOBJECT(args));
+ }
+ QDECREF(args);
+
+ return v;
+}