[Telepathy-commits] [telepathy-glib/master] glib-gtypes-generator: generate the first level of array of mappings
Simon McVittie
simon.mcvittie at collabora.co.uk
Fri Jan 30 08:45:29 PST 2009
---
tools/glib-gtypes-generator.py | 50 ++++++++++++++++++++++++++++++++++++++++
1 files changed, 50 insertions(+), 0 deletions(-)
diff --git a/tools/glib-gtypes-generator.py b/tools/glib-gtypes-generator.py
index d784f6e..2b7ea31 100644
--- a/tools/glib-gtypes-generator.py
+++ b/tools/glib-gtypes-generator.py
@@ -60,6 +60,10 @@ class GTypesGenerator(object):
# key escaped
self.need_struct_arrays = {}
+ # keys are the contents of the array (unlike need_struct_arrays!),
+ # values are the key escaped
+ self.need_other_arrays = {}
+
def do_mapping_header(self, mapping):
members = mapping.getElementsByTagNameNS(NS_TP, 'member')
assert len(members) == 2
@@ -114,6 +118,20 @@ class GTypesGenerator(object):
self.header.write('#define %s (%s ())\n\n' % (name, impl))
self.need_mappings[impl_sig] = esc_impl_sig
+ array_name = mapping.getAttribute('array-name')
+ if array_name:
+ gtype_name = self.PREFIX_ + 'ARRAY_TYPE_' + array_name.upper()
+ contents_sig = 'a{' + impl_sig + '}'
+ esc_contents_sig = escape_as_identifier(contents_sig)
+ impl = self.prefix_ + 'type_dbus_array_of_' + esc_contents_sig
+ self.header.write('/**\n * %s:\n\n' % gtype_name)
+ self.header.write(' * Expands to a call to a function\n')
+ self.header.write(' * that returns the #GType of a #GPtrArray\n')
+ self.header.write(' * of #%s.\n' % name)
+ self.header.write(' */\n')
+ self.header.write('#define %s (%s ())\n\n' % (gtype_name, impl))
+ self.need_other_arrays[contents_sig] = esc_contents_sig
+
def do_struct_header(self, struct):
members = struct.getElementsByTagNameNS(NS_TP, 'member')
impl_sig = ''.join([elt.getAttribute('type') for elt in members])
@@ -227,6 +245,38 @@ class GTypesGenerator(object):
self.body.write(' return t;\n')
self.body.write('}\n\n')
+ for sig in self.need_other_arrays:
+ self.header.write('GType %stype_dbus_array_of_%s (void);\n\n' %
+ (self.prefix_, self.need_other_arrays[sig]))
+ self.body.write('GType\n%stype_dbus_array_of_%s (void)\n{\n' %
+ (self.prefix_, self.need_other_arrays[sig]))
+ self.body.write(' static GType t = 0;\n\n')
+ self.body.write(' if (G_UNLIKELY (t == 0))\n')
+
+ if sig[:2] == 'a{' and sig[-1:] == '}':
+ # array of mappings
+ self.body.write(' t = dbus_g_type_get_collection ('
+ '"GPtrArray", '
+ '%stype_dbus_hash_%s ());\n' %
+ (self.prefix_, self.need_other_arrays[sig][2:-1]))
+ elif sig[:2] == 'a(' and sig[-1:] == ')':
+ # array of arrays of struct
+ self.body.write(' t = dbus_g_type_get_collection ('
+ '"GPtrArray", '
+ '%stype_dbus_array_%s ());\n' %
+ (self.prefix_, self.need_other_arrays[sig][2:-1]))
+ elif sig[:1] == 'a':
+ # array of arrays of non-struct
+ self.body.write(' t = dbus_g_type_get_collection ('
+ '"GPtrArray", '
+ '%stype_dbus_array_of_%s ());\n' %
+ (self.prefix_, self.need_other_arrays[sig][1:]))
+ else:
+ raise AssertionError("array of '%s' not supported" % sig)
+
+ self.body.write(' return t;\n')
+ self.body.write('}\n\n')
+
if __name__ == '__main__':
argv = sys.argv[1:]
--
1.5.6.5
More information about the telepathy-commits
mailing list