summaryrefslogtreecommitdiffstats
path: root/src/sbus/sbus_codegen
diff options
context:
space:
mode:
Diffstat (limited to 'src/sbus/sbus_codegen')
-rwxr-xr-xsrc/sbus/sbus_codegen42
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"