1 /* 2 * Core Definitions for QAPI Visitor Classes 3 * 4 * Copyright (C) 2012-2016 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 #ifndef QAPI_VISITOR_CORE_H 15 #define QAPI_VISITOR_CORE_H 16 17 #include "qapi/qmp/qobject.h" 18 19 /* This struct is layout-compatible with all other *List structs 20 * created by the qapi generator. It is used as a typical 21 * singly-linked list. */ 22 typedef struct GenericList { 23 struct GenericList *next; 24 char padding[]; 25 } GenericList; 26 27 /* This struct is layout-compatible with all Alternate types 28 * created by the qapi generator. */ 29 typedef struct GenericAlternate { 30 QType type; 31 char padding[]; 32 } GenericAlternate; 33 34 void visit_start_struct(Visitor *v, const char *name, void **obj, 35 size_t size, Error **errp); 36 void visit_end_struct(Visitor *v, Error **errp); 37 38 void visit_start_list(Visitor *v, const char *name, Error **errp); 39 GenericList *visit_next_list(Visitor *v, GenericList **list, size_t size); 40 void visit_end_list(Visitor *v); 41 42 /* 43 * Start the visit of an alternate @obj with the given @size. 44 * 45 * @name specifies the relationship to the containing struct (ignored 46 * for a top level visit, the name of the key if this alternate is 47 * part of an object, or NULL if this alternate is part of a list). 48 * 49 * @obj must not be NULL. Input visitors will allocate @obj and 50 * determine the qtype of the next thing to be visited, stored in 51 * (*@obj)->type. Other visitors will leave @obj unchanged. 52 * 53 * If @promote_int, treat integers as QTYPE_FLOAT. 54 * 55 * If successful, this must be paired with visit_end_alternate(), even 56 * if visiting the contents of the alternate fails. 57 */ 58 void visit_start_alternate(Visitor *v, const char *name, 59 GenericAlternate **obj, size_t size, 60 bool promote_int, Error **errp); 61 62 /* 63 * Finish visiting an alternate type. 64 * 65 * Must be called after a successful visit_start_alternate(), even if 66 * an error occurred in the meantime. 67 * 68 * TODO: Should all the visit_end_* interfaces take obj parameter, so 69 * that dealloc visitor need not track what was passed in visit_start? 70 */ 71 void visit_end_alternate(Visitor *v); 72 73 /** 74 * Check if an optional member @name of an object needs visiting. 75 * For input visitors, set *@present according to whether the 76 * corresponding visit_type_*() needs calling; for other visitors, 77 * leave *@present unchanged. Return *@present for convenience. 78 */ 79 bool visit_optional(Visitor *v, const char *name, bool *present); 80 81 void visit_type_enum(Visitor *v, const char *name, int *obj, 82 const char *const strings[], Error **errp); 83 void visit_type_int(Visitor *v, const char *name, int64_t *obj, Error **errp); 84 void visit_type_uint8(Visitor *v, const char *name, uint8_t *obj, 85 Error **errp); 86 void visit_type_uint16(Visitor *v, const char *name, uint16_t *obj, 87 Error **errp); 88 void visit_type_uint32(Visitor *v, const char *name, uint32_t *obj, 89 Error **errp); 90 void visit_type_uint64(Visitor *v, const char *name, uint64_t *obj, 91 Error **errp); 92 void visit_type_int8(Visitor *v, const char *name, int8_t *obj, Error **errp); 93 void visit_type_int16(Visitor *v, const char *name, int16_t *obj, 94 Error **errp); 95 void visit_type_int32(Visitor *v, const char *name, int32_t *obj, 96 Error **errp); 97 void visit_type_int64(Visitor *v, const char *name, int64_t *obj, 98 Error **errp); 99 void visit_type_size(Visitor *v, const char *name, uint64_t *obj, 100 Error **errp); 101 void visit_type_bool(Visitor *v, const char *name, bool *obj, Error **errp); 102 void visit_type_str(Visitor *v, const char *name, char **obj, Error **errp); 103 void visit_type_number(Visitor *v, const char *name, double *obj, 104 Error **errp); 105 void visit_type_any(Visitor *v, const char *name, QObject **obj, Error **errp); 106 107 #endif 108