xref: /qemu/scripts/qapi/events.py (revision 9167ebd98f97dee8afa3ee206f1f48244b8707d2)
121cd70dfSWenchao Xia#
221cd70dfSWenchao Xia# QAPI event generator
321cd70dfSWenchao Xia#
421cd70dfSWenchao Xia# Copyright (c) 2014 Wenchao Xia
5a16e3e5cSEric Blake# Copyright (c) 2015-2016 Red Hat Inc.
621cd70dfSWenchao Xia#
721cd70dfSWenchao Xia# Authors:
821cd70dfSWenchao Xia#  Wenchao Xia <wenchaoqemu@gmail.com>
905f43a96SMarkus Armbruster#  Markus Armbruster <armbru@redhat.com>
1021cd70dfSWenchao Xia#
1121cd70dfSWenchao Xia# This work is licensed under the terms of the GNU GPL, version 2.
1221cd70dfSWenchao Xia# See the COPYING file in the top-level directory.
1321cd70dfSWenchao Xia
1421cd70dfSWenchao Xiafrom qapi import *
1521cd70dfSWenchao Xia
16e98859a9SMarkus Armbruster
17e98859a9SMarkus Armbrusterdef gen_event_send_proto(name, arg_type):
1803b4367aSMarkus Armbruster    return 'void qapi_event_send_%(c_name)s(%(param)s)' % {
1903b4367aSMarkus Armbruster        'c_name': c_name(name.lower()),
2003b4367aSMarkus Armbruster        'param': gen_params(arg_type, 'Error **errp')}
2121cd70dfSWenchao Xia
2221cd70dfSWenchao Xia
23e98859a9SMarkus Armbrusterdef gen_event_send_decl(name, arg_type):
2421cd70dfSWenchao Xia    return mcgen('''
2521cd70dfSWenchao Xia
26e98859a9SMarkus Armbruster%(proto)s;
2721cd70dfSWenchao Xia''',
28e98859a9SMarkus Armbruster                 proto=gen_event_send_proto(name, arg_type))
2921cd70dfSWenchao Xia
3021cd70dfSWenchao Xia
31e98859a9SMarkus Armbrusterdef gen_event_send(name, arg_type):
32e98859a9SMarkus Armbruster    ret = mcgen('''
33e98859a9SMarkus Armbruster
34e98859a9SMarkus Armbruster%(proto)s
3521cd70dfSWenchao Xia{
3621cd70dfSWenchao Xia    QDict *qmp;
372a0f50e8SEric Blake    Error *err = NULL;
3821cd70dfSWenchao Xia    QMPEventFuncEmit emit;
39e98859a9SMarkus Armbruster''',
40e98859a9SMarkus Armbruster                proto=gen_event_send_proto(name, arg_type))
4121cd70dfSWenchao Xia
42e98859a9SMarkus Armbruster    if arg_type and arg_type.members:
43e98859a9SMarkus Armbruster        ret += mcgen('''
4421cd70dfSWenchao Xia    QmpOutputVisitor *qov;
4521cd70dfSWenchao Xia    Visitor *v;
4621cd70dfSWenchao Xia    QObject *obj;
4721cd70dfSWenchao Xia
48e98859a9SMarkus Armbruster''')
4921cd70dfSWenchao Xia
50e98859a9SMarkus Armbruster    ret += mcgen('''
5121cd70dfSWenchao Xia    emit = qmp_event_get_func_emit();
5221cd70dfSWenchao Xia    if (!emit) {
5321cd70dfSWenchao Xia        return;
5421cd70dfSWenchao Xia    }
5521cd70dfSWenchao Xia
56e98859a9SMarkus Armbruster    qmp = qmp_event_build_dict("%(name)s");
5721cd70dfSWenchao Xia
58e98859a9SMarkus Armbruster''',
59e98859a9SMarkus Armbruster                 name=name)
6021cd70dfSWenchao Xia
61e98859a9SMarkus Armbruster    if arg_type and arg_type.members:
62e98859a9SMarkus Armbruster        ret += mcgen('''
6321cd70dfSWenchao Xia    qov = qmp_output_visitor_new();
6421cd70dfSWenchao Xia    v = qmp_output_get_visitor(qov);
6521cd70dfSWenchao Xia
66337283dfSEric Blake    visit_start_struct(v, "%(name)s", NULL, 0, &err);
67e98859a9SMarkus Armbruster''',
68e98859a9SMarkus Armbruster                     name=name)
691f353344SEric Blake        ret += gen_err_check()
70a16e3e5cSEric Blake        ret += gen_visit_fields(arg_type.members, need_cast=True,
71a16e3e5cSEric Blake                                label='out_obj')
72e98859a9SMarkus Armbruster        ret += mcgen('''
73a16e3e5cSEric Blakeout_obj:
74a16e3e5cSEric Blake    visit_end_struct(v, err ? NULL : &err);
752a0f50e8SEric Blake    if (err) {
76f782399cSEric Blake        goto out;
7721cd70dfSWenchao Xia    }
7821cd70dfSWenchao Xia
7921cd70dfSWenchao Xia    obj = qmp_output_get_qobject(qov);
80a16e3e5cSEric Blake    g_assert(obj);
8121cd70dfSWenchao Xia
8221cd70dfSWenchao Xia    qdict_put_obj(qmp, "data", obj);
83e98859a9SMarkus Armbruster''')
8421cd70dfSWenchao Xia
85e98859a9SMarkus Armbruster    ret += mcgen('''
862a0f50e8SEric Blake    emit(%(c_enum)s, qmp, &err);
8721cd70dfSWenchao Xia
88e98859a9SMarkus Armbruster''',
89e98859a9SMarkus Armbruster                 c_enum=c_enum_const(event_enum_name, name))
9021cd70dfSWenchao Xia
91e98859a9SMarkus Armbruster    if arg_type and arg_type.members:
92e98859a9SMarkus Armbruster        ret += mcgen('''
93f782399cSEric Blakeout:
9421cd70dfSWenchao Xia    qmp_output_visitor_cleanup(qov);
95e98859a9SMarkus Armbruster''')
96e98859a9SMarkus Armbruster    ret += mcgen('''
972a0f50e8SEric Blake    error_propagate(errp, err);
9821cd70dfSWenchao Xia    QDECREF(qmp);
9921cd70dfSWenchao Xia}
100e98859a9SMarkus Armbruster''')
10121cd70dfSWenchao Xia    return ret
10221cd70dfSWenchao Xia
10305f43a96SMarkus Armbruster
10405f43a96SMarkus Armbrusterclass QAPISchemaGenEventVisitor(QAPISchemaVisitor):
10505f43a96SMarkus Armbruster    def __init__(self):
10605f43a96SMarkus Armbruster        self.decl = None
10705f43a96SMarkus Armbruster        self.defn = None
10805f43a96SMarkus Armbruster        self._event_names = None
10905f43a96SMarkus Armbruster
11005f43a96SMarkus Armbruster    def visit_begin(self, schema):
11105f43a96SMarkus Armbruster        self.decl = ''
11205f43a96SMarkus Armbruster        self.defn = ''
11305f43a96SMarkus Armbruster        self._event_names = []
11405f43a96SMarkus Armbruster
11505f43a96SMarkus Armbruster    def visit_end(self):
116e98859a9SMarkus Armbruster        self.decl += gen_enum(event_enum_name, self._event_names)
117e98859a9SMarkus Armbruster        self.defn += gen_enum_lookup(event_enum_name, self._event_names)
11805f43a96SMarkus Armbruster        self._event_names = None
11905f43a96SMarkus Armbruster
12005f43a96SMarkus Armbruster    def visit_event(self, name, info, arg_type):
121e98859a9SMarkus Armbruster        self.decl += gen_event_send_decl(name, arg_type)
122e98859a9SMarkus Armbruster        self.defn += gen_event_send(name, arg_type)
12305f43a96SMarkus Armbruster        self._event_names.append(name)
12405f43a96SMarkus Armbruster
12505f43a96SMarkus Armbruster
1262114f5a9SMarkus Armbruster(input_file, output_dir, do_c, do_h, prefix, dummy) = parse_command_line()
12721cd70dfSWenchao Xia
12812f8e1b9SMarkus Armbrusterc_comment = '''
12921cd70dfSWenchao Xia/*
13021cd70dfSWenchao Xia * schema-defined QAPI event functions
13121cd70dfSWenchao Xia *
13221cd70dfSWenchao Xia * Copyright (c) 2014 Wenchao Xia
13321cd70dfSWenchao Xia *
13421cd70dfSWenchao Xia * Authors:
13521cd70dfSWenchao Xia *  Wenchao Xia   <wenchaoqemu@gmail.com>
13621cd70dfSWenchao Xia *
13721cd70dfSWenchao Xia * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
13821cd70dfSWenchao Xia * See the COPYING.LIB file in the top-level directory.
13921cd70dfSWenchao Xia *
14021cd70dfSWenchao Xia */
14112f8e1b9SMarkus Armbruster'''
14212f8e1b9SMarkus Armbrusterh_comment = '''
14312f8e1b9SMarkus Armbruster/*
14412f8e1b9SMarkus Armbruster * schema-defined QAPI event functions
14512f8e1b9SMarkus Armbruster *
14612f8e1b9SMarkus Armbruster * Copyright (c) 2014 Wenchao Xia
14712f8e1b9SMarkus Armbruster *
14812f8e1b9SMarkus Armbruster * Authors:
14912f8e1b9SMarkus Armbruster *  Wenchao Xia  <wenchaoqemu@gmail.com>
15012f8e1b9SMarkus Armbruster *
15112f8e1b9SMarkus Armbruster * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
15212f8e1b9SMarkus Armbruster * See the COPYING.LIB file in the top-level directory.
15312f8e1b9SMarkus Armbruster *
15412f8e1b9SMarkus Armbruster */
15512f8e1b9SMarkus Armbruster'''
15621cd70dfSWenchao Xia
15712f8e1b9SMarkus Armbruster(fdef, fdecl) = open_output(output_dir, do_c, do_h, prefix,
15812f8e1b9SMarkus Armbruster                            'qapi-event.c', 'qapi-event.h',
15912f8e1b9SMarkus Armbruster                            c_comment, h_comment)
16012f8e1b9SMarkus Armbruster
16112f8e1b9SMarkus Armbrusterfdef.write(mcgen('''
162*9167ebd9SEric Blake#include "qemu/osdep.h"
16321cd70dfSWenchao Xia#include "qemu-common.h"
16412f8e1b9SMarkus Armbruster#include "%(prefix)sqapi-event.h"
16521cd70dfSWenchao Xia#include "%(prefix)sqapi-visit.h"
16621cd70dfSWenchao Xia#include "qapi/qmp-output-visitor.h"
16721cd70dfSWenchao Xia#include "qapi/qmp-event.h"
16821cd70dfSWenchao Xia
16921cd70dfSWenchao Xia''',
17012f8e1b9SMarkus Armbruster                 prefix=prefix))
17121cd70dfSWenchao Xia
17221cd70dfSWenchao Xiafdecl.write(mcgen('''
17321cd70dfSWenchao Xia#include "qapi/error.h"
17421cd70dfSWenchao Xia#include "qapi/qmp/qdict.h"
17521cd70dfSWenchao Xia#include "%(prefix)sqapi-types.h"
17621cd70dfSWenchao Xia
17721cd70dfSWenchao Xia''',
17812f8e1b9SMarkus Armbruster                  prefix=prefix))
17921cd70dfSWenchao Xia
180016a335bSMarkus Armbrusterevent_enum_name = c_name(prefix + "QAPIEvent", protect=False)
18121cd70dfSWenchao Xia
18205f43a96SMarkus Armbrusterschema = QAPISchema(input_file)
18305f43a96SMarkus Armbrustergen = QAPISchemaGenEventVisitor()
18405f43a96SMarkus Armbrusterschema.visit(gen)
18505f43a96SMarkus Armbrusterfdef.write(gen.defn)
18605f43a96SMarkus Armbrusterfdecl.write(gen.decl)
18721cd70dfSWenchao Xia
18812f8e1b9SMarkus Armbrusterclose_output(fdef, fdecl)
189