1 /* GObject introspection: Repository implementation
3 * Copyright (C) 2005 Matthias Clasen
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.
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.
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.
25 #include <glib-object.h>
27 #include "girepository.h"
34 GIBaseInfo *container;
40 struct _GIUnresolvedInfo
44 GIBaseInfo *container;
47 const gchar *namespace;
50 struct _GICallableInfo
55 struct _GIFunctionInfo
57 GICallableInfo callable;
60 struct _GICallbackInfo
62 GICallableInfo callable;
65 struct _GIRegisteredTypeInfo
72 GIRegisteredTypeInfo registered;
77 GIRegisteredTypeInfo registered;
82 GIRegisteredTypeInfo registered;
85 struct _GIInterfaceInfo
87 GIRegisteredTypeInfo registered;
90 struct _GIConstantInfo
102 GICallableInfo callable;
107 GICallableInfo callable;
110 struct _GIPropertyInfo
132 GIRegisteredTypeInfo registered;
138 g_info_new (GIInfoType type,
139 GIBaseInfo *container,
145 info = g_new0 (GIBaseInfo, 1);
150 info->typelib = typelib;
151 info->offset = offset;
154 info->container = g_base_info_ref (container);
160 g_info_from_entry (GTypelib *typelib,
164 DirEntry *entry = g_typelib_get_dir_entry (typelib, index);
167 result = g_info_new (entry->blob_type, NULL, typelib, entry->offset);
170 const gchar *namespace = g_typelib_get_string (typelib, entry->offset);
171 const gchar *name = g_typelib_get_string (typelib, entry->name);
173 GIRepository *repository = g_irepository_get_default ();
175 result = g_irepository_find_by_name (repository, namespace, name);
178 GIUnresolvedInfo *unresolved;
180 unresolved = g_new0 (GIUnresolvedInfo, 1);
182 unresolved->type = GI_INFO_TYPE_UNRESOLVED;
183 unresolved->ref_count = 1;
184 unresolved->container = NULL;
185 unresolved->name = name;
186 unresolved->namespace = namespace;
188 return (GIBaseInfo*)unresolved;
196 /* GIBaseInfo functions */
198 g_base_info_ref (GIBaseInfo *info)
206 g_base_info_unref (GIBaseInfo *info)
208 g_assert (info->ref_count > 0);
211 if (!info->ref_count)
214 g_base_info_unref (info->container);
221 g_base_info_get_type (GIBaseInfo *info)
228 g_base_info_get_name (GIBaseInfo *info)
230 g_assert (info->ref_count > 0);
233 case GI_INFO_TYPE_FUNCTION:
234 case GI_INFO_TYPE_CALLBACK:
235 case GI_INFO_TYPE_STRUCT:
236 case GI_INFO_TYPE_BOXED:
237 case GI_INFO_TYPE_ENUM:
238 case GI_INFO_TYPE_FLAGS:
239 case GI_INFO_TYPE_OBJECT:
240 case GI_INFO_TYPE_INTERFACE:
241 case GI_INFO_TYPE_CONSTANT:
242 case GI_INFO_TYPE_ERROR_DOMAIN:
243 case GI_INFO_TYPE_UNION:
245 CommonBlob *blob = (CommonBlob *)&info->typelib->data[info->offset];
247 return g_typelib_get_string (info->typelib, blob->name);
251 case GI_INFO_TYPE_VALUE:
253 ValueBlob *blob = (ValueBlob *)&info->typelib->data[info->offset];
255 return g_typelib_get_string (info->typelib, blob->name);
259 case GI_INFO_TYPE_SIGNAL:
261 SignalBlob *blob = (SignalBlob *)&info->typelib->data[info->offset];
263 return g_typelib_get_string (info->typelib, blob->name);
267 case GI_INFO_TYPE_PROPERTY:
269 PropertyBlob *blob = (PropertyBlob *)&info->typelib->data[info->offset];
271 return g_typelib_get_string (info->typelib, blob->name);
275 case GI_INFO_TYPE_VFUNC:
277 VFuncBlob *blob = (VFuncBlob *)&info->typelib->data[info->offset];
279 return g_typelib_get_string (info->typelib, blob->name);
283 case GI_INFO_TYPE_FIELD:
285 FieldBlob *blob = (FieldBlob *)&info->typelib->data[info->offset];
287 return g_typelib_get_string (info->typelib, blob->name);
291 case GI_INFO_TYPE_ARG:
293 ArgBlob *blob = (ArgBlob *)&info->typelib->data[info->offset];
295 return g_typelib_get_string (info->typelib, blob->name);
298 case GI_INFO_TYPE_UNRESOLVED:
300 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
302 return unresolved->name;
305 case GI_INFO_TYPE_TYPE:
307 g_assert_not_reached ();
315 g_base_info_get_namespace (GIBaseInfo *info)
317 Header *header = (Header *)info->typelib->data;
319 g_assert (info->ref_count > 0);
321 if (info->type == GI_INFO_TYPE_UNRESOLVED)
323 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
325 return unresolved->namespace;
328 return g_typelib_get_string (info->typelib, header->namespace);
332 g_base_info_is_deprecated (GIBaseInfo *info)
336 case GI_INFO_TYPE_FUNCTION:
337 case GI_INFO_TYPE_CALLBACK:
338 case GI_INFO_TYPE_STRUCT:
339 case GI_INFO_TYPE_BOXED:
340 case GI_INFO_TYPE_ENUM:
341 case GI_INFO_TYPE_FLAGS:
342 case GI_INFO_TYPE_OBJECT:
343 case GI_INFO_TYPE_INTERFACE:
344 case GI_INFO_TYPE_CONSTANT:
345 case GI_INFO_TYPE_ERROR_DOMAIN:
347 CommonBlob *blob = (CommonBlob *)&info->typelib->data[info->offset];
349 return blob->deprecated;
353 case GI_INFO_TYPE_VALUE:
355 ValueBlob *blob = (ValueBlob *)&info->typelib->data[info->offset];
357 return blob->deprecated;
361 case GI_INFO_TYPE_SIGNAL:
363 SignalBlob *blob = (SignalBlob *)&info->typelib->data[info->offset];
365 return blob->deprecated;
369 case GI_INFO_TYPE_PROPERTY:
371 PropertyBlob *blob = (PropertyBlob *)&info->typelib->data[info->offset];
373 return blob->deprecated;
377 case GI_INFO_TYPE_VFUNC:
378 case GI_INFO_TYPE_FIELD:
379 case GI_INFO_TYPE_ARG:
380 case GI_INFO_TYPE_TYPE:
382 /* no deprecation flag for these */
389 cmp_annotation (const void *av,
392 const AnnotationBlob *a = av;
393 const AnnotationBlob *b = bv;
395 if (b->offset < a->offset)
398 if (b->offset > a->offset)
405 g_base_info_get_annotation (GIBaseInfo *info,
408 GIBaseInfo *base = (GIBaseInfo *)info;
409 Header *header = (Header *)base->typelib->data;
410 AnnotationBlob blob, *first, *after, *res, *next;
413 blob.offset = base->offset;
415 first = (AnnotationBlob *) &base->typelib->data[header->annotations];
416 after = (AnnotationBlob *) &base->typelib->data[header->annotations +
417 header->n_annotations * header->annotation_blob_size];
419 res = bsearch (&blob, first, header->n_annotations,
420 header->annotation_blob_size, cmp_annotation);
429 next = res -= header->annotation_blob_size;
431 while (next >= first && next->offset == base->offset);
438 rname = g_typelib_get_string (base->typelib, res->name);
439 if (strcmp (name, rname) == 0)
440 return g_typelib_get_string (base->typelib, res->value);
442 next = res += header->annotation_blob_size;
444 while (next < after && next->offset == base->offset);
450 g_base_info_get_container (GIBaseInfo *info)
452 return info->container;
456 g_base_info_get_typelib (GIBaseInfo *info)
458 return info->typelib;
461 /* GIFunctionInfo functions */
463 g_function_info_get_symbol (GIFunctionInfo *info)
465 GIBaseInfo *base = (GIBaseInfo *)info;
466 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
468 return g_typelib_get_string (base->typelib, blob->symbol);
472 g_function_info_get_flags (GIFunctionInfo *info)
474 GIFunctionInfoFlags flags;
475 GIBaseInfo *base = (GIBaseInfo *)info;
476 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
480 /* Make sure we don't flag Constructors as methods */
481 if (base->container != NULL && !blob->constructor)
482 flags = flags | GI_FUNCTION_IS_METHOD;
484 if (blob->constructor)
485 flags = flags | GI_FUNCTION_IS_CONSTRUCTOR;
488 flags = flags | GI_FUNCTION_IS_GETTER;
491 flags = flags | GI_FUNCTION_IS_SETTER;
493 if (blob->wraps_vfunc)
494 flags = flags | GI_FUNCTION_WRAPS_VFUNC;
497 flags = flags | GI_FUNCTION_THROWS;
503 g_function_info_get_property (GIFunctionInfo *info)
505 GIBaseInfo *base = (GIBaseInfo *)info;
506 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
507 GIInterfaceInfo *container = (GIInterfaceInfo *)base->container;
509 return g_interface_info_get_property (container, blob->index);
513 g_function_info_get_vfunc (GIFunctionInfo *info)
515 GIBaseInfo *base = (GIBaseInfo *)info;
516 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
517 GIInterfaceInfo *container = (GIInterfaceInfo *)base->container;
519 return g_interface_info_get_vfunc (container, blob->index);
523 /* GICallableInfo functions */
525 signature_offset (GICallableInfo *info)
528 switch (info->base.type)
530 case GI_INFO_TYPE_FUNCTION:
531 sigoff = G_STRUCT_OFFSET (FunctionBlob, signature);
533 case GI_INFO_TYPE_VFUNC:
534 sigoff = G_STRUCT_OFFSET (VFuncBlob, signature);
536 case GI_INFO_TYPE_CALLBACK:
537 sigoff = G_STRUCT_OFFSET (CallbackBlob, signature);
539 case GI_INFO_TYPE_SIGNAL:
540 sigoff = G_STRUCT_OFFSET (SignalBlob, signature);
544 return *(guint32 *)&info->base.typelib->data[info->base.offset + sigoff];
549 g_type_info_new (GIBaseInfo *container,
553 SimpleTypeBlob *type = (SimpleTypeBlob *)&typelib->data[offset];
555 return (GITypeInfo *) g_info_new (GI_INFO_TYPE_TYPE, container, typelib,
556 (type->reserved == 0 && type->reserved2 == 0) ? offset : type->offset);
560 * g_callable_info_get_return_type:
561 * @info: a #GICallableInfo
563 * Get the return type of a callable item as
566 * Returns: a #GITypeInfo idexing the TypeBlob for the
567 * return type of #info
570 g_callable_info_get_return_type (GICallableInfo *info)
572 GIBaseInfo *base = (GIBaseInfo *)info;
575 offset = signature_offset (info);
577 return g_type_info_new (base, base->typelib, offset);
581 * g_callable_info_may_return_null:
582 * @info: a #GICallableInfo
584 * See if a callable could return NULL.
586 * Returns: TRUE if callable could return NULL
589 g_callable_info_may_return_null (GICallableInfo *info)
591 GIBaseInfo *base = (GIBaseInfo *)info;
592 SignatureBlob *blob = (SignatureBlob *)&base->typelib->data[signature_offset (info)];
594 return blob->may_return_null;
598 * g_callable_info_get_caller_owns:
599 * @info: a #GICallableInfo
601 * See whether the caller owns the return value
604 * Returns: TRUE if the caller owns the return value, FALSE otherwise.
607 g_callable_info_get_caller_owns (GICallableInfo *info)
609 GIBaseInfo *base = (GIBaseInfo *)info;
610 SignatureBlob *blob = (SignatureBlob *)&base->typelib->data[signature_offset (info)];
612 if (blob->caller_owns_return_value)
613 return GI_TRANSFER_EVERYTHING;
614 else if (blob->caller_owns_return_container)
615 return GI_TRANSFER_CONTAINER;
617 return GI_TRANSFER_NOTHING;
621 * g_callable_info_get_n_args:
622 * @info: a #GICallableInfo
624 * Get the number of arguments (both IN and OUT) for this callable.
626 * Returns: The number of arguments this callable expects.
629 g_callable_info_get_n_args (GICallableInfo *info)
631 GIBaseInfo *base = (GIBaseInfo *)info;
635 offset = signature_offset (info);
636 blob = (SignatureBlob *)&base->typelib->data[offset];
638 return blob->n_arguments;
642 * g_callable_info_get_arg:
643 * @info: a #GICallableInfo
645 * Get information about a particular argument of this callable.
647 * Returns: A #GIArgInfo indexing the typelib on the given argument.
650 g_callable_info_get_arg (GICallableInfo *info,
653 GIBaseInfo *base = (GIBaseInfo *)info;
654 Header *header = (Header *)base->typelib->data;
657 offset = signature_offset (info);
659 return (GIArgInfo *) g_info_new (GI_INFO_TYPE_ARG, base, base->typelib,
660 offset + header->signature_blob_size + n * header->arg_blob_size);
663 /* GIArgInfo function */
665 g_arg_info_get_direction (GIArgInfo *info)
667 GIBaseInfo *base = (GIBaseInfo *)info;
668 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
670 if (blob->in && blob->out)
671 return GI_DIRECTION_INOUT;
673 return GI_DIRECTION_OUT;
675 return GI_DIRECTION_IN;
679 g_arg_info_is_return_value (GIArgInfo *info)
681 GIBaseInfo *base = (GIBaseInfo *)info;
682 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
684 return blob->return_value;
688 g_arg_info_is_dipper (GIArgInfo *info)
690 GIBaseInfo *base = (GIBaseInfo *)info;
691 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
697 g_arg_info_is_optional (GIArgInfo *info)
699 GIBaseInfo *base = (GIBaseInfo *)info;
700 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
702 return blob->optional;
706 g_arg_info_may_be_null (GIArgInfo *info)
708 GIBaseInfo *base = (GIBaseInfo *)info;
709 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
711 return blob->allow_none;
715 g_arg_info_get_ownership_transfer (GIArgInfo *info)
717 GIBaseInfo *base = (GIBaseInfo *)info;
718 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
720 if (blob->transfer_ownership)
721 return GI_TRANSFER_EVERYTHING;
722 else if (blob->transfer_container_ownership)
723 return GI_TRANSFER_CONTAINER;
725 return GI_TRANSFER_NOTHING;
729 g_arg_info_get_type (GIArgInfo *info)
731 GIBaseInfo *base = (GIBaseInfo *)info;
733 return g_type_info_new (base, base->typelib, base->offset + 8);
736 /* GITypeInfo functions */
738 g_type_info_is_pointer (GITypeInfo *info)
740 GIBaseInfo *base = (GIBaseInfo *)info;
741 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
743 if (type->reserved == 0 && type->reserved2 == 0)
744 return type->pointer;
747 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
749 return iface->pointer;
754 g_type_info_get_tag (GITypeInfo *info)
756 GIBaseInfo *base = (GIBaseInfo *)info;
757 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
759 if (type->reserved == 0 && type->reserved2 == 0)
763 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
770 g_type_info_get_param_type (GITypeInfo *info,
773 GIBaseInfo *base = (GIBaseInfo *)info;
774 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
776 if (!(type->reserved == 0 && type->reserved2 == 0))
778 ParamTypeBlob *param = (ParamTypeBlob *)&base->typelib->data[base->offset];
782 case GI_TYPE_TAG_ARRAY:
783 case GI_TYPE_TAG_GLIST:
784 case GI_TYPE_TAG_GSLIST:
785 case GI_TYPE_TAG_GHASH:
786 return g_type_info_new (base, base->typelib, base->offset + 4 + 4 * n);
797 g_type_info_get_interface (GITypeInfo *info)
799 GIBaseInfo *base = (GIBaseInfo *)info;
800 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
802 if (!(type->reserved == 0 && type->reserved2 == 0))
804 InterfaceTypeBlob *blob = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
806 if (blob->tag == GI_TYPE_TAG_INTERFACE)
807 return g_info_from_entry (base->typelib, blob->interface);
814 g_type_info_get_array_length (GITypeInfo *info)
816 GIBaseInfo *base = (GIBaseInfo *)info;
817 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
819 if (!(type->reserved == 0 && type->reserved2 == 0))
821 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
823 if (blob->tag == GI_TYPE_TAG_ARRAY)
825 if (blob->has_length)
834 g_type_info_get_array_fixed_size (GITypeInfo *info)
836 GIBaseInfo *base = (GIBaseInfo *)info;
837 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
839 if (!(type->reserved == 0 && type->reserved2 == 0))
841 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
843 if (blob->tag == GI_TYPE_TAG_ARRAY)
854 g_type_info_is_zero_terminated (GITypeInfo *info)
856 GIBaseInfo *base = (GIBaseInfo *)info;
857 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
859 if (!(type->reserved == 0 && type->reserved2 == 0))
861 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
863 if (blob->tag == GI_TYPE_TAG_ARRAY)
864 return blob->zero_terminated;
871 g_type_info_get_n_error_domains (GITypeInfo *info)
873 GIBaseInfo *base = (GIBaseInfo *)info;
874 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
876 if (!(type->reserved == 0 && type->reserved2 == 0))
878 ErrorTypeBlob *blob = (ErrorTypeBlob *)&base->typelib->data[base->offset];
880 if (blob->tag == GI_TYPE_TAG_ERROR)
881 return blob->n_domains;
888 g_type_info_get_error_domain (GITypeInfo *info,
891 GIBaseInfo *base = (GIBaseInfo *)info;
892 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
894 if (!(type->reserved == 0 && type->reserved2 == 0))
896 ErrorTypeBlob *blob = (ErrorTypeBlob *)&base->typelib->data[base->offset];
898 if (blob->tag == GI_TYPE_TAG_ERROR)
899 return (GIErrorDomainInfo *) g_info_from_entry (base->typelib,
907 /* GIErrorDomainInfo functions */
909 g_error_domain_info_get_quark (GIErrorDomainInfo *info)
911 GIBaseInfo *base = (GIBaseInfo *)info;
912 ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->typelib->data[base->offset];
914 return g_typelib_get_string (base->typelib, blob->get_quark);
918 g_error_domain_info_get_codes (GIErrorDomainInfo *info)
920 GIBaseInfo *base = (GIBaseInfo *)info;
921 ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->typelib->data[base->offset];
923 return (GIInterfaceInfo *) g_info_from_entry (base->typelib, blob->error_codes);
927 /* GIValueInfo functions */
929 g_value_info_get_value (GIValueInfo *info)
931 GIBaseInfo *base = (GIBaseInfo *)info;
932 ValueBlob *blob = (ValueBlob *)&base->typelib->data[base->offset];
934 return (glong)blob->value;
937 /* GIFieldInfo functions */
939 g_field_info_get_flags (GIFieldInfo *info)
941 GIFieldInfoFlags flags;
943 GIBaseInfo *base = (GIBaseInfo *)info;
944 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
949 flags = flags | GI_FIELD_IS_READABLE;
952 flags = flags | GI_FIELD_IS_WRITABLE;
958 g_field_info_get_size (GIFieldInfo *info)
960 GIBaseInfo *base = (GIBaseInfo *)info;
961 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
967 g_field_info_get_offset (GIFieldInfo *info)
969 GIBaseInfo *base = (GIBaseInfo *)info;
970 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
972 return blob->struct_offset;
976 g_field_info_get_type (GIFieldInfo *info)
978 GIBaseInfo *base = (GIBaseInfo *)info;
980 return g_type_info_new (base, base->typelib, base->offset + 8);
983 /* GIRegisteredTypeInfo functions */
985 g_registered_type_info_get_type_name (GIRegisteredTypeInfo *info)
987 GIBaseInfo *base = (GIBaseInfo *)info;
988 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&base->typelib->data[base->offset];
990 if (blob->gtype_name)
991 return g_typelib_get_string (base->typelib, blob->gtype_name);
997 g_registered_type_info_get_type_init (GIRegisteredTypeInfo *info)
999 GIBaseInfo *base = (GIBaseInfo *)info;
1000 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&base->typelib->data[base->offset];
1002 if (blob->gtype_init)
1003 return g_typelib_get_string (base->typelib, blob->gtype_init);
1009 g_registered_type_info_get_g_type (GIRegisteredTypeInfo *info)
1011 const char *type_init;
1012 GType (* get_type_func) (void);
1014 type_init = g_registered_type_info_get_type_init (info);
1016 if (type_init == NULL)
1019 get_type_func = NULL;
1020 if (!g_typelib_symbol (((GIBaseInfo*)info)->typelib,
1022 (void**) &get_type_func))
1025 return (* get_type_func) ();
1028 /* GIStructInfo functions */
1030 g_struct_info_get_n_fields (GIStructInfo *info)
1032 GIBaseInfo *base = (GIBaseInfo *)info;
1033 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1035 return blob->n_fields;
1039 g_struct_info_get_field (GIStructInfo *info,
1042 GIBaseInfo *base = (GIBaseInfo *)info;
1043 Header *header = (Header *)base->typelib->data;
1045 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib,
1046 base->offset + header->struct_blob_size +
1047 n * header->field_blob_size);
1051 g_struct_info_get_n_methods (GIStructInfo *info)
1053 GIBaseInfo *base = (GIBaseInfo *)info;
1054 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1056 return blob->n_methods;
1060 g_struct_info_get_method (GIStructInfo *info,
1063 GIBaseInfo *base = (GIBaseInfo *)info;
1064 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1065 Header *header = (Header *)base->typelib->data;
1068 offset = base->offset + header->struct_blob_size
1069 + blob->n_fields * header->field_blob_size
1070 + n * header->function_blob_size;
1071 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1072 base->typelib, offset);
1075 static GIFunctionInfo *
1076 find_method (GIBaseInfo *base,
1082 Header *header = (Header *)base->typelib->data;
1085 for (i = 0; i < n_methods; i++)
1087 FunctionBlob *fblob = (FunctionBlob *)&base->typelib->data[offset];
1088 const gchar *fname = (const gchar *)&base->typelib->data[fblob->name];
1090 if (strcmp (name, fname) == 0)
1091 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1092 base->typelib, offset);
1094 offset += header->function_blob_size;
1101 g_struct_info_find_method (GIStructInfo *info,
1105 GIBaseInfo *base = (GIBaseInfo *)info;
1106 Header *header = (Header *)base->typelib->data;
1107 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1109 offset = base->offset + header->struct_blob_size
1110 + blob->n_fields * header->field_blob_size;
1112 return find_method (base, offset, blob->n_methods, name);
1116 g_enum_info_get_n_values (GIEnumInfo *info)
1118 GIBaseInfo *base = (GIBaseInfo *)info;
1119 EnumBlob *blob = (EnumBlob *)&base->typelib->data[base->offset];
1121 return blob->n_values;
1125 g_enum_info_get_value (GIEnumInfo *info,
1128 GIBaseInfo *base = (GIBaseInfo *)info;
1129 Header *header = (Header *)base->typelib->data;
1132 offset = base->offset + header->enum_blob_size
1133 + n * header->value_blob_size;
1134 return (GIValueInfo *) g_info_new (GI_INFO_TYPE_VALUE, base, base->typelib, offset);
1137 /* GIObjectInfo functions */
1139 g_object_info_get_parent (GIObjectInfo *info)
1141 GIBaseInfo *base = (GIBaseInfo *)info;
1142 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1145 return (GIObjectInfo *) g_info_from_entry (base->typelib, blob->parent);
1151 g_object_info_get_abstract (GIObjectInfo *info)
1153 GIBaseInfo *base = (GIBaseInfo *)info;
1154 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1155 return blob->abstract != 0;
1159 g_object_info_get_type_name (GIObjectInfo *info)
1161 GIBaseInfo *base = (GIBaseInfo *)info;
1162 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1164 return g_typelib_get_string (base->typelib, blob->gtype_name);
1168 g_object_info_get_type_init (GIObjectInfo *info)
1170 GIBaseInfo *base = (GIBaseInfo *)info;
1171 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1173 return g_typelib_get_string (base->typelib, blob->gtype_init);
1177 g_object_info_get_n_interfaces (GIObjectInfo *info)
1179 GIBaseInfo *base = (GIBaseInfo *)info;
1180 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1182 return blob->n_interfaces;
1186 g_object_info_get_interface (GIObjectInfo *info,
1189 GIBaseInfo *base = (GIBaseInfo *)info;
1190 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1192 return (GIInterfaceInfo *) g_info_from_entry (base->typelib, blob->interfaces[n]);
1196 g_object_info_get_n_fields (GIObjectInfo *info)
1198 GIBaseInfo *base = (GIBaseInfo *)info;
1199 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1201 return blob->n_fields;
1205 g_object_info_get_field (GIObjectInfo *info,
1209 GIBaseInfo *base = (GIBaseInfo *)info;
1210 Header *header = (Header *)base->typelib->data;
1211 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1213 offset = base->offset + header->object_blob_size
1214 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1215 + n * header->field_blob_size;
1217 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib, offset);
1221 g_object_info_get_n_properties (GIObjectInfo *info)
1223 GIBaseInfo *base = (GIBaseInfo *)info;
1224 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1226 return blob->n_properties;
1230 g_object_info_get_property (GIObjectInfo *info,
1234 GIBaseInfo *base = (GIBaseInfo *)info;
1235 Header *header = (Header *)base->typelib->data;
1236 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1238 offset = base->offset + header->object_blob_size
1239 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1240 + blob->n_fields * header->field_blob_size
1241 + n * header->property_blob_size;
1243 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base,
1244 base->typelib, offset);
1248 g_object_info_get_n_methods (GIObjectInfo *info)
1250 GIBaseInfo *base = (GIBaseInfo *)info;
1251 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1253 return blob->n_methods;
1257 g_object_info_get_method (GIObjectInfo *info,
1261 GIBaseInfo *base = (GIBaseInfo *)info;
1262 Header *header = (Header *)base->typelib->data;
1263 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1265 offset = base->offset + header->object_blob_size
1266 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1267 + blob->n_fields * header->field_blob_size
1268 + blob->n_properties * header->property_blob_size
1269 + n * header->function_blob_size;
1271 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1272 base->typelib, offset);
1276 g_object_info_find_method (GIObjectInfo *info,
1280 GIBaseInfo *base = (GIBaseInfo *)info;
1281 Header *header = (Header *)base->typelib->data;
1282 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1284 offset = base->offset + header->object_blob_size
1285 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1286 + blob->n_fields * header->field_blob_size +
1287 + blob->n_properties * header->property_blob_size;
1289 return find_method (base, offset, blob->n_methods, name);
1293 g_object_info_get_n_signals (GIObjectInfo *info)
1295 GIBaseInfo *base = (GIBaseInfo *)info;
1296 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1298 return blob->n_signals;
1302 g_object_info_get_signal (GIObjectInfo *info,
1306 GIBaseInfo *base = (GIBaseInfo *)info;
1307 Header *header = (Header *)base->typelib->data;
1308 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1310 offset = base->offset + header->object_blob_size
1311 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1312 + blob->n_fields * header->field_blob_size
1313 + blob->n_properties * header->property_blob_size
1314 + blob->n_methods * header->function_blob_size
1315 + n * header->signal_blob_size;
1317 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base,
1318 base->typelib, offset);
1322 g_object_info_get_n_vfuncs (GIObjectInfo *info)
1324 GIBaseInfo *base = (GIBaseInfo *)info;
1325 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1327 return blob->n_vfuncs;
1331 g_object_info_get_vfunc (GIObjectInfo *info,
1335 GIBaseInfo *base = (GIBaseInfo *)info;
1336 Header *header = (Header *)base->typelib->data;
1337 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1339 offset = base->offset + header->object_blob_size
1340 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1341 + blob->n_fields * header->field_blob_size
1342 + blob->n_properties * header->property_blob_size
1343 + blob->n_methods * header->function_blob_size
1344 + blob->n_signals * header->signal_blob_size
1345 + n * header->vfunc_blob_size;
1347 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1348 base->typelib, offset);
1352 g_object_info_get_n_constants (GIObjectInfo *info)
1354 GIBaseInfo *base = (GIBaseInfo *)info;
1355 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1357 return blob->n_constants;
1361 g_object_info_get_constant (GIObjectInfo *info,
1365 GIBaseInfo *base = (GIBaseInfo *)info;
1366 Header *header = (Header *)base->typelib->data;
1367 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1369 offset = base->offset + header->object_blob_size
1370 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1371 + blob->n_fields * header->field_blob_size
1372 + blob->n_properties * header->property_blob_size
1373 + blob->n_methods * header->function_blob_size
1374 + blob->n_signals * header->signal_blob_size
1375 + blob->n_vfuncs * header->vfunc_blob_size
1376 + n * header->constant_blob_size;
1378 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1379 base->typelib, offset);
1383 /* GIInterfaceInfo functions */
1385 g_interface_info_get_n_prerequisites (GIInterfaceInfo *info)
1387 GIBaseInfo *base = (GIBaseInfo *)info;
1388 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1390 return blob->n_prerequisites;
1394 g_interface_info_get_prerequisite (GIInterfaceInfo *info,
1397 GIBaseInfo *base = (GIBaseInfo *)info;
1398 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1400 return g_info_from_entry (base->typelib, blob->prerequisites[n]);
1405 g_interface_info_get_n_properties (GIInterfaceInfo *info)
1407 GIBaseInfo *base = (GIBaseInfo *)info;
1408 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1410 return blob->n_properties;
1414 g_interface_info_get_property (GIInterfaceInfo *info,
1418 GIBaseInfo *base = (GIBaseInfo *)info;
1419 Header *header = (Header *)base->typelib->data;
1420 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1422 offset = base->offset + header->interface_blob_size
1423 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1424 + n * header->property_blob_size;
1426 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base,
1427 base->typelib, offset);
1431 g_interface_info_get_n_methods (GIInterfaceInfo *info)
1433 GIBaseInfo *base = (GIBaseInfo *)info;
1434 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1436 return blob->n_methods;
1440 g_interface_info_get_method (GIInterfaceInfo *info,
1444 GIBaseInfo *base = (GIBaseInfo *)info;
1445 Header *header = (Header *)base->typelib->data;
1446 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1448 offset = base->offset + header->interface_blob_size
1449 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1450 + blob->n_properties * header->property_blob_size
1451 + n * header->function_blob_size;
1453 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1454 base->typelib, offset);
1458 g_interface_info_find_method (GIInterfaceInfo *info,
1462 GIBaseInfo *base = (GIBaseInfo *)info;
1463 Header *header = (Header *)base->typelib->data;
1464 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1466 offset = base->offset + header->interface_blob_size
1467 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1468 + blob->n_properties * header->property_blob_size;
1470 return find_method (base, offset, blob->n_methods, name);
1474 g_interface_info_get_n_signals (GIInterfaceInfo *info)
1476 GIBaseInfo *base = (GIBaseInfo *)info;
1477 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1479 return blob->n_signals;
1483 g_interface_info_get_signal (GIInterfaceInfo *info,
1487 GIBaseInfo *base = (GIBaseInfo *)info;
1488 Header *header = (Header *)base->typelib->data;
1489 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1491 offset = base->offset + header->interface_blob_size
1492 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1493 + blob->n_properties * header->property_blob_size
1494 + blob->n_methods * header->function_blob_size
1495 + n * header->signal_blob_size;
1497 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base,
1498 base->typelib, offset);
1502 g_interface_info_get_n_vfuncs (GIInterfaceInfo *info)
1504 GIBaseInfo *base = (GIBaseInfo *)info;
1505 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1507 return blob->n_vfuncs;
1511 g_interface_info_get_vfunc (GIInterfaceInfo *info,
1515 GIBaseInfo *base = (GIBaseInfo *)info;
1516 Header *header = (Header *)base->typelib->data;
1517 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1519 offset = base->offset + header->interface_blob_size
1520 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1521 + blob->n_properties * header->property_blob_size
1522 + blob->n_methods * header->function_blob_size
1523 + blob->n_signals * header->signal_blob_size
1524 + n * header->vfunc_blob_size;
1526 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1527 base->typelib, offset);
1531 g_interface_info_get_n_constants (GIInterfaceInfo *info)
1533 GIBaseInfo *base = (GIBaseInfo *)info;
1534 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1536 return blob->n_constants;
1540 g_interface_info_get_constant (GIInterfaceInfo *info,
1544 GIBaseInfo *base = (GIBaseInfo *)info;
1545 Header *header = (Header *)base->typelib->data;
1546 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1548 offset = base->offset + header->interface_blob_size
1549 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1550 + blob->n_properties * header->property_blob_size
1551 + blob->n_methods * header->function_blob_size
1552 + blob->n_signals * header->signal_blob_size
1553 + blob->n_vfuncs * header->vfunc_blob_size
1554 + n * header->constant_blob_size;
1556 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1557 base->typelib, offset);
1563 /* GIPropertyInfo functions */
1565 g_property_info_get_flags (GIPropertyInfo *info)
1568 GIBaseInfo *base = (GIBaseInfo *)info;
1569 PropertyBlob *blob = (PropertyBlob *)&base->typelib->data[base->offset];
1574 flags = flags | G_PARAM_READABLE;
1577 flags = flags | G_PARAM_WRITABLE;
1579 if (blob->construct)
1580 flags = flags | G_PARAM_CONSTRUCT;
1582 if (blob->construct_only)
1583 flags = flags | G_PARAM_CONSTRUCT_ONLY;
1589 g_property_info_get_type (GIPropertyInfo *info)
1591 GIBaseInfo *base = (GIBaseInfo *)info;
1593 return g_type_info_new (base, base->typelib, base->offset + 8);
1597 /* GISignalInfo functions */
1599 g_signal_info_get_flags (GISignalInfo *info)
1603 GIBaseInfo *base = (GIBaseInfo *)info;
1604 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1608 if (blob->run_first)
1609 flags = flags | G_SIGNAL_RUN_FIRST;
1612 flags = flags | G_SIGNAL_RUN_LAST;
1614 if (blob->run_cleanup)
1615 flags = flags | G_SIGNAL_RUN_CLEANUP;
1617 if (blob->no_recurse)
1618 flags = flags | G_SIGNAL_NO_RECURSE;
1621 flags = flags | G_SIGNAL_DETAILED;
1624 flags = flags | G_SIGNAL_ACTION;
1627 flags = flags | G_SIGNAL_NO_HOOKS;
1633 g_signal_info_get_class_closure (GISignalInfo *info)
1635 GIBaseInfo *base = (GIBaseInfo *)info;
1636 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1638 if (blob->has_class_closure)
1639 return g_interface_info_get_vfunc ((GIInterfaceInfo *)base->container, blob->class_closure);
1645 g_signal_info_true_stops_emit (GISignalInfo *info)
1647 GIBaseInfo *base = (GIBaseInfo *)info;
1648 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1650 return blob->true_stops_emit;
1653 /* GIVFuncInfo functions */
1655 g_vfunc_info_get_flags (GIVFuncInfo *info)
1657 GIVFuncInfoFlags flags;
1659 GIBaseInfo *base = (GIBaseInfo *)info;
1660 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
1664 if (blob->must_chain_up)
1665 flags = flags | GI_VFUNC_MUST_CHAIN_UP;
1667 if (blob->must_be_implemented)
1668 flags = flags | GI_VFUNC_MUST_OVERRIDE;
1670 if (blob->must_not_be_implemented)
1671 flags = flags | GI_VFUNC_MUST_NOT_OVERRIDE;
1677 g_vfunc_info_get_offset (GIVFuncInfo *info)
1679 GIBaseInfo *base = (GIBaseInfo *)info;
1680 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
1682 return blob->struct_offset;
1686 g_vfunc_info_get_signal (GIVFuncInfo *info)
1688 GIBaseInfo *base = (GIBaseInfo *)info;
1689 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
1691 if (blob->class_closure)
1692 return g_interface_info_get_signal ((GIInterfaceInfo *)base->container, blob->signal);
1698 /* GIConstantInfo functions */
1700 g_constant_info_get_type (GIConstantInfo *info)
1702 GIBaseInfo *base = (GIBaseInfo *)info;
1704 return g_type_info_new (base, base->typelib, base->offset + 8);
1708 g_constant_info_get_value (GIConstantInfo *info,
1711 GIBaseInfo *base = (GIBaseInfo *)info;
1712 ConstantBlob *blob = (ConstantBlob *)&base->typelib->data[base->offset];
1714 /* FIXME non-basic types ? */
1715 if (blob->type.reserved == 0 && blob->type.reserved2 == 0)
1717 if (blob->type.pointer)
1718 value->v_pointer = g_memdup (&base->typelib->data[blob->offset], blob->size);
1721 switch (blob->type.tag)
1723 case GI_TYPE_TAG_BOOLEAN:
1724 value->v_boolean = *(gboolean*)&base->typelib->data[blob->offset];
1726 case GI_TYPE_TAG_INT8:
1727 value->v_int8 = *(gint8*)&base->typelib->data[blob->offset];
1729 case GI_TYPE_TAG_UINT8:
1730 value->v_uint8 = *(guint8*)&base->typelib->data[blob->offset];
1732 case GI_TYPE_TAG_INT16:
1733 value->v_int16 = *(gint16*)&base->typelib->data[blob->offset];
1735 case GI_TYPE_TAG_UINT16:
1736 value->v_uint16 = *(guint16*)&base->typelib->data[blob->offset];
1738 case GI_TYPE_TAG_INT32:
1739 value->v_int32 = *(gint32*)&base->typelib->data[blob->offset];
1741 case GI_TYPE_TAG_UINT32:
1742 value->v_uint32 = *(guint32*)&base->typelib->data[blob->offset];
1744 case GI_TYPE_TAG_INT64:
1745 value->v_int64 = *(gint64*)&base->typelib->data[blob->offset];
1747 case GI_TYPE_TAG_UINT64:
1748 value->v_uint64 = *(guint64*)&base->typelib->data[blob->offset];
1750 case GI_TYPE_TAG_FLOAT:
1751 value->v_float = *(gfloat*)&base->typelib->data[blob->offset];
1753 case GI_TYPE_TAG_DOUBLE:
1754 value->v_double = *(gdouble*)&base->typelib->data[blob->offset];
1756 case GI_TYPE_TAG_TIME_T:
1757 value->v_long = *(long*)&base->typelib->data[blob->offset];
1759 case GI_TYPE_TAG_INT:
1760 value->v_int = *(gint*)&base->typelib->data[blob->offset];
1762 case GI_TYPE_TAG_UINT:
1763 value->v_uint = *(guint*)&base->typelib->data[blob->offset];
1765 case GI_TYPE_TAG_LONG:
1766 value->v_long = *(glong*)&base->typelib->data[blob->offset];
1768 case GI_TYPE_TAG_ULONG:
1769 value->v_ulong = *(gulong*)&base->typelib->data[blob->offset];
1778 /* GIUnionInfo functions */
1780 g_union_info_get_n_fields (GIUnionInfo *info)
1782 GIBaseInfo *base = (GIBaseInfo *)info;
1783 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1785 return blob->n_fields;
1789 g_union_info_get_field (GIUnionInfo *info,
1792 GIBaseInfo *base = (GIBaseInfo *)info;
1793 Header *header = (Header *)base->typelib->data;
1795 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib,
1796 base->offset + header->union_blob_size +
1797 n * header->field_blob_size);
1801 g_union_info_get_n_methods (GIUnionInfo *info)
1803 GIBaseInfo *base = (GIBaseInfo *)info;
1804 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1806 return blob->n_functions;
1810 g_union_info_get_method (GIUnionInfo *info,
1813 GIBaseInfo *base = (GIBaseInfo *)info;
1814 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1815 Header *header = (Header *)base->typelib->data;
1818 offset = base->offset + header->union_blob_size
1819 + blob->n_fields * header->field_blob_size
1820 + n * header->function_blob_size;
1821 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1822 base->typelib, offset);
1826 g_union_info_is_discriminated (GIUnionInfo *info)
1828 GIBaseInfo *base = (GIBaseInfo *)info;
1829 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1831 return blob->discriminated;
1835 g_union_info_get_discriminator_offset (GIUnionInfo *info)
1837 GIBaseInfo *base = (GIBaseInfo *)info;
1838 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1840 return blob->discriminator_offset;
1844 g_union_info_get_discriminator_type (GIUnionInfo *info)
1846 GIBaseInfo *base = (GIBaseInfo *)info;
1848 return g_type_info_new (base, base->typelib, base->offset + 24);
1852 g_union_info_get_discriminator (GIUnionInfo *info,
1855 GIBaseInfo *base = (GIBaseInfo *)info;
1856 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1858 if (blob->discriminated)
1860 Header *header = (Header *)base->typelib->data;
1863 offset = base->offset + header->union_blob_size
1864 + blob->n_fields * header->field_blob_size
1865 + blob->n_functions * header->function_blob_size
1866 + n * header->constant_blob_size;
1868 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1869 base->typelib, offset);
1876 g_union_info_find_method (GIUnionInfo *info,
1880 GIBaseInfo *base = (GIBaseInfo *)info;
1881 Header *header = (Header *)base->typelib->data;
1882 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1884 offset = base->offset + header->union_blob_size
1885 + blob->n_fields * header->field_blob_size;
1887 return find_method (base, offset, blob->n_functions, name);