1 /* 2 * Input Visitor 3 * 4 * Copyright (C) 2017 Red Hat, Inc. 5 * Copyright IBM, Corp. 2011 6 * 7 * Authors: 8 * Anthony Liguori <aliguori@us.ibm.com> 9 * 10 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. 11 * See the COPYING.LIB file in the top-level directory. 12 * 13 */ 14 15 #ifndef QOBJECT_INPUT_VISITOR_H 16 #define QOBJECT_INPUT_VISITOR_H 17 18 #include "qapi/visitor.h" 19 20 typedef struct QObjectInputVisitor QObjectInputVisitor; 21 22 /* 23 * Create a QObject input visitor for @obj 24 * 25 * A QObject input visitor visit builds a QAPI object from a QObject. 26 * This simultaneously walks the QAPI object being built and the 27 * QObject. The latter walk starts at @obj. 28 * 29 * visit_type_FOO() creates an instance of QAPI type FOO. The visited 30 * QObject must match FOO. QDict matches struct/union types, QList 31 * matches list types, QString matches type 'str' and enumeration 32 * types, QNum matches integer and float types, QBool matches type 33 * 'bool'. Type 'any' is matched by QObject. A QAPI alternate type 34 * is matched when one of its member types is. 35 * 36 * visit_start_struct() ... visit_end_struct() visits a QDict and 37 * creates a QAPI struct/union. Visits in between visit the 38 * dictionary members. visit_optional() is true when the QDict has 39 * this member. visit_check_struct() fails if unvisited members 40 * remain. 41 * 42 * visit_start_list() ... visit_end_list() visits a QList and creates 43 * a QAPI list. Visits in between visit list members, one after the 44 * other. visit_next_list() returns NULL when all QList members have 45 * been visited. visit_check_list() fails if unvisited members 46 * remain. 47 * 48 * visit_start_alternate() ... visit_end_alternate() visits a QObject 49 * and creates a QAPI alternate. The visit in between visits the same 50 * QObject and initializes the alternate member that is in use. 51 * 52 * Error messages refer to parts of @obj in JavaScript/Python syntax. 53 * For example, 'a.b[2]' refers to the second member of the QList 54 * member 'b' of the QDict member 'a' of QDict @obj. 55 * 56 * The caller is responsible for freeing the visitor with 57 * visit_free(). 58 */ 59 Visitor *qobject_input_visitor_new(QObject *obj); 60 61 /* 62 * Create a QObject input visitor for @obj for use with keyval_parse() 63 * 64 * This is like qobject_input_visitor_new(), except scalars are all 65 * QString, and error messages refer to parts of @obj in the syntax 66 * keyval_parse() uses for KEYs. 67 */ 68 Visitor *qobject_input_visitor_new_keyval(QObject *obj); 69 70 /* 71 * Create a QObject input visitor for parsing @str. 72 * 73 * If @str looks like JSON, parse it as JSON, else as KEY=VALUE,... 74 * @implied_key applies to KEY=VALUE, and works as in keyval_parse(). 75 * On failure, store an error through @errp and return NULL. 76 * On success, return a new QObject input visitor for the parse. 77 */ 78 Visitor *qobject_input_visitor_new_str(const char *str, 79 const char *implied_key, 80 Error **errp); 81 82 #endif 83