]>
Commit | Line | Data |
---|---|---|
21cd70df WX |
1 | # |
2 | # QAPI event generator | |
3 | # | |
4 | # Copyright (c) 2014 Wenchao Xia | |
a16e3e5c | 5 | # Copyright (c) 2015-2016 Red Hat Inc. |
21cd70df WX |
6 | # |
7 | # Authors: | |
8 | # Wenchao Xia <[email protected]> | |
05f43a96 | 9 | # Markus Armbruster <[email protected]> |
21cd70df WX |
10 | # |
11 | # This work is licensed under the terms of the GNU GPL, version 2. | |
12 | # See the COPYING file in the top-level directory. | |
13 | ||
21cd70df | 14 | from qapi import * |
21cd70df | 15 | |
e98859a9 MA |
16 | |
17 | def gen_event_send_proto(name, arg_type): | |
03b4367a MA |
18 | return 'void qapi_event_send_%(c_name)s(%(param)s)' % { |
19 | 'c_name': c_name(name.lower()), | |
20 | 'param': gen_params(arg_type, 'Error **errp')} | |
21cd70df | 21 | |
21cd70df | 22 | |
e98859a9 | 23 | def gen_event_send_decl(name, arg_type): |
21cd70df WX |
24 | return mcgen(''' |
25 | ||
e98859a9 | 26 | %(proto)s; |
21cd70df | 27 | ''', |
e98859a9 MA |
28 | proto=gen_event_send_proto(name, arg_type)) |
29 | ||
21cd70df | 30 | |
e98859a9 MA |
31 | def gen_event_send(name, arg_type): |
32 | ret = mcgen(''' | |
21cd70df | 33 | |
e98859a9 | 34 | %(proto)s |
21cd70df WX |
35 | { |
36 | QDict *qmp; | |
2a0f50e8 | 37 | Error *err = NULL; |
21cd70df | 38 | QMPEventFuncEmit emit; |
e98859a9 MA |
39 | ''', |
40 | proto=gen_event_send_proto(name, arg_type)) | |
21cd70df | 41 | |
e98859a9 MA |
42 | if arg_type and arg_type.members: |
43 | ret += mcgen(''' | |
21cd70df WX |
44 | QmpOutputVisitor *qov; |
45 | Visitor *v; | |
46 | QObject *obj; | |
47 | ||
e98859a9 | 48 | ''') |
21cd70df | 49 | |
e98859a9 | 50 | ret += mcgen(''' |
21cd70df WX |
51 | emit = qmp_event_get_func_emit(); |
52 | if (!emit) { | |
53 | return; | |
54 | } | |
55 | ||
e98859a9 | 56 | qmp = qmp_event_build_dict("%(name)s"); |
21cd70df | 57 | |
e98859a9 MA |
58 | ''', |
59 | name=name) | |
21cd70df | 60 | |
e98859a9 MA |
61 | if arg_type and arg_type.members: |
62 | ret += mcgen(''' | |
21cd70df | 63 | qov = qmp_output_visitor_new(); |
21cd70df | 64 | v = qmp_output_get_visitor(qov); |
21cd70df | 65 | |
337283df | 66 | visit_start_struct(v, "%(name)s", NULL, 0, &err); |
e98859a9 MA |
67 | ''', |
68 | name=name) | |
1f353344 | 69 | ret += gen_err_check() |
a16e3e5c EB |
70 | ret += gen_visit_fields(arg_type.members, need_cast=True, |
71 | label='out_obj') | |
e98859a9 | 72 | ret += mcgen(''' |
a16e3e5c EB |
73 | out_obj: |
74 | visit_end_struct(v, err ? NULL : &err); | |
2a0f50e8 | 75 | if (err) { |
f782399c | 76 | goto out; |
21cd70df WX |
77 | } |
78 | ||
79 | obj = qmp_output_get_qobject(qov); | |
a16e3e5c | 80 | g_assert(obj); |
21cd70df WX |
81 | |
82 | qdict_put_obj(qmp, "data", obj); | |
e98859a9 | 83 | ''') |
21cd70df | 84 | |
e98859a9 | 85 | ret += mcgen(''' |
2a0f50e8 | 86 | emit(%(c_enum)s, qmp, &err); |
21cd70df | 87 | |
e98859a9 MA |
88 | ''', |
89 | c_enum=c_enum_const(event_enum_name, name)) | |
21cd70df | 90 | |
e98859a9 MA |
91 | if arg_type and arg_type.members: |
92 | ret += mcgen(''' | |
f782399c | 93 | out: |
21cd70df | 94 | qmp_output_visitor_cleanup(qov); |
e98859a9 MA |
95 | ''') |
96 | ret += mcgen(''' | |
2a0f50e8 | 97 | error_propagate(errp, err); |
21cd70df WX |
98 | QDECREF(qmp); |
99 | } | |
e98859a9 | 100 | ''') |
21cd70df WX |
101 | return ret |
102 | ||
05f43a96 MA |
103 | |
104 | class QAPISchemaGenEventVisitor(QAPISchemaVisitor): | |
105 | def __init__(self): | |
106 | self.decl = None | |
107 | self.defn = None | |
108 | self._event_names = None | |
109 | ||
110 | def visit_begin(self, schema): | |
111 | self.decl = '' | |
112 | self.defn = '' | |
113 | self._event_names = [] | |
114 | ||
115 | def visit_end(self): | |
e98859a9 MA |
116 | self.decl += gen_enum(event_enum_name, self._event_names) |
117 | self.defn += gen_enum_lookup(event_enum_name, self._event_names) | |
05f43a96 MA |
118 | self._event_names = None |
119 | ||
120 | def visit_event(self, name, info, arg_type): | |
e98859a9 MA |
121 | self.decl += gen_event_send_decl(name, arg_type) |
122 | self.defn += gen_event_send(name, arg_type) | |
05f43a96 MA |
123 | self._event_names.append(name) |
124 | ||
125 | ||
2114f5a9 | 126 | (input_file, output_dir, do_c, do_h, prefix, dummy) = parse_command_line() |
21cd70df | 127 | |
12f8e1b9 | 128 | c_comment = ''' |
21cd70df WX |
129 | /* |
130 | * schema-defined QAPI event functions | |
131 | * | |
132 | * Copyright (c) 2014 Wenchao Xia | |
133 | * | |
134 | * Authors: | |
135 | * Wenchao Xia <[email protected]> | |
136 | * | |
137 | * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. | |
138 | * See the COPYING.LIB file in the top-level directory. | |
139 | * | |
140 | */ | |
12f8e1b9 MA |
141 | ''' |
142 | h_comment = ''' | |
21cd70df WX |
143 | /* |
144 | * schema-defined QAPI event functions | |
145 | * | |
146 | * Copyright (c) 2014 Wenchao Xia | |
147 | * | |
148 | * Authors: | |
149 | * Wenchao Xia <[email protected]> | |
150 | * | |
151 | * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. | |
152 | * See the COPYING.LIB file in the top-level directory. | |
153 | * | |
154 | */ | |
12f8e1b9 | 155 | ''' |
21cd70df | 156 | |
12f8e1b9 MA |
157 | (fdef, fdecl) = open_output(output_dir, do_c, do_h, prefix, |
158 | 'qapi-event.c', 'qapi-event.h', | |
159 | c_comment, h_comment) | |
21cd70df | 160 | |
12f8e1b9 | 161 | fdef.write(mcgen(''' |
9167ebd9 | 162 | #include "qemu/osdep.h" |
12f8e1b9 MA |
163 | #include "qemu-common.h" |
164 | #include "%(prefix)sqapi-event.h" | |
165 | #include "%(prefix)sqapi-visit.h" | |
166 | #include "qapi/qmp-output-visitor.h" | |
167 | #include "qapi/qmp-event.h" | |
168 | ||
169 | ''', | |
170 | prefix=prefix)) | |
171 | ||
172 | fdecl.write(mcgen(''' | |
21cd70df WX |
173 | #include "qapi/error.h" |
174 | #include "qapi/qmp/qdict.h" | |
175 | #include "%(prefix)sqapi-types.h" | |
176 | ||
177 | ''', | |
12f8e1b9 | 178 | prefix=prefix)) |
21cd70df | 179 | |
016a335b | 180 | event_enum_name = c_name(prefix + "QAPIEvent", protect=False) |
05f43a96 MA |
181 | |
182 | schema = QAPISchema(input_file) | |
183 | gen = QAPISchemaGenEventVisitor() | |
184 | schema.visit(gen) | |
185 | fdef.write(gen.defn) | |
186 | fdecl.write(gen.decl) | |
21cd70df | 187 | |
12f8e1b9 | 188 | close_output(fdef, fdecl) |