blob: 3b950f6e3db78140f57130ec8a7af64f33974ce2 [file] [log] [blame]
Paolo Bonzini0f71a1e2012-02-09 09:11:52 +01001/*
2 * Core Definitions for QAPI Visitor implementations
3 *
Eric Blake04e070d2016-01-29 06:48:51 -07004 * Copyright (C) 2012-2016 Red Hat, Inc.
Paolo Bonzini0f71a1e2012-02-09 09:11:52 +01005 *
6 * Author: Paolo Bonizni <pbonzini@redhat.com>
7 *
8 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
9 * See the COPYING.LIB file in the top-level directory.
10 *
11 */
12#ifndef QAPI_VISITOR_IMPL_H
13#define QAPI_VISITOR_IMPL_H
14
Paolo Bonzini7b1b5d12012-12-17 18:19:43 +010015#include "qapi/visitor.h"
Paolo Bonzini0f71a1e2012-02-09 09:11:52 +010016
Eric Blake983f52d2016-04-28 15:45:09 -060017/*
Eric Blakeadfb2642016-04-28 15:45:20 -060018 * This file describes the callback interface for implementing a QAPI
19 * visitor. For the client interface, see visitor.h. When
20 * implementing the callbacks, it is easiest to declare a struct with
21 * 'Visitor visitor;' as the first member. A callback's contract
22 * matches the corresponding public functions' contract unless stated
23 * otherwise. In the comments below, some callbacks are marked "must
24 * be set for $TYPE visits to work"; if a visitor implementation omits
25 * that callback, it should also document that it is only useful for a
26 * subset of QAPI.
27 */
28
29/*
Eric Blakea15fcc32016-06-09 10:48:44 -060030 * There are four classes of visitors; setting the class determines
Eric Blake983f52d2016-04-28 15:45:09 -060031 * how QAPI enums are visited, as well as what additional restrictions
Eric Blakea15fcc32016-06-09 10:48:44 -060032 * can be asserted. The values are intentionally chosen so as to
33 * permit some assertions based on whether a given bit is set (that
34 * is, some assertions apply to input and clone visitors, some
35 * assertions apply to output and clone visitors).
Eric Blake983f52d2016-04-28 15:45:09 -060036 */
37typedef enum VisitorType {
Eric Blakea15fcc32016-06-09 10:48:44 -060038 VISITOR_INPUT = 1,
39 VISITOR_OUTPUT = 2,
40 VISITOR_CLONE = 3,
41 VISITOR_DEALLOC = 4,
Eric Blake983f52d2016-04-28 15:45:09 -060042} VisitorType;
43
Paolo Bonzini7edd63f2012-12-06 11:28:04 +010044struct Visitor
45{
Markus Armbruster1f584242020-04-24 10:43:35 +020046 /*
47 * Only input visitors may fail!
48 */
49
Eric Blakeadfb2642016-04-28 15:45:20 -060050 /* Must be set to visit structs */
Markus Armbruster012d4c92020-07-07 18:05:45 +020051 bool (*start_struct)(Visitor *v, const char *name, void **obj,
Eric Blake337283d2016-01-29 06:48:57 -070052 size_t size, Error **errp);
Eric Blakeadfb2642016-04-28 15:45:20 -060053
Eric Blake15c2f662016-04-28 15:45:27 -060054 /* Optional; intended for input visitors */
Markus Armbruster012d4c92020-07-07 18:05:45 +020055 bool (*check_struct)(Visitor *v, Error **errp);
Eric Blake15c2f662016-04-28 15:45:27 -060056
Eric Blakeadfb2642016-04-28 15:45:20 -060057 /* Must be set to visit structs */
Eric Blake1158bb22016-06-09 10:48:34 -060058 void (*end_struct)(Visitor *v, void **obj);
Paolo Bonzini7edd63f2012-12-06 11:28:04 +010059
Eric Blaked9f62dd2016-04-28 15:45:31 -060060 /* Must be set; implementations may require @list to be non-null,
61 * but must document it. */
Markus Armbruster012d4c92020-07-07 18:05:45 +020062 bool (*start_list)(Visitor *v, const char *name, GenericList **list,
Eric Blaked9f62dd2016-04-28 15:45:31 -060063 size_t size, Error **errp);
Eric Blakeadfb2642016-04-28 15:45:20 -060064
Eric Blake08f95412016-01-29 06:48:59 -070065 /* Must be set */
Eric Blaked9f62dd2016-04-28 15:45:31 -060066 GenericList *(*next_list)(Visitor *v, GenericList *tail, size_t size);
Eric Blakeadfb2642016-04-28 15:45:20 -060067
Markus Armbrustera4a1c702017-03-03 13:32:45 +010068 /* Optional; intended for input visitors */
Markus Armbruster012d4c92020-07-07 18:05:45 +020069 bool (*check_list)(Visitor *v, Error **errp);
Markus Armbrustera4a1c702017-03-03 13:32:45 +010070
Eric Blake08f95412016-01-29 06:48:59 -070071 /* Must be set */
Eric Blake1158bb22016-06-09 10:48:34 -060072 void (*end_list)(Visitor *v, void **list);
Paolo Bonzini7edd63f2012-12-06 11:28:04 +010073
Markus Armbruster8b7ce952020-04-24 10:43:30 +020074 /* Must be set by input and clone visitors to visit alternates */
Markus Armbruster012d4c92020-07-07 18:05:45 +020075 bool (*start_alternate)(Visitor *v, const char *name,
Eric Blakedbf11922016-02-17 23:48:29 -070076 GenericAlternate **obj, size_t size,
Marc-André Lureau60390d22017-06-07 20:35:59 +040077 Error **errp);
Eric Blakedbf11922016-02-17 23:48:29 -070078
Markus Armbruster8b7ce952020-04-24 10:43:30 +020079 /* Optional */
Eric Blake1158bb22016-06-09 10:48:34 -060080 void (*end_alternate)(Visitor *v, void **obj);
Eric Blakedbf11922016-02-17 23:48:29 -070081
Eric Blakeadfb2642016-04-28 15:45:20 -060082 /* Must be set */
Markus Armbruster012d4c92020-07-07 18:05:45 +020083 bool (*type_int64)(Visitor *v, const char *name, int64_t *obj,
Eric Blake4c403142016-01-29 06:48:49 -070084 Error **errp);
Eric Blakeadfb2642016-04-28 15:45:20 -060085
86 /* Must be set */
Markus Armbruster012d4c92020-07-07 18:05:45 +020087 bool (*type_uint64)(Visitor *v, const char *name, uint64_t *obj,
Eric Blakef755dea2016-01-29 06:48:50 -070088 Error **errp);
Eric Blakeadfb2642016-04-28 15:45:20 -060089
90 /* Optional; fallback is type_uint64() */
Markus Armbruster012d4c92020-07-07 18:05:45 +020091 bool (*type_size)(Visitor *v, const char *name, uint64_t *obj,
Eric Blakef755dea2016-01-29 06:48:50 -070092 Error **errp);
Eric Blakeadfb2642016-04-28 15:45:20 -060093
94 /* Must be set */
Markus Armbruster012d4c92020-07-07 18:05:45 +020095 bool (*type_bool)(Visitor *v, const char *name, bool *obj, Error **errp);
Eric Blakeadfb2642016-04-28 15:45:20 -060096
97 /* Must be set */
Markus Armbruster012d4c92020-07-07 18:05:45 +020098 bool (*type_str)(Visitor *v, const char *name, char **obj, Error **errp);
Eric Blakeadfb2642016-04-28 15:45:20 -060099
100 /* Must be set to visit numbers */
Markus Armbruster012d4c92020-07-07 18:05:45 +0200101 bool (*type_number)(Visitor *v, const char *name, double *obj,
Paolo Bonzini7edd63f2012-12-06 11:28:04 +0100102 Error **errp);
Eric Blakeadfb2642016-04-28 15:45:20 -0600103
104 /* Must be set to visit arbitrary QTypes */
Markus Armbruster012d4c92020-07-07 18:05:45 +0200105 bool (*type_any)(Visitor *v, const char *name, QObject **obj,
Markus Armbruster28770e02015-09-16 13:06:24 +0200106 Error **errp);
Paolo Bonzini7edd63f2012-12-06 11:28:04 +0100107
Eric Blake3bc97fd2016-04-28 15:45:22 -0600108 /* Must be set to visit explicit null values. */
Markus Armbruster012d4c92020-07-07 18:05:45 +0200109 bool (*type_null)(Visitor *v, const char *name, QNull **obj,
Markus Armbrusterd2f95f42017-06-26 18:22:59 +0200110 Error **errp);
Eric Blake3bc97fd2016-04-28 15:45:22 -0600111
Markus Armbrustera8aec6d2017-03-03 13:32:35 +0100112 /* Must be set for input visitors to visit structs, optional otherwise.
113 The core takes care of the return type in the public interface. */
Eric Blake0b2a0d62016-01-29 06:48:56 -0700114 void (*optional)(Visitor *v, const char *name, bool *present);
Paolo Bonzini7edd63f2012-12-06 11:28:04 +0100115
Markus Armbruster91fa93e2021-03-18 16:55:11 +0100116 /* Optional */
Markus Armbrusterdb291642021-03-18 16:55:18 +0100117 bool (*deprecated_accept)(Visitor *v, const char *name, Error **errp);
118
119 /* Optional */
Markus Armbruster91fa93e2021-03-18 16:55:11 +0100120 bool (*deprecated)(Visitor *v, const char *name);
121
Eric Blake983f52d2016-04-28 15:45:09 -0600122 /* Must be set */
123 VisitorType type;
Eric Blake2c0ef9f2016-06-09 10:48:35 -0600124
Eric Blake3b098d52016-06-09 10:48:43 -0600125 /* Must be set for output visitors, optional otherwise. */
126 void (*complete)(Visitor *v, void *opaque);
127
Eric Blake2c0ef9f2016-06-09 10:48:35 -0600128 /* Must be set */
129 void (*free)(Visitor *v);
Eric Blake983f52d2016-04-28 15:45:09 -0600130};
Paolo Bonzini0f71a1e2012-02-09 09:11:52 +0100131
132#endif