51
51
' * as the specification from which it was generated.\n'
54
# keys are e.g. 'sv', values are the key escaped
54
55
self.need_mappings = {}
56
# keys are the contents of the struct (e.g. 'sssu'), values are the
55
58
self.need_structs = {}
59
# keys are the contents of the struct (e.g. 'sssu'), values are the
61
self.need_struct_arrays = {}
63
# keys are the contents of the array (unlike need_struct_arrays!),
64
# values are the key escaped
65
self.need_other_arrays = {}
58
67
def do_mapping_header(self, mapping):
59
68
members = mapping.getElementsByTagNameNS(NS_TP, 'member')
109
118
self.header.write('#define %s (%s ())\n\n' % (name, impl))
110
119
self.need_mappings[impl_sig] = esc_impl_sig
121
array_name = mapping.getAttribute('array-name')
123
gtype_name = self.PREFIX_ + 'ARRAY_TYPE_' + array_name.upper()
124
contents_sig = 'a{' + impl_sig + '}'
125
esc_contents_sig = escape_as_identifier(contents_sig)
126
impl = self.prefix_ + 'type_dbus_array_of_' + esc_contents_sig
127
self.header.write('/**\n * %s:\n\n' % gtype_name)
128
self.header.write(' * Expands to a call to a function\n')
129
self.header.write(' * that returns the #GType of a #GPtrArray\n')
130
self.header.write(' * of #%s.\n' % name)
131
self.header.write(' */\n')
132
self.header.write('#define %s (%s ())\n\n' % (gtype_name, impl))
133
self.need_other_arrays[contents_sig] = esc_contents_sig
112
135
def do_struct_header(self, struct):
113
136
members = struct.getElementsByTagNameNS(NS_TP, 'member')
114
137
impl_sig = ''.join([elt.getAttribute('type') for elt in members])
164
187
self.header.write(' * of #%s.\n' % name)
165
188
self.header.write(' */\n')
166
189
self.header.write('#define %s (%s ())\n\n' % (array_name, impl))
167
self.need_arrays[impl_sig] = esc_impl_sig
190
self.need_struct_arrays[impl_sig] = esc_impl_sig
169
192
self.need_structs[impl_sig] = esc_impl_sig
209
232
self.body.write(' return t;\n')
210
233
self.body.write('}\n\n')
212
for sig in self.need_arrays:
235
for sig in self.need_struct_arrays:
213
236
self.header.write('GType %stype_dbus_array_%s (void);\n\n' %
214
(self.prefix_, self.need_structs[sig]))
237
(self.prefix_, self.need_struct_arrays[sig]))
215
238
self.body.write('GType\n%stype_dbus_array_%s (void)\n{\n' %
216
(self.prefix_, self.need_structs[sig]))
239
(self.prefix_, self.need_struct_arrays[sig]))
217
240
self.body.write(' static GType t = 0;\n\n')
218
241
self.body.write(' if (G_UNLIKELY (t == 0))\n')
219
242
self.body.write(' t = dbus_g_type_get_collection ("GPtrArray", '
220
243
'%stype_dbus_struct_%s ());\n' %
221
(self.prefix_, self.need_structs[sig]))
244
(self.prefix_, self.need_struct_arrays[sig]))
245
self.body.write(' return t;\n')
246
self.body.write('}\n\n')
248
for sig in self.need_other_arrays:
249
self.header.write('GType %stype_dbus_array_of_%s (void);\n\n' %
250
(self.prefix_, self.need_other_arrays[sig]))
251
self.body.write('GType\n%stype_dbus_array_of_%s (void)\n{\n' %
252
(self.prefix_, self.need_other_arrays[sig]))
253
self.body.write(' static GType t = 0;\n\n')
254
self.body.write(' if (G_UNLIKELY (t == 0))\n')
256
if sig[:2] == 'a{' and sig[-1:] == '}':
258
self.body.write(' t = dbus_g_type_get_collection ('
260
'%stype_dbus_hash_%s ());\n' %
261
(self.prefix_, escape_as_identifier(sig[2:-1])))
262
elif sig[:2] == 'a(' and sig[-1:] == ')':
263
# array of arrays of struct
264
self.body.write(' t = dbus_g_type_get_collection ('
266
'%stype_dbus_array_%s ());\n' %
267
(self.prefix_, escape_as_identifier(sig[2:-1])))
269
# array of arrays of non-struct
270
self.body.write(' t = dbus_g_type_get_collection ('
272
'%stype_dbus_array_of_%s ());\n' %
273
(self.prefix_, escape_as_identifier(sig[1:])))
275
raise AssertionError("array of '%s' not supported" % sig)
222
277
self.body.write(' return t;\n')
223
278
self.body.write('}\n\n')