[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