Bug 560252 - Compute field offsets before writing typelib
[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   
147   GIrNodeType *type;
148 };
149
150 struct _GIrNodeProperty
151 {
152   GIrNode node;
153
154   gboolean deprecated;
155
156   gchar *name;
157   gboolean readable;
158   gboolean writable;
159   gboolean construct;
160   gboolean construct_only;
161   
162   GIrNodeType *type;
163 };
164
165 struct _GIrNodeSignal 
166 {
167   GIrNode node;
168
169   gboolean deprecated;
170
171   gboolean run_first;
172   gboolean run_last;
173   gboolean run_cleanup;
174   gboolean no_recurse;
175   gboolean detailed;
176   gboolean action;
177   gboolean no_hooks;
178   
179   gboolean has_class_closure;
180   gboolean true_stops_emit;
181   
182   gint class_closure;
183   
184   GList *parameters;
185   GIrNodeParam *result;    
186 };
187
188 struct _GIrNodeVFunc 
189 {
190   GIrNode node;
191
192   gboolean is_varargs; /* Not in typelib yet */ 
193   gboolean must_chain_up;
194   gboolean must_be_implemented;
195   gboolean must_not_be_implemented;
196   gboolean is_class_closure;
197   
198   GList *parameters;
199   GIrNodeParam *result;      
200
201   gint offset;
202 };
203
204 struct _GIrNodeField
205 {
206   GIrNode node;
207
208   gboolean readable;
209   gboolean writable;
210   gint bits;
211   gint offset;
212   
213   GIrNodeType *type;
214 };
215
216 struct _GIrNodeInterface
217 {
218   GIrNode node;
219
220   gboolean abstract;
221   gboolean deprecated;
222
223   gchar *gtype_name;
224   gchar *gtype_init;
225
226   gchar *parent;
227   
228   GList *interfaces;
229   GList *prerequisites;
230
231   GList *members;
232 };
233
234 struct _GIrNodeValue
235 {
236   GIrNode node;
237
238   gboolean deprecated;
239
240   guint32 value;
241 };
242
243 struct _GIrNodeConstant
244 {
245   GIrNode node;
246
247   gboolean deprecated;
248
249   GIrNodeType *type;
250   
251   gchar *value;
252 };
253
254 struct _GIrNodeEnum
255 {
256   GIrNode node;
257
258   gboolean deprecated;
259
260   gchar *gtype_name;
261   gchar *gtype_init;
262
263   GList *values;
264 };
265
266 struct _GIrNodeBoxed
267
268   GIrNode node;
269
270   gboolean deprecated;
271
272   gchar *gtype_name;
273   gchar *gtype_init;
274
275   gint alignment;
276   gint size;
277   
278   GList *members;
279 };
280
281 struct _GIrNodeStruct
282 {
283   GIrNode node;
284
285   gboolean deprecated;
286   gboolean disguised;
287
288   gchar *gtype_name;
289   gchar *gtype_init;
290
291   gint alignment;
292   gint size;
293   
294   GList *members;
295 };
296
297 struct _GIrNodeUnion
298 {
299   GIrNode node;
300
301   gboolean deprecated;
302   
303   GList *members;
304   GList *discriminators;
305
306   gchar *gtype_name;
307   gchar *gtype_init;
308
309   gint alignment;
310   gint size;
311
312   gint discriminator_offset;
313   GIrNodeType *discriminator_type;
314 };
315
316
317 struct _GIrNodeErrorDomain
318 {
319   GIrNode node;
320
321   gboolean deprecated;
322   
323   gchar *name;
324   gchar *getquark;
325   gchar *codes;
326 };
327
328
329 GIrNode * g_ir_node_new             (GIrNodeTypeId type);
330 void      g_ir_node_free            (GIrNode    *node);
331 guint32   g_ir_node_get_size        (GIrNode    *node);
332 guint32   g_ir_node_get_full_size   (GIrNode    *node);
333 void      g_ir_node_build_typelib   (GIrNode    *node,
334                                      GIrModule  *module,
335                                      GList       *modules,
336                                      GHashTable  *strings,
337                                      GHashTable  *types,
338                                      guchar      *data,
339                                      guint32     *offset,
340                                      guint32     *offset2);
341 int       g_ir_node_cmp             (GIrNode    *node,
342                                      GIrNode    *other);
343 gboolean  g_ir_node_can_have_member (GIrNode    *node);
344 void      g_ir_node_add_member      (GIrNode         *node,
345                                      GIrNodeFunction *member);
346 guint32   write_string              (const gchar *str,
347                                      GHashTable  *strings, 
348                                      guchar      *data,
349                                      guint32     *offset);
350
351 const gchar * g_ir_node_param_direction_string (GIrNodeParam * node);
352 const gchar * g_ir_node_type_to_string         (GIrNodeTypeId type);
353
354 gboolean g_ir_find_node (GIrModule  *module,
355                          GList      *modules,
356                          const char *name,
357                          GIrNode   **node_out,
358                          GIrModule **module_out);
359
360 /* In giroffsets.c */
361
362 void g_ir_node_compute_offsets (GIrNode   *node,
363                                 GIrModule *module,
364                                 GList     *modules);
365
366
367 G_END_DECLS
368
369 #endif  /* __G_IR_NODE_H__ */