sbus_codegen revision 4f7f714e118e95896fac5239c7a8b529c39a4758
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#!/usr/bin/python
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# Authors:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# Stef Walter <stefw@redhat.com>
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews# Copyright (C) 2014 Red Hat
fcc9f7f86c2fa2ceb8a5c16dc934fea7fa6887f2Andreas Gustafsson#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# This program is free software; you can redistribute it and/or modify
fcc9f7f86c2fa2ceb8a5c16dc934fea7fa6887f2Andreas Gustafsson# it under the terms of the GNU General Public License as published by
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# the Free Software Foundation; either version 3 of the License, or
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# (at your option) any later version.
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# This program is distributed in the hope that it will be useful,
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# but WITHOUT ANY WARRANTY; without even the implied warranty of
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# GNU General Public License for more details.
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#
fcc9f7f86c2fa2ceb8a5c16dc934fea7fa6887f2Andreas Gustafsson# You should have received a copy of the GNU General Public License
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# along with this program. If not, see <http://www.gnu.org/licenses/>.
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# Some parser code from GLib
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# Copyright (C) 2008-2011 Red Hat, Inc.
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews# This library is free software; you can redistribute it and/or
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# modify it under the terms of the GNU Lesser General Public
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# License as published by the Free Software Foundation; either
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# version 2 of the License, or (at your option) any later version.
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# This library is distributed in the hope that it will be useful,
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# but WITHOUT ANY WARRANTY; without even the implied warranty of
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# Lesser General Public License for more details.
fcc9f7f86c2fa2ceb8a5c16dc934fea7fa6887f2Andreas Gustafsson#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# You should have received a copy of the GNU Lesser General
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# Public License along with this library; if not, write to the
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# Boston, MA 02111-1307, USA.
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# Portions by: David Zeuthen <davidz@redhat.com>
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# DBus interfaces are defined here:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# http://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# The introspection data format has become the standard way to represent a
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# DBus interface. For many examples see /usr/share/dbus-1/interfaces/ on a
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# typical linux machine.
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# A word about annotations. These are extra flags or values that can be
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# assigned to anything. So far, the codegen supports this annotation:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# org.freedesktop.DBus.GLib.CSymbol
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# - An annotation specified in the specification that tells us what C symbol
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews# to generate for a given interface or method. By default the codegen will
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# build up a symbol name from the DBus name.
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce#
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luceimport optparse
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luceimport os
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luceimport re
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luceimport StringIO
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luceimport sys
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luceimport xml.parsers.expat
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# -----------------------------------------------------------------------------
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# Objects
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luceclass DBusXmlException(Exception):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce line = 0
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce file = None
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce # Lets us print problems like a compiler would
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def __str__(self):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce message = Exception.__str__(self)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if self.file and self.line:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce return "%s:%d: %s" % (self.file, self.line, message)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce elif self.file:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce return "%s: %s" % (self.file, message)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce return message
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luceclass Base:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def __init__(self, name):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if not name:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce raise DBusXmlException('No name on element')
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.name = name
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.annotations = { }
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def validate(self):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce pass
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def c_name(self):
1fa26403d7679235a30fbf6289f68fed5872df30Mark Andrews return self.annotations.get("org.freedesktop.DBus.GLib.CSymbol", self.name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# The basic types that we support marshalling right now. These
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# are the ones we can pass as basic arguments to libdbus directly.
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# If the dbus and sssd types are identical we pass things directly.
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# otherwise some copying is necessary.
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric LuceBASIC_TYPES = {
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce 'y': ( "DBUS_TYPE_BYTE", "uint8_t", "uint8_t" ),
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce 'b': ( "DBUS_TYPE_BOOLEAN", "dbus_bool_t", "bool" ),
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson 'n': ( "DBUS_TYPE_INT16", "int16_t", "int16_t" ),
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson 'q': ( "DBUS_TYPE_UINT16", "uint16_t", "uint16_t" ),
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce 'i': ( "DBUS_TYPE_INT32", "int32_t", "int32_t" ),
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce 'u': ( "DBUS_TYPE_UINT32", "uint32_t", "uint32_t" ),
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson 'x': ( "DBUS_TYPE_INT64", "int64_t", "int64_t" ),
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson 't': ( "DBUS_TYPE_UINT64", "uint64_t", "uint64_t" ),
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce 'd': ( "DBUS_TYPE_DOUBLE", "double", "double" ),
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce 's': ( "DBUS_TYPE_STRING", "const char *", "const char *" ),
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce 'o': ( "DBUS_TYPE_OBJECT_PATH", "const char *", "const char *" ),
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson}
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luceclass Typed(Base):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def __init__(self, name, type):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce Base.__init__(self, name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.type = type
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.is_basic = False
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.is_array = False
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.dbus_constant = None
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.dbus_type = None
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.sssd_type = None
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if type[0] == 'a':
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce type = type[1:]
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.is_array = True
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if type in BASIC_TYPES:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce (self.dbus_constant, self.dbus_type, self.sssd_type) = BASIC_TYPES[type]
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce # If types are not identical, we can't do array (yet)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if self.is_array:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.is_basic = (self.dbus_type == self.sssd_type)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.is_basic = True
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luceclass Arg(Typed):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def __init__(self, method, name, type):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce Typed.__init__(self, name, type)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.method = method
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luceclass Method(Base):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def __init__(self, iface, name):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce Base.__init__(self, name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.iface = iface
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.in_args = []
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.out_args = []
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def validate(self):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if not self.only_basic_args() and not self.use_raw_handler():
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce raise DBusXmlException("Method has complex arguments and requires " +
fcc9f7f86c2fa2ceb8a5c16dc934fea7fa6887f2Andreas Gustafsson "the 'org.freedesktop.sssd.RawHandler' annotation")
0707a8c04f0d350cb964ce9db07c3ed66f7442eaMark Andrews def fq_c_name(self):
fcc9f7f86c2fa2ceb8a5c16dc934fea7fa6887f2Andreas Gustafsson return "%s_%s" % (self.iface.c_name(), self.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def use_raw_handler(self):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce anno = 'org.freedesktop.sssd.RawHandler'
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce return self.annotations.get(anno, self.iface.annotations.get(anno)) == 'true'
aeb8fffc841865c3336383eadfd9987332a03286Andreas Gustafsson def in_signature(self):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce return "".join([arg.type for arg in self.in_args])
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def only_basic_args(self):
fcc9f7f86c2fa2ceb8a5c16dc934fea7fa6887f2Andreas Gustafsson for arg in self.in_args + self.out_args:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if not arg.is_basic:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce return False
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce return True
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luceclass Signal(Base):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def __init__(self, iface, name):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce Base.__init__(self, name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.iface = iface
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.args = []
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def fq_c_name(self):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce return "%s_%s" % (self.iface.c_name(), self.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luceclass Property(Typed):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def __init__(self, iface, name, type, access):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce Typed.__init__(self, name, type)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.iface = iface
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.readable = False
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.writable = False
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if access == 'readwrite':
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.readable = True
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.writable = True
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce elif access == 'read':
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.readable = True
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce elif access == 'write':
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.writable = True
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce raise DBusXmlException('Invalid access type %s'%self.access)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def fq_c_name(self):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce return "%s_%s" % (self.iface.c_name(), self.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def getter_name(self):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce return "%s_get_%s" % (self.iface.c_name(), self.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def getter_invoker_name(self):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce return "invoke_get_%s" % self.type
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def getter_signature(self, name):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce sig = "void (*%s)(struct sbus_request *, void *data, %s *" % (name, self.sssd_type)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if self.is_array:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce sig += " *, int *"
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce sig += ")"
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce return sig
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luceclass Interface(Base):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def __init__(self, name):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce Base.__init__(self, name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.methods = []
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.signals = []
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson self.properties = []
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson def c_name(self):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce return self.annotations.get("org.freedesktop.DBus.GLib.CSymbol",
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.name.replace(".", "_"))
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# -----------------------------------------------------------------------------
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce# Code Generation
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafssondef out(format, *args, **kwargs):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce str = format % args
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce sys.stdout.write(str)
c71787bd6356c92e9c7d0a174cd63ab17fcf34c6Eric Luce # NOTE: Would like to use the following syntax for this function
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce # but need to wait until python3 until it is supported:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce # def out(format, *args, new_line=True)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if kwargs.pop("new_line", True):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce sys.stdout.write("\n")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce assert not kwargs, "unknown keyword argument(s): %s" % str(kwargs)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef method_arg_types(args, with_names=False):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce str = ""
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for arg in args:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce str += ", "
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce str += arg.sssd_type
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if with_names:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if str[-1] != '*':
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce str += " "
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce str += "arg_"
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce str += arg.c_name()
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if arg.is_array:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce str += "[], int"
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if with_names:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce str += " len_"
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce str += arg.c_name()
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce return str
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
b9c96971964d87c2705c8dc29300ff8103479ee6Andreas Gustafssondef method_function_pointer(meth, name, with_names=False):
b9c96971964d87c2705c8dc29300ff8103479ee6Andreas Gustafsson if meth.use_raw_handler():
b9c96971964d87c2705c8dc29300ff8103479ee6Andreas Gustafsson return "sbus_msg_handler_fn " + name
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce return "int (*%s)(struct sbus_request *%s, void *%s%s)" % \
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce (name, with_names and "req" or "",
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce with_names and "data" or "",
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce method_arg_types(meth.in_args, with_names))
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef property_handlers(prop):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce return prop.getter_signature(prop.getter_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef forward_method_invoker(signature, args):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("/* invokes a handler with a '%s' DBus signature */", signature)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("static int invoke_%s_method(struct sbus_request *dbus_req, void *function_ptr);", signature)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef source_method_invoker(signature, args):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("/* invokes a handler with a '%s' DBus signature */", signature)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("static int invoke_%s_method(struct sbus_request *dbus_req, void *function_ptr)", signature)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("{")
38ba66e41bc93315422380d6c7ab41053963ed47Andreas Gustafsson for i in range(0, len(args)):
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson arg = args[i]
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if arg.is_array:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s *arg_%d;", arg.dbus_type, i)
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson out(" int len_%d;", i)
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s arg_%d;", arg.dbus_type, i)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" int (*handler)(struct sbus_request *, void *%s) = function_ptr;", method_arg_types(args))
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" if (!sbus_request_parse_or_finish(dbus_req,")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for i in range(0, len(args)):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce arg = args[i]
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if arg.is_array:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" DBUS_TYPE_ARRAY, %s, &arg_%d, &len_%d,",
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce arg.dbus_constant, i, i)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s, &arg_%d,", arg.dbus_constant, i)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" DBUS_TYPE_INVALID)) {")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" return EOK; /* request handled */")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" }")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" return (handler)(dbus_req, dbus_req->intf->instance_data", new_line=False)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for i in range(0, len(args)):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce arg = args[i]
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(",\n arg_%d", i, new_line=False)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if arg.is_array:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(",\n len_%d", i, new_line=False)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(");")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("}")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef source_prop_types(prop, type_prefix=False):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce prefix = "%s_" % prop.type if type_prefix else ""
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if prop.is_array:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s *%sprop_val;", prop.sssd_type, prefix)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" int %sprop_len;", prefix)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s *%sout_val;", prop.dbus_type, prefix)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s %sprop_val;", prop.sssd_type, prefix)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s %sout_val;", prop.dbus_type, prefix)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef source_prop_handler(prop, type_prefix=False):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce prefix = "%s_" % prop.type if type_prefix else ""
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s", prop.getter_signature("%shandler" % prefix), new_line=False)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(";")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef source_getter_invoker(prop):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if prop.is_array:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("/* invokes a getter with an array of '%s' DBus type */", prop.dbus_type)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("/* invokes a getter with a '%s' DBus type */", prop.dbus_type)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("static int %s(struct sbus_request *dbus_req, void *function_ptr)",
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce prop.getter_invoker_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("{")
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews source_prop_types(prop)
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews out("")
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews out(" %s", prop.getter_signature("handler"), new_line=False)
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews out(" = function_ptr;")
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews out("")
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews out(" (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val", new_line=False)
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews if prop.is_array:
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews out(", &prop_len", new_line=False)
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews out(");")
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews out("")
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews if prop.type == "s":
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews out(" out_val = prop_val == NULL ? \"\" : prop_val;")
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews elif prop.type == "o":
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews out(" out_val = prop_val == NULL ? \"/\" : prop_val;")
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews else:
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews out(" out_val = prop_val;")
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews if prop.is_array:
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews 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)
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews else:
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews out(" return sbus_request_return_as_variant(dbus_req, %s, &out_val);", prop.dbus_constant)
3970098dcd2a7122541667b4b56cea8abce8ccf2Mark Andrews out("}")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef source_getall_invoker(iface, prop_invokers):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("/* invokes GetAll for the '%s' interface */", iface.name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("static int invoke_%s_get_all(struct sbus_request *dbus_req, void *function_ptr)",
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce iface.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("{")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" DBusMessage *reply;")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" dbus_bool_t dbret;")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" DBusMessageIter iter;")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" DBusMessageIter iter_dict;")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if iface.properties:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" int ret;")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" struct sbus_interface *intf = dbus_req->intf;")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" const struct sbus_property_meta *property;")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce iface_types = [ p.type for p in iface.properties ]
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for prop in [ p for p in prop_invokers.values() if p.type in iface_types ]:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce source_prop_types(prop, type_prefix=True)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce source_prop_handler(prop, type_prefix=True)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" reply = dbus_message_new_method_return(dbus_req->message);")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" if (!reply) return ENOMEM;")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" dbus_message_iter_init_append(reply, &iter);")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" dbret = dbus_message_iter_open_container(")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" &iter, DBUS_TYPE_ARRAY,")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" DBUS_TYPE_STRING_AS_STRING")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" DBUS_TYPE_VARIANT_AS_STRING")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" DBUS_DICT_ENTRY_END_CHAR_AS_STRING,")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" &iter_dict);")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" if (!dbret) return ENOMEM;")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for prop in iface.properties:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" property = sbus_meta_find_property(intf->vtable->meta, \"%s\");", prop.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);", prop.type)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" if (%s_handler) {", prop.type)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" (%s_handler)(dbus_req, dbus_req->intf->instance_data, &%s_prop_val", prop.type, prop.type, new_line=False)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if prop.is_array:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(", &%s_prop_len", prop.type, new_line=False)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(");")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if prop.type == "s":
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s_out_val = %s_prop_val == NULL ? \"\" : %s_prop_val;",
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce prop.type, prop.type, prop.type)
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson elif prop.type == "o":
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s_out_val = %s_prop_val == NULL ? \"/\" : %s_prop_val;",
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce prop.type, prop.type, prop.type)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson out(" %s_out_val = %s_prop_val;", prop.type, prop.type)
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson if prop.is_array:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce 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)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" ret = sbus_add_variant_to_dict(&iter_dict, \"%s\", %s, &%s_out_val);", prop.c_name(), prop.dbus_constant, prop.type)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" if (ret != EOK) return ret;")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" }")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" }")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" dbret = dbus_message_iter_close_container(&iter, &iter_dict);")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" if (!dbret) return ENOMEM;")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" return sbus_request_finish(dbus_req, reply);")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("}")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef forward_method_invokers(ifaces):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce invokers = { }
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for iface in ifaces:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for meth in iface.methods:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if meth.use_raw_handler() or not meth.in_args:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce continue
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce signature = meth.in_signature()
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if signature in invokers:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce continue
ab19d688255b3a333a41b4ebe6f4213538e89c2aEric Luce forward_method_invoker(signature, meth.in_args)
ab19d688255b3a333a41b4ebe6f4213538e89c2aEric Luce invokers[signature] = meth
ab19d688255b3a333a41b4ebe6f4213538e89c2aEric Luce return invokers
ab19d688255b3a333a41b4ebe6f4213538e89c2aEric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef source_method_invokers(invokers):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for (signature, meth) in invokers.items():
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce source_method_invoker(signature, meth.in_args)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef forward_prop_invoker(prop):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("static int %s(struct sbus_request *dbus_req, void *function_ptr);",
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce prop.getter_invoker_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef forward_prop_invokers(ifaces):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce invokers = { }
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for iface in ifaces:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for prop in iface.properties:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if not prop.is_basic:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce continue
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if prop.type in invokers:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce continue
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce forward_prop_invoker(prop)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce invokers[prop.type] = prop
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce return invokers
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef source_prop_invokers(invokers):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for (type, prop) in invokers.items():
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if prop.readable:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce source_getter_invoker(prop)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef source_finisher(meth):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("int %s_finish(struct sbus_request *req%s)",
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce meth.fq_c_name(), method_arg_types(meth.out_args, with_names=True))
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("{")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for arg in meth.out_args:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if arg.dbus_type != arg.sssd_type:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s cast_%s = arg_%s;", arg.dbus_type, arg.c_name(), arg.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" return sbus_request_return_and_finish(req,")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for arg in meth.out_args:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" ", new_line=False)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if arg.is_array:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("DBUS_TYPE_ARRAY, %s, &arg_%s, len_%s,",
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce arg.dbus_constant, arg.c_name(), arg.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce elif arg.dbus_type != arg.sssd_type:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("%s, &cast_%s,", arg.dbus_constant, arg.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("%s, &arg_%s,", arg.dbus_constant, arg.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" DBUS_TYPE_INVALID);")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("}")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef header_reply(meth):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for arg in meth.out_args:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if arg.is_array:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s *%s", arg.dbus_type, arg.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" int %s__len", arg.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s %s;", arg.dbus_type, arg.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce types = [arg.sssd_type for arg in meth.in_args]
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef source_args(parent, args, suffix):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("/* arguments for %s.%s */", parent.iface.name, parent.name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("const struct sbus_arg_meta %s%s[] = {", parent.fq_c_name(), suffix)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for arg in args:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" { \"%s\", \"%s\" },", arg.name, arg.type)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" { NULL, }")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("};")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef source_methods(iface, methods):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for meth in methods:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if meth.in_args:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce source_args(meth, meth.in_args, "__in")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if meth.out_args:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce source_args(meth, meth.out_args, "__out")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if not meth.use_raw_handler():
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce source_finisher(meth)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("/* methods for %s */", iface.name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("const struct sbus_method_meta %s__methods[] = {", iface.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for meth in methods:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" {")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" \"%s\", /* name */", meth.name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if meth.in_args:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s__in,", meth.fq_c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson out(" NULL, /* no in_args */")
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson if meth.out_args:
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson out(" %s__out,", meth.fq_c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" NULL, /* no out_args */")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" offsetof(struct %s, %s),", iface.c_name(), meth.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if meth.use_raw_handler() or not meth.in_args:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" NULL, /* no invoker */")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" invoke_%s_method,", meth.in_signature())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" },")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" { NULL, }")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("};")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef source_signals(iface, signals):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for sig in iface.signals:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if sig.args:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce source_args(sig, sig.args, "__args")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("/* signals for %s */", iface.name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("const struct sbus_signal_meta %s__signals[] = {", iface.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for sig in signals:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" {")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" \"%s\", /* name */", sig.name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if sig.args:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s__args", sig.fq_c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" NULL, /* no args */")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" },")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" { NULL, }")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("};")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef source_properties(iface, properties):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("/* property info for %s */", iface.name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("const struct sbus_property_meta %s__properties[] = {", iface.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for prop in properties:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" {")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" \"%s\", /* name */", prop.name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" \"%s\", /* type */", prop.type)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if prop.readable and prop.writable:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" SBUS_PROPERTY_READABLE | SBUS_PROPERTY_WRITABLE,")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce elif prop.readable:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" SBUS_PROPERTY_READABLE,")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce elif prop.writable:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" SBUS_PROPERTY_WRITABLE,")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce assert False, "should not be reached"
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if prop.readable:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" offsetof(struct %s, %s),", iface.c_name(), prop.getter_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s,", prop.getter_invoker_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" 0, /* not readable */")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" NULL, /* no invoker */")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" 0, /* not writable */")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" NULL, /* no invoker */")
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson out(" },")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" { NULL, }")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("};")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef header_interface(iface):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("/* interface info for %s */", iface.name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("extern const struct sbus_interface_meta %s_meta;", iface.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef source_interface(iface):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("/* interface info for %s */", iface.name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("const struct sbus_interface_meta %s_meta = {", iface.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" \"%s\", /* name */", iface.name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if iface.methods:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s__methods,", iface.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" NULL, /* no methods */")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if iface.signals:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s__signals,", iface.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" NULL, /* no signals */")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if iface.properties:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s__properties,", iface.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" NULL, /* no properties */")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" invoke_%s_get_all, /* GetAll invoker */", iface.c_name())
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out("};")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef generate_source(ifaces, filename, include_header=None):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce basename = os.path.basename(filename)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("/* The following definitions are auto-generated from %s */", basename)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("#include \"util/util.h\"")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("#include \"sbus/sssd_dbus.h\"")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("#include \"sbus/sssd_dbus_meta.h\"")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if include_header:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("#include \"%s\"", os.path.basename(include_header))
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce meth_invokers = forward_method_invokers(ifaces)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce prop_invokers = forward_prop_invokers(ifaces)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for iface in ifaces:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce # The methods
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if iface.methods:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce source_methods(iface, iface.methods)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce # The signals array
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson if iface.signals:
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson source_signals(iface, iface.signals)
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson # The properties array
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson if iface.properties:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce source_properties(iface, iface.properties)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce # always generate getall, for interfaces without properties
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce # let's return an empty array
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce source_getall_invoker(iface, prop_invokers)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce # The sbus_interface structure
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce source_interface(iface)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce source_method_invokers(meth_invokers)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce source_prop_invokers(prop_invokers)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef header_finisher(iface, meth):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if meth.use_raw_handler():
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce return
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("/* finish function for %s */", meth.name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("int %s_finish(struct sbus_request *req%s);",
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce meth.fq_c_name(), method_arg_types(meth.out_args, with_names=True))
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef header_vtable(iface, methods):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("/* vtable for %s */", iface.name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("struct %s {", iface.c_name())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" struct sbus_vtable vtable; /* derive from sbus_vtable */")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce # All methods
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for meth in iface.methods:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s;", method_function_pointer(meth, meth.c_name(), with_names=True))
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for prop in iface.properties:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out(" %s;", property_handlers(prop))
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("};")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef header_constants(iface):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("/* constants for %s */", iface.name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("#define %s \"%s\"", iface.c_name().upper(), iface.name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for meth in iface.methods:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("#define %s \"%s\"", meth.fq_c_name().upper(), meth.name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for sig in iface.signals:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("#define %s \"%s\"", sig.fq_c_name().upper(), sig.name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for prop in iface.properties:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("#define %s \"%s\"", prop.fq_c_name().upper(), prop.name)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef generate_header(ifaces, filename):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce basename = os.path.basename(filename)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce guard = "__%s__" % re.sub(r'([^_A-Z0-9])', "_", basename.upper())
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("/* The following declarations are auto-generated from %s */", basename)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("#ifndef %s", guard)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("#define %s", guard)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("#include \"sbus/sssd_dbus.h\"")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce out("/* ------------------------------------------------------------------------")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" * DBus Constants")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" *")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" * Various constants of interface and method names mostly for use by clients")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" */")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson for iface in ifaces:
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson header_constants(iface)
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out("")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out("/* ------------------------------------------------------------------------")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" * DBus handlers")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" *")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" * These structures are filled in by implementors of the different")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" * dbus interfaces to handle method calls.")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" *")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" * Handler functions of type sbus_msg_handler_fn accept raw messages,")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" * other handlers are typed appropriately. If a handler that is")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" * set to NULL is invoked it will result in a")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" * org.freedesktop.DBus.Error.NotSupported error for the caller.")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" *")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" * Handlers have a matching xxx_finish() function (unless the method has")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" * accepts raw messages). These finish functions the")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" * sbus_request_return_and_finish() with the appropriate arguments to")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" * construct a valid reply. Once a finish function has been called, the")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" * @dbus_req it was called with is freed and no longer valid.")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" */")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson for iface in ifaces:
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson if iface.methods or iface.properties:
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson header_vtable(iface, iface.methods)
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson for meth in iface.methods:
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson header_finisher(iface, meth)
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out("")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out("/* ------------------------------------------------------------------------")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" * DBus Interface Metadata")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" *")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" * These structure definitions are filled in with the information about")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" * the interfaces, methods, properties and so on.")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" *")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" * The actual definitions are found in the accompanying C file next")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" * to this header.")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out(" */")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson for iface in ifaces:
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson header_interface(iface)
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out("")
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson out("#endif /* %s */", guard)
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson# -----------------------------------------------------------------------------
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson# XML Interface Parsing
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson
5f09ce124cad9712a9675f17f83ddc915e734909Andreas GustafssonSTATE_TOP = 'top'
5f09ce124cad9712a9675f17f83ddc915e734909Andreas GustafssonSTATE_NODE = 'node'
5f09ce124cad9712a9675f17f83ddc915e734909Andreas GustafssonSTATE_INTERFACE = 'interface'
5f09ce124cad9712a9675f17f83ddc915e734909Andreas GustafssonSTATE_METHOD = 'method'
5f09ce124cad9712a9675f17f83ddc915e734909Andreas GustafssonSTATE_SIGNAL = 'signal'
5f09ce124cad9712a9675f17f83ddc915e734909Andreas GustafssonSTATE_PROPERTY = 'property'
5f09ce124cad9712a9675f17f83ddc915e734909Andreas GustafssonSTATE_ARG = 'arg'
5f09ce124cad9712a9675f17f83ddc915e734909Andreas GustafssonSTATE_ANNOTATION = 'annotation'
5f09ce124cad9712a9675f17f83ddc915e734909Andreas GustafssonSTATE_IGNORED = 'ignored'
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafssondef expect_attr(attrs, name):
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson if name not in attrs:
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson raise DBusXmlException("Missing attribute '%s'" % name)
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson if attrs[name] == "":
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson raise DBusXmlException("Empty attribute '%s'" % name)
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson return attrs[name]
5f09ce124cad9712a9675f17f83ddc915e734909Andreas Gustafsson
fcc9f7f86c2fa2ceb8a5c16dc934fea7fa6887f2Andreas Gustafssonclass DBusXMLParser:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def __init__(self, filename):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce parser = xml.parsers.expat.ParserCreate()
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce parser.CommentHandler = self.handle_comment
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce parser.CharacterDataHandler = self.handle_char_data
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce parser.StartElementHandler = self.handle_start_element
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce parser.EndElementHandler = self.handle_end_element
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.parsed_interfaces = []
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.cur_object = None
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.state = STATE_TOP
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.state_stack = []
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.cur_object = None
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.cur_object_stack = []
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.arg_count = 0
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce try:
0707a8c04f0d350cb964ce9db07c3ed66f7442eaMark Andrews with open(filename, "r") as f:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce parser.ParseFile(f)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce except DBusXmlException, ex:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce ex.line = parser.CurrentLineNumber
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce ex.file = filename
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce raise
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce except xml.parsers.expat.ExpatError, ex:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce exc = DBusXmlException(str(ex))
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce exc.line = ex.lineno
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce exc.file = filename
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce raise exc
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def handle_comment(self, data):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce pass
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def handle_char_data(self, data):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce pass
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def handle_start_element(self, name, attrs):
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce old_state = self.state
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce old_cur_object = self.cur_object
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if self.state == STATE_IGNORED:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.state = STATE_IGNORED
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce elif self.cur_object and name == STATE_ANNOTATION:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce val = attrs.get('value', '')
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.cur_object.annotations[expect_attr(attrs, 'name')] = val
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.state = STATE_IGNORED
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce elif self.state == STATE_TOP:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if name == STATE_NODE:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.state = STATE_NODE
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
0707a8c04f0d350cb964ce9db07c3ed66f7442eaMark Andrews self.state = STATE_IGNORED
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce elif self.state == STATE_NODE:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if name == STATE_INTERFACE:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.state = STATE_INTERFACE
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce iface = Interface(expect_attr(attrs, 'name'))
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson self.cur_object = iface
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson self.parsed_interfaces.append(iface)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson self.state = STATE_IGNORED
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson elif self.state == STATE_INTERFACE:
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson if name == STATE_METHOD:
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson self.state = STATE_METHOD
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson method = Method(self.cur_object, expect_attr(attrs, 'name'))
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.cur_object.methods.append(method)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.cur_object = method
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.arg_count = 0
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce elif name == STATE_SIGNAL:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.state = STATE_SIGNAL
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce signal = Signal(self.cur_object, expect_attr(attrs, 'name'))
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.cur_object.signals.append(signal)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.cur_object = signal
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.arg_count = 0
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce elif name == STATE_PROPERTY:
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson self.state = STATE_PROPERTY
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce prop = Property(self.cur_object,
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce expect_attr(attrs, 'name'),
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce expect_attr(attrs, 'type'),
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson expect_attr(attrs, 'access'))
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson self.cur_object.properties.append(prop)
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson self.cur_object = prop
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.state = STATE_IGNORED
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce elif self.state == STATE_METHOD:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if name == STATE_ARG:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.state = STATE_ARG
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce arg = Arg(self.cur_object,
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce expect_attr(attrs, 'name'),
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce expect_attr(attrs, 'type'))
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce direction = attrs.get('direction', 'in')
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if direction == 'in':
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.cur_object.in_args.append(arg)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce elif direction == 'out':
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.cur_object.out_args.append(arg)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce raise DBusXmlException('Invalid direction "%s"' % direction)
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson self.cur_object = arg
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.state = STATE_IGNORED
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce elif self.state == STATE_SIGNAL:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if name == STATE_ARG:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.state = STATE_ARG
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce arg = Arg(self.cur_object,
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce expect_attr(attrs, 'name'),
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce expect_attr(attrs, 'type'))
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.cur_object.args.append(arg)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.cur_object = arg
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson self.state = STATE_IGNORED
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce elif self.state == STATE_PROPERTY:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.state = STATE_IGNORED
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce elif self.state == STATE_ARG:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.state = STATE_IGNORED
f1fd37f759991616d454ce371a2390da45141593Andreas Gustafsson
f1fd37f759991616d454ce371a2390da45141593Andreas Gustafsson else:
f1fd37f759991616d454ce371a2390da45141593Andreas Gustafsson assert False, 'Unhandled state "%s" while entering element with name "%s"' % (self.state, name)
f1fd37f759991616d454ce371a2390da45141593Andreas Gustafsson
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.state_stack.append(old_state)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.cur_object_stack.append(old_cur_object)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce def handle_end_element(self, name):
f1fd37f759991616d454ce371a2390da45141593Andreas Gustafsson if self.cur_object:
f1fd37f759991616d454ce371a2390da45141593Andreas Gustafsson self.cur_object.validate()
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.state = self.state_stack.pop()
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce self.cur_object = self.cur_object_stack.pop()
0a792c72e6b4aefed6fb9dcbf004f1100fe9dfe7Andreas Gustafsson
0a792c72e6b4aefed6fb9dcbf004f1100fe9dfe7Andreas Gustafssondef parse_options():
0a792c72e6b4aefed6fb9dcbf004f1100fe9dfe7Andreas Gustafsson parser = optparse.OptionParser("usage: %prog [options] introspect.xml ...")
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson parser.set_description("sbus_codegen generates sbus interface structures \
0a792c72e6b4aefed6fb9dcbf004f1100fe9dfe7Andreas Gustafsson from standard XML Introspect data.")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce parser.add_option("--mode",
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce dest="mode", default="header",
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce help="'header' or 'source' (default: header)",
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce metavar="MODE")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce parser.add_option("--output",
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce dest="output", default=None,
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce help="Set output file name (default: stdout)",
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce metavar="FILE")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce parser.add_option("--include",
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce dest="include", default=None,
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce help="name of a header to #include",
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce metavar="HEADER")
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce (options, args) = parser.parse_args()
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if not args:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce print >> sys.stderr, "sbus_codegen: no input file specified"
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson sys.exit(2)
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if options.mode not in ["header", "source"]:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce print >> sys.stderr, "sbus_codegen: specify --mode=header or --mode=source"
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce return options, args
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Lucedef main():
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce options, args = parse_options()
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if options.output:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce sys.stdout = buf = StringIO.StringIO()
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce for filename in args:
0707a8c04f0d350cb964ce9db07c3ed66f7442eaMark Andrews parser = DBusXMLParser(filename)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if options.mode == "header":
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce generate_header(parser.parsed_interfaces, filename)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce elif options.mode == "source":
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce generate_source(parser.parsed_interfaces, filename, options.include)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce else:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce assert False, "should not be reached"
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce # Write output at end to be nice to 'make'
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce if options.output:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce output = open(options.output, "w")
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson output.write(buf.getvalue())
727f5b8846457a33d06f515a10a7e1aa849ddf18Andreas Gustafsson output.close()
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luceif __name__ == "__main__":
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce try:
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce main()
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce except DBusXmlException, ex:
0707a8c04f0d350cb964ce9db07c3ed66f7442eaMark Andrews print >> sys.stderr, str(ex)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce sys.exit(1)
f293a69bcd1c1dd7bdac8f4102fc2398b9e475c8Eric Luce