sbus_codegen revision e8058322725ba050014777ee2484f7e833ab1e3a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Stef Walter <stefw@redhat.com>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Copyright (C) 2014 Red Hat
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This program is free software; you can redistribute it and/or modify
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# it under the terms of the GNU General Public License as published by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# the Free Software Foundation; either version 3 of the License, or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# (at your option) any later version.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This program is distributed in the hope that it will be useful,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# but WITHOUT ANY WARRANTY; without even the implied warranty of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# GNU General Public License for more details.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# You should have received a copy of the GNU General Public License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# along with this program. If not, see <http://www.gnu.org/licenses/>.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Some parser code from GLib
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Copyright (C) 2008-2011 Red Hat, Inc.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This library is free software; you can redistribute it and/or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# modify it under the terms of the GNU Lesser General Public
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# License as published by the Free Software Foundation; either
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# version 2 of the License, or (at your option) any later version.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This library is distributed in the hope that it will be useful,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# but WITHOUT ANY WARRANTY; without even the implied warranty of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Lesser General Public License for more details.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# You should have received a copy of the GNU Lesser General
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Public License along with this library; if not, write to the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Boston, MA 02111-1307, USA.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Portions by: David Zeuthen <davidz@redhat.com>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# DBus interfaces are defined here:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# http://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# The introspection data format has become the standard way to represent a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# DBus interface. For many examples see /usr/share/dbus-1/interfaces/ on a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# typical linux machine.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# A word about annotations. These are extra flags or values that can be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# assigned to anything. So far, the codegen supports this annotation:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# - An annotation specified in the specification that tells us what C symbol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# to generate for a given interface or method. By default the codegen will
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# build up a symbol name from the DBus name.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# -----------------------------------------------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Lets us print problems like a compiler would
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return "%s:%d: %s" % (self.file, self.line, message)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self.annotations.get("org.freedesktop.DBus.GLib.CSymbol", self.name)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# The basic types that we support marshalling right now. These
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# are the ones we can pass as basic arguments to libdbus directly.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# If the dbus and sssd types are identical we pass things directly.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# otherwise some copying is necessary.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 'b': ( "DBUS_TYPE_BOOLEAN", "dbus_bool_t", "bool" ),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 'q': ( "DBUS_TYPE_UINT16", "uint16_t", "uint16_t" ),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 'u': ( "DBUS_TYPE_UINT32", "uint32_t", "uint32_t" ),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 't': ( "DBUS_TYPE_UINT64", "uint64_t", "uint64_t" ),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 's': ( "DBUS_TYPE_STRING", "const char *", "const char *" ),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 'o': ( "DBUS_TYPE_OBJECT_PATH", "const char *", "const char *" ),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync type = type[1:]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (self.dbus_constant, self.dbus_type, self.sssd_type) = BASIC_TYPES[type]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # If types are not identical, we can't do array (yet)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not self.only_basic_args() and not self.use_raw_handler():
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise DBusXmlException("Method has complex arguments and requires " +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "the 'org.freedesktop.sssd.RawHandler' annotation")
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return "%s_%s" % (self.iface.c_name(), self.c_name())
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self.annotations.get(anno, self.iface.annotations.get(anno)) == 'true'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return "%s_%s" % (self.iface.c_name(), self.c_name())
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync raise DBusXmlException('Invalid access type %s'%self.access)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return "%s_%s" % (self.iface.c_name(), self.c_name())
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return "%s_get_%s" % (self.iface.c_name(), self.c_name())
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sig = "void (*%s)(struct sbus_request *, void *data, %s *" % (name, self.sssd_type)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return self.annotations.get("org.freedesktop.DBus.GLib.CSymbol",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# -----------------------------------------------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Code Generation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # NOTE: Would like to use the following syntax for this function
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # but need to wait until python3 until it is supported:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync assert not kwargs, "unknown keyword argument(s): %s" % str(kwargs)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef method_function_pointer(meth, name, with_names=False):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return "int (*%s)(struct sbus_request *%s, void *%s%s)" % \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync out("/* invokes a handler with a '%s' DBus signature */", signature)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync out("static int invoke_%s_method(struct sbus_request *dbus_req, void *function_ptr);", signature)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync out("/* invokes a handler with a '%s' DBus signature */", signature)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync out("static int invoke_%s_method(struct sbus_request *dbus_req, void *function_ptr)", signature)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync out(" int (*handler)(struct sbus_request *, void *%s) = function_ptr;", method_arg_types(args))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync out(" if (!sbus_request_parse_or_finish(dbus_req,")
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync out(" return (handler)(dbus_req, dbus_req->intf->handler_data", new_line=False)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync out(" %s", prop.getter_signature("%shandler" % prefix), new_line=False)
out(" return sbus_request_return_array_as_variant(dbus_req, %s, (uint8_t*)out_val, prop_len, sizeof(%s));", prop.dbus_constant, prop.sssd_type)
if iface.properties:
iface_types = [ p.type for p in iface.properties ]
for prop in iface.properties:
out(" (%s_handler)(dbus_req, dbus_req->intf->handler_data, &%s_prop_val", prop.type, prop.type, new_line=False)
out(" ret = sbus_add_array_as_variant_to_dict(&iter_dict, \"%s\", %s, (uint8_t*)%s_out_val, %s_prop_len, sizeof(%s));", prop.c_name(), prop.dbus_constant, prop.type, prop.type, prop.sssd_type)
out(" ret = sbus_add_variant_to_dict(&iter_dict, \"%s\", %s, &%s_out_val);", prop.c_name(), prop.dbus_constant, prop.type)
for meth in iface.methods:
return invokers
for prop in iface.properties:
return invokers
if prop.readable:
for sig in iface.signals:
if sig.args:
if sig.args:
for prop in properties:
elif prop.readable:
elif prop.writable:
if prop.readable:
if iface.methods:
if iface.signals:
if iface.properties:
if include_header:
if iface.methods:
if iface.signals:
if iface.properties:
for meth in iface.methods:
for prop in iface.properties:
for meth in iface.methods:
for sig in iface.signals:
for prop in iface.properties:
for meth in iface.methods:
self.state_stack = []
try:
if self.state == STATE_IGNORED:
elif self.cur_object and name == STATE_ANNOTATION:
elif self.state == STATE_TOP:
if name == STATE_NODE:
elif self.state == STATE_NODE:
if name == STATE_INTERFACE:
elif self.state == STATE_INTERFACE:
if name == STATE_METHOD:
elif name == STATE_SIGNAL:
elif name == STATE_PROPERTY:
elif self.state == STATE_METHOD:
elif self.state == STATE_SIGNAL:
elif self.state == STATE_PROPERTY:
elif self.state == STATE_ARG:
if options.output:
if options.output:
try: