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