diff options
Diffstat (limited to 'src/sbus/sbus_codegen')
-rwxr-xr-x | src/sbus/sbus_codegen | 42 |
1 files changed, 40 insertions, 2 deletions
diff --git a/src/sbus/sbus_codegen b/src/sbus/sbus_codegen index a1e2d02a0..86aeff094 100755 --- a/src/sbus/sbus_codegen +++ b/src/sbus/sbus_codegen @@ -184,6 +184,7 @@ def source_methods(iface, methods): out(" %s__out,", meth.fq_c_name()) else: out(" NULL, /* no out_args */") + out(" offsetof(struct %s, %s),", iface.c_name(), meth.c_name()) out(" },") out(" { NULL, }") out("};") @@ -251,7 +252,7 @@ def source_interface(iface): out(" NULL, /* no propetries */") out("};") -def generate_source(ifaces, filename): +def generate_source(ifaces, filename, include_header=None): basename = os.path.basename(filename) out("/* The following definitions are auto-generated from %s */", basename) @@ -260,6 +261,8 @@ def generate_source(ifaces, filename): out("#include \"util/util.h\"") out("#include \"sbus/sssd_dbus.h\"") out("#include \"sbus/sssd_dbus_meta.h\"") + if include_header: + out("#include \"%s\"", os.path.basename(include_header)) for iface in ifaces: @@ -278,6 +281,20 @@ def generate_source(ifaces, filename): # The sbus_interface structure source_interface(iface) +def header_vtable(iface, methods): + out("") + out("/* vtable for %s */", iface.name) + out("struct %s {", iface.c_name()) + out(" struct sbus_vtable vtable; /* derive from sbus_vtable */") + + # All methods + for meth in iface.methods: + out(" sbus_msg_handler_fn %s;", meth.c_name()) + + # TODO: Property getters and setters will go here + + out("};") + def generate_header(ifaces, filename): basename = os.path.basename(filename) guard = "__%s__" % re.sub(r'([^_A-Z0-9])', "_", basename.upper()) @@ -291,6 +308,23 @@ def generate_header(ifaces, filename): out("") out("/* ------------------------------------------------------------------------") + out(" * DBus Vtable handler structures") + out(" *") + out(" * These structures are filled in by implementors of the different") + out(" * dbus interfaces to handle method calls.") + out(" *") + out(" * Handler functions of type sbus_msg_handler_fn accept raw messages,") + out(" * other handlers will be typed appropriately. If a handler that is") + out(" * set to NULL is invoked it will result in a") + out(" * org.freedesktop.DBus.Error.NotSupported error for the caller.") + out(" */") + + for iface in ifaces: + if iface.methods: + header_vtable(iface, iface.methods) + + out("") + out("/* ------------------------------------------------------------------------") out(" * DBus Interface Metadata") out(" *") out(" * These structure definitions are filled in with the information about") @@ -465,6 +499,10 @@ def parse_options(): dest="output", default=None, help="Set output file name (default: stdout)", metavar="FILE") + parser.add_option("--include", + dest="include", default=None, + help="name of a header to #include", + metavar="HEADER") (options, args) = parser.parse_args() if not args: @@ -488,7 +526,7 @@ def main(): if options.mode == "header": generate_header(parser.parsed_interfaces, filename) elif options.mode == "source": - generate_source(parser.parsed_interfaces, filename) + generate_source(parser.parsed_interfaces, filename, options.include) else: assert False, "should not be reached" |