sbus_codegen revision fcd8093c58638dc7c4f9cddfc97f273b94ce2ead
ac4e70ff8955669341f435bc0a734a17c01af124Mark Andrews#!/usr/bin/python
885f47576842cf3c569315b9a48bd9f0ca03f203Automatic Updater
71bd43eebd9d6e42dbcae62b730f5b6508d5acd8Automatic Updater#
59528addd704f8d5757b54e540520f74e588a7c7Automatic Updater# Authors:
59528addd704f8d5757b54e540520f74e588a7c7Automatic Updater# Stef Walter <stefw@redhat.com>
2bb3422dc683c013db7042f5736240de6b86f182Automatic Updater#
75b70a68aefaa17ac4e768d5ed85d2f50d471490Automatic Updater# Copyright (C) 2014 Red Hat
2ec4ab21838e218863d052ebfa3e106e04f50820Evan Hunt#
ea854b585041ad19f70f7af15e08144ef2c2bd1bMark Andrews# This program is free software; you can redistribute it and/or modify
78cb74fab4665da2e2641ba909c6f59f74cc4193Automatic Updater# it under the terms of the GNU General Public License as published by
c89d02f2fb4c06168236d600e86831cff324f763Mark Andrews# the Free Software Foundation; either version 3 of the License, or
90ff38a0d8deaf5f9c2aa5916d99b2e572d28738Automatic Updater# (at your option) any later version.
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington#
ac4e70ff8955669341f435bc0a734a17c01af124Mark Andrews# This program is distributed in the hope that it will be useful,
6c6a121295b30772cbf3dd75a51fb9d883051a0eAutomatic Updater# but WITHOUT ANY WARRANTY; without even the implied warranty of
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater# GNU General Public License for more details.
bc0a53583d92309bebcf93c408e2f3247ebd3d3cAutomatic Updater#
56874aef380a64a2c183b7c282c3e7a361d67fa1Automatic Updater# You should have received a copy of the GNU General Public License
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews# along with this program. If not, see <http://www.gnu.org/licenses/>.
96713299d08c0735c18ebe8772dd2cc1ecd4356aAutomatic Updater#
3cc98b8ecedcbc8465f1cf2740b966b315662430Automatic Updater
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews#
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews# Some parser code from GLib
96713299d08c0735c18ebe8772dd2cc1ecd4356aAutomatic Updater#
80faf1588895fd26490f82f95a7a1b771df1c324Automatic Updater# Copyright (C) 2008-2011 Red Hat, Inc.
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews#
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater# This library is free software; you can redistribute it and/or
efb0e886f18894a1d2489f1ad74ad14b579e11c7Mark Andrews# modify it under the terms of the GNU Lesser General Public
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater# License as published by the Free Software Foundation; either
91216cff91b34c9ff6e846dc23f248219cafe660Andreas Gustafsson# version 2 of the License, or (at your option) any later version.
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater#
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater# This library is distributed in the hope that it will be useful,
91216cff91b34c9ff6e846dc23f248219cafe660Andreas Gustafsson# but WITHOUT ANY WARRANTY; without even the implied warranty of
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater# Lesser General Public License for more details.
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater#
aa9c561961e9d877946ebaa8795fa2be054ab7bfEvan Hunt# You should have received a copy of the GNU Lesser General
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater# Public License along with this library; if not, write to the
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
aa9c561961e9d877946ebaa8795fa2be054ab7bfEvan Hunt# Boston, MA 02111-1307, USA.
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater#
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater# Portions by: David Zeuthen <davidz@redhat.com>
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater#
aa9c561961e9d877946ebaa8795fa2be054ab7bfEvan Hunt
2d2dc37599979c83495510f8af8d1756753aa2c5Automatic Updater#
2d2dc37599979c83495510f8af8d1756753aa2c5Automatic Updater# DBus interfaces are defined here:
aa9c561961e9d877946ebaa8795fa2be054ab7bfEvan Hunt#
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater# http://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater#
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater# The introspection data format has become the standard way to represent a
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater# DBus interface. For many examples see /usr/share/dbus-1/interfaces/ on a
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater# typical linux machine.
cdfc81e048bd34c1d628380247bda6b80a89e20eAutomatic Updater#
cdfc81e048bd34c1d628380247bda6b80a89e20eAutomatic Updater# A word about annotations. These are extra flags or values that can be
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater# assigned to anything. So far, the codegen supports this annotation:
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater#
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater# org.freedesktop.DBus.GLib.CSymbol
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater# - An annotation specified in the specification that tells us what C symbol
eabc9c3c07cd956d3c436bd7614cb162dabdda76Mark Andrews# to generate for a given interface or method. By default the codegen will
eabc9c3c07cd956d3c436bd7614cb162dabdda76Mark Andrews# build up a symbol name from the DBus name.
eabc9c3c07cd956d3c436bd7614cb162dabdda76Mark Andrews#
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updaterimport optparse
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrewsimport os
59528addd704f8d5757b54e540520f74e588a7c7Automatic Updaterimport re
80faf1588895fd26490f82f95a7a1b771df1c324Automatic Updaterimport StringIO
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrewsimport sys
59528addd704f8d5757b54e540520f74e588a7c7Automatic Updaterimport xml.parsers.expat
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews
db5b7e2cdf150c46e8242d3e2e3ad3f5c7300258Automatic Updater# -----------------------------------------------------------------------------
80faf1588895fd26490f82f95a7a1b771df1c324Automatic Updater# Objects
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews
1a06700908f5a1d9f4a8d51285a0fd971e2f9117Automatic Updaterclass DBusXmlException(Exception):
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews line = 0
db5b7e2cdf150c46e8242d3e2e3ad3f5c7300258Automatic Updater file = None
4b2cb1422c7c600fbc13b1cb06a8b4693bc11af8Mark Andrews
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews # Lets us print problems like a compiler would
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater def __str__(self):
91216cff91b34c9ff6e846dc23f248219cafe660Andreas Gustafsson message = Exception.__str__(self)
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater if self.file and self.line:
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater return "%s:%d: %s" % (self.file, self.line, message)
efb0e886f18894a1d2489f1ad74ad14b579e11c7Mark Andrews elif self.file:
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater return "%s: %s" % (self.file, message)
91216cff91b34c9ff6e846dc23f248219cafe660Andreas Gustafsson else:
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater return message
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater
91216cff91b34c9ff6e846dc23f248219cafe660Andreas Gustafssonclass Base:
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater def __init__(self, name):
dd65eb1efb40b1c47d57963192bfc54873b219beAutomatic Updater if not name:
dd65eb1efb40b1c47d57963192bfc54873b219beAutomatic Updater raise DBusXmlException('No name on element')
9174e44c14b1cb91a651fa1dc29470438c246ab9Automatic Updater self.name = name
55e03fc54708d97917bf26639b987f759bdc1f44Automatic Updater self.annotations = { }
9174e44c14b1cb91a651fa1dc29470438c246ab9Automatic Updater def c_name(self):
9174e44c14b1cb91a651fa1dc29470438c246ab9Automatic Updater return self.annotations.get("org.freedesktop.DBus.GLib.CSymbol", self.name)
2a31bd531072824ef252c18303859d6af7451b00Francis Dupont
52367885450d8f61d4f2d63292beb15ba8f39ac7Automatic Updaterclass Arg(Base):
133e6d43fa82e80d3798be4de00f4540f485ec6cAutomatic Updater def __init__(self, method, name, signature):
2a31bd531072824ef252c18303859d6af7451b00Francis Dupont Base.__init__(self, name)
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews self.method = method
52367885450d8f61d4f2d63292beb15ba8f39ac7Automatic Updater self.signature = signature
9174e44c14b1cb91a651fa1dc29470438c246ab9Automatic Updater
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrewsclass Method(Base):
dd65eb1efb40b1c47d57963192bfc54873b219beAutomatic Updater def __init__(self, iface, name):
dd65eb1efb40b1c47d57963192bfc54873b219beAutomatic Updater Base.__init__(self, name)
dd65eb1efb40b1c47d57963192bfc54873b219beAutomatic Updater self.iface = iface
dd65eb1efb40b1c47d57963192bfc54873b219beAutomatic Updater self.in_args = []
133e6d43fa82e80d3798be4de00f4540f485ec6cAutomatic Updater self.out_args = []
133e6d43fa82e80d3798be4de00f4540f485ec6cAutomatic Updater def fq_c_name(self):
133e6d43fa82e80d3798be4de00f4540f485ec6cAutomatic Updater return "%s_%s" % (self.iface.c_name(), self.c_name())
133e6d43fa82e80d3798be4de00f4540f485ec6cAutomatic Updater
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrewsclass Signal(Base):
885f47576842cf3c569315b9a48bd9f0ca03f203Automatic Updater def __init__(self, iface, name):
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updater Base.__init__(self, name)
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews self.iface = iface
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updater self.args = []
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater def fq_c_name(self):
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater return "%s_%s" % (self.iface.c_name(), self.c_name())
cdfc81e048bd34c1d628380247bda6b80a89e20eAutomatic Updater
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updaterclass Property(Base):
fe80a4909bf62b602feaf246866e9d29f7654194Automatic Updater def __init__(self, iface, name, signature, access):
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater Base.__init__(self, name)
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater self.iface = iface
fe80a4909bf62b602feaf246866e9d29f7654194Automatic Updater self.signature = signature
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater self.readable = False
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater self.writable = False
91216cff91b34c9ff6e846dc23f248219cafe660Andreas Gustafsson if access == 'readwrite':
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater self.readable = True
aa1d397c4736cd86540555193d71e55fa3b37b2aMark Andrews self.writable = True
91216cff91b34c9ff6e846dc23f248219cafe660Andreas Gustafsson elif access == 'read':
dd65eb1efb40b1c47d57963192bfc54873b219beAutomatic Updater self.readable = True
dd65eb1efb40b1c47d57963192bfc54873b219beAutomatic Updater elif access == 'write':
dd65eb1efb40b1c47d57963192bfc54873b219beAutomatic Updater self.writable = True
133e6d43fa82e80d3798be4de00f4540f485ec6cAutomatic Updater else:
133e6d43fa82e80d3798be4de00f4540f485ec6cAutomatic Updater raise DBusXmlException('Invalid access type %s'%self.access)
133e6d43fa82e80d3798be4de00f4540f485ec6cAutomatic Updater def fq_c_name(self):
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater return "%s_%s" % (self.iface.c_name(), self.c_name())
91216cff91b34c9ff6e846dc23f248219cafe660Andreas Gustafsson
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updaterclass Interface(Base):
4104e236f71eb5108fcfda6711878a97f6f4a8e7Automatic Updater def __init__(self, name):
0df8ead472f207020f8da22a185fe4b945248ab8Automatic Updater Base.__init__(self, name)
e8c7dc2a5ce48f11c07a67c9923eeb8f419ff19fEvan Hunt self.methods = []
0ce87e5749aabb8eef1e0a37e4bd6e6ffa1d7196Automatic Updater self.signals = []
0ce87e5749aabb8eef1e0a37e4bd6e6ffa1d7196Automatic Updater self.properties = []
0df8ead472f207020f8da22a185fe4b945248ab8Automatic Updater def c_name(self):
2bb3422dc683c013db7042f5736240de6b86f182Automatic Updater return self.annotations.get("org.freedesktop.DBus.GLib.CSymbol",
59528addd704f8d5757b54e540520f74e588a7c7Automatic Updater self.name.replace(".", "_"))
0df8ead472f207020f8da22a185fe4b945248ab8Automatic Updater
3b6e4c84a525b0b3fc9e8affd8bb9fa5c000345fAutomatic Updater# -----------------------------------------------------------------------------
19b3dc94bce93fa76bd7e066f9298630dbc9dcb4Automatic Updater# Code Generation
d145b64cacc8d9cda51f9924ec70cd4661c3e2cfAutomatic Updater
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updaterdef out(format, *args):
59528addd704f8d5757b54e540520f74e588a7c7Automatic Updater str = format % args
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater sys.stdout.write(str)
c243d779731a410f8dc2d2feeed20c15f299b6e3Automatic Updater sys.stdout.write("\n")
0df8ead472f207020f8da22a185fe4b945248ab8Automatic Updater
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updaterdef source_args(parent, args, suffix):
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater out("")
bc0a53583d92309bebcf93c408e2f3247ebd3d3cAutomatic Updater out("/* arguments for %s.%s */", parent.iface.name, parent.name)
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater out("const struct sbus_arg_meta %s%s[] = {", parent.fq_c_name(), suffix)
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater for arg in args:
59528addd704f8d5757b54e540520f74e588a7c7Automatic Updater out(" { \"%s\", \"%s\" },", arg.name, arg.signature)
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater out(" { NULL, }")
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater out("};")
7f79131f9a8e804b93c57f3c679065cce878b726Automatic Updater
59528addd704f8d5757b54e540520f74e588a7c7Automatic Updaterdef source_methods(iface, methods):
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater for meth in methods:
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater if meth.in_args:
7f94d9a8162c9a96b56e66176702b66e79d8e1a2Automatic Updater source_args(meth, meth.in_args, "__in")
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater if meth.out_args:
19b3dc94bce93fa76bd7e066f9298630dbc9dcb4Automatic Updater source_args(meth, meth.out_args, "__out")
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater out("")
7f94d9a8162c9a96b56e66176702b66e79d8e1a2Automatic Updater out("/* methods for %s */", iface.name)
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater out("const struct sbus_method_meta %s__methods[] = {", iface.c_name())
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater for meth in methods:
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater out(" {")
59528addd704f8d5757b54e540520f74e588a7c7Automatic Updater out(" \"%s\", /* name */", meth.name)
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater if meth.in_args:
71bd43eebd9d6e42dbcae62b730f5b6508d5acd8Automatic Updater out(" %s__in,", meth.fq_c_name())
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater else:
7262eb86f2b465822206122921e2f357218f0cfdAutomatic Updater out(" NULL, /* no in_args */")
96ea71632887c58a9d00f47eb318bf76b35903c3Mark Andrews if meth.out_args:
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater out(" %s__out,", meth.fq_c_name())
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater else:
bbb069be941f649228760edcc241122933c066d2Automatic Updater out(" NULL, /* no out_args */")
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater out(" offsetof(struct %s, %s),", iface.c_name(), meth.c_name())
4cda4fd158d6ded5586bacea8c388445d99611eaAutomatic Updater out(" },")
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews out(" { NULL, }")
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater out("};")
80faf1588895fd26490f82f95a7a1b771df1c324Automatic Updater
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrewsdef source_signals(iface, signals):
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater for sig in iface.signals:
59528addd704f8d5757b54e540520f74e588a7c7Automatic Updater if sig.args:
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews source_args(sig, sig.args, "__args")
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews
70f5a54bf2676b136aa838d1ee9688e00b5dd8b9Automatic Updater out("")
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews out("/* signals for %s */", iface.name)
f7c88d61cc1ad2435b0b7cfaedfc9d5248c0be25Automatic Updater out("const struct sbus_signal_meta %s__signals[] = {", iface.c_name())
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews for sig in signals:
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater out(" {")
bc0a53583d92309bebcf93c408e2f3247ebd3d3cAutomatic Updater out(" \"%s\", /* name */", sig.name)
7f94d9a8162c9a96b56e66176702b66e79d8e1a2Automatic Updater if sig.args:
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater out(" %s__args", sig.fq_c_name())
7f94d9a8162c9a96b56e66176702b66e79d8e1a2Automatic Updater else:
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater out(" NULL, /* no args */")
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater out(" },")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out(" { NULL, }")
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater out("};")
cf7e98f59148b559946a7f1ca728471374f1eef3Automatic Updater
96713299d08c0735c18ebe8772dd2cc1ecd4356aAutomatic Updaterdef source_properties(iface, properties):
59528addd704f8d5757b54e540520f74e588a7c7Automatic Updater out("")
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater out("/* property info for %s */", iface.name)
cf7e98f59148b559946a7f1ca728471374f1eef3Automatic Updater out("const struct sbus_property_meta %s__properties[] = {", iface.c_name())
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater for prop in properties:
91216cff91b34c9ff6e846dc23f248219cafe660Andreas Gustafsson out(" {")
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater out(" \"%s\", /* name */", prop.name)
361bec4bdec45042897fb479b7071cd05bbd56b9Automatic Updater out(" \"%s\", /* signature */", prop.signature)
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater if prop.readable and prop.writable:
71bd43eebd9d6e42dbcae62b730f5b6508d5acd8Automatic Updater out(" SBUS_PROPERTY_READABLE | SBUS_PROPERTY_WRITABLE,")
0ce87e5749aabb8eef1e0a37e4bd6e6ffa1d7196Automatic Updater elif prop.readable:
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out(" SBUS_PROPERTY_READABLE,")
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater elif prop.writable:
3857cb6fcabeb79d85de4b3e3e4ab99912b701f8Mark Andrews out(" SBUS_PROPERTY_WRITABLE,")
59528addd704f8d5757b54e540520f74e588a7c7Automatic Updater else:
80faf1588895fd26490f82f95a7a1b771df1c324Automatic Updater assert False, "should not be reached"
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews out(" },")
9174e44c14b1cb91a651fa1dc29470438c246ab9Automatic Updater out(" { NULL, }")
91216cff91b34c9ff6e846dc23f248219cafe660Andreas Gustafsson out("};")
e2caa7536302de34de6cc04025abcd53dc3a499aAutomatic Updater
56e7dc0c24b04210dcbffb180a9e35644fb820daAutomatic Updaterdef header_interface(iface):
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater out("")
8292deab031e7599cd7622aa7675fbe139ca6095Mark Andrews out("/* interface info for %s */", iface.name)
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater out("extern const struct sbus_interface_meta %s_meta;", iface.c_name())
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updaterdef source_interface(iface):
699487d8026a2b931bdce8ce3ae6bc1025d639fbMark Andrews out("")
ca35524ce2b57e6f1b261d23565d1288a355d12fAutomatic Updater out("/* interface info for %s */", iface.name)
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater out("const struct sbus_interface_meta %s_meta = {", iface.c_name())
3351ccbd5c1961404044f8273d54dad405f53960Mark Andrews out(" \"%s\", /* name */", iface.name)
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater if iface.methods:
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater out(" %s__methods,", iface.c_name())
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater else:
3351ccbd5c1961404044f8273d54dad405f53960Mark Andrews out(" NULL, /* no methods */")
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater if iface.signals:
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater out(" %s__signals,", iface.c_name())
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater else:
3351ccbd5c1961404044f8273d54dad405f53960Mark Andrews out(" NULL, /* no signals */")
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater if iface.properties:
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater out(" %s__properties", iface.c_name())
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater else:
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater out(" NULL, /* no propetries */")
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater out("};")
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updaterdef generate_source(ifaces, filename, include_header=None):
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater basename = os.path.basename(filename)
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater out("/* The following definitions are auto-generated from %s */", basename)
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater out("")
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater out("#include \"util/util.h\"")
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater out("#include \"sbus/sssd_dbus.h\"")
e8fc8c884b44371784805e1e0d3100da403dd3f1Automatic Updater out("#include \"sbus/sssd_dbus_meta.h\"")
e8fc8c884b44371784805e1e0d3100da403dd3f1Automatic Updater if include_header:
e8fc8c884b44371784805e1e0d3100da403dd3f1Automatic Updater out("#include \"%s\"", os.path.basename(include_header))
e8fc8c884b44371784805e1e0d3100da403dd3f1Automatic Updater
e8fc8c884b44371784805e1e0d3100da403dd3f1Automatic Updater for iface in ifaces:
e8fc8c884b44371784805e1e0d3100da403dd3f1Automatic Updater
e8fc8c884b44371784805e1e0d3100da403dd3f1Automatic Updater # The methods
e8fc8c884b44371784805e1e0d3100da403dd3f1Automatic Updater if iface.methods:
e8fc8c884b44371784805e1e0d3100da403dd3f1Automatic Updater source_methods(iface, iface.methods)
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater
807ffe7aba4095b2f25c75ac1459f9efcd017eebMark Andrews # The signals array
7d12a6b412fe47e6d6582923fd6954ab8cd0baebAutomatic Updater if iface.signals:
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington source_signals(iface, iface.signals)
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater
59528addd704f8d5757b54e540520f74e588a7c7Automatic Updater # The properties array
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews if iface.properties:
59528addd704f8d5757b54e540520f74e588a7c7Automatic Updater source_properties(iface, iface.properties)
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews # The sbus_interface structure
4b2cb1422c7c600fbc13b1cb06a8b4693bc11af8Mark Andrews source_interface(iface)
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews
4b2cb1422c7c600fbc13b1cb06a8b4693bc11af8Mark Andrewsdef header_vtable(iface, methods):
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews out("")
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater out("/* vtable for %s */", iface.name)
7f79131f9a8e804b93c57f3c679065cce878b726Automatic Updater out("struct %s {", iface.c_name())
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater out(" struct sbus_vtable vtable; /* derive from sbus_vtable */")
91216cff91b34c9ff6e846dc23f248219cafe660Andreas Gustafsson
f2770f6b39a9b2a98afb7a11ed105f73f1570c1eAutomatic Updater # All methods
efb0e886f18894a1d2489f1ad74ad14b579e11c7Mark Andrews for meth in iface.methods:
efb0e886f18894a1d2489f1ad74ad14b579e11c7Mark Andrews out(" sbus_msg_handler_fn %s;", meth.c_name())
ac4e70ff8955669341f435bc0a734a17c01af124Mark Andrews
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington # TODO: Property getters and setters will go here
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington
b4cebdb6ccde66a8f3e397a1b90b0cf788519d69Automatic Updater out("};")
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updaterdef generate_header(ifaces, filename):
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater basename = os.path.basename(filename)
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater guard = "__%s__" % re.sub(r'([^_A-Z0-9])', "_", basename.upper())
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater out("/* The following declarations are auto-generated from %s */", basename)
6c6a121295b30772cbf3dd75a51fb9d883051a0eAutomatic Updater out("")
bc0a4c01beede169df81a3ee5b614ed9e82339dbAutomatic Updater out("#ifndef %s", guard)
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out("#define %s", guard)
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater out("")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out("#include \"sbus/sssd_dbus.h\"")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out("")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out("/* ------------------------------------------------------------------------")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out(" * DBus Vtable handler structures")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out(" *")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out(" * These structures are filled in by implementors of the different")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out(" * dbus interfaces to handle method calls.")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out(" *")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out(" * Handler functions of type sbus_msg_handler_fn accept raw messages,")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out(" * other handlers will be typed appropriately. If a handler that is")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out(" * set to NULL is invoked it will result in a")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out(" * org.freedesktop.DBus.Error.NotSupported error for the caller.")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out(" */")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington for iface in ifaces:
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington if iface.methods:
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington header_vtable(iface, iface.methods)
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out("")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out("/* ------------------------------------------------------------------------")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out(" * DBus Interface Metadata")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out(" *")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out(" * These structure definitions are filled in with the information about")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out(" * the interfaces, methods, properties and so on.")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out(" *")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out(" * The actual definitions are found in the accompanying C file next")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out(" * to this header.")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out(" */")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington for iface in ifaces:
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington header_interface(iface)
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out("")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington out("#endif /* %s */", guard)
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington# -----------------------------------------------------------------------------
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington# XML Interface Parsing
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian WellingtonSTATE_TOP = 'top'
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian WellingtonSTATE_NODE = 'node'
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian WellingtonSTATE_INTERFACE = 'interface'
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian WellingtonSTATE_METHOD = 'method'
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian WellingtonSTATE_SIGNAL = 'signal'
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian WellingtonSTATE_PROPERTY = 'property'
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian WellingtonSTATE_ARG = 'arg'
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian WellingtonSTATE_ANNOTATION = 'annotation'
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian WellingtonSTATE_IGNORED = 'ignored'
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellingtondef expect_attr(attrs, name):
a26b22914b7bf25f065afb8cdef983766dcd672bAutomatic Updater if name not in attrs:
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater raise DBusXmlException("Missing attribute '%s'" % name)
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updater if attrs[name] == "":
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updater raise DBusXmlException("Empty attribute '%s'" % name)
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updater return attrs[name]
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updater
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updaterclass DBusXMLParser:
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updater def __init__(self, filename):
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updater parser = xml.parsers.expat.ParserCreate()
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updater parser.CommentHandler = self.handle_comment
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updater parser.CharacterDataHandler = self.handle_char_data
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updater parser.StartElementHandler = self.handle_start_element
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updater parser.EndElementHandler = self.handle_end_element
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updater
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updater self.parsed_interfaces = []
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updater self.cur_object = None
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updater
0d3490f93bb980fde704055e74c1b508987a5fe4Mark Andrews self.state = STATE_TOP
d4ef65050feac78554addf6e16a06c6e2e0bd331Brian Wellington self.state_stack = []
d4ef65050feac78554addf6e16a06c6e2e0bd331Brian Wellington self.cur_object = None
d4ef65050feac78554addf6e16a06c6e2e0bd331Brian Wellington self.cur_object_stack = []
d4ef65050feac78554addf6e16a06c6e2e0bd331Brian Wellington self.arg_count = 0
aa1d397c4736cd86540555193d71e55fa3b37b2aMark Andrews
aa1d397c4736cd86540555193d71e55fa3b37b2aMark Andrews try:
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington with open(filename, "r") as f:
aa1d397c4736cd86540555193d71e55fa3b37b2aMark Andrews parser.ParseFile(f)
d4ef65050feac78554addf6e16a06c6e2e0bd331Brian Wellington except DBusXmlException, ex:
aa1d397c4736cd86540555193d71e55fa3b37b2aMark Andrews ex.line = parser.CurrentLineNumber
6c6a121295b30772cbf3dd75a51fb9d883051a0eAutomatic Updater ex.file = filename
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington raise
6c6a121295b30772cbf3dd75a51fb9d883051a0eAutomatic Updater except xml.parsers.expat.ExpatError, ex:
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater exc = DBusXmlException(str(ex))
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington exc.line = ex.lineno
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington exc.file = filename
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington raise exc
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington
a26b22914b7bf25f065afb8cdef983766dcd672bAutomatic Updater def handle_comment(self, data):
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater pass
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater def handle_char_data(self, data):
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater pass
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater def handle_start_element(self, name, attrs):
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater old_state = self.state
c01dec514a81ecf8c17ca3ef8c3ba95e437295ebAutomatic Updater old_cur_object = self.cur_object
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater if self.state == STATE_IGNORED:
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater self.state = STATE_IGNORED
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater elif self.cur_object and name == STATE_ANNOTATION:
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater val = attrs.get('value', '')
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater self.cur_object.annotations[expect_attr(attrs, 'name')] = val
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater self.state = STATE_IGNORED
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington elif self.state == STATE_TOP:
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater if name == STATE_NODE:
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington self.state = STATE_NODE
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington else:
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington self.state = STATE_IGNORED
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington elif self.state == STATE_NODE:
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington if name == STATE_INTERFACE:
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington self.state = STATE_INTERFACE
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington iface = Interface(expect_attr(attrs, 'name'))
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington self.cur_object = iface
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington self.parsed_interfaces.append(iface)
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington else:
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington self.state = STATE_IGNORED
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington elif self.state == STATE_INTERFACE:
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington if name == STATE_METHOD:
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington self.state = STATE_METHOD
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington method = Method(self.cur_object, expect_attr(attrs, 'name'))
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington self.cur_object.methods.append(method)
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington self.cur_object = method
7adcb4de92bf4383a4c5624c4ed256736d02bc6dMark Andrews self.arg_count = 0
7adcb4de92bf4383a4c5624c4ed256736d02bc6dMark Andrews elif name == STATE_SIGNAL:
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington self.state = STATE_SIGNAL
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington signal = Signal(self.cur_object, expect_attr(attrs, 'name'))
a26b22914b7bf25f065afb8cdef983766dcd672bAutomatic Updater self.cur_object.signals.append(signal)
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater self.cur_object = signal
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington self.arg_count = 0
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater elif name == STATE_PROPERTY:
a26b22914b7bf25f065afb8cdef983766dcd672bAutomatic Updater self.state = STATE_PROPERTY
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater prop = Property(self.cur_object,
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater expect_attr(attrs, 'name'),
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater expect_attr(attrs, 'type'),
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington expect_attr(attrs, 'access'))
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater self.cur_object.properties.append(prop)
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington self.cur_object = prop
7adcb4de92bf4383a4c5624c4ed256736d02bc6dMark Andrews else:
7adcb4de92bf4383a4c5624c4ed256736d02bc6dMark Andrews self.state = STATE_IGNORED
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington elif self.state == STATE_METHOD:
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington if name == STATE_ARG:
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington self.state = STATE_ARG
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington arg = Arg(self.cur_object,
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington expect_attr(attrs, 'name'),
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington expect_attr(attrs, 'type'))
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington direction = attrs.get('direction', 'in')
b7aab05edae933e169d5f83c653935b17c7f0a8bMark Andrews if direction == 'in':
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington self.cur_object.in_args.append(arg)
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington elif direction == 'out':
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington self.cur_object.out_args.append(arg)
7adcb4de92bf4383a4c5624c4ed256736d02bc6dMark Andrews else:
7adcb4de92bf4383a4c5624c4ed256736d02bc6dMark Andrews raise DBusXmlException('Invalid direction "%s"' % direction)
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington self.cur_object = arg
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington else:
7adcb4de92bf4383a4c5624c4ed256736d02bc6dMark Andrews self.state = STATE_IGNORED
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington elif self.state == STATE_SIGNAL:
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington if name == STATE_ARG:
a26b22914b7bf25f065afb8cdef983766dcd672bAutomatic Updater self.state = STATE_ARG
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington arg = Arg(self.cur_object,
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington expect_attr(attrs, 'name'),
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington expect_attr(attrs, 'type'))
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington self.cur_object.args.append(arg)
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington self.cur_object = arg
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington else:
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington self.state = STATE_IGNORED
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington elif self.state == STATE_PROPERTY:
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater self.state = STATE_IGNORED
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington elif self.state == STATE_ARG:
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater self.state = STATE_IGNORED
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater else:
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater assert False, 'Unhandled state "%s" while entering element with name "%s"' % (self.state, name)
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater self.state_stack.append(old_state)
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater self.cur_object_stack.append(old_cur_object)
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater def handle_end_element(self, name):
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater self.state = self.state_stack.pop()
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington self.cur_object = self.cur_object_stack.pop()
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellingtondef parse_options():
7adcb4de92bf4383a4c5624c4ed256736d02bc6dMark Andrews parser = optparse.OptionParser("usage: %prog [options] introspect.xml ...")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington parser.set_description("sbus_codegen generates sbus interface structures \
7adcb4de92bf4383a4c5624c4ed256736d02bc6dMark Andrews from standard XML Introspect data.")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington parser.add_option("--mode",
7adcb4de92bf4383a4c5624c4ed256736d02bc6dMark Andrews dest="mode", default="header",
7adcb4de92bf4383a4c5624c4ed256736d02bc6dMark Andrews help="'header' or 'source' (default: header)",
7adcb4de92bf4383a4c5624c4ed256736d02bc6dMark Andrews metavar="MODE")
7adcb4de92bf4383a4c5624c4ed256736d02bc6dMark Andrews parser.add_option("--output",
7adcb4de92bf4383a4c5624c4ed256736d02bc6dMark Andrews dest="output", default=None,
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington help="Set output file name (default: stdout)",
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington metavar="FILE")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington parser.add_option("--include",
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington dest="include", default=None,
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington help="name of a header to #include",
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington metavar="HEADER")
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington (options, args) = parser.parse_args()
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington if not args:
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington print >> sys.stderr, "sbus_codegen: no input file specified"
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington sys.exit(2)
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington
a26b22914b7bf25f065afb8cdef983766dcd672bAutomatic Updater if options.mode not in ["header", "source"]:
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater print >> sys.stderr, "sbus_codegen: specify --mode=header or --mode=source"
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater return options, args
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updaterdef main():
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater options, args = parse_options()
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater if options.output:
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater sys.stdout = buf = StringIO.StringIO()
b0d566a2ce0f5a67f537ee7f8233f82f2584cc61Automatic Updater
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington for filename in args:
b4cebdb6ccde66a8f3e397a1b90b0cf788519d69Automatic Updater parser = DBusXMLParser(filename)
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater if options.mode == "header":
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington generate_header(parser.parsed_interfaces, filename)
7af91d15b2ce1ce32f7320f6d5cc3b83621c241aAutomatic Updater elif options.mode == "source":
068a66979695c77359e7a9181bb3f831c965b21cMark Andrews generate_source(parser.parsed_interfaces, filename, options.include)
532d27b39244fadfcf8d8b4593f4c65434c9c664Automatic Updater else:
532d27b39244fadfcf8d8b4593f4c65434c9c664Automatic Updater assert False, "should not be reached"
532d27b39244fadfcf8d8b4593f4c65434c9c664Automatic Updater
532d27b39244fadfcf8d8b4593f4c65434c9c664Automatic Updater # Write output at end to be nice to 'make'
532d27b39244fadfcf8d8b4593f4c65434c9c664Automatic Updater if options.output:
532d27b39244fadfcf8d8b4593f4c65434c9c664Automatic Updater output = open(options.output, "w")
532d27b39244fadfcf8d8b4593f4c65434c9c664Automatic Updater output.write(buf.getvalue())
31a540386a9abaf681d8952f1b2cdf5c75a0ba6cAutomatic Updater output.close()
31a540386a9abaf681d8952f1b2cdf5c75a0ba6cAutomatic Updater
31a540386a9abaf681d8952f1b2cdf5c75a0ba6cAutomatic Updaterif __name__ == "__main__":
31a540386a9abaf681d8952f1b2cdf5c75a0ba6cAutomatic Updater try:
31a540386a9abaf681d8952f1b2cdf5c75a0ba6cAutomatic Updater main()
31a540386a9abaf681d8952f1b2cdf5c75a0ba6cAutomatic Updater except DBusXmlException, ex:
31a540386a9abaf681d8952f1b2cdf5c75a0ba6cAutomatic Updater print >> sys.stderr, str(ex)
31a540386a9abaf681d8952f1b2cdf5c75a0ba6cAutomatic Updater sys.exit(1)
31a540386a9abaf681d8952f1b2cdf5c75a0ba6cAutomatic Updater