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>
34 GIRepository *repository;
35 GIBaseInfo *container;
41 struct _GIUnresolvedInfo
45 GIBaseInfo *container;
48 const gchar *namespace;
51 struct _GICallableInfo
56 struct _GIFunctionInfo
58 GICallableInfo callable;
61 struct _GICallbackInfo
63 GICallableInfo callable;
66 struct _GIRegisteredTypeInfo
73 GIRegisteredTypeInfo registered;
78 GIRegisteredTypeInfo registered;
83 GIRegisteredTypeInfo registered;
86 struct _GIInterfaceInfo
88 GIRegisteredTypeInfo registered;
91 struct _GIConstantInfo
103 GICallableInfo callable;
108 GICallableInfo callable;
111 struct _GIPropertyInfo
133 GIRegisteredTypeInfo registered;
139 g_info_new_full (GIInfoType type,
140 GIRepository *repository,
141 GIBaseInfo *container,
147 g_return_val_if_fail (container != NULL || repository != NULL, NULL);
149 info = g_new0 (GIBaseInfo, 1);
154 info->typelib = typelib;
155 info->offset = offset;
158 info->container = g_base_info_ref (container);
160 info->repository = g_object_ref (repository);
166 g_info_new (GIInfoType type,
167 GIBaseInfo *container,
171 return g_info_new_full (type, container->repository, container, typelib, offset);
175 g_info_from_entry (GIRepository *repository,
180 DirEntry *entry = g_typelib_get_dir_entry (typelib, index);
183 result = g_info_new_full (entry->blob_type, repository, NULL, typelib, entry->offset);
186 const gchar *namespace = g_typelib_get_string (typelib, entry->offset);
187 const gchar *name = g_typelib_get_string (typelib, entry->name);
189 result = g_irepository_find_by_name (repository, namespace, name);
192 GIUnresolvedInfo *unresolved;
194 unresolved = g_new0 (GIUnresolvedInfo, 1);
196 unresolved->type = GI_INFO_TYPE_UNRESOLVED;
197 unresolved->ref_count = 1;
198 unresolved->container = NULL;
199 unresolved->name = name;
200 unresolved->namespace = namespace;
202 return (GIBaseInfo*)unresolved;
210 /* GIBaseInfo functions */
212 g_base_info_ref (GIBaseInfo *info)
220 g_base_info_unref (GIBaseInfo *info)
222 g_assert (info->ref_count > 0);
225 if (!info->ref_count)
228 g_base_info_unref (info->container);
230 g_object_unref (info->repository);
237 g_base_info_get_type (GIBaseInfo *info)
244 g_base_info_get_name (GIBaseInfo *info)
246 g_assert (info->ref_count > 0);
249 case GI_INFO_TYPE_FUNCTION:
250 case GI_INFO_TYPE_CALLBACK:
251 case GI_INFO_TYPE_STRUCT:
252 case GI_INFO_TYPE_BOXED:
253 case GI_INFO_TYPE_ENUM:
254 case GI_INFO_TYPE_FLAGS:
255 case GI_INFO_TYPE_OBJECT:
256 case GI_INFO_TYPE_INTERFACE:
257 case GI_INFO_TYPE_CONSTANT:
258 case GI_INFO_TYPE_ERROR_DOMAIN:
259 case GI_INFO_TYPE_UNION:
261 CommonBlob *blob = (CommonBlob *)&info->typelib->data[info->offset];
263 return g_typelib_get_string (info->typelib, blob->name);
267 case GI_INFO_TYPE_VALUE:
269 ValueBlob *blob = (ValueBlob *)&info->typelib->data[info->offset];
271 return g_typelib_get_string (info->typelib, blob->name);
275 case GI_INFO_TYPE_SIGNAL:
277 SignalBlob *blob = (SignalBlob *)&info->typelib->data[info->offset];
279 return g_typelib_get_string (info->typelib, blob->name);
283 case GI_INFO_TYPE_PROPERTY:
285 PropertyBlob *blob = (PropertyBlob *)&info->typelib->data[info->offset];
287 return g_typelib_get_string (info->typelib, blob->name);
291 case GI_INFO_TYPE_VFUNC:
293 VFuncBlob *blob = (VFuncBlob *)&info->typelib->data[info->offset];
295 return g_typelib_get_string (info->typelib, blob->name);
299 case GI_INFO_TYPE_FIELD:
301 FieldBlob *blob = (FieldBlob *)&info->typelib->data[info->offset];
303 return g_typelib_get_string (info->typelib, blob->name);
307 case GI_INFO_TYPE_ARG:
309 ArgBlob *blob = (ArgBlob *)&info->typelib->data[info->offset];
311 return g_typelib_get_string (info->typelib, blob->name);
314 case GI_INFO_TYPE_UNRESOLVED:
316 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
318 return unresolved->name;
321 case GI_INFO_TYPE_TYPE:
323 g_assert_not_reached ();
331 g_base_info_get_namespace (GIBaseInfo *info)
333 Header *header = (Header *)info->typelib->data;
335 g_assert (info->ref_count > 0);
337 if (info->type == GI_INFO_TYPE_UNRESOLVED)
339 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
341 return unresolved->namespace;
344 return g_typelib_get_string (info->typelib, header->namespace);
348 g_base_info_is_deprecated (GIBaseInfo *info)
352 case GI_INFO_TYPE_FUNCTION:
353 case GI_INFO_TYPE_CALLBACK:
354 case GI_INFO_TYPE_STRUCT:
355 case GI_INFO_TYPE_BOXED:
356 case GI_INFO_TYPE_ENUM:
357 case GI_INFO_TYPE_FLAGS:
358 case GI_INFO_TYPE_OBJECT:
359 case GI_INFO_TYPE_INTERFACE:
360 case GI_INFO_TYPE_CONSTANT:
361 case GI_INFO_TYPE_ERROR_DOMAIN:
363 CommonBlob *blob = (CommonBlob *)&info->typelib->data[info->offset];
365 return blob->deprecated;
369 case GI_INFO_TYPE_VALUE:
371 ValueBlob *blob = (ValueBlob *)&info->typelib->data[info->offset];
373 return blob->deprecated;
377 case GI_INFO_TYPE_SIGNAL:
379 SignalBlob *blob = (SignalBlob *)&info->typelib->data[info->offset];
381 return blob->deprecated;
385 case GI_INFO_TYPE_PROPERTY:
387 PropertyBlob *blob = (PropertyBlob *)&info->typelib->data[info->offset];
389 return blob->deprecated;
393 case GI_INFO_TYPE_VFUNC:
394 case GI_INFO_TYPE_FIELD:
395 case GI_INFO_TYPE_ARG:
396 case GI_INFO_TYPE_TYPE:
398 /* no deprecation flag for these */
405 cmp_annotation (const void *av,
408 const AnnotationBlob *a = av;
409 const AnnotationBlob *b = bv;
411 if (b->offset < a->offset)
414 if (b->offset > a->offset)
421 g_base_info_get_annotation (GIBaseInfo *info,
424 GIBaseInfo *base = (GIBaseInfo *)info;
425 Header *header = (Header *)base->typelib->data;
426 AnnotationBlob blob, *first, *after, *res, *next;
429 blob.offset = base->offset;
431 first = (AnnotationBlob *) &base->typelib->data[header->annotations];
432 after = (AnnotationBlob *) &base->typelib->data[header->annotations +
433 header->n_annotations * header->annotation_blob_size];
435 res = bsearch (&blob, first, header->n_annotations,
436 header->annotation_blob_size, cmp_annotation);
445 next = res -= header->annotation_blob_size;
447 while (next >= first && next->offset == base->offset);
454 rname = g_typelib_get_string (base->typelib, res->name);
455 if (strcmp (name, rname) == 0)
456 return g_typelib_get_string (base->typelib, res->value);
458 next = res += header->annotation_blob_size;
460 while (next < after && next->offset == base->offset);
466 g_base_info_get_container (GIBaseInfo *info)
468 return info->container;
472 g_base_info_get_typelib (GIBaseInfo *info)
474 return info->typelib;
477 /* GIFunctionInfo functions */
479 g_function_info_get_symbol (GIFunctionInfo *info)
481 GIBaseInfo *base = (GIBaseInfo *)info;
482 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
484 return g_typelib_get_string (base->typelib, blob->symbol);
488 g_function_info_get_flags (GIFunctionInfo *info)
490 GIFunctionInfoFlags flags;
491 GIBaseInfo *base = (GIBaseInfo *)info;
492 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
496 /* Make sure we don't flag Constructors as methods */
497 if (base->container != NULL && !blob->constructor)
498 flags = flags | GI_FUNCTION_IS_METHOD;
500 if (blob->constructor)
501 flags = flags | GI_FUNCTION_IS_CONSTRUCTOR;
504 flags = flags | GI_FUNCTION_IS_GETTER;
507 flags = flags | GI_FUNCTION_IS_SETTER;
509 if (blob->wraps_vfunc)
510 flags = flags | GI_FUNCTION_WRAPS_VFUNC;
513 flags = flags | GI_FUNCTION_THROWS;
519 g_function_info_get_property (GIFunctionInfo *info)
521 GIBaseInfo *base = (GIBaseInfo *)info;
522 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
523 GIInterfaceInfo *container = (GIInterfaceInfo *)base->container;
525 return g_interface_info_get_property (container, blob->index);
529 g_function_info_get_vfunc (GIFunctionInfo *info)
531 GIBaseInfo *base = (GIBaseInfo *)info;
532 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
533 GIInterfaceInfo *container = (GIInterfaceInfo *)base->container;
535 return g_interface_info_get_vfunc (container, blob->index);
539 /* GICallableInfo functions */
541 signature_offset (GICallableInfo *info)
544 switch (info->base.type)
546 case GI_INFO_TYPE_FUNCTION:
547 sigoff = G_STRUCT_OFFSET (FunctionBlob, signature);
549 case GI_INFO_TYPE_VFUNC:
550 sigoff = G_STRUCT_OFFSET (VFuncBlob, signature);
552 case GI_INFO_TYPE_CALLBACK:
553 sigoff = G_STRUCT_OFFSET (CallbackBlob, signature);
555 case GI_INFO_TYPE_SIGNAL:
556 sigoff = G_STRUCT_OFFSET (SignalBlob, signature);
560 return *(guint32 *)&info->base.typelib->data[info->base.offset + sigoff];
565 g_type_info_new (GIBaseInfo *container,
569 SimpleTypeBlob *type = (SimpleTypeBlob *)&typelib->data[offset];
571 return (GITypeInfo *) g_info_new (GI_INFO_TYPE_TYPE, container, typelib,
572 (type->reserved == 0 && type->reserved2 == 0) ? offset : type->offset);
576 * g_callable_info_get_return_type:
577 * @info: a #GICallableInfo
579 * Get the return type of a callable item as
582 * Returns: a #GITypeInfo idexing the TypeBlob for the
583 * return type of #info
586 g_callable_info_get_return_type (GICallableInfo *info)
588 GIBaseInfo *base = (GIBaseInfo *)info;
591 offset = signature_offset (info);
593 return g_type_info_new (base, base->typelib, offset);
597 * g_callable_info_may_return_null:
598 * @info: a #GICallableInfo
600 * See if a callable could return NULL.
602 * Returns: TRUE if callable could return NULL
605 g_callable_info_may_return_null (GICallableInfo *info)
607 GIBaseInfo *base = (GIBaseInfo *)info;
608 SignatureBlob *blob = (SignatureBlob *)&base->typelib->data[signature_offset (info)];
610 return blob->may_return_null;
614 * g_callable_info_get_caller_owns:
615 * @info: a #GICallableInfo
617 * See whether the caller owns the return value
620 * Returns: TRUE if the caller owns the return value, FALSE otherwise.
623 g_callable_info_get_caller_owns (GICallableInfo *info)
625 GIBaseInfo *base = (GIBaseInfo *)info;
626 SignatureBlob *blob = (SignatureBlob *)&base->typelib->data[signature_offset (info)];
628 if (blob->caller_owns_return_value)
629 return GI_TRANSFER_EVERYTHING;
630 else if (blob->caller_owns_return_container)
631 return GI_TRANSFER_CONTAINER;
633 return GI_TRANSFER_NOTHING;
637 * g_callable_info_get_n_args:
638 * @info: a #GICallableInfo
640 * Get the number of arguments (both IN and OUT) for this callable.
642 * Returns: The number of arguments this callable expects.
645 g_callable_info_get_n_args (GICallableInfo *info)
647 GIBaseInfo *base = (GIBaseInfo *)info;
651 offset = signature_offset (info);
652 blob = (SignatureBlob *)&base->typelib->data[offset];
654 return blob->n_arguments;
658 * g_callable_info_get_arg:
659 * @info: a #GICallableInfo
661 * Get information about a particular argument of this callable.
663 * Returns: A #GIArgInfo indexing the typelib on the given argument.
666 g_callable_info_get_arg (GICallableInfo *info,
669 GIBaseInfo *base = (GIBaseInfo *)info;
670 Header *header = (Header *)base->typelib->data;
673 offset = signature_offset (info);
675 return (GIArgInfo *) g_info_new (GI_INFO_TYPE_ARG, base, base->typelib,
676 offset + header->signature_blob_size + n * header->arg_blob_size);
679 /* GIArgInfo function */
681 g_arg_info_get_direction (GIArgInfo *info)
683 GIBaseInfo *base = (GIBaseInfo *)info;
684 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
686 if (blob->in && blob->out)
687 return GI_DIRECTION_INOUT;
689 return GI_DIRECTION_OUT;
691 return GI_DIRECTION_IN;
695 g_arg_info_is_return_value (GIArgInfo *info)
697 GIBaseInfo *base = (GIBaseInfo *)info;
698 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
700 return blob->return_value;
704 g_arg_info_is_dipper (GIArgInfo *info)
706 GIBaseInfo *base = (GIBaseInfo *)info;
707 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
713 g_arg_info_is_optional (GIArgInfo *info)
715 GIBaseInfo *base = (GIBaseInfo *)info;
716 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
718 return blob->optional;
722 g_arg_info_may_be_null (GIArgInfo *info)
724 GIBaseInfo *base = (GIBaseInfo *)info;
725 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
727 return blob->allow_none;
731 g_arg_info_get_ownership_transfer (GIArgInfo *info)
733 GIBaseInfo *base = (GIBaseInfo *)info;
734 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
736 if (blob->transfer_ownership)
737 return GI_TRANSFER_EVERYTHING;
738 else if (blob->transfer_container_ownership)
739 return GI_TRANSFER_CONTAINER;
741 return GI_TRANSFER_NOTHING;
745 g_arg_info_get_type (GIArgInfo *info)
747 GIBaseInfo *base = (GIBaseInfo *)info;
749 return g_type_info_new (base, base->typelib, base->offset + 8);
752 /* GITypeInfo functions */
754 g_type_info_is_pointer (GITypeInfo *info)
756 GIBaseInfo *base = (GIBaseInfo *)info;
757 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
759 if (type->reserved == 0 && type->reserved2 == 0)
760 return type->pointer;
763 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
765 return iface->pointer;
770 g_type_info_get_tag (GITypeInfo *info)
772 GIBaseInfo *base = (GIBaseInfo *)info;
773 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
775 if (type->reserved == 0 && type->reserved2 == 0)
779 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
786 g_type_info_get_param_type (GITypeInfo *info,
789 GIBaseInfo *base = (GIBaseInfo *)info;
790 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
792 if (!(type->reserved == 0 && type->reserved2 == 0))
794 ParamTypeBlob *param = (ParamTypeBlob *)&base->typelib->data[base->offset];
798 case GI_TYPE_TAG_ARRAY:
799 case GI_TYPE_TAG_GLIST:
800 case GI_TYPE_TAG_GSLIST:
801 case GI_TYPE_TAG_GHASH:
802 return g_type_info_new (base, base->typelib, base->offset + 4 + 4 * n);
813 g_type_info_get_interface (GITypeInfo *info)
815 GIBaseInfo *base = (GIBaseInfo *)info;
816 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
818 if (!(type->reserved == 0 && type->reserved2 == 0))
820 InterfaceTypeBlob *blob = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
822 if (blob->tag == GI_TYPE_TAG_INTERFACE)
823 return g_info_from_entry (base->repository, base->typelib, blob->interface);
830 g_type_info_get_array_length (GITypeInfo *info)
832 GIBaseInfo *base = (GIBaseInfo *)info;
833 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
835 if (!(type->reserved == 0 && type->reserved2 == 0))
837 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
839 if (blob->tag == GI_TYPE_TAG_ARRAY)
841 if (blob->has_length)
850 g_type_info_get_array_fixed_size (GITypeInfo *info)
852 GIBaseInfo *base = (GIBaseInfo *)info;
853 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
855 if (!(type->reserved == 0 && type->reserved2 == 0))
857 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
859 if (blob->tag == GI_TYPE_TAG_ARRAY)
870 g_type_info_is_zero_terminated (GITypeInfo *info)
872 GIBaseInfo *base = (GIBaseInfo *)info;
873 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
875 if (!(type->reserved == 0 && type->reserved2 == 0))
877 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
879 if (blob->tag == GI_TYPE_TAG_ARRAY)
880 return blob->zero_terminated;
887 g_type_info_get_n_error_domains (GITypeInfo *info)
889 GIBaseInfo *base = (GIBaseInfo *)info;
890 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
892 if (!(type->reserved == 0 && type->reserved2 == 0))
894 ErrorTypeBlob *blob = (ErrorTypeBlob *)&base->typelib->data[base->offset];
896 if (blob->tag == GI_TYPE_TAG_ERROR)
897 return blob->n_domains;
904 g_type_info_get_error_domain (GITypeInfo *info,
907 GIBaseInfo *base = (GIBaseInfo *)info;
908 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
910 if (!(type->reserved == 0 && type->reserved2 == 0))
912 ErrorTypeBlob *blob = (ErrorTypeBlob *)&base->typelib->data[base->offset];
914 if (blob->tag == GI_TYPE_TAG_ERROR)
915 return (GIErrorDomainInfo *) g_info_from_entry (base->repository,
924 /* GIErrorDomainInfo functions */
926 g_error_domain_info_get_quark (GIErrorDomainInfo *info)
928 GIBaseInfo *base = (GIBaseInfo *)info;
929 ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->typelib->data[base->offset];
931 return g_typelib_get_string (base->typelib, blob->get_quark);
935 g_error_domain_info_get_codes (GIErrorDomainInfo *info)
937 GIBaseInfo *base = (GIBaseInfo *)info;
938 ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->typelib->data[base->offset];
940 return (GIInterfaceInfo *) g_info_from_entry (base->repository,
941 base->typelib, blob->error_codes);
945 /* GIValueInfo functions */
947 g_value_info_get_value (GIValueInfo *info)
949 GIBaseInfo *base = (GIBaseInfo *)info;
950 ValueBlob *blob = (ValueBlob *)&base->typelib->data[base->offset];
952 return (glong)blob->value;
955 /* GIFieldInfo functions */
957 g_field_info_get_flags (GIFieldInfo *info)
959 GIFieldInfoFlags flags;
961 GIBaseInfo *base = (GIBaseInfo *)info;
962 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
967 flags = flags | GI_FIELD_IS_READABLE;
970 flags = flags | GI_FIELD_IS_WRITABLE;
976 g_field_info_get_size (GIFieldInfo *info)
978 GIBaseInfo *base = (GIBaseInfo *)info;
979 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
985 g_field_info_get_offset (GIFieldInfo *info)
987 GIBaseInfo *base = (GIBaseInfo *)info;
988 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
990 return blob->struct_offset;
994 g_field_info_get_type (GIFieldInfo *info)
996 GIBaseInfo *base = (GIBaseInfo *)info;
998 return g_type_info_new (base, base->typelib, base->offset + 8);
1001 /* GIRegisteredTypeInfo functions */
1003 g_registered_type_info_get_type_name (GIRegisteredTypeInfo *info)
1005 GIBaseInfo *base = (GIBaseInfo *)info;
1006 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&base->typelib->data[base->offset];
1008 if (blob->gtype_name)
1009 return g_typelib_get_string (base->typelib, blob->gtype_name);
1015 g_registered_type_info_get_type_init (GIRegisteredTypeInfo *info)
1017 GIBaseInfo *base = (GIBaseInfo *)info;
1018 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&base->typelib->data[base->offset];
1020 if (blob->gtype_init)
1021 return g_typelib_get_string (base->typelib, blob->gtype_init);
1027 g_registered_type_info_get_g_type (GIRegisteredTypeInfo *info)
1029 const char *type_init;
1030 GType (* get_type_func) (void);
1032 type_init = g_registered_type_info_get_type_init (info);
1034 if (type_init == NULL)
1037 get_type_func = NULL;
1038 if (!g_typelib_symbol (((GIBaseInfo*)info)->typelib,
1040 (void**) &get_type_func))
1043 return (* get_type_func) ();
1046 /* GIStructInfo functions */
1048 g_struct_info_get_n_fields (GIStructInfo *info)
1050 GIBaseInfo *base = (GIBaseInfo *)info;
1051 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1053 return blob->n_fields;
1057 g_struct_info_get_field (GIStructInfo *info,
1060 GIBaseInfo *base = (GIBaseInfo *)info;
1061 Header *header = (Header *)base->typelib->data;
1063 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib,
1064 base->offset + header->struct_blob_size +
1065 n * header->field_blob_size);
1069 g_struct_info_get_n_methods (GIStructInfo *info)
1071 GIBaseInfo *base = (GIBaseInfo *)info;
1072 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1074 return blob->n_methods;
1078 g_struct_info_get_method (GIStructInfo *info,
1081 GIBaseInfo *base = (GIBaseInfo *)info;
1082 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1083 Header *header = (Header *)base->typelib->data;
1086 offset = base->offset + header->struct_blob_size
1087 + blob->n_fields * header->field_blob_size
1088 + n * header->function_blob_size;
1089 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1090 base->typelib, offset);
1093 static GIFunctionInfo *
1094 find_method (GIBaseInfo *base,
1100 Header *header = (Header *)base->typelib->data;
1103 for (i = 0; i < n_methods; i++)
1105 FunctionBlob *fblob = (FunctionBlob *)&base->typelib->data[offset];
1106 const gchar *fname = (const gchar *)&base->typelib->data[fblob->name];
1108 if (strcmp (name, fname) == 0)
1109 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1110 base->typelib, offset);
1112 offset += header->function_blob_size;
1119 g_struct_info_find_method (GIStructInfo *info,
1123 GIBaseInfo *base = (GIBaseInfo *)info;
1124 Header *header = (Header *)base->typelib->data;
1125 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1127 offset = base->offset + header->struct_blob_size
1128 + blob->n_fields * header->field_blob_size;
1130 return find_method (base, offset, blob->n_methods, name);
1134 g_struct_info_get_size (GIStructInfo *info)
1136 GIBaseInfo *base = (GIBaseInfo *)info;
1137 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1143 g_struct_info_get_alignment (GIStructInfo *info)
1145 GIBaseInfo *base = (GIBaseInfo *)info;
1146 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1148 return blob->alignment;
1152 g_enum_info_get_n_values (GIEnumInfo *info)
1154 GIBaseInfo *base = (GIBaseInfo *)info;
1155 EnumBlob *blob = (EnumBlob *)&base->typelib->data[base->offset];
1157 return blob->n_values;
1161 g_enum_info_get_value (GIEnumInfo *info,
1164 GIBaseInfo *base = (GIBaseInfo *)info;
1165 Header *header = (Header *)base->typelib->data;
1168 offset = base->offset + header->enum_blob_size
1169 + n * header->value_blob_size;
1170 return (GIValueInfo *) g_info_new (GI_INFO_TYPE_VALUE, base, base->typelib, offset);
1174 * g_enum_info_get_storage_type:
1177 * Gets the tag of the type used for the enum in the C ABI. This will
1178 * will be a signed or unsigned integral type.
1180 * Note that in the current implementation the width of the type is
1181 * computed correctly, but the signed or unsigned nature of the type
1182 * may not match the sign of the type used by the C compiler.
1184 * Return Value: the storage type for the enumeration
1187 g_enum_info_get_storage_type (GIEnumInfo *info)
1189 GIBaseInfo *base = (GIBaseInfo *)info;
1190 EnumBlob *blob = (EnumBlob *)&base->typelib->data[base->offset];
1192 return blob->storage_type;
1195 /* GIObjectInfo functions */
1197 g_object_info_get_parent (GIObjectInfo *info)
1199 GIBaseInfo *base = (GIBaseInfo *)info;
1200 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1203 return (GIObjectInfo *) g_info_from_entry (base->repository,
1204 base->typelib, blob->parent);
1210 g_object_info_get_abstract (GIObjectInfo *info)
1212 GIBaseInfo *base = (GIBaseInfo *)info;
1213 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1214 return blob->abstract != 0;
1218 g_object_info_get_type_name (GIObjectInfo *info)
1220 GIBaseInfo *base = (GIBaseInfo *)info;
1221 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1223 return g_typelib_get_string (base->typelib, blob->gtype_name);
1227 g_object_info_get_type_init (GIObjectInfo *info)
1229 GIBaseInfo *base = (GIBaseInfo *)info;
1230 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1232 return g_typelib_get_string (base->typelib, blob->gtype_init);
1236 g_object_info_get_n_interfaces (GIObjectInfo *info)
1238 GIBaseInfo *base = (GIBaseInfo *)info;
1239 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1241 return blob->n_interfaces;
1245 g_object_info_get_interface (GIObjectInfo *info,
1248 GIBaseInfo *base = (GIBaseInfo *)info;
1249 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1251 return (GIInterfaceInfo *) g_info_from_entry (base->repository,
1252 base->typelib, blob->interfaces[n]);
1256 g_object_info_get_n_fields (GIObjectInfo *info)
1258 GIBaseInfo *base = (GIBaseInfo *)info;
1259 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1261 return blob->n_fields;
1265 g_object_info_get_field (GIObjectInfo *info,
1269 GIBaseInfo *base = (GIBaseInfo *)info;
1270 Header *header = (Header *)base->typelib->data;
1271 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1273 offset = base->offset + header->object_blob_size
1274 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1275 + n * header->field_blob_size;
1277 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib, offset);
1281 g_object_info_get_n_properties (GIObjectInfo *info)
1283 GIBaseInfo *base = (GIBaseInfo *)info;
1284 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1286 return blob->n_properties;
1290 g_object_info_get_property (GIObjectInfo *info,
1294 GIBaseInfo *base = (GIBaseInfo *)info;
1295 Header *header = (Header *)base->typelib->data;
1296 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1298 offset = base->offset + header->object_blob_size
1299 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1300 + blob->n_fields * header->field_blob_size
1301 + n * header->property_blob_size;
1303 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base,
1304 base->typelib, offset);
1308 g_object_info_get_n_methods (GIObjectInfo *info)
1310 GIBaseInfo *base = (GIBaseInfo *)info;
1311 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1313 return blob->n_methods;
1317 g_object_info_get_method (GIObjectInfo *info,
1321 GIBaseInfo *base = (GIBaseInfo *)info;
1322 Header *header = (Header *)base->typelib->data;
1323 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1325 offset = base->offset + header->object_blob_size
1326 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1327 + blob->n_fields * header->field_blob_size
1328 + blob->n_properties * header->property_blob_size
1329 + n * header->function_blob_size;
1331 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1332 base->typelib, offset);
1336 g_object_info_find_method (GIObjectInfo *info,
1340 GIBaseInfo *base = (GIBaseInfo *)info;
1341 Header *header = (Header *)base->typelib->data;
1342 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1344 offset = base->offset + header->object_blob_size
1345 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1346 + blob->n_fields * header->field_blob_size +
1347 + blob->n_properties * header->property_blob_size;
1349 return find_method (base, offset, blob->n_methods, name);
1353 g_object_info_get_n_signals (GIObjectInfo *info)
1355 GIBaseInfo *base = (GIBaseInfo *)info;
1356 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1358 return blob->n_signals;
1362 g_object_info_get_signal (GIObjectInfo *info,
1366 GIBaseInfo *base = (GIBaseInfo *)info;
1367 Header *header = (Header *)base->typelib->data;
1368 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1370 offset = base->offset + header->object_blob_size
1371 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1372 + blob->n_fields * header->field_blob_size
1373 + blob->n_properties * header->property_blob_size
1374 + blob->n_methods * header->function_blob_size
1375 + n * header->signal_blob_size;
1377 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base,
1378 base->typelib, offset);
1382 g_object_info_get_n_vfuncs (GIObjectInfo *info)
1384 GIBaseInfo *base = (GIBaseInfo *)info;
1385 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1387 return blob->n_vfuncs;
1391 g_object_info_get_vfunc (GIObjectInfo *info,
1395 GIBaseInfo *base = (GIBaseInfo *)info;
1396 Header *header = (Header *)base->typelib->data;
1397 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1399 offset = base->offset + header->object_blob_size
1400 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1401 + blob->n_fields * header->field_blob_size
1402 + blob->n_properties * header->property_blob_size
1403 + blob->n_methods * header->function_blob_size
1404 + blob->n_signals * header->signal_blob_size
1405 + n * header->vfunc_blob_size;
1407 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1408 base->typelib, offset);
1412 g_object_info_get_n_constants (GIObjectInfo *info)
1414 GIBaseInfo *base = (GIBaseInfo *)info;
1415 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1417 return blob->n_constants;
1421 g_object_info_get_constant (GIObjectInfo *info,
1425 GIBaseInfo *base = (GIBaseInfo *)info;
1426 Header *header = (Header *)base->typelib->data;
1427 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1429 offset = base->offset + header->object_blob_size
1430 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1431 + blob->n_fields * header->field_blob_size
1432 + blob->n_properties * header->property_blob_size
1433 + blob->n_methods * header->function_blob_size
1434 + blob->n_signals * header->signal_blob_size
1435 + blob->n_vfuncs * header->vfunc_blob_size
1436 + n * header->constant_blob_size;
1438 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1439 base->typelib, offset);
1443 /* GIInterfaceInfo functions */
1445 g_interface_info_get_n_prerequisites (GIInterfaceInfo *info)
1447 GIBaseInfo *base = (GIBaseInfo *)info;
1448 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1450 return blob->n_prerequisites;
1454 g_interface_info_get_prerequisite (GIInterfaceInfo *info,
1457 GIBaseInfo *base = (GIBaseInfo *)info;
1458 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1460 return g_info_from_entry (base->repository,
1461 base->typelib, blob->prerequisites[n]);
1466 g_interface_info_get_n_properties (GIInterfaceInfo *info)
1468 GIBaseInfo *base = (GIBaseInfo *)info;
1469 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1471 return blob->n_properties;
1475 g_interface_info_get_property (GIInterfaceInfo *info,
1479 GIBaseInfo *base = (GIBaseInfo *)info;
1480 Header *header = (Header *)base->typelib->data;
1481 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1483 offset = base->offset + header->interface_blob_size
1484 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1485 + n * header->property_blob_size;
1487 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base,
1488 base->typelib, offset);
1492 g_interface_info_get_n_methods (GIInterfaceInfo *info)
1494 GIBaseInfo *base = (GIBaseInfo *)info;
1495 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1497 return blob->n_methods;
1501 g_interface_info_get_method (GIInterfaceInfo *info,
1505 GIBaseInfo *base = (GIBaseInfo *)info;
1506 Header *header = (Header *)base->typelib->data;
1507 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1509 offset = base->offset + header->interface_blob_size
1510 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1511 + blob->n_properties * header->property_blob_size
1512 + n * header->function_blob_size;
1514 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1515 base->typelib, offset);
1519 g_interface_info_find_method (GIInterfaceInfo *info,
1523 GIBaseInfo *base = (GIBaseInfo *)info;
1524 Header *header = (Header *)base->typelib->data;
1525 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1527 offset = base->offset + header->interface_blob_size
1528 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1529 + blob->n_properties * header->property_blob_size;
1531 return find_method (base, offset, blob->n_methods, name);
1535 g_interface_info_get_n_signals (GIInterfaceInfo *info)
1537 GIBaseInfo *base = (GIBaseInfo *)info;
1538 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1540 return blob->n_signals;
1544 g_interface_info_get_signal (GIInterfaceInfo *info,
1548 GIBaseInfo *base = (GIBaseInfo *)info;
1549 Header *header = (Header *)base->typelib->data;
1550 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1552 offset = base->offset + header->interface_blob_size
1553 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1554 + blob->n_properties * header->property_blob_size
1555 + blob->n_methods * header->function_blob_size
1556 + n * header->signal_blob_size;
1558 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base,
1559 base->typelib, offset);
1563 g_interface_info_get_n_vfuncs (GIInterfaceInfo *info)
1565 GIBaseInfo *base = (GIBaseInfo *)info;
1566 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1568 return blob->n_vfuncs;
1572 g_interface_info_get_vfunc (GIInterfaceInfo *info,
1576 GIBaseInfo *base = (GIBaseInfo *)info;
1577 Header *header = (Header *)base->typelib->data;
1578 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1580 offset = base->offset + header->interface_blob_size
1581 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1582 + blob->n_properties * header->property_blob_size
1583 + blob->n_methods * header->function_blob_size
1584 + blob->n_signals * header->signal_blob_size
1585 + n * header->vfunc_blob_size;
1587 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1588 base->typelib, offset);
1592 g_interface_info_get_n_constants (GIInterfaceInfo *info)
1594 GIBaseInfo *base = (GIBaseInfo *)info;
1595 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1597 return blob->n_constants;
1601 g_interface_info_get_constant (GIInterfaceInfo *info,
1605 GIBaseInfo *base = (GIBaseInfo *)info;
1606 Header *header = (Header *)base->typelib->data;
1607 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1609 offset = base->offset + header->interface_blob_size
1610 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1611 + blob->n_properties * header->property_blob_size
1612 + blob->n_methods * header->function_blob_size
1613 + blob->n_signals * header->signal_blob_size
1614 + blob->n_vfuncs * header->vfunc_blob_size
1615 + n * header->constant_blob_size;
1617 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1618 base->typelib, offset);
1624 /* GIPropertyInfo functions */
1626 g_property_info_get_flags (GIPropertyInfo *info)
1629 GIBaseInfo *base = (GIBaseInfo *)info;
1630 PropertyBlob *blob = (PropertyBlob *)&base->typelib->data[base->offset];
1635 flags = flags | G_PARAM_READABLE;
1638 flags = flags | G_PARAM_WRITABLE;
1640 if (blob->construct)
1641 flags = flags | G_PARAM_CONSTRUCT;
1643 if (blob->construct_only)
1644 flags = flags | G_PARAM_CONSTRUCT_ONLY;
1650 g_property_info_get_type (GIPropertyInfo *info)
1652 GIBaseInfo *base = (GIBaseInfo *)info;
1654 return g_type_info_new (base, base->typelib, base->offset + 8);
1658 /* GISignalInfo functions */
1660 g_signal_info_get_flags (GISignalInfo *info)
1664 GIBaseInfo *base = (GIBaseInfo *)info;
1665 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1669 if (blob->run_first)
1670 flags = flags | G_SIGNAL_RUN_FIRST;
1673 flags = flags | G_SIGNAL_RUN_LAST;
1675 if (blob->run_cleanup)
1676 flags = flags | G_SIGNAL_RUN_CLEANUP;
1678 if (blob->no_recurse)
1679 flags = flags | G_SIGNAL_NO_RECURSE;
1682 flags = flags | G_SIGNAL_DETAILED;
1685 flags = flags | G_SIGNAL_ACTION;
1688 flags = flags | G_SIGNAL_NO_HOOKS;
1694 g_signal_info_get_class_closure (GISignalInfo *info)
1696 GIBaseInfo *base = (GIBaseInfo *)info;
1697 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1699 if (blob->has_class_closure)
1700 return g_interface_info_get_vfunc ((GIInterfaceInfo *)base->container, blob->class_closure);
1706 g_signal_info_true_stops_emit (GISignalInfo *info)
1708 GIBaseInfo *base = (GIBaseInfo *)info;
1709 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1711 return blob->true_stops_emit;
1714 /* GIVFuncInfo functions */
1716 g_vfunc_info_get_flags (GIVFuncInfo *info)
1718 GIVFuncInfoFlags flags;
1720 GIBaseInfo *base = (GIBaseInfo *)info;
1721 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
1725 if (blob->must_chain_up)
1726 flags = flags | GI_VFUNC_MUST_CHAIN_UP;
1728 if (blob->must_be_implemented)
1729 flags = flags | GI_VFUNC_MUST_OVERRIDE;
1731 if (blob->must_not_be_implemented)
1732 flags = flags | GI_VFUNC_MUST_NOT_OVERRIDE;
1738 g_vfunc_info_get_offset (GIVFuncInfo *info)
1740 GIBaseInfo *base = (GIBaseInfo *)info;
1741 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
1743 return blob->struct_offset;
1747 g_vfunc_info_get_signal (GIVFuncInfo *info)
1749 GIBaseInfo *base = (GIBaseInfo *)info;
1750 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
1752 if (blob->class_closure)
1753 return g_interface_info_get_signal ((GIInterfaceInfo *)base->container, blob->signal);
1759 /* GIConstantInfo functions */
1761 g_constant_info_get_type (GIConstantInfo *info)
1763 GIBaseInfo *base = (GIBaseInfo *)info;
1765 return g_type_info_new (base, base->typelib, base->offset + 8);
1769 g_constant_info_get_value (GIConstantInfo *info,
1772 GIBaseInfo *base = (GIBaseInfo *)info;
1773 ConstantBlob *blob = (ConstantBlob *)&base->typelib->data[base->offset];
1775 /* FIXME non-basic types ? */
1776 if (blob->type.reserved == 0 && blob->type.reserved2 == 0)
1778 if (blob->type.pointer)
1779 value->v_pointer = g_memdup (&base->typelib->data[blob->offset], blob->size);
1782 switch (blob->type.tag)
1784 case GI_TYPE_TAG_BOOLEAN:
1785 value->v_boolean = *(gboolean*)&base->typelib->data[blob->offset];
1787 case GI_TYPE_TAG_INT8:
1788 value->v_int8 = *(gint8*)&base->typelib->data[blob->offset];
1790 case GI_TYPE_TAG_UINT8:
1791 value->v_uint8 = *(guint8*)&base->typelib->data[blob->offset];
1793 case GI_TYPE_TAG_INT16:
1794 value->v_int16 = *(gint16*)&base->typelib->data[blob->offset];
1796 case GI_TYPE_TAG_UINT16:
1797 value->v_uint16 = *(guint16*)&base->typelib->data[blob->offset];
1799 case GI_TYPE_TAG_INT32:
1800 value->v_int32 = *(gint32*)&base->typelib->data[blob->offset];
1802 case GI_TYPE_TAG_UINT32:
1803 value->v_uint32 = *(guint32*)&base->typelib->data[blob->offset];
1805 case GI_TYPE_TAG_INT64:
1806 value->v_int64 = *(gint64*)&base->typelib->data[blob->offset];
1808 case GI_TYPE_TAG_UINT64:
1809 value->v_uint64 = *(guint64*)&base->typelib->data[blob->offset];
1811 case GI_TYPE_TAG_FLOAT:
1812 value->v_float = *(gfloat*)&base->typelib->data[blob->offset];
1814 case GI_TYPE_TAG_DOUBLE:
1815 value->v_double = *(gdouble*)&base->typelib->data[blob->offset];
1817 case GI_TYPE_TAG_TIME_T:
1818 value->v_long = *(long*)&base->typelib->data[blob->offset];
1820 case GI_TYPE_TAG_INT:
1821 value->v_int = *(gint*)&base->typelib->data[blob->offset];
1823 case GI_TYPE_TAG_UINT:
1824 value->v_uint = *(guint*)&base->typelib->data[blob->offset];
1826 case GI_TYPE_TAG_LONG:
1827 value->v_long = *(glong*)&base->typelib->data[blob->offset];
1829 case GI_TYPE_TAG_ULONG:
1830 value->v_ulong = *(gulong*)&base->typelib->data[blob->offset];
1839 /* GIUnionInfo functions */
1841 g_union_info_get_n_fields (GIUnionInfo *info)
1843 GIBaseInfo *base = (GIBaseInfo *)info;
1844 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1846 return blob->n_fields;
1850 g_union_info_get_field (GIUnionInfo *info,
1853 GIBaseInfo *base = (GIBaseInfo *)info;
1854 Header *header = (Header *)base->typelib->data;
1856 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib,
1857 base->offset + header->union_blob_size +
1858 n * header->field_blob_size);
1862 g_union_info_get_n_methods (GIUnionInfo *info)
1864 GIBaseInfo *base = (GIBaseInfo *)info;
1865 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1867 return blob->n_functions;
1871 g_union_info_get_method (GIUnionInfo *info,
1874 GIBaseInfo *base = (GIBaseInfo *)info;
1875 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1876 Header *header = (Header *)base->typelib->data;
1879 offset = base->offset + header->union_blob_size
1880 + blob->n_fields * header->field_blob_size
1881 + n * header->function_blob_size;
1882 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1883 base->typelib, offset);
1887 g_union_info_is_discriminated (GIUnionInfo *info)
1889 GIBaseInfo *base = (GIBaseInfo *)info;
1890 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1892 return blob->discriminated;
1896 g_union_info_get_discriminator_offset (GIUnionInfo *info)
1898 GIBaseInfo *base = (GIBaseInfo *)info;
1899 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1901 return blob->discriminator_offset;
1905 g_union_info_get_discriminator_type (GIUnionInfo *info)
1907 GIBaseInfo *base = (GIBaseInfo *)info;
1909 return g_type_info_new (base, base->typelib, base->offset + 24);
1913 g_union_info_get_discriminator (GIUnionInfo *info,
1916 GIBaseInfo *base = (GIBaseInfo *)info;
1917 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1919 if (blob->discriminated)
1921 Header *header = (Header *)base->typelib->data;
1924 offset = base->offset + header->union_blob_size
1925 + blob->n_fields * header->field_blob_size
1926 + blob->n_functions * header->function_blob_size
1927 + n * header->constant_blob_size;
1929 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1930 base->typelib, offset);
1937 g_union_info_find_method (GIUnionInfo *info,
1941 GIBaseInfo *base = (GIBaseInfo *)info;
1942 Header *header = (Header *)base->typelib->data;
1943 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1945 offset = base->offset + header->union_blob_size
1946 + blob->n_fields * header->field_blob_size;
1948 return find_method (base, offset, blob->n_functions, name);
1952 g_union_info_get_size (GIUnionInfo *info)
1954 GIBaseInfo *base = (GIBaseInfo *)info;
1955 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1961 g_union_info_get_alignment (GIUnionInfo *info)
1963 GIBaseInfo *base = (GIBaseInfo *)info;
1964 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
1966 return blob->alignment;