Loading include/qapi/qobject-input-visitor.h +12 −0 Original line number Diff line number Diff line Loading @@ -68,4 +68,16 @@ Visitor *qobject_input_visitor_new(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 qapi/qobject-input-visitor.c +36 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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; } Loading
include/qapi/qobject-input-visitor.h +12 −0 Original line number Diff line number Diff line Loading @@ -68,4 +68,16 @@ Visitor *qobject_input_visitor_new(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
qapi/qobject-input-visitor.c +36 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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; }