mirror of
https://github.com/mii443/qemu.git
synced 2025-08-22 23:25:48 +00: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:
@ -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;
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user