Avoid using - (hyphen) in gdbus-codegen directory name
[platform/upstream/glib.git] / gio / gdbus-2.0 / codegen / dbustypes.py
1 # -*- Mode: Python -*-
2
3 # GDBus - GLib D-Bus Library
4 #
5 # Copyright (C) 2008-2011 Red Hat, Inc.
6 #
7 # This library is free software; you can redistribute it and/or
8 # modify it under the terms of the GNU Lesser General Public
9 # License as published by the Free Software Foundation; either
10 # version 2 of the License, or (at your option) any later version.
11 #
12 # This library is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 # Lesser General Public License for more details.
16 #
17 # You should have received a copy of the GNU Lesser General
18 # Public License along with this library; if not, write to the
19 # Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20 # Boston, MA 02111-1307, USA.
21 #
22 # Author: David Zeuthen <davidz@redhat.com>
23
24 import utils
25
26 class Annotation:
27     def __init__(self, key, value):
28         self.key = key
29         self.value = value
30         self.annotations = []
31
32 class Arg:
33     def __init__(self, name, signature):
34         self.name = name
35         self.signature = signature
36         self.annotations = []
37         self.doc_string = ''
38         self.since = ''
39
40     def post_process(self, interface_prefix, c_namespace, arg_number):
41         if len(self.doc_string) == 0:
42             self.doc_string = utils.lookup_docs(self.annotations)
43         if len(self.since) == 0:
44             self.since = utils.lookup_since(self.annotations)
45
46         if self.name == None:
47             self.name = 'unnamed_arg%d'%arg_number
48         # default to GVariant
49         self.ctype_in_g  = 'GVariant *'
50         self.ctype_in  = 'GVariant *'
51         self.ctype_in_dup  = 'GVariant *'
52         self.ctype_out = 'GVariant **'
53         self.gtype = 'G_TYPE_VARIANT'
54         self.free_func = 'g_variant_unref'
55         self.format_in = '@' + self.signature
56         self.format_out = '@' + self.signature
57         self.gvariant_get = 'XXX'
58         self.gvalue_get = 'g_value_get_variant'
59         if not utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.ForceGVariant'):
60             if self.signature == 'b':
61                 self.ctype_in_g  = 'gboolean '
62                 self.ctype_in  = 'gboolean '
63                 self.ctype_out = 'gboolean *'
64                 self.gtype = 'G_TYPE_BOOLEAN'
65                 self.free_func = None
66                 self.format_in = 'b'
67                 self.format_out = 'b'
68                 self.gvariant_get = 'g_variant_get_boolean'
69                 self.gvalue_get = 'g_value_get_boolean'
70             elif self.signature == 'y':
71                 self.ctype_in_g  = 'guchar '
72                 self.ctype_in  = 'guchar '
73                 self.ctype_out = 'guchar *'
74                 self.gtype = 'G_TYPE_UCHAR'
75                 self.free_func = None
76                 self.format_in = 'y'
77                 self.format_out = 'y'
78                 self.gvariant_get = 'g_variant_get_byte'
79                 self.gvalue_get = 'g_value_get_uchar'
80             elif self.signature == 'n':
81                 self.ctype_in_g  = 'gint '
82                 self.ctype_in  = 'gint16 '
83                 self.ctype_out = 'gint16 *'
84                 self.gtype = 'G_TYPE_INT'
85                 self.free_func = None
86                 self.format_in = 'n'
87                 self.format_out = 'n'
88                 self.gvariant_get = 'g_variant_get_int16'
89                 self.gvalue_get = 'g_value_get_int'
90             elif self.signature == 'q':
91                 self.ctype_in_g  = 'guint '
92                 self.ctype_in  = 'guint16 '
93                 self.ctype_out = 'guint16 *'
94                 self.gtype = 'G_TYPE_UINT'
95                 self.free_func = None
96                 self.format_in = 'q'
97                 self.format_out = 'q'
98                 self.gvariant_get = 'g_variant_get_uint16'
99                 self.gvalue_get = 'g_value_get_uint'
100             elif self.signature == 'i':
101                 self.ctype_in_g  = 'gint '
102                 self.ctype_in  = 'gint '
103                 self.ctype_out = 'gint *'
104                 self.gtype = 'G_TYPE_INT'
105                 self.free_func = None
106                 self.format_in = 'i'
107                 self.format_out = 'i'
108                 self.gvariant_get = 'g_variant_get_int32'
109                 self.gvalue_get = 'g_value_get_int'
110             elif self.signature == 'u':
111                 self.ctype_in_g  = 'guint '
112                 self.ctype_in  = 'guint '
113                 self.ctype_out = 'guint *'
114                 self.gtype = 'G_TYPE_UINT'
115                 self.free_func = None
116                 self.format_in = 'u'
117                 self.format_out = 'u'
118                 self.gvariant_get = 'g_variant_get_uint32'
119                 self.gvalue_get = 'g_value_get_uint'
120             elif self.signature == 'x':
121                 self.ctype_in_g  = 'gint64 '
122                 self.ctype_in  = 'gint64 '
123                 self.ctype_out = 'gint64 *'
124                 self.gtype = 'G_TYPE_INT64'
125                 self.free_func = None
126                 self.format_in = 'x'
127                 self.format_out = 'x'
128                 self.gvariant_get = 'g_variant_get_int64'
129                 self.gvalue_get = 'g_value_get_int64'
130             elif self.signature == 't':
131                 self.ctype_in_g  = 'guint64 '
132                 self.ctype_in  = 'guint64 '
133                 self.ctype_out = 'guint64 *'
134                 self.gtype = 'G_TYPE_UINT64'
135                 self.free_func = None
136                 self.format_in = 't'
137                 self.format_out = 't'
138                 self.gvariant_get = 'g_variant_get_uint64'
139                 self.gvalue_get = 'g_value_get_uint64'
140             elif self.signature == 'd':
141                 self.ctype_in_g  = 'gdouble '
142                 self.ctype_in  = 'gdouble '
143                 self.ctype_out = 'gdouble *'
144                 self.gtype = 'G_TYPE_DOUBLE'
145                 self.free_func = None
146                 self.format_in = 'd'
147                 self.format_out = 'd'
148                 self.gvariant_get = 'g_variant_get_double'
149                 self.gvalue_get = 'g_value_get_double'
150             elif self.signature == 's':
151                 self.ctype_in_g  = 'const gchar *'
152                 self.ctype_in  = 'const gchar *'
153                 self.ctype_in_dup  = 'gchar *'
154                 self.ctype_out = 'gchar **'
155                 self.gtype = 'G_TYPE_STRING'
156                 self.free_func = 'g_free'
157                 self.format_in = 's'
158                 self.format_out = 's'
159                 self.gvariant_get = 'g_variant_get_string'
160                 self.gvalue_get = 'g_value_get_string'
161             elif self.signature == 'o':
162                 self.ctype_in_g  = 'const gchar *'
163                 self.ctype_in  = 'const gchar *'
164                 self.ctype_in_dup  = 'gchar *'
165                 self.ctype_out = 'gchar **'
166                 self.gtype = 'G_TYPE_STRING'
167                 self.free_func = 'g_free'
168                 self.format_in = 'o'
169                 self.format_out = 'o'
170                 self.gvariant_get = 'g_variant_get_string'
171                 self.gvalue_get = 'g_value_get_string'
172             elif self.signature == 'g':
173                 self.ctype_in_g  = 'const gchar *'
174                 self.ctype_in  = 'const gchar *'
175                 self.ctype_in_dup  = 'gchar *'
176                 self.ctype_out = 'gchar **'
177                 self.gtype = 'G_TYPE_STRING'
178                 self.free_func = 'g_free'
179                 self.format_in = 'g'
180                 self.format_out = 'g'
181                 self.gvariant_get = 'g_variant_get_string'
182                 self.gvalue_get = 'g_value_get_string'
183             elif self.signature == 'ay':
184                 self.ctype_in_g  = 'const gchar *'
185                 self.ctype_in  = 'const gchar *'
186                 self.ctype_in_dup  = 'gchar *'
187                 self.ctype_out = 'gchar **'
188                 self.gtype = 'G_TYPE_STRING'
189                 self.free_func = 'g_free'
190                 self.format_in = '^ay'
191                 self.format_out = '^ay'
192                 self.gvariant_get = 'g_variant_get_bytestring'
193                 self.gvalue_get = 'g_value_get_string'
194             elif self.signature == 'as':
195                 self.ctype_in_g  = 'const gchar *const *'
196                 self.ctype_in  = 'const gchar *const *'
197                 self.ctype_in_dup  = 'gchar **'
198                 self.ctype_out = 'gchar ***'
199                 self.gtype = 'G_TYPE_STRV'
200                 self.free_func = 'g_strfreev'
201                 self.format_in = '^as'
202                 self.format_out = '^as'
203                 self.gvariant_get = 'g_variant_get_strv'
204                 self.gvalue_get = 'g_value_get_boxed'
205             elif self.signature == 'ao':
206                 self.ctype_in_g  = 'const gchar *const *'
207                 self.ctype_in  = 'const gchar *const *'
208                 self.ctype_in_dup  = 'gchar **'
209                 self.ctype_out = 'gchar ***'
210                 self.gtype = 'G_TYPE_STRV'
211                 self.free_func = 'g_strfreev'
212                 self.format_in = '^ao'
213                 self.format_out = '^ao'
214                 self.gvariant_get = 'g_variant_get_objv'
215                 self.gvalue_get = 'g_value_get_boxed'
216             elif self.signature == 'aay':
217                 self.ctype_in_g  = 'const gchar *const *'
218                 self.ctype_in  = 'const gchar *const *'
219                 self.ctype_in_dup  = 'gchar **'
220                 self.ctype_out = 'gchar ***'
221                 self.gtype = 'G_TYPE_STRV'
222                 self.free_func = 'g_strfreev'
223                 self.format_in = '^aay'
224                 self.format_out = '^aay'
225                 self.gvariant_get = 'g_variant_get_bytestring_array'
226                 self.gvalue_get = 'g_value_get_boxed'
227
228 class Method:
229     def __init__(self, name):
230         self.name = name
231         self.in_args = []
232         self.out_args = []
233         self.annotations = []
234         self.doc_string = ''
235         self.since = ''
236         self.deprecated = False
237
238     def post_process(self, interface_prefix, c_namespace):
239         if len(self.doc_string) == 0:
240             self.doc_string = utils.lookup_docs(self.annotations)
241         if len(self.since) == 0:
242             self.since = utils.lookup_since(self.annotations)
243
244         name = self.name
245         overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name')
246         if utils.is_ugly_case(overridden_name):
247             self.name_lower = overridden_name.lower()
248         else:
249             if overridden_name:
250                 name = overridden_name
251             self.name_lower = utils.camel_case_to_uscore(name).lower().replace('-', '_')
252         self.name_hyphen = self.name_lower.replace('_', '-')
253
254         arg_count = 0
255         for a in self.in_args:
256             a.post_process(interface_prefix, c_namespace, arg_count)
257             arg_count += 1
258
259         for a in self.out_args:
260             a.post_process(interface_prefix, c_namespace, arg_count)
261             arg_count += 1
262
263         if utils.lookup_annotation(self.annotations, 'org.freedesktop.DBus.Deprecated') == 'true':
264             self.deprecated = True
265
266 class Signal:
267     def __init__(self, name):
268         self.name = name
269         self.args = []
270         self.annotations = []
271         self.doc_string = ''
272         self.since = ''
273         self.deprecated = False
274
275     def post_process(self, interface_prefix, c_namespace):
276         if len(self.doc_string) == 0:
277             self.doc_string = utils.lookup_docs(self.annotations)
278         if len(self.since) == 0:
279             self.since = utils.lookup_since(self.annotations)
280
281         name = self.name
282         overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name')
283         if utils.is_ugly_case(overridden_name):
284             self.name_lower = overridden_name.lower()
285         else:
286             if overridden_name:
287                 name = overridden_name
288             self.name_lower = utils.camel_case_to_uscore(name).lower().replace('-', '_')
289         self.name_hyphen = self.name_lower.replace('_', '-')
290
291         arg_count = 0
292         for a in self.args:
293             a.post_process(interface_prefix, c_namespace, arg_count)
294             arg_count += 1
295
296         if utils.lookup_annotation(self.annotations, 'org.freedesktop.DBus.Deprecated') == 'true':
297             self.deprecated = True
298
299 class Property:
300     def __init__(self, name, signature, access):
301         self.name = name
302         self.signature = signature
303         self.access = access
304         self.annotations = []
305         self.arg = Arg('value', self.signature)
306         self.arg.annotations = self.annotations
307         self.readable = False
308         self.writable = False
309         if self.access == 'readwrite':
310             self.readable = True
311             self.writable = True
312         elif self.access == 'read':
313             self.readable = True
314         elif self.access == 'write':
315             self.writable = True
316         else:
317             raise RuntimeError('Invalid access type %s'%self.access)
318         self.doc_string = ''
319         self.since = ''
320         self.deprecated = False
321
322     def post_process(self, interface_prefix, c_namespace):
323         if len(self.doc_string) == 0:
324             self.doc_string = utils.lookup_docs(self.annotations)
325         if len(self.since) == 0:
326             self.since = utils.lookup_since(self.annotations)
327
328         name = self.name
329         overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name')
330         if utils.is_ugly_case(overridden_name):
331             self.name_lower = overridden_name.lower()
332         else:
333             if overridden_name:
334                 name = overridden_name
335             self.name_lower = utils.camel_case_to_uscore(name).lower().replace('-', '_')
336         if self.name_lower == 'type':
337             self.name_lower = 'type_'
338         self.name_hyphen = self.name_lower.replace('_', '-')
339
340         # recalculate arg
341         self.arg.annotations = self.annotations
342         self.arg.post_process(interface_prefix, c_namespace, 0)
343
344         if utils.lookup_annotation(self.annotations, 'org.freedesktop.DBus.Deprecated') == 'true':
345             self.deprecated = True
346
347 class Interface:
348     def __init__(self, name):
349         self.name = name
350         self.methods = []
351         self.signals = []
352         self.properties = []
353         self.annotations = []
354         self.doc_string = ''
355         self.doc_string_brief = ''
356         self.since = ''
357         self.deprecated = False
358
359     def post_process(self, interface_prefix, c_namespace):
360         if len(self.doc_string) == 0:
361             self.doc_string = utils.lookup_docs(self.annotations)
362         if len(self.doc_string_brief) == 0:
363             self.doc_string_brief = utils.lookup_brief_docs(self.annotations)
364         if len(self.since) == 0:
365             self.since = utils.lookup_since(self.annotations)
366
367         overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name')
368         if utils.is_ugly_case(overridden_name):
369             name = overridden_name.replace('_', '')
370             name_with_ns = c_namespace + name
371             self.name_without_prefix = name
372             self.camel_name = name_with_ns
373             if len(c_namespace) > 0:
374                 self.ns_upper = utils.camel_case_to_uscore(c_namespace).upper() + '_'
375                 self.name_lower = utils.camel_case_to_uscore(c_namespace) + '_' + overridden_name.lower()
376             else:
377                 self.ns_upper = ''
378                 self.name_lower = overridden_name.lower()
379             self.name_upper = overridden_name.upper()
380
381             #raise RuntimeError('handle Ugly_Case ', overridden_name)
382         else:
383             if overridden_name:
384                 name = overridden_name
385             else:
386                 name = self.name
387                 if name.startswith(interface_prefix):
388                     name = name[len(interface_prefix):]
389             self.name_without_prefix = name
390             name = utils.strip_dots(name)
391             name_with_ns = utils.strip_dots(c_namespace + '.' + name)
392
393             self.camel_name = name_with_ns
394             if len(c_namespace) > 0:
395                 self.ns_upper = utils.camel_case_to_uscore(c_namespace).upper() + '_'
396                 self.name_lower = utils.camel_case_to_uscore(c_namespace) + '_' + utils.camel_case_to_uscore(name)
397             else:
398                 self.ns_upper = ''
399                 self.name_lower = utils.camel_case_to_uscore(name_with_ns)
400             self.name_upper = utils.camel_case_to_uscore(name).upper()
401
402         self.name_hyphen = self.name_upper.lower().replace('_', '-')
403
404         if utils.lookup_annotation(self.annotations, 'org.freedesktop.DBus.Deprecated') == 'true':
405             self.deprecated = True
406
407         for m in self.methods:
408             m.post_process(interface_prefix, c_namespace)
409
410         for s in self.signals:
411             s.post_process(interface_prefix, c_namespace)
412
413         for p in self.properties:
414             p.post_process(interface_prefix, c_namespace)