Bug 556489 – callback annotations
[gnome.gobject-introspection] / girepository / girnode.h
1 /* GObject introspection: Parsed GIR
2  *
3  * Copyright (C) 2005 Matthias Clasen
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20
21 #ifndef __G_IR_NODE_H__
22 #define __G_IR_NODE_H__
23
24 #include <glib.h>
25
26 #include "girmodule.h"
27
28 G_BEGIN_DECLS
29
30 typedef struct _GIrNode GIrNode; 
31 typedef struct _GIrNodeFunction GIrNodeFunction;
32 typedef struct _GIrNodeParam GIrNodeParam;
33 typedef struct _GIrNodeType GIrNodeType;
34 typedef struct _GIrNodeInterface GIrNodeInterface;
35 typedef struct _GIrNodeSignal GIrNodeSignal;
36 typedef struct _GIrNodeProperty GIrNodeProperty;
37 typedef struct _GIrNodeVFunc GIrNodeVFunc;
38 typedef struct _GIrNodeField GIrNodeField;
39 typedef struct _GIrNodeValue GIrNodeValue;
40 typedef struct _GIrNodeEnum GIrNodeEnum;
41 typedef struct _GIrNodeBoxed GIrNodeBoxed;
42 typedef struct _GIrNodeStruct GIrNodeStruct;
43 typedef struct _GIrNodeConstant GIrNodeConstant;
44 typedef struct _GIrNodeErrorDomain GIrNodeErrorDomain;
45 typedef struct _GIrNodeXRef GIrNodeXRef;
46 typedef struct _GIrNodeUnion GIrNodeUnion;
47
48 typedef enum 
49 {
50   G_IR_NODE_INVALID      =  0,
51   G_IR_NODE_FUNCTION     =  1,
52   G_IR_NODE_CALLBACK     =  2,
53   G_IR_NODE_STRUCT       =  3,
54   G_IR_NODE_BOXED        =  4,
55   G_IR_NODE_ENUM         =  5,
56   G_IR_NODE_FLAGS        =  6, 
57   G_IR_NODE_OBJECT       =  7,
58   G_IR_NODE_INTERFACE    =  8,
59   G_IR_NODE_CONSTANT     =  9,
60   G_IR_NODE_ERROR_DOMAIN = 10,
61   G_IR_NODE_UNION        = 11,
62   G_IR_NODE_PARAM        = 12,
63   G_IR_NODE_TYPE         = 13,
64   G_IR_NODE_PROPERTY     = 14,
65   G_IR_NODE_SIGNAL       = 15,
66   G_IR_NODE_VALUE        = 16,
67   G_IR_NODE_VFUNC        = 17,
68   G_IR_NODE_FIELD        = 18,
69   G_IR_NODE_XREF         = 19
70 } GIrNodeTypeId;
71
72 struct _GIrNode
73 {
74   GIrNodeTypeId type;
75   gchar *name;
76 };
77
78 struct _GIrNodeXRef
79 {
80   GIrNode node;
81
82   gchar *namespace;
83 };
84
85 struct _GIrNodeFunction
86 {
87   GIrNode node;
88
89   gboolean deprecated;
90   gboolean is_varargs; /* Not in typelib yet */ 
91
92   gboolean is_method;
93   gboolean is_setter;
94   gboolean is_getter;
95   gboolean is_constructor;
96   gboolean wraps_vfunc;
97   gboolean throws;
98
99   gchar *symbol;
100
101   GIrNodeParam *result;
102   GList *parameters;
103 };
104
105 struct _GIrNodeType 
106 {
107   GIrNode node;
108
109   gboolean is_pointer;
110   gboolean is_basic;
111   gboolean is_array;
112   gboolean is_glist;
113   gboolean is_gslist;
114   gboolean is_ghashtable;
115   gboolean is_interface;
116   gboolean is_error;
117   gint tag;
118
119   gchar *unparsed;
120
121   gboolean zero_terminated;
122   gboolean has_length;
123   gint length;
124   gboolean has_size;
125   gint size;
126   
127   GIrNodeType *parameter_type1;
128   GIrNodeType *parameter_type2;  
129
130   gchar *interface;
131   gchar **errors;
132 };
133
134 struct _GIrNodeParam 
135 {
136   GIrNode node;
137
138   gboolean in;
139   gboolean out;
140   gboolean dipper;
141   gboolean optional;
142   gboolean retval;
143   gboolean allow_none;
144   gboolean transfer;
145   gboolean shallow_transfer;
146   GIScopeType scope;
147   
148   gint8 closure;
149   gint8 destroy;
150   
151   GIrNodeType *type;
152 };
153
154 struct _GIrNodeProperty
155 {
156   GIrNode node;
157
158   gboolean deprecated;
159
160   gchar *name;
161   gboolean readable;
162   gboolean writable;
163   gboolean construct;
164   gboolean construct_only;
165   
166   GIrNodeType *type;
167 };
168
169 struct _GIrNodeSignal 
170 {
171   GIrNode node;
172
173   gboolean deprecated;
174
175   gboolean run_first;
176   gboolean run_last;
177   gboolean run_cleanup;
178   gboolean no_recurse;
179   gboolean detailed;
180   gboolean action;
181   gboolean no_hooks;
182   
183   gboolean has_class_closure;
184   gboolean true_stops_emit;
185   
186   gint class_closure;
187   
188   GList *parameters;
189   GIrNodeParam *result;    
190 };
191
192 struct _GIrNodeVFunc 
193 {
194   GIrNode node;
195
196   gboolean is_varargs; /* Not in typelib yet */ 
197   gboolean must_chain_up;
198   gboolean must_be_implemented;
199   gboolean must_not_be_implemented;
200   gboolean is_class_closure;
201   
202   GList *parameters;
203   GIrNodeParam *result;      
204
205   gint offset;
206 };
207
208 struct _GIrNodeField
209 {
210   GIrNode node;
211
212   gboolean readable;
213   gboolean writable;
214   gint bits;
215   gint offset;
216   
217   GIrNodeType *type;
218 };
219
220 struct _GIrNodeInterface
221 {
222   GIrNode node;
223
224   gboolean abstract;
225   gboolean deprecated;
226
227   gchar *gtype_name;
228   gchar *gtype_init;
229
230   gchar *parent;
231   
232   GList *interfaces;
233   GList *prerequisites;
234
235   gint alignment;
236   gint size;
237   
238   GList *members;
239 };
240
241 struct _GIrNodeValue
242 {
243   GIrNode node;
244
245   gboolean deprecated;
246
247   guint32 value;
248 };
249
250 struct _GIrNodeConstant
251 {
252   GIrNode node;
253
254   gboolean deprecated;
255
256   GIrNodeType *type;
257   
258   gchar *value;
259 };
260
261 struct _GIrNodeEnum
262 {
263   GIrNode node;
264
265   gboolean deprecated;
266   gint storage_type;
267
268   gchar *gtype_name;
269   gchar *gtype_init;
270
271   GList *values;
272 };
273
274 struct _GIrNodeBoxed
275
276   GIrNode node;
277
278   gboolean deprecated;
279
280   gchar *gtype_name;
281   gchar *gtype_init;
282
283   gint alignment;
284   gint size;
285   
286   GList *members;
287 };
288
289 struct _GIrNodeStruct
290 {
291   GIrNode node;
292
293   gboolean deprecated;
294   gboolean disguised;
295
296   gchar *gtype_name;
297   gchar *gtype_init;
298
299   gint alignment;
300   gint size;
301   
302   GList *members;
303 };
304
305 struct _GIrNodeUnion
306 {
307   GIrNode node;
308
309   gboolean deprecated;
310   
311   GList *members;
312   GList *discriminators;
313
314   gchar *gtype_name;
315   gchar *gtype_init;
316
317   gint alignment;
318   gint size;
319
320   gint discriminator_offset;
321   GIrNodeType *discriminator_type;
322 };
323
324
325 struct _GIrNodeErrorDomain
326 {
327   GIrNode node;
328
329   gboolean deprecated;
330   
331   gchar *name;
332   gchar *getquark;
333   gchar *codes;
334 };
335
336
337 GIrNode * g_ir_node_new             (GIrNodeTypeId type);
338 void      g_ir_node_free            (GIrNode    *node);
339 guint32   g_ir_node_get_size        (GIrNode    *node);
340 guint32   g_ir_node_get_full_size   (GIrNode    *node);
341 void      g_ir_node_build_typelib   (GIrNode    *node,
342                                      GIrModule  *module,
343                                      GList       *modules,
344                                      GHashTable  *strings,
345                                      GHashTable  *types,
346                                      guchar      *data,
347                                      guint32     *offset,
348                                      guint32     *offset2);
349 int       g_ir_node_cmp             (GIrNode    *node,
350                                      GIrNode    *other);
351 gboolean  g_ir_node_can_have_member (GIrNode    *node);
352 void      g_ir_node_add_member      (GIrNode         *node,
353                                      GIrNodeFunction *member);
354 guint32   write_string              (const gchar *str,
355                                      GHashTable  *strings, 
356                                      guchar      *data,
357                                      guint32     *offset);
358
359 const gchar * g_ir_node_param_direction_string (GIrNodeParam * node);
360 const gchar * g_ir_node_type_to_string         (GIrNodeTypeId type);
361
362 gboolean g_ir_find_node (GIrModule  *module,
363                          GList      *modules,
364                          const char *name,
365                          GIrNode   **node_out,
366                          GIrModule **module_out);
367
368 /* In giroffsets.c */
369
370 void g_ir_node_compute_offsets (GIrNode   *node,
371                                 GIrModule *module,
372                                 GList     *modules);
373
374
375 G_END_DECLS
376
377 #endif  /* __G_IR_NODE_H__ */