mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-27 04:13:53 -06:00
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>
This commit is contained in:
parent
f740048323
commit
9d1eab4b95
2 changed files with 48 additions and 0 deletions
|
@ -68,4 +68,16 @@ Visitor *qobject_input_visitor_new(QObject *obj);
|
||||||
*/
|
*/
|
||||||
Visitor *qobject_input_visitor_new_keyval(QObject *obj);
|
Visitor *qobject_input_visitor_new_keyval(QObject *obj);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a QObject input visitor for parsing @str.
|
||||||
|
*
|
||||||
|
* If @str looks like JSON, parse it as JSON, else as KEY=VALUE,...
|
||||||
|
* @implied_key applies to KEY=VALUE, and works as in keyval_parse().
|
||||||
|
* On failure, store an error through @errp and return NULL.
|
||||||
|
* On success, return a new QObject input visitor for the parse.
|
||||||
|
*/
|
||||||
|
Visitor *qobject_input_visitor_new_str(const char *str,
|
||||||
|
const char *implied_key,
|
||||||
|
Error **errp);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -18,9 +18,11 @@
|
||||||
#include "qapi/visitor-impl.h"
|
#include "qapi/visitor-impl.h"
|
||||||
#include "qemu/queue.h"
|
#include "qemu/queue.h"
|
||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
|
#include "qapi/qmp/qjson.h"
|
||||||
#include "qapi/qmp/types.h"
|
#include "qapi/qmp/types.h"
|
||||||
#include "qapi/qmp/qerror.h"
|
#include "qapi/qmp/qerror.h"
|
||||||
#include "qemu/cutils.h"
|
#include "qemu/cutils.h"
|
||||||
|
#include "qemu/option.h"
|
||||||
|
|
||||||
typedef struct StackObject {
|
typedef struct StackObject {
|
||||||
const char *name; /* Name of @obj in its parent, if any */
|
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;
|
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;
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue