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
					
				| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue