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