sbus_codegen revision 4f7f714e118e95896fac5239c7a8b529c39a4758
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder#!/usr/bin/python
c63ebf815c8a874525cf18670ad74847f7fc7b26Christian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder#
25cc5fbba63f84b47e389af749f55abbbde71c8cChristian Maeder# Authors:
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder# Stef Walter <stefw@redhat.com>
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder#
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder# Copyright (C) 2014 Red Hat
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder#
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder# This program is free software; you can redistribute it and/or modify
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder# it under the terms of the GNU General Public License as published by
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder# the Free Software Foundation; either version 3 of the License, or
f4a2a20e49f41b2afa657e5e64d9e349c7faa091Christian Maeder# (at your option) any later version.
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian Maeder#
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder# This program is distributed in the hope that it will be useful,
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder# but WITHOUT ANY WARRANTY; without even the implied warranty of
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
68d10d143f29fcff3c637ba24f90e983995ceae6Christian Maeder# GNU General Public License for more details.
a53841f6d6e86ac751c12a33dc8aadf53f59d977Klaus Luettich#
a53841f6d6e86ac751c12a33dc8aadf53f59d977Klaus Luettich# You should have received a copy of the GNU General Public License
a53841f6d6e86ac751c12a33dc8aadf53f59d977Klaus Luettich# along with this program. If not, see <http://www.gnu.org/licenses/>.
a53841f6d6e86ac751c12a33dc8aadf53f59d977Klaus Luettich#
a737caf82de97c1907027c03e4b4509eb492b4b8Christian Maeder
68d10d143f29fcff3c637ba24f90e983995ceae6Christian Maeder#
96646aed2ae087b942ae23f15bbe729a8f7c43d3Christian Maeder# Some parser code from GLib
01e383014b555bbcf639c0ca60c5810b3eff83c0Christian Maeder#
3b06e23643a9f65390cb8c1caabe83fa7e87a708Till Mossakowski# Copyright (C) 2008-2011 Red Hat, Inc.
df29370ae8d8b41587957f6bcdcb43a3f1927e47Christian Maeder#
f04e8f3ff56405901be968fd4c6e9769239f1a9bKlaus Luettich# This library is free software; you can redistribute it and/or
ce8b15da31cd181b7e90593cbbca98f47eda29d6Till Mossakowski# modify it under the terms of the GNU Lesser General Public
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder# License as published by the Free Software Foundation; either
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder# version 2 of the License, or (at your option) any later version.
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder#
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder# This library is distributed in the hope that it will be useful,
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder# but WITHOUT ANY WARRANTY; without even the implied warranty of
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2e2094a642e3775b0d76b890556407941d3a53b6Christian Maeder# Lesser General Public License for more details.
2e2094a642e3775b0d76b890556407941d3a53b6Christian Maeder#
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder# You should have received a copy of the GNU Lesser General
e8db9a65830cf71504e33c6f441a67b4d184a3caChristian Maeder# Public License along with this library; if not, write to the
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
8410667510a76409aca9bb24ff0eda0420088274Christian Maeder# Boston, MA 02111-1307, USA.
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder#
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder# Portions by: David Zeuthen <davidz@redhat.com>
8410667510a76409aca9bb24ff0eda0420088274Christian Maeder#
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettich
b1f59a4ea7c96f4c03a4d7cfcb9c5e66871cfbbbChristian Maeder#
ad270004874ce1d0697fb30d7309f180553bb315Christian Maeder# DBus interfaces are defined here:
4d56f2fa72e4aec20eb827c11ed49c8cbb7014bdChristian Maeder#
4cb215739e9ab13447fa21162482ebe485b47455Christian Maeder# http://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format
8ef75f1cc0437656bf622cec5ac9e8ea221da8f2Christian Maeder#
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettich# The introspection data format has become the standard way to represent a
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder# DBus interface. For many examples see /usr/share/dbus-1/interfaces/ on a
356fa49fe3e6a8398f92d13e9f920d0f093697ecChristian Maeder# typical linux machine.
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder#
55adfe57a4de1f36adc3e3bfc16f342e44a7d444Christian Maeder# A word about annotations. These are extra flags or values that can be
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder# assigned to anything. So far, the codegen supports this annotation:
8d97ef4f234681b11bb5924bd4d03adef858d2d2Christian Maeder#
f4a2a20e49f41b2afa657e5e64d9e349c7faa091Christian Maeder# org.freedesktop.DBus.GLib.CSymbol
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder# - An annotation specified in the specification that tells us what C symbol
e593b89bfd4952698dc37feced21cefe869d87a2Christian Maeder# to generate for a given interface or method. By default the codegen will
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder# build up a symbol name from the DBus name.
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder#
7cc09dd93962a2155c34d209d1d4cd7d7b838264Christian Maeder
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maederimport optparse
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maederimport os
f041c9a6bda23de33a38490e35b831ae18d96b45Christian Maederimport re
7cc09dd93962a2155c34d209d1d4cd7d7b838264Christian Maederimport StringIO
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maederimport sys
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maederimport xml.parsers.expat
c3053d57f642ca507cdf79512e604437c4546cb9Christian Maeder
dcbd32289a7bdf1e6edd06c6ab0698c6a9dbf37aChristian Maeder# -----------------------------------------------------------------------------
f4a2a20e49f41b2afa657e5e64d9e349c7faa091Christian Maeder# Objects
f4a2a20e49f41b2afa657e5e64d9e349c7faa091Christian Maeder
dcbd32289a7bdf1e6edd06c6ab0698c6a9dbf37aChristian Maederclass DBusXmlException(Exception):
b886e9e5db2098d0112cc4f70aeba232962939ddChristian Maeder line = 0
c2fcc35abb03cf0b4ca4b050efeb10827f38c322Christian Maeder file = None
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder
356fa49fe3e6a8398f92d13e9f920d0f093697ecChristian Maeder # Lets us print problems like a compiler would
356fa49fe3e6a8398f92d13e9f920d0f093697ecChristian Maeder def __str__(self):
4ed0007ac9caea5b468f202521352d153481423cChristian Maeder message = Exception.__str__(self)
356fa49fe3e6a8398f92d13e9f920d0f093697ecChristian Maeder if self.file and self.line:
356fa49fe3e6a8398f92d13e9f920d0f093697ecChristian Maeder return "%s:%d: %s" % (self.file, self.line, message)
0206ab93ef846e4e0885996d052b9b73b9dc66b0Christian Maeder elif self.file:
f13d1e86e58da53680e78043e8df182eed867efbChristian Maeder return "%s: %s" % (self.file, message)
c2a4d8ae266aa37cc922eba97077520229a19902Christian Maeder else:
79e80c4b3f0ebb337d84415a50f29ccfc793e68bChristian Maeder return message
79e80c4b3f0ebb337d84415a50f29ccfc793e68bChristian Maeder
79e80c4b3f0ebb337d84415a50f29ccfc793e68bChristian Maederclass Base:
79e80c4b3f0ebb337d84415a50f29ccfc793e68bChristian Maeder def __init__(self, name):
757e6c79ec40491d45dc72c82b5eb59a386634b0Jian Chun Wang if not name:
ecf76bc89d9a2ecd7ac7310d30654b9a79d97d62Klaus Luettich raise DBusXmlException('No name on element')
ecf76bc89d9a2ecd7ac7310d30654b9a79d97d62Klaus Luettich self.name = name
ecf76bc89d9a2ecd7ac7310d30654b9a79d97d62Klaus Luettich self.annotations = { }
36f63902db2b3463faa9f59912ad106e2d5aaa24Klaus Luettich def validate(self):
36f63902db2b3463faa9f59912ad106e2d5aaa24Klaus Luettich pass
f04e8f3ff56405901be968fd4c6e9769239f1a9bKlaus Luettich def c_name(self):
5ad5dffe06818a13e1632b1119fbca7881085fc1Dominik Luecke return self.annotations.get("org.freedesktop.DBus.GLib.CSymbol", self.name)
8cacad2a09782249243b80985f28e9387019fe40Christian Maeder
363939beade943a02b31004cea09dec34fa8a6d9Christian Maeder# The basic types that we support marshalling right now. These
a7c27282e71cf4505026645f96d4f5cb8a284e32Christian Maeder# are the ones we can pass as basic arguments to libdbus directly.
363939beade943a02b31004cea09dec34fa8a6d9Christian Maeder# If the dbus and sssd types are identical we pass things directly.
8a28707e9155465c6f2236a06eac6580a65c7025Christian Maeder# otherwise some copying is necessary.
f04e8f3ff56405901be968fd4c6e9769239f1a9bKlaus LuettichBASIC_TYPES = {
ea0dd71829400e24c3d8a7b7440cd6b42c34a3b8Christian Maeder 'y': ( "DBUS_TYPE_BYTE", "uint8_t", "uint8_t" ),
431d34c7007a787331c4e5ec997badb0f8190fc7Christian Maeder 'b': ( "DBUS_TYPE_BOOLEAN", "dbus_bool_t", "bool" ),
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder 'n': ( "DBUS_TYPE_INT16", "int16_t", "int16_t" ),
d3ae0072823e2ef0d41d4431fcc768e66489c20eChristian Maeder 'q': ( "DBUS_TYPE_UINT16", "uint16_t", "uint16_t" ),
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder 'i': ( "DBUS_TYPE_INT32", "int32_t", "int32_t" ),
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder 'u': ( "DBUS_TYPE_UINT32", "uint32_t", "uint32_t" ),
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder 'x': ( "DBUS_TYPE_INT64", "int64_t", "int64_t" ),
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder 't': ( "DBUS_TYPE_UINT64", "uint64_t", "uint64_t" ),
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder 'd': ( "DBUS_TYPE_DOUBLE", "double", "double" ),
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder 's': ( "DBUS_TYPE_STRING", "const char *", "const char *" ),
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder 'o': ( "DBUS_TYPE_OBJECT_PATH", "const char *", "const char *" ),
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder}
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maederclass Typed(Base):
b886e9e5db2098d0112cc4f70aeba232962939ddChristian Maeder def __init__(self, name, type):
f04e8f3ff56405901be968fd4c6e9769239f1a9bKlaus Luettich Base.__init__(self, name)
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder self.type = type
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder self.is_basic = False
f1541d4a151dbd08002dbd14e7eb1d5dde253689Christian Maeder self.is_array = False
776a1a086df734581431e6edb4343ed4c8d34d55Christian Maeder self.dbus_constant = None
f1541d4a151dbd08002dbd14e7eb1d5dde253689Christian Maeder self.dbus_type = None
6dc9bc98d0854fe2e3dd3bfc4275096a0c28ee1cChristian Maeder self.sssd_type = None
6dc9bc98d0854fe2e3dd3bfc4275096a0c28ee1cChristian Maeder if type[0] == 'a':
6dc9bc98d0854fe2e3dd3bfc4275096a0c28ee1cChristian Maeder type = type[1:]
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder self.is_array = True
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder if type in BASIC_TYPES:
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder (self.dbus_constant, self.dbus_type, self.sssd_type) = BASIC_TYPES[type]
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder # If types are not identical, we can't do array (yet)
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder if self.is_array:
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder self.is_basic = (self.dbus_type == self.sssd_type)
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder else:
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder self.is_basic = True
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maederclass Arg(Typed):
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder def __init__(self, method, name, type):
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder Typed.__init__(self, name, type)
03a6d8f77f588dc5d3dd6653797fa2362efa1751Christian Maeder self.method = method
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maederclass Method(Base):
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder def __init__(self, iface, name):
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder Base.__init__(self, name)
a5e5b8c3e5c11177e5034ef2423813a5d28979edChristian Maeder self.iface = iface
bc8cbf12aa172bf5673b92a9e7a0151d4aa4c315Christian Maeder self.in_args = []
2d130d212db7208777ca896a7ecad619a8944971Christian Maeder self.out_args = []
2d130d212db7208777ca896a7ecad619a8944971Christian Maeder def validate(self):
a5e5b8c3e5c11177e5034ef2423813a5d28979edChristian Maeder if not self.only_basic_args() and not self.use_raw_handler():
a5e5b8c3e5c11177e5034ef2423813a5d28979edChristian Maeder raise DBusXmlException("Method has complex arguments and requires " +
2d130d212db7208777ca896a7ecad619a8944971Christian Maeder "the 'org.freedesktop.sssd.RawHandler' annotation")
bc8cbf12aa172bf5673b92a9e7a0151d4aa4c315Christian Maeder def fq_c_name(self):
2d130d212db7208777ca896a7ecad619a8944971Christian Maeder return "%s_%s" % (self.iface.c_name(), self.c_name())
f4a2a20e49f41b2afa657e5e64d9e349c7faa091Christian Maeder def use_raw_handler(self):
2d130d212db7208777ca896a7ecad619a8944971Christian Maeder anno = 'org.freedesktop.sssd.RawHandler'
2d130d212db7208777ca896a7ecad619a8944971Christian Maeder return self.annotations.get(anno, self.iface.annotations.get(anno)) == 'true'
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder def in_signature(self):
6ff7a91875597d6e4dfaa68c79187d01473e8341Christian Maeder return "".join([arg.type for arg in self.in_args])
6ff7a91875597d6e4dfaa68c79187d01473e8341Christian Maeder def only_basic_args(self):
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder for arg in self.in_args + self.out_args:
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder if not arg.is_basic:
4017ebc0f692820736d796af3110c3b3018c108aChristian Maeder return False
a9b59eb2ce961014974276cdae0e9df4419bd212Christian Maeder return True
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maederclass Signal(Base):
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder def __init__(self, iface, name):
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder Base.__init__(self, name)
88318aafc287e92931dceffbb943d58a9310001dChristian Maeder self.iface = iface
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder self.args = []
a3c6d8e0670bf2aa71bc8e2a3b1f45d56dd65e4cChristian Maeder def fq_c_name(self):
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder return "%s_%s" % (self.iface.c_name(), self.c_name())
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederclass Property(Typed):
363939beade943a02b31004cea09dec34fa8a6d9Christian Maeder def __init__(self, iface, name, type, access):
363939beade943a02b31004cea09dec34fa8a6d9Christian Maeder Typed.__init__(self, name, type)
363939beade943a02b31004cea09dec34fa8a6d9Christian Maeder self.iface = iface
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder self.readable = False
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder self.writable = False
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder if access == 'readwrite':
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder self.readable = True
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder self.writable = True
4017ebc0f692820736d796af3110c3b3018c108aChristian Maeder elif access == 'read':
b568982efd0997d877286faa592d81b03c8c67b8Christian Maeder self.readable = True
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder elif access == 'write':
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich self.writable = True
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder else:
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder raise DBusXmlException('Invalid access type %s'%self.access)
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder def fq_c_name(self):
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder return "%s_%s" % (self.iface.c_name(), self.c_name())
f2f9df2e17e70674f0bf426ed1763c973ee4cde0Christian Maeder def getter_name(self):
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maeder return "%s_get_%s" % (self.iface.c_name(), self.c_name())
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maeder def getter_invoker_name(self):
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maeder return "invoke_get_%s" % self.type
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maeder def getter_signature(self, name):
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maeder sig = "void (*%s)(struct sbus_request *, void *data, %s *" % (name, self.sssd_type)
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder if self.is_array:
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder sig += " *, int *"
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder sig += ")"
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder return sig
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maederclass Interface(Base):
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder def __init__(self, name):
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder Base.__init__(self, name)
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder self.methods = []
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder self.signals = []
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder self.properties = []
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder def c_name(self):
f1541d4a151dbd08002dbd14e7eb1d5dde253689Christian Maeder return self.annotations.get("org.freedesktop.DBus.GLib.CSymbol",
6dc9bc98d0854fe2e3dd3bfc4275096a0c28ee1cChristian Maeder self.name.replace(".", "_"))
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maeder
89f7631cbfbd1bb99fc152b434bd362a7799d295Christian Maeder# -----------------------------------------------------------------------------
363939beade943a02b31004cea09dec34fa8a6d9Christian Maeder# Code Generation
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder
f1541d4a151dbd08002dbd14e7eb1d5dde253689Christian Maederdef out(format, *args, **kwargs):
363939beade943a02b31004cea09dec34fa8a6d9Christian Maeder str = format % args
363939beade943a02b31004cea09dec34fa8a6d9Christian Maeder sys.stdout.write(str)
f4505a64a089693012a3f5c3b1f12a82cd7a2a5aKlaus Luettich # NOTE: Would like to use the following syntax for this function
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder # but need to wait until python3 until it is supported:
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder # def out(format, *args, new_line=True)
f4505a64a089693012a3f5c3b1f12a82cd7a2a5aKlaus Luettich if kwargs.pop("new_line", True):
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder sys.stdout.write("\n")
4ed0007ac9caea5b468f202521352d153481423cChristian Maeder assert not kwargs, "unknown keyword argument(s): %s" % str(kwargs)
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
2c619a4dfdc1df27573eba98e81ed1ace906941dChristian Maederdef method_arg_types(args, with_names=False):
b886e9e5db2098d0112cc4f70aeba232962939ddChristian Maeder str = ""
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder for arg in args:
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder str += ", "
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder str += arg.sssd_type
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder if with_names:
42b12fba6830ada5057949f825fc27edf5574e5fChristian Maeder if str[-1] != '*':
42b12fba6830ada5057949f825fc27edf5574e5fChristian Maeder str += " "
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder str += "arg_"
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder str += arg.c_name()
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder if arg.is_array:
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder str += "[], int"
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder if with_names:
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder str += " len_"
9df11f85fd7f8c4745d64464876e84ec4e263692Christian Maeder str += arg.c_name()
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers return str
6770ec11184086a81daddba75e0cd1f45a2eff96Christian Maeder
fb328c4f646dd3dd78a9391c5cb58450a3dd0aa9Klaus Luettichdef method_function_pointer(meth, name, with_names=False):
3b06e23643a9f65390cb8c1caabe83fa7e87a708Till Mossakowski if meth.use_raw_handler():
cf04ba46b9eb495d334466e24e082e391055ca7bDominik Luecke return "sbus_msg_handler_fn " + name
5b818f10e11fc79def1fdd5c8a080d64a6438d87Christian Maeder else:
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers return "int (*%s)(struct sbus_request *%s, void *%s%s)" % \
819e29dba060687cf391e444e0f6ff88c1908cc3Christian Maeder (name, with_names and "req" or "",
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder with_names and "data" or "",
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder method_arg_types(meth.in_args, with_names))
383aa66e5142365fe9b1f88b18c1da5b27cc8c04Christian Maeder
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckersdef property_handlers(prop):
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder return prop.getter_signature(prop.getter_name())
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maederdef forward_method_invoker(signature, args):
383aa66e5142365fe9b1f88b18c1da5b27cc8c04Christian Maeder out("")
383aa66e5142365fe9b1f88b18c1da5b27cc8c04Christian Maeder out("/* invokes a handler with a '%s' DBus signature */", signature)
383aa66e5142365fe9b1f88b18c1da5b27cc8c04Christian Maeder out("static int invoke_%s_method(struct sbus_request *dbus_req, void *function_ptr);", signature)
383aa66e5142365fe9b1f88b18c1da5b27cc8c04Christian Maeder
383aa66e5142365fe9b1f88b18c1da5b27cc8c04Christian Maederdef source_method_invoker(signature, args):
383aa66e5142365fe9b1f88b18c1da5b27cc8c04Christian Maeder out("")
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder out("/* invokes a handler with a '%s' DBus signature */", signature)
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder out("static int invoke_%s_method(struct sbus_request *dbus_req, void *function_ptr)", signature)
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder out("{")
819e29dba060687cf391e444e0f6ff88c1908cc3Christian Maeder for i in range(0, len(args)):
819e29dba060687cf391e444e0f6ff88c1908cc3Christian Maeder arg = args[i]
819e29dba060687cf391e444e0f6ff88c1908cc3Christian Maeder if arg.is_array:
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder out(" %s *arg_%d;", arg.dbus_type, i)
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder out(" int len_%d;", i)
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder else:
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder out(" %s arg_%d;", arg.dbus_type, i)
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder out(" int (*handler)(struct sbus_request *, void *%s) = function_ptr;", method_arg_types(args))
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder out("")
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder out(" if (!sbus_request_parse_or_finish(dbus_req,")
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder for i in range(0, len(args)):
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder arg = args[i]
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder if arg.is_array:
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder out(" DBUS_TYPE_ARRAY, %s, &arg_%d, &len_%d,",
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder arg.dbus_constant, i, i)
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder else:
ac34194a668399bb8ef238da77c3a09e93fb253bChristian Maeder out(" %s, &arg_%d,", arg.dbus_constant, i)
ac34194a668399bb8ef238da77c3a09e93fb253bChristian Maeder out(" DBUS_TYPE_INVALID)) {")
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder out(" return EOK; /* request handled */")
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder out(" }")
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder out("")
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder
4561227a776bdf0ab679b19fb92f1eaaed8786f7Christian Maeder out(" return (handler)(dbus_req, dbus_req->intf->instance_data", new_line=False)
6fe9628743562678acf97d6730ebcfee5e9e50c2Christian Maeder for i in range(0, len(args)):
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder arg = args[i]
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder out(",\n arg_%d", i, new_line=False)
5ad5dffe06818a13e1632b1119fbca7881085fc1Dominik Luecke if arg.is_array:
1b5b696aa3bc2a6747a4eeac777f850788482c98Dominik Luecke out(",\n len_%d", i, new_line=False)
1b5b696aa3bc2a6747a4eeac777f850788482c98Dominik Luecke out(");")
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder out("}")
3b06e23643a9f65390cb8c1caabe83fa7e87a708Till Mossakowski
b1f59a4ea7c96f4c03a4d7cfcb9c5e66871cfbbbChristian Maederdef source_prop_types(prop, type_prefix=False):
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder prefix = "%s_" % prop.type if type_prefix else ""
0b349288edfa50fdf38fda1a14e1562d03f92574Christian Maeder if prop.is_array:
0b349288edfa50fdf38fda1a14e1562d03f92574Christian Maeder out(" %s *%sprop_val;", prop.sssd_type, prefix)
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder out(" int %sprop_len;", prefix)
fb328c4f646dd3dd78a9391c5cb58450a3dd0aa9Klaus Luettich out(" %s *%sout_val;", prop.dbus_type, prefix)
fb328c4f646dd3dd78a9391c5cb58450a3dd0aa9Klaus Luettich else:
f04e8f3ff56405901be968fd4c6e9769239f1a9bKlaus Luettich out(" %s %sprop_val;", prop.sssd_type, prefix)
e96a0bf4040fd789339958c01f145c5057d26db6René Wagner out(" %s %sout_val;", prop.dbus_type, prefix)
abf2487c3aece95c371ea89ac64319370dcb6483Klaus Luettich
abf2487c3aece95c371ea89ac64319370dcb6483Klaus Luettichdef source_prop_handler(prop, type_prefix=False):
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder prefix = "%s_" % prop.type if type_prefix else ""
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder out(" %s", prop.getter_signature("%shandler" % prefix), new_line=False)
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder out(";")
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maederdef source_getter_invoker(prop):
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder out("")
b9b960bc75e34658e70c4a0231dbc6a6e7373f2dChristian Maeder if prop.is_array:
18a4d5cb6828f080db9c5f9551785c5151027271Christian Maeder out("/* invokes a getter with an array of '%s' DBus type */", prop.dbus_type)
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich else:
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder out("/* invokes a getter with a '%s' DBus type */", prop.dbus_type)
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder out("static int %s(struct sbus_request *dbus_req, void *function_ptr)",
fdb2d618144159395f7bf8ce3327b3c112a17dd3Till Mossakowski prop.getter_invoker_name())
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder out("{")
383aa66e5142365fe9b1f88b18c1da5b27cc8c04Christian Maeder
3b06e23643a9f65390cb8c1caabe83fa7e87a708Till Mossakowski source_prop_types(prop)
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder out("")
f4a2a20e49f41b2afa657e5e64d9e349c7faa091Christian Maeder out(" %s", prop.getter_signature("handler"), new_line=False)
d8bebe0559abdfcd912ac68cf0948fe601249a66Christian Maeder out(" = function_ptr;")
edd1b7f4720bc2eea51fa0685417e1e4f3be4915Klaus Luettich out("")
9a5fda85e9eaf0e6a18d0dd2b8535805c5135e9aDominik Luecke
63e50b4c36074d5fb9de872c4007b688b4bce534Christian Maeder out(" (handler)(dbus_req, dbus_req->intf->instance_data, &prop_val", new_line=False)
bd54a9917cd87169b8e40bcc5616c537fed85815Christian Maeder if prop.is_array:
be218d4b48c5447b7b08c1e323e048a0cfae2d6eHendrik Iben out(", &prop_len", new_line=False)
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder out(");")
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder out("")
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder if prop.type == "s":
6a79849bed67264c396dddb3e9c184bdfc1a1bc9Christian Maeder out(" out_val = prop_val == NULL ? \"\" : prop_val;")
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder elif prop.type == "o":
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder out(" out_val = prop_val == NULL ? \"/\" : prop_val;")
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder else:
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder out(" out_val = prop_val;")
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder if prop.is_array:
6bf24e5eb644064ad650eb3fd9774483fccbf601Christian Maeder 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)
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder else:
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder out(" return sbus_request_return_as_variant(dbus_req, %s, &out_val);", prop.dbus_constant)
f04e8f3ff56405901be968fd4c6e9769239f1a9bKlaus Luettich out("}")
e8db9a65830cf71504e33c6f441a67b4d184a3caChristian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maederdef source_getall_invoker(iface, prop_invokers):
1f8a7f8343f7df719768d2b1d7e3077ee291a1caChristian Maeder out("")
1f8a7f8343f7df719768d2b1d7e3077ee291a1caChristian Maeder out("/* invokes GetAll for the '%s' interface */", iface.name)
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder out("static int invoke_%s_get_all(struct sbus_request *dbus_req, void *function_ptr)",
6bf24e5eb644064ad650eb3fd9774483fccbf601Christian Maeder iface.c_name())
dbe752ee940baae7f9f231f29c62284bb0f90a25Christian Maeder out("{")
53818ced114da21321063fff307aa41c1ab31dd3Achim Mahnke out(" DBusMessage *reply;")
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder out(" dbus_bool_t dbret;")
53818ced114da21321063fff307aa41c1ab31dd3Achim Mahnke out(" DBusMessageIter iter;")
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder out(" DBusMessageIter iter_dict;")
53818ced114da21321063fff307aa41c1ab31dd3Achim Mahnke if iface.properties:
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder out(" int ret;")
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder out(" struct sbus_interface *intf = dbus_req->intf;")
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder out(" const struct sbus_property_meta *property;")
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder iface_types = [ p.type for p in iface.properties ]
27785f379d6810811b4e6d23feab18845fde9a98Christian Maeder for prop in [ p for p in prop_invokers.values() if p.type in iface_types ]:
f443a57f2a8e0ca3daa7431b0c89a18ba52c337aChristian Maeder source_prop_types(prop, type_prefix=True)
363939beade943a02b31004cea09dec34fa8a6d9Christian Maeder source_prop_handler(prop, type_prefix=True)
0b349288edfa50fdf38fda1a14e1562d03f92574Christian Maeder out("")
a5e5b8c3e5c11177e5034ef2423813a5d28979edChristian Maeder
857992065be4ed40a72c6296b6c0aec62ab4c5b9Christian Maeder out(" reply = dbus_message_new_method_return(dbus_req->message);")
fdb2d618144159395f7bf8ce3327b3c112a17dd3Till Mossakowski out(" if (!reply) return ENOMEM;")
7c99e334446bb97120e30e967baeeddfdd1278deKlaus Luettich out(" dbus_message_iter_init_append(reply, &iter);")
dcbd32289a7bdf1e6edd06c6ab0698c6a9dbf37aChristian Maeder out(" dbret = dbus_message_iter_open_container(")
dcbd32289a7bdf1e6edd06c6ab0698c6a9dbf37aChristian Maeder out(" &iter, DBUS_TYPE_ARRAY,")
dcbd32289a7bdf1e6edd06c6ab0698c6a9dbf37aChristian Maeder out(" DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING")
f4a2a20e49f41b2afa657e5e64d9e349c7faa091Christian Maeder out(" DBUS_TYPE_STRING_AS_STRING")
f4a2a20e49f41b2afa657e5e64d9e349c7faa091Christian Maeder out(" DBUS_TYPE_VARIANT_AS_STRING")
f041c9a6bda23de33a38490e35b831ae18d96b45Christian Maeder out(" DBUS_DICT_ENTRY_END_CHAR_AS_STRING,")
dcbd32289a7bdf1e6edd06c6ab0698c6a9dbf37aChristian Maeder out(" &iter_dict);")
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder out(" if (!dbret) return ENOMEM;")
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder out("")
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder for prop in iface.properties:
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder out(" property = sbus_meta_find_property(intf->vtable->meta, \"%s\");", prop.c_name())
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder out(" if (property != NULL && property->flags & SBUS_PROPERTY_READABLE) {")
dcbd32289a7bdf1e6edd06c6ab0698c6a9dbf37aChristian Maeder out(" %s_handler = VTABLE_FUNC(intf->vtable, property->vtable_offset_get);", prop.type)
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder out(" if (%s_handler) {", prop.type)
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder out(" (%s_handler)(dbus_req, dbus_req->intf->instance_data, &%s_prop_val", prop.type, prop.type, new_line=False)
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder if prop.is_array:
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder out(", &%s_prop_len", prop.type, new_line=False)
dcbd32289a7bdf1e6edd06c6ab0698c6a9dbf37aChristian Maeder out(");")
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder if prop.type == "s":
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder out(" %s_out_val = %s_prop_val == NULL ? \"\" : %s_prop_val;",
215d42ce4d6397a453d5887292bc786e8fa9c1a2Christian Maeder prop.type, prop.type, prop.type)
215d42ce4d6397a453d5887292bc786e8fa9c1a2Christian Maeder elif prop.type == "o":
215d42ce4d6397a453d5887292bc786e8fa9c1a2Christian Maeder out(" %s_out_val = %s_prop_val == NULL ? \"/\" : %s_prop_val;",
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder prop.type, prop.type, prop.type)
f4a2a20e49f41b2afa657e5e64d9e349c7faa091Christian Maeder else:
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder out(" %s_out_val = %s_prop_val;", prop.type, prop.type)
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder if prop.is_array:
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder 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)
215d42ce4d6397a453d5887292bc786e8fa9c1a2Christian Maeder else:
215d42ce4d6397a453d5887292bc786e8fa9c1a2Christian Maeder out(" ret = sbus_add_variant_to_dict(&iter_dict, \"%s\", %s, &%s_out_val);", prop.c_name(), prop.dbus_constant, prop.type)
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder out(" if (ret != EOK) return ret;")
f4a2a20e49f41b2afa657e5e64d9e349c7faa091Christian Maeder out(" }")
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder out(" }")
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder out("")
215d42ce4d6397a453d5887292bc786e8fa9c1a2Christian Maeder
215d42ce4d6397a453d5887292bc786e8fa9c1a2Christian Maeder out(" dbret = dbus_message_iter_close_container(&iter, &iter_dict);")
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder out(" if (!dbret) return ENOMEM;")
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder out("")
f4a2a20e49f41b2afa657e5e64d9e349c7faa091Christian Maeder
27785f379d6810811b4e6d23feab18845fde9a98Christian Maeder out(" return sbus_request_finish(dbus_req, reply);")
27785f379d6810811b4e6d23feab18845fde9a98Christian Maeder out("}")
b886e9e5db2098d0112cc4f70aeba232962939ddChristian Maeder
27785f379d6810811b4e6d23feab18845fde9a98Christian Maederdef forward_method_invokers(ifaces):
2d130d212db7208777ca896a7ecad619a8944971Christian Maeder invokers = { }
2d130d212db7208777ca896a7ecad619a8944971Christian Maeder for iface in ifaces:
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder for meth in iface.methods:
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder if meth.use_raw_handler() or not meth.in_args:
33d042fe6a9eb27a4c48f840b80838f3e7d98e34Christian Maeder continue
83394c6b6e6de128e71b67c9251ed7a84485d082Christian Maeder signature = meth.in_signature()
fa21fba9ceb1ddf7b3efd54731a12ed8750191d8Christian Maeder if signature in invokers:
fa21fba9ceb1ddf7b3efd54731a12ed8750191d8Christian Maeder continue
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder forward_method_invoker(signature, meth.in_args)
0c355dd0b739631ee472f9a656e266be27fa4e64Christian Maeder invokers[signature] = meth
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder return invokers
fa21fba9ceb1ddf7b3efd54731a12ed8750191d8Christian Maeder
b49276c9f50038e0bd499ad49f7bd6444566a834Christian Maederdef source_method_invokers(invokers):
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder for (signature, meth) in invokers.items():
b49276c9f50038e0bd499ad49f7bd6444566a834Christian Maeder source_method_invoker(signature, meth.in_args)
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maederdef forward_prop_invoker(prop):
c7ec85d1103173e089aa5048fd7afb2f9b505124Klaus Luettich out("static int %s(struct sbus_request *dbus_req, void *function_ptr);",
c7ec85d1103173e089aa5048fd7afb2f9b505124Klaus Luettich prop.getter_invoker_name())
c7ec85d1103173e089aa5048fd7afb2f9b505124Klaus Luettich
c7ec85d1103173e089aa5048fd7afb2f9b505124Klaus Luettichdef forward_prop_invokers(ifaces):
c7ec85d1103173e089aa5048fd7afb2f9b505124Klaus Luettich invokers = { }
b905126bab9454b89041f92b3c50bb9efc85e427Klaus Luettich for iface in ifaces:
a883cd4d01fe39d23219cf5333425f195be24d8bChristian Maeder for prop in iface.properties:
5c69cef4668bbd959d721668313a779126014d1eKlaus Luettich if not prop.is_basic:
b905126bab9454b89041f92b3c50bb9efc85e427Klaus Luettich continue
c4ef79587a902327f36277c45a8d91d1e67bd6d5Klaus Luettich if prop.type in invokers:
c4ef79587a902327f36277c45a8d91d1e67bd6d5Klaus Luettich continue
c4ef79587a902327f36277c45a8d91d1e67bd6d5Klaus Luettich forward_prop_invoker(prop)
c4ef79587a902327f36277c45a8d91d1e67bd6d5Klaus Luettich invokers[prop.type] = prop
c4ef79587a902327f36277c45a8d91d1e67bd6d5Klaus Luettich return invokers
c4ef79587a902327f36277c45a8d91d1e67bd6d5Klaus Luettich
c4ef79587a902327f36277c45a8d91d1e67bd6d5Klaus Luettichdef source_prop_invokers(invokers):
c4ef79587a902327f36277c45a8d91d1e67bd6d5Klaus Luettich for (type, prop) in invokers.items():
c4ef79587a902327f36277c45a8d91d1e67bd6d5Klaus Luettich if prop.readable:
c4ef79587a902327f36277c45a8d91d1e67bd6d5Klaus Luettich source_getter_invoker(prop)
c4ef79587a902327f36277c45a8d91d1e67bd6d5Klaus Luettich
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maederdef source_finisher(meth):
b905126bab9454b89041f92b3c50bb9efc85e427Klaus Luettich out("")
b905126bab9454b89041f92b3c50bb9efc85e427Klaus Luettich out("int %s_finish(struct sbus_request *req%s)",
b905126bab9454b89041f92b3c50bb9efc85e427Klaus Luettich meth.fq_c_name(), method_arg_types(meth.out_args, with_names=True))
b905126bab9454b89041f92b3c50bb9efc85e427Klaus Luettich out("{")
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
33d042fe6a9eb27a4c48f840b80838f3e7d98e34Christian Maeder for arg in meth.out_args:
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder if arg.dbus_type != arg.sssd_type:
dbe752ee940baae7f9f231f29c62284bb0f90a25Christian Maeder out(" %s cast_%s = arg_%s;", arg.dbus_type, arg.c_name(), arg.c_name())
1f8a7f8343f7df719768d2b1d7e3077ee291a1caChristian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder out(" return sbus_request_return_and_finish(req,")
1f8a7f8343f7df719768d2b1d7e3077ee291a1caChristian Maeder for arg in meth.out_args:
1f8a7f8343f7df719768d2b1d7e3077ee291a1caChristian Maeder out(" ", new_line=False)
c1bf9cc3bc3729b0bf925be3be123cbb59bea2a6Christian Maeder if arg.is_array:
c1bf9cc3bc3729b0bf925be3be123cbb59bea2a6Christian Maeder out("DBUS_TYPE_ARRAY, %s, &arg_%s, len_%s,",
1f8a7f8343f7df719768d2b1d7e3077ee291a1caChristian Maeder arg.dbus_constant, arg.c_name(), arg.c_name())
96646aed2ae087b942ae23f15bbe729a8f7c43d3Christian Maeder elif arg.dbus_type != arg.sssd_type:
96646aed2ae087b942ae23f15bbe729a8f7c43d3Christian Maeder out("%s, &cast_%s,", arg.dbus_constant, arg.c_name())
1f8a7f8343f7df719768d2b1d7e3077ee291a1caChristian Maeder else:
3a7788e09dd23b364a46c9488cbd1522369113dbChristian Maeder out("%s, &arg_%s,", arg.dbus_constant, arg.c_name())
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder out(" DBUS_TYPE_INVALID);")
ef67402074be14deb95e4ff564737d5593144130Klaus Luettich out("}")
dbe752ee940baae7f9f231f29c62284bb0f90a25Christian Maeder
ef67402074be14deb95e4ff564737d5593144130Klaus Luettichdef header_reply(meth):
462d9dc583444aab82732e14a75610684d2dc7e9Christian Maeder for arg in meth.out_args:
c9e197862d9d8ef2585270dd08f5194b3aed4a9dKlaus Luettich if arg.is_array:
e7e1ab2ac3f1fded8611bb92ae00e8f3b8c693fbKlaus Luettich out(" %s *%s", arg.dbus_type, arg.c_name())
ef67402074be14deb95e4ff564737d5593144130Klaus Luettich out(" int %s__len", arg.c_name())
1323eba62fc519b068f5aaec4f9d2be05ffabea9Klaus Luettich else:
a80c28bb8b7a23ccdf7e08d0fe216fc19cc97273Klaus Luettich out(" %s %s;", arg.dbus_type, arg.c_name())
d784803f9c752667b4fcf7393d698002bedf3f89Klaus Luettich types = [arg.sssd_type for arg in meth.in_args]
1323eba62fc519b068f5aaec4f9d2be05ffabea9Klaus Luettich
1323eba62fc519b068f5aaec4f9d2be05ffabea9Klaus Luettichdef source_args(parent, args, suffix):
1f8a7f8343f7df719768d2b1d7e3077ee291a1caChristian Maeder out("")
1f8a7f8343f7df719768d2b1d7e3077ee291a1caChristian Maeder out("/* arguments for %s.%s */", parent.iface.name, parent.name)
462d9dc583444aab82732e14a75610684d2dc7e9Christian Maeder out("const struct sbus_arg_meta %s%s[] = {", parent.fq_c_name(), suffix)
5d39c60274aaa76506292d2d9e885fccd27e1eabChristian Maeder for arg in args:
5d39c60274aaa76506292d2d9e885fccd27e1eabChristian Maeder out(" { \"%s\", \"%s\" },", arg.name, arg.type)
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder out(" { NULL, }")
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder out("};")
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maederdef source_methods(iface, methods):
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder for meth in methods:
1f8a7f8343f7df719768d2b1d7e3077ee291a1caChristian Maeder if meth.in_args:
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder source_args(meth, meth.in_args, "__in")
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettich if meth.out_args:
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettich source_args(meth, meth.out_args, "__out")
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder if not meth.use_raw_handler():
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettich source_finisher(meth)
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder out("")
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder out("/* methods for %s */", iface.name)
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder out("const struct sbus_method_meta %s__methods[] = {", iface.c_name())
f2d9352f2999f82c36b4b65535d14a6a40ae5a82Christian Maeder for meth in methods:
340706b6c0c6e3dbacdd7003e20e9cab7f9aa765Christian Maeder out(" {")
43bb71dfe7ec405f563864d57c1cacdaa8ce9a80Christian Maeder out(" \"%s\", /* name */", meth.name)
f2d9352f2999f82c36b4b65535d14a6a40ae5a82Christian Maeder if meth.in_args:
340706b6c0c6e3dbacdd7003e20e9cab7f9aa765Christian Maeder out(" %s__in,", meth.fq_c_name())
fdb2d618144159395f7bf8ce3327b3c112a17dd3Till Mossakowski else:
2d6d9112c010389cde5625404c4f437aa7fa3cd4Christian Maeder out(" NULL, /* no in_args */")
5a9437fabd7b65fe4aa1c59c6f79f154f3cf8841Christian Maeder if meth.out_args:
37951dbd8e5f2418a07f072d9bf551d0c3a1eafcChristian Maeder out(" %s__out,", meth.fq_c_name())
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder else:
99afa6000472f3d291fdf9193ea19d334a58658dChristian Maeder out(" NULL, /* no out_args */")
99afa6000472f3d291fdf9193ea19d334a58658dChristian Maeder out(" offsetof(struct %s, %s),", iface.c_name(), meth.c_name())
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder if meth.use_raw_handler() or not meth.in_args:
c22d75ec3ea1306219d1c09a5b3e8ff04f753ad6Christian Maeder out(" NULL, /* no invoker */")
9c3edf2b283c09d33b2820696886d1ed32fcadc8Christian Maeder else:
c22d75ec3ea1306219d1c09a5b3e8ff04f753ad6Christian Maeder out(" invoke_%s_method,", meth.in_signature())
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder out(" },")
68b77966b2cf7bf2e340bf0fb6b9efc3e6a00467Christian Maeder out(" { NULL, }")
99afa6000472f3d291fdf9193ea19d334a58658dChristian Maeder out("};")
5bb7eeaca10ea76595229375f907a5a388b7c882Christian Maeder
5bb7eeaca10ea76595229375f907a5a388b7c882Christian Maederdef source_signals(iface, signals):
5bb7eeaca10ea76595229375f907a5a388b7c882Christian Maeder for sig in iface.signals:
c59d1c38ef94b4fb1c8d9fda9573bc1e1d2801e7Christian Maeder if sig.args:
cd36bffee51c77cdadcb9f916b34fa512e311946Christian Maeder source_args(sig, sig.args, "__args")
99afa6000472f3d291fdf9193ea19d334a58658dChristian Maeder
ac0bbbcb2774629bb87986e69cf53d3402c5f575Christian Maeder out("")
8410667510a76409aca9bb24ff0eda0420088274Christian Maeder out("/* signals for %s */", iface.name)
ddc9315cc0b1f5dd3d8f99a77f1c75064db33b48Christian Maeder out("const struct sbus_signal_meta %s__signals[] = {", iface.c_name())
ddc9315cc0b1f5dd3d8f99a77f1c75064db33b48Christian Maeder for sig in signals:
5d522dff4d0fabf57dd476d4c3de15d354a89f62Christian Maeder out(" {")
5d522dff4d0fabf57dd476d4c3de15d354a89f62Christian Maeder out(" \"%s\", /* name */", sig.name)
5d522dff4d0fabf57dd476d4c3de15d354a89f62Christian Maeder if sig.args:
8410667510a76409aca9bb24ff0eda0420088274Christian Maeder out(" %s__args", sig.fq_c_name())
8410667510a76409aca9bb24ff0eda0420088274Christian Maeder else:
8410667510a76409aca9bb24ff0eda0420088274Christian Maeder out(" NULL, /* no args */")
b1f59a4ea7c96f4c03a4d7cfcb9c5e66871cfbbbChristian Maeder out(" },")
e62d49c0dc2893da75faad896bd135e2e9a7087bKlaus Luettich out(" { NULL, }")
e62d49c0dc2893da75faad896bd135e2e9a7087bKlaus Luettich out("};")
e62d49c0dc2893da75faad896bd135e2e9a7087bKlaus Luettich
e62d49c0dc2893da75faad896bd135e2e9a7087bKlaus Luettichdef source_properties(iface, properties):
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich out("")
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich out("/* property info for %s */", iface.name)
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich out("const struct sbus_property_meta %s__properties[] = {", iface.c_name())
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich for prop in properties:
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich out(" {")
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich out(" \"%s\", /* name */", prop.name)
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich out(" \"%s\", /* type */", prop.type)
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich if prop.readable and prop.writable:
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich out(" SBUS_PROPERTY_READABLE | SBUS_PROPERTY_WRITABLE,")
36f63902db2b3463faa9f59912ad106e2d5aaa24Klaus Luettich elif prop.readable:
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich out(" SBUS_PROPERTY_READABLE,")
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich elif prop.writable:
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich out(" SBUS_PROPERTY_WRITABLE,")
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich else:
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich assert False, "should not be reached"
ac43fa22d2d3f91a17674ac164cba3cf39a17795Klaus Luettich if prop.readable:
ac43fa22d2d3f91a17674ac164cba3cf39a17795Klaus Luettich out(" offsetof(struct %s, %s),", iface.c_name(), prop.getter_name())
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers out(" %s,", prop.getter_invoker_name())
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder else:
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers out(" 0, /* not readable */")
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder out(" NULL, /* no invoker */")
18c1d987ce5818ecf0bfc8af3f43aed2ce86e1eaChristian Maeder out(" 0, /* not writable */")
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder out(" NULL, /* no invoker */")
5ad5dffe06818a13e1632b1119fbca7881085fc1Dominik Luecke out(" },")
f4a2a20e49f41b2afa657e5e64d9e349c7faa091Christian Maeder out(" { NULL, }")
5ad5dffe06818a13e1632b1119fbca7881085fc1Dominik Luecke out("};")
5ad5dffe06818a13e1632b1119fbca7881085fc1Dominik Luecke
5ad5dffe06818a13e1632b1119fbca7881085fc1Dominik Lueckedef header_interface(iface):
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder out("")
1c9a63e4f7c6879f51fe0f32154a9116f2c126dbChristian Maeder out("/* interface info for %s */", iface.name)
6fe9628743562678acf97d6730ebcfee5e9e50c2Christian Maeder out("extern const struct sbus_interface_meta %s_meta;", iface.c_name())
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maederdef source_interface(iface):
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder out("")
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder out("/* interface info for %s */", iface.name)
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder out("const struct sbus_interface_meta %s_meta = {", iface.c_name())
fb328c4f646dd3dd78a9391c5cb58450a3dd0aa9Klaus Luettich out(" \"%s\", /* name */", iface.name)
3b06e23643a9f65390cb8c1caabe83fa7e87a708Till Mossakowski if iface.methods:
3b06e23643a9f65390cb8c1caabe83fa7e87a708Till Mossakowski out(" %s__methods,", iface.c_name())
3b06e23643a9f65390cb8c1caabe83fa7e87a708Till Mossakowski else:
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder out(" NULL, /* no methods */")
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder if iface.signals:
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder out(" %s__signals,", iface.c_name())
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder else:
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder out(" NULL, /* no signals */")
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder if iface.properties:
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder out(" %s__properties,", iface.c_name())
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder else:
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers out(" NULL, /* no properties */")
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder out(" invoke_%s_get_all, /* GetAll invoker */", iface.c_name())
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder out("};")
e96a0bf4040fd789339958c01f145c5057d26db6René Wagner
f04e8f3ff56405901be968fd4c6e9769239f1a9bKlaus Luettichdef generate_source(ifaces, filename, include_header=None):
f04e8f3ff56405901be968fd4c6e9769239f1a9bKlaus Luettich basename = os.path.basename(filename)
abf2487c3aece95c371ea89ac64319370dcb6483Klaus Luettich
abf2487c3aece95c371ea89ac64319370dcb6483Klaus Luettich out("/* The following definitions are auto-generated from %s */", basename)
abf2487c3aece95c371ea89ac64319370dcb6483Klaus Luettich out("")
abf2487c3aece95c371ea89ac64319370dcb6483Klaus Luettich
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers out("#include \"util/util.h\"")
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder out("#include \"sbus/sssd_dbus.h\"")
83394c6b6e6de128e71b67c9251ed7a84485d082Christian Maeder out("#include \"sbus/sssd_dbus_meta.h\"")
6dc9bc98d0854fe2e3dd3bfc4275096a0c28ee1cChristian Maeder if include_header:
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckers out("#include \"%s\"", os.path.basename(include_header))
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder meth_invokers = forward_method_invokers(ifaces)
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder prop_invokers = forward_prop_invokers(ifaces)
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich
a80c28bb8b7a23ccdf7e08d0fe216fc19cc97273Klaus Luettich for iface in ifaces:
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
a80c28bb8b7a23ccdf7e08d0fe216fc19cc97273Klaus Luettich # The methods
68d10d143f29fcff3c637ba24f90e983995ceae6Christian Maeder if iface.methods:
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder source_methods(iface, iface.methods)
b9625461755578f3eed04676d42a63fd2caebd0cChristian Maeder
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder # The signals array
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder if iface.signals:
d0652648f9879c67a194f8b03baafe2700c68eb4Christian Maeder source_signals(iface, iface.signals)
363939beade943a02b31004cea09dec34fa8a6d9Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder # The properties array
b1f59a4ea7c96f4c03a4d7cfcb9c5e66871cfbbbChristian Maeder if iface.properties:
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich source_properties(iface, iface.properties)
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich # always generate getall, for interfaces without properties
83394c6b6e6de128e71b67c9251ed7a84485d082Christian Maeder # let's return an empty array
36f63902db2b3463faa9f59912ad106e2d5aaa24Klaus Luettich source_getall_invoker(iface, prop_invokers)
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder # The sbus_interface structure
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder source_interface(iface)
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder
27785f379d6810811b4e6d23feab18845fde9a98Christian Maeder source_method_invokers(meth_invokers)
2d130d212db7208777ca896a7ecad619a8944971Christian Maeder source_prop_invokers(prop_invokers)
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maederdef header_finisher(iface, meth):
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder if meth.use_raw_handler():
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder return
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder out("")
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder out("/* finish function for %s */", meth.name)
83394c6b6e6de128e71b67c9251ed7a84485d082Christian Maeder out("int %s_finish(struct sbus_request *req%s);",
68d10d143f29fcff3c637ba24f90e983995ceae6Christian Maeder meth.fq_c_name(), method_arg_types(meth.out_args, with_names=True))
e7757995211bd395dc79d26fe017d99375f7d2a6Christian Maeder
c5e3fc166373b0d90f6e36e8aa234396a1dcd879Christian Maederdef header_vtable(iface, methods):
340706b6c0c6e3dbacdd7003e20e9cab7f9aa765Christian Maeder out("")
3e61f574717499939bd8e0ff538ea9e7b72d4e2dKlaus Luettich out("/* vtable for %s */", iface.name)
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder out("struct %s {", iface.c_name())
68d10d143f29fcff3c637ba24f90e983995ceae6Christian Maeder out(" struct sbus_vtable vtable; /* derive from sbus_vtable */")
8451c0f87cd1c53edee413e5154dbe7e44448664Christian Maeder
e1559d046eb2c6dde0e6e272b37b6756eac0e8adChristian Maeder # All methods
68d10d143f29fcff3c637ba24f90e983995ceae6Christian Maeder for meth in iface.methods:
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder out(" %s;", method_function_pointer(meth, meth.c_name(), with_names=True))
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder for prop in iface.properties:
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder out(" %s;", property_handlers(prop))
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder out("};")
2c619a4dfdc1df27573eba98e81ed1ace906941dChristian Maeder
2c619a4dfdc1df27573eba98e81ed1ace906941dChristian Maederdef header_constants(iface):
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder out("")
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder out("/* constants for %s */", iface.name)
50515239e7e190f4a34ca581dd685d002148fbddChristian Maeder out("#define %s \"%s\"", iface.c_name().upper(), iface.name)
50515239e7e190f4a34ca581dd685d002148fbddChristian Maeder for meth in iface.methods:
50515239e7e190f4a34ca581dd685d002148fbddChristian Maeder out("#define %s \"%s\"", meth.fq_c_name().upper(), meth.name)
0b349288edfa50fdf38fda1a14e1562d03f92574Christian Maeder for sig in iface.signals:
0b349288edfa50fdf38fda1a14e1562d03f92574Christian Maeder out("#define %s \"%s\"", sig.fq_c_name().upper(), sig.name)
0b349288edfa50fdf38fda1a14e1562d03f92574Christian Maeder for prop in iface.properties:
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder out("#define %s \"%s\"", prop.fq_c_name().upper(), prop.name)
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maederdef generate_header(ifaces, filename):
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder basename = os.path.basename(filename)
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder guard = "__%s__" % re.sub(r'([^_A-Z0-9])', "_", basename.upper())
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
8b4c68db8b465107cabef8b9cd5b6bc216e1b156Till Mossakowski out("/* The following declarations are auto-generated from %s */", basename)
8b4c68db8b465107cabef8b9cd5b6bc216e1b156Till Mossakowski out("")
8b4c68db8b465107cabef8b9cd5b6bc216e1b156Till Mossakowski out("#ifndef %s", guard)
bcaf979d9babe6346aa343687aa7d596e2894cccPaolo Torrini out("#define %s", guard)
df29370ae8d8b41587957f6bcdcb43a3f1927e47Christian Maeder out("")
bcaf979d9babe6346aa343687aa7d596e2894cccPaolo Torrini out("#include \"sbus/sssd_dbus.h\"")
5ce19352a9cc47d982819cc889a71cd0a61ac171Christian Maeder
5ce19352a9cc47d982819cc889a71cd0a61ac171Christian Maeder out("")
5ce19352a9cc47d982819cc889a71cd0a61ac171Christian Maeder out("/* ------------------------------------------------------------------------")
bcaf979d9babe6346aa343687aa7d596e2894cccPaolo Torrini out(" * DBus Constants")
23ab8855c58adfbd03a0730584b917b24c603901Christian Maeder out(" *")
df29370ae8d8b41587957f6bcdcb43a3f1927e47Christian Maeder out(" * Various constants of interface and method names mostly for use by clients")
23ab8855c58adfbd03a0730584b917b24c603901Christian Maeder out(" */")
e50e41135ece589f7202bd4ef8d6b97531c2a56eKlaus Luettich
47b0e9f3cb008cb7997f4e3bae26e4d62dcc887aChristian Maeder for iface in ifaces:
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder header_constants(iface)
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
431d34c7007a787331c4e5ec997badb0f8190fc7Christian Maeder out("")
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder out("/* ------------------------------------------------------------------------")
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder out(" * DBus handlers")
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder out(" *")
99afa6000472f3d291fdf9193ea19d334a58658dChristian Maeder out(" * These structures are filled in by implementors of the different")
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder out(" * dbus interfaces to handle method calls.")
88318aafc287e92931dceffbb943d58a9310001dChristian Maeder out(" *")
d5d349836d8b1fa93ea49a59d977b106c6e9233bKlaus Luettich out(" * Handler functions of type sbus_msg_handler_fn accept raw messages,")
d5d349836d8b1fa93ea49a59d977b106c6e9233bKlaus Luettich out(" * other handlers are typed appropriately. If a handler that is")
88318aafc287e92931dceffbb943d58a9310001dChristian Maeder out(" * set to NULL is invoked it will result in a")
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder out(" * org.freedesktop.DBus.Error.NotSupported error for the caller.")
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder out(" *")
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder out(" * Handlers have a matching xxx_finish() function (unless the method has")
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder out(" * accepts raw messages). These finish functions the")
e62d49c0dc2893da75faad896bd135e2e9a7087bKlaus Luettich out(" * sbus_request_return_and_finish() with the appropriate arguments to")
9096f6c6aaded6cd8288656ceccd4c7b3bd0747eChristian Maeder out(" * construct a valid reply. Once a finish function has been called, the")
9096f6c6aaded6cd8288656ceccd4c7b3bd0747eChristian Maeder out(" * @dbus_req it was called with is freed and no longer valid.")
e62d49c0dc2893da75faad896bd135e2e9a7087bKlaus Luettich out(" */")
e62d49c0dc2893da75faad896bd135e2e9a7087bKlaus Luettich
e62d49c0dc2893da75faad896bd135e2e9a7087bKlaus Luettich for iface in ifaces:
e62d49c0dc2893da75faad896bd135e2e9a7087bKlaus Luettich if iface.methods or iface.properties:
e62d49c0dc2893da75faad896bd135e2e9a7087bKlaus Luettich header_vtable(iface, iface.methods)
e62d49c0dc2893da75faad896bd135e2e9a7087bKlaus Luettich for meth in iface.methods:
e62d49c0dc2893da75faad896bd135e2e9a7087bKlaus Luettich header_finisher(iface, meth)
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder out("")
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder out("/* ------------------------------------------------------------------------")
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder out(" * DBus Interface Metadata")
1aee4aaddde105264c1faf394d88e302c05094ffChristian Maeder out(" *")
363939beade943a02b31004cea09dec34fa8a6d9Christian Maeder out(" * These structure definitions are filled in with the information about")
c72c1e75a969ff4c336e77481c2a8e42603f13eeChristian Maeder out(" * the interfaces, methods, properties and so on.")
fdef3358918491badb0e29e42b5d3b5a01950716Christian Maeder out(" *")
6ff7a91875597d6e4dfaa68c79187d01473e8341Christian Maeder out(" * The actual definitions are found in the accompanying C file next")
6ff7a91875597d6e4dfaa68c79187d01473e8341Christian Maeder out(" * to this header.")
6ff7a91875597d6e4dfaa68c79187d01473e8341Christian Maeder out(" */")
88318aafc287e92931dceffbb943d58a9310001dChristian Maeder
fdef3358918491badb0e29e42b5d3b5a01950716Christian Maeder for iface in ifaces:
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder header_interface(iface)
88318aafc287e92931dceffbb943d58a9310001dChristian Maeder
7767474aba4fa2dc51a6c68017d3bcef3b773001Christian Maeder out("")
88318aafc287e92931dceffbb943d58a9310001dChristian Maeder out("#endif /* %s */", guard)
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
fdb2d618144159395f7bf8ce3327b3c112a17dd3Till Mossakowski# -----------------------------------------------------------------------------
340706b6c0c6e3dbacdd7003e20e9cab7f9aa765Christian Maeder# XML Interface Parsing
88318aafc287e92931dceffbb943d58a9310001dChristian Maeder
bf76f4fcf07abaebea587df8135de8356c26a363Till MossakowskiSTATE_TOP = 'top'
88318aafc287e92931dceffbb943d58a9310001dChristian MaederSTATE_NODE = 'node'
fdb2d618144159395f7bf8ce3327b3c112a17dd3Till MossakowskiSTATE_INTERFACE = 'interface'
e7757995211bd395dc79d26fe017d99375f7d2a6Christian MaederSTATE_METHOD = 'method'
6e049108aa87dc46bcff96fae50a4625df1d9648Klaus LuettichSTATE_SIGNAL = 'signal'
473bc1f3f3443f18e0ee83e4642fab42183470f2Christian MaederSTATE_PROPERTY = 'property'
473bc1f3f3443f18e0ee83e4642fab42183470f2Christian MaederSTATE_ARG = 'arg'
6e049108aa87dc46bcff96fae50a4625df1d9648Klaus LuettichSTATE_ANNOTATION = 'annotation'
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian MaederSTATE_IGNORED = 'ignored'
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
f4505a64a089693012a3f5c3b1f12a82cd7a2a5aKlaus Luettichdef expect_attr(attrs, name):
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder if name not in attrs:
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder raise DBusXmlException("Missing attribute '%s'" % name)
f4505a64a089693012a3f5c3b1f12a82cd7a2a5aKlaus Luettich if attrs[name] == "":
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder raise DBusXmlException("Empty attribute '%s'" % name)
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder return attrs[name]
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maederclass DBusXMLParser:
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder def __init__(self, filename):
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder parser = xml.parsers.expat.ParserCreate()
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder parser.CommentHandler = self.handle_comment
1a6464613c59e35072b90ca296ae402cbe956144Christian Maeder parser.CharacterDataHandler = self.handle_char_data
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich parser.StartElementHandler = self.handle_start_element
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich parser.EndElementHandler = self.handle_end_element
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich self.parsed_interfaces = []
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich self.cur_object = None
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich self.state = STATE_TOP
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich self.state_stack = []
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich self.cur_object = None
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich self.cur_object_stack = []
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich self.arg_count = 0
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich
2e62113845a35e07cb46db05714627c95450f267Klaus Luettich try:
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich with open(filename, "r") as f:
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich parser.ParseFile(f)
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich except DBusXmlException, ex:
0be0db405c49906bd7057255069bf6df53395ac9Klaus Luettich ex.line = parser.CurrentLineNumber
438f9bd974c8e668203e636b0f2bc80c589af043Klaus Luettich ex.file = filename
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder raise
9e748851c150e1022fb952bab3315e869aaf0214Christian Maeder except xml.parsers.expat.ExpatError, ex:
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder exc = DBusXmlException(str(ex))
88318aafc287e92931dceffbb943d58a9310001dChristian Maeder exc.line = ex.lineno
438f9bd974c8e668203e636b0f2bc80c589af043Klaus Luettich exc.file = filename
88318aafc287e92931dceffbb943d58a9310001dChristian Maeder raise exc
feac53e31a8351e3e3c6621f6a14b5714008bfc7Heng Jiang
89c9d707aa817684b88036a2dad66c3437840677Heng Jiang def handle_comment(self, data):
af12672e86f22a822a9915a21efbbbc04a01e3c1Heng Jiang pass
af12672e86f22a822a9915a21efbbbc04a01e3c1Heng Jiang
af12672e86f22a822a9915a21efbbbc04a01e3c1Heng Jiang def handle_char_data(self, data):
bea81dabd203833818cb4a5f3758977c695728cdHeng Jiang pass
bea81dabd203833818cb4a5f3758977c695728cdHeng Jiang
f041c9a6bda23de33a38490e35b831ae18d96b45Christian Maeder def handle_start_element(self, name, attrs):
bea81dabd203833818cb4a5f3758977c695728cdHeng Jiang old_state = self.state
b1fc44bcc364a48f94b73b7995c2325e37359db7Heng Jiang old_cur_object = self.cur_object
b1fc44bcc364a48f94b73b7995c2325e37359db7Heng Jiang if self.state == STATE_IGNORED:
63fd75b1839e6d061eaa2d8d72011b6ca53b0ca9Heng Jiang self.state = STATE_IGNORED
f041c9a6bda23de33a38490e35b831ae18d96b45Christian Maeder elif self.cur_object and name == STATE_ANNOTATION:
f041c9a6bda23de33a38490e35b831ae18d96b45Christian Maeder val = attrs.get('value', '')
f041c9a6bda23de33a38490e35b831ae18d96b45Christian Maeder self.cur_object.annotations[expect_attr(attrs, 'name')] = val
f041c9a6bda23de33a38490e35b831ae18d96b45Christian Maeder self.state = STATE_IGNORED
cef2a3ba4ae8b76980733a5e6fc025df18001962Heng Jiang elif self.state == STATE_TOP:
f041c9a6bda23de33a38490e35b831ae18d96b45Christian Maeder if name == STATE_NODE:
f041c9a6bda23de33a38490e35b831ae18d96b45Christian Maeder self.state = STATE_NODE
f041c9a6bda23de33a38490e35b831ae18d96b45Christian Maeder else:
f041c9a6bda23de33a38490e35b831ae18d96b45Christian Maeder self.state = STATE_IGNORED
f041c9a6bda23de33a38490e35b831ae18d96b45Christian Maeder elif self.state == STATE_NODE:
f041c9a6bda23de33a38490e35b831ae18d96b45Christian Maeder if name == STATE_INTERFACE:
f041c9a6bda23de33a38490e35b831ae18d96b45Christian Maeder self.state = STATE_INTERFACE
bea81dabd203833818cb4a5f3758977c695728cdHeng Jiang iface = Interface(expect_attr(attrs, 'name'))
af12672e86f22a822a9915a21efbbbc04a01e3c1Heng Jiang self.cur_object = iface
af12672e86f22a822a9915a21efbbbc04a01e3c1Heng Jiang self.parsed_interfaces.append(iface)
af12672e86f22a822a9915a21efbbbc04a01e3c1Heng Jiang else:
af12672e86f22a822a9915a21efbbbc04a01e3c1Heng Jiang self.state = STATE_IGNORED
af12672e86f22a822a9915a21efbbbc04a01e3c1Heng Jiang
feac53e31a8351e3e3c6621f6a14b5714008bfc7Heng Jiang elif self.state == STATE_INTERFACE:
if name == STATE_METHOD:
self.state = STATE_METHOD
method = Method(self.cur_object, expect_attr(attrs, 'name'))
self.cur_object.methods.append(method)
self.cur_object = method
self.arg_count = 0
elif name == STATE_SIGNAL:
self.state = STATE_SIGNAL
signal = Signal(self.cur_object, expect_attr(attrs, 'name'))
self.cur_object.signals.append(signal)
self.cur_object = signal
self.arg_count = 0
elif name == STATE_PROPERTY:
self.state = STATE_PROPERTY
prop = Property(self.cur_object,
expect_attr(attrs, 'name'),
expect_attr(attrs, 'type'),
expect_attr(attrs, 'access'))
self.cur_object.properties.append(prop)
self.cur_object = prop
else:
self.state = STATE_IGNORED
elif self.state == STATE_METHOD:
if name == STATE_ARG:
self.state = STATE_ARG
arg = Arg(self.cur_object,
expect_attr(attrs, 'name'),
expect_attr(attrs, 'type'))
direction = attrs.get('direction', 'in')
if direction == 'in':
self.cur_object.in_args.append(arg)
elif direction == 'out':
self.cur_object.out_args.append(arg)
else:
raise DBusXmlException('Invalid direction "%s"' % direction)
self.cur_object = arg
else:
self.state = STATE_IGNORED
elif self.state == STATE_SIGNAL:
if name == STATE_ARG:
self.state = STATE_ARG
arg = Arg(self.cur_object,
expect_attr(attrs, 'name'),
expect_attr(attrs, 'type'))
self.cur_object.args.append(arg)
self.cur_object = arg
else:
self.state = STATE_IGNORED
elif self.state == STATE_PROPERTY:
self.state = STATE_IGNORED
elif self.state == STATE_ARG:
self.state = STATE_IGNORED
else:
assert False, 'Unhandled state "%s" while entering element with name "%s"' % (self.state, name)
self.state_stack.append(old_state)
self.cur_object_stack.append(old_cur_object)
def handle_end_element(self, name):
if self.cur_object:
self.cur_object.validate()
self.state = self.state_stack.pop()
self.cur_object = self.cur_object_stack.pop()
def parse_options():
parser = optparse.OptionParser("usage: %prog [options] introspect.xml ...")
parser.set_description("sbus_codegen generates sbus interface structures \
from standard XML Introspect data.")
parser.add_option("--mode",
dest="mode", default="header",
help="'header' or 'source' (default: header)",
metavar="MODE")
parser.add_option("--output",
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:
print >> sys.stderr, "sbus_codegen: no input file specified"
sys.exit(2)
if options.mode not in ["header", "source"]:
print >> sys.stderr, "sbus_codegen: specify --mode=header or --mode=source"
return options, args
def main():
options, args = parse_options()
if options.output:
sys.stdout = buf = StringIO.StringIO()
for filename in args:
parser = DBusXMLParser(filename)
if options.mode == "header":
generate_header(parser.parsed_interfaces, filename)
elif options.mode == "source":
generate_source(parser.parsed_interfaces, filename, options.include)
else:
assert False, "should not be reached"
# Write output at end to be nice to 'make'
if options.output:
output = open(options.output, "w")
output.write(buf.getvalue())
output.close()
if __name__ == "__main__":
try:
main()
except DBusXmlException, ex:
print >> sys.stderr, str(ex)
sys.exit(1)