1 /* GObject introspection: Repository implementation
3 * Copyright (C) 2005 Matthias Clasen
4 * Copyright (C) 2008,2009 Red Hat, Inc.
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
26 #include <glib-object.h>
33 /* Keep this part in sync with GIUnresolvedInfo below */
36 GIRepository *repository;
37 GIBaseInfo *container;
39 /* Resolved specific */
45 struct _GIUnresolvedInfo
47 /* Keep this part in sync with GIBaseInfo above */
50 GIRepository *repository;
51 GIBaseInfo *container;
53 /* Unresolved specific */
56 const gchar *namespace;
59 struct _GICallableInfo
64 struct _GIFunctionInfo
66 GICallableInfo callable;
69 struct _GICallbackInfo
71 GICallableInfo callable;
74 struct _GIRegisteredTypeInfo
81 GIRegisteredTypeInfo registered;
86 GIRegisteredTypeInfo registered;
91 GIRegisteredTypeInfo registered;
94 struct _GIInterfaceInfo
96 GIRegisteredTypeInfo registered;
99 struct _GIConstantInfo
111 GICallableInfo callable;
116 GICallableInfo callable;
119 struct _GIPropertyInfo
137 gboolean is_embedded;
142 GIRegisteredTypeInfo registered;
148 g_info_new_full (GIInfoType type,
149 GIRepository *repository,
150 GIBaseInfo *container,
156 g_return_val_if_fail (container != NULL || repository != NULL, NULL);
158 if (type == GI_INFO_TYPE_TYPE)
159 info = (GIBaseInfo *)g_new0 (GITypeInfo, 1);
161 info = g_new0 (GIBaseInfo, 1);
166 info->typelib = typelib;
167 info->offset = offset;
170 info->container = g_base_info_ref (container);
172 info->repository = g_object_ref (repository);
178 g_info_new (GIInfoType type,
179 GIBaseInfo *container,
183 return g_info_new_full (type, container->repository, container, typelib, offset);
187 g_info_from_entry (GIRepository *repository,
192 DirEntry *entry = g_typelib_get_dir_entry (typelib, index);
195 result = g_info_new_full (entry->blob_type, repository, NULL, typelib, entry->offset);
198 const gchar *namespace = g_typelib_get_string (typelib, entry->offset);
199 const gchar *name = g_typelib_get_string (typelib, entry->name);
201 result = g_irepository_find_by_name (repository, namespace, name);
204 GIUnresolvedInfo *unresolved;
206 unresolved = g_new0 (GIUnresolvedInfo, 1);
208 unresolved->type = GI_INFO_TYPE_UNRESOLVED;
209 unresolved->ref_count = 1;
210 unresolved->repository = g_object_ref (repository);
211 unresolved->container = NULL;
212 unresolved->name = name;
213 unresolved->namespace = namespace;
215 return (GIBaseInfo*)unresolved;
223 /* GIBaseInfo functions */
225 g_base_info_ref (GIBaseInfo *info)
233 g_base_info_unref (GIBaseInfo *info)
235 g_assert (info->ref_count > 0);
238 if (!info->ref_count)
241 g_base_info_unref (info->container);
243 if (info->repository)
244 g_object_unref (info->repository);
251 g_base_info_get_type (GIBaseInfo *info)
258 g_base_info_get_name (GIBaseInfo *info)
260 g_assert (info->ref_count > 0);
263 case GI_INFO_TYPE_FUNCTION:
264 case GI_INFO_TYPE_CALLBACK:
265 case GI_INFO_TYPE_STRUCT:
266 case GI_INFO_TYPE_BOXED:
267 case GI_INFO_TYPE_ENUM:
268 case GI_INFO_TYPE_FLAGS:
269 case GI_INFO_TYPE_OBJECT:
270 case GI_INFO_TYPE_INTERFACE:
271 case GI_INFO_TYPE_CONSTANT:
272 case GI_INFO_TYPE_ERROR_DOMAIN:
273 case GI_INFO_TYPE_UNION:
275 CommonBlob *blob = (CommonBlob *)&info->typelib->data[info->offset];
277 return g_typelib_get_string (info->typelib, blob->name);
281 case GI_INFO_TYPE_VALUE:
283 ValueBlob *blob = (ValueBlob *)&info->typelib->data[info->offset];
285 return g_typelib_get_string (info->typelib, blob->name);
289 case GI_INFO_TYPE_SIGNAL:
291 SignalBlob *blob = (SignalBlob *)&info->typelib->data[info->offset];
293 return g_typelib_get_string (info->typelib, blob->name);
297 case GI_INFO_TYPE_PROPERTY:
299 PropertyBlob *blob = (PropertyBlob *)&info->typelib->data[info->offset];
301 return g_typelib_get_string (info->typelib, blob->name);
305 case GI_INFO_TYPE_VFUNC:
307 VFuncBlob *blob = (VFuncBlob *)&info->typelib->data[info->offset];
309 return g_typelib_get_string (info->typelib, blob->name);
313 case GI_INFO_TYPE_FIELD:
315 FieldBlob *blob = (FieldBlob *)&info->typelib->data[info->offset];
317 return g_typelib_get_string (info->typelib, blob->name);
321 case GI_INFO_TYPE_ARG:
323 ArgBlob *blob = (ArgBlob *)&info->typelib->data[info->offset];
325 return g_typelib_get_string (info->typelib, blob->name);
328 case GI_INFO_TYPE_UNRESOLVED:
330 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
332 return unresolved->name;
335 case GI_INFO_TYPE_TYPE:
337 g_assert_not_reached ();
345 g_base_info_get_namespace (GIBaseInfo *info)
347 Header *header = (Header *)info->typelib->data;
349 g_assert (info->ref_count > 0);
351 if (info->type == GI_INFO_TYPE_UNRESOLVED)
353 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
355 return unresolved->namespace;
358 return g_typelib_get_string (info->typelib, header->namespace);
362 g_base_info_is_deprecated (GIBaseInfo *info)
366 case GI_INFO_TYPE_FUNCTION:
367 case GI_INFO_TYPE_CALLBACK:
368 case GI_INFO_TYPE_STRUCT:
369 case GI_INFO_TYPE_BOXED:
370 case GI_INFO_TYPE_ENUM:
371 case GI_INFO_TYPE_FLAGS:
372 case GI_INFO_TYPE_OBJECT:
373 case GI_INFO_TYPE_INTERFACE:
374 case GI_INFO_TYPE_CONSTANT:
375 case GI_INFO_TYPE_ERROR_DOMAIN:
377 CommonBlob *blob = (CommonBlob *)&info->typelib->data[info->offset];
379 return blob->deprecated;
383 case GI_INFO_TYPE_VALUE:
385 ValueBlob *blob = (ValueBlob *)&info->typelib->data[info->offset];
387 return blob->deprecated;
391 case GI_INFO_TYPE_SIGNAL:
393 SignalBlob *blob = (SignalBlob *)&info->typelib->data[info->offset];
395 return blob->deprecated;
399 case GI_INFO_TYPE_PROPERTY:
401 PropertyBlob *blob = (PropertyBlob *)&info->typelib->data[info->offset];
403 return blob->deprecated;
407 case GI_INFO_TYPE_VFUNC:
408 case GI_INFO_TYPE_FIELD:
409 case GI_INFO_TYPE_ARG:
410 case GI_INFO_TYPE_TYPE:
412 /* no deprecation flag for these */
419 * g_base_info_get_attribute:
420 * @info: A #GIBaseInfo
421 * @name: A freeform string naming an attribute
423 * Retrieve an arbitrary attribute associated with this node.
425 * Return value: The value of the attribute, or %NULL if no such attribute exists
428 g_base_info_get_attribute (GIBaseInfo *info,
431 GIAttributeIter iter = { 0, };
432 gchar *curname, *curvalue;
433 while (g_base_info_iterate_attributes (info, &iter, &curname, &curvalue))
435 if (strcmp (name, curname) == 0)
436 return (const gchar*) curvalue;
443 cmp_attribute (const void *av,
446 const AttributeBlob *a = av;
447 const AttributeBlob *b = bv;
449 if (a->offset < b->offset)
451 else if (a->offset == b->offset)
457 static AttributeBlob *
458 find_first_attribute (GIBaseInfo *info)
460 GIBaseInfo *base = (GIBaseInfo *)info;
461 Header *header = (Header *)base->typelib->data;
462 AttributeBlob blob, *first, *res, *previous;
464 blob.offset = base->offset;
466 first = (AttributeBlob *) &base->typelib->data[header->attributes];
468 res = bsearch (&blob, first, header->n_attributes,
469 header->attribute_blob_size, cmp_attribute);
475 while (previous >= first && previous->offset == base->offset)
485 * g_base_info_iterate_attributes:
486 * @info: A #GIBaseInfo
487 * @iter: A #GIAttributeIter structure, must be initialized; see below
488 * @name: (out) (transfer none): Returned name, must not be freed
489 * @value: (out) (transfer none): Returned name, must not be freed
491 * Iterate over all attributes associated with this node. The iterator
492 * structure is typically stack allocated, and must have its first
493 * member initialized to %NULL.
495 * Both the @name and @value should be treated as constants
496 * and must not be freed.
499 * <title>Iterating over attributes</title>
502 * print_attributes (GIBaseInfo *info)
504 * GIAttributeIter iter = { 0, };
507 * while (g_base_info_iterate_attributes (info, &iter, &name, &value))
509 * g_print ("attribute name: %s value: %s", name, value);
515 * Return value: %TRUE if there are more attributes, %FALSE otherwise
518 g_base_info_iterate_attributes (GIBaseInfo *info,
519 GIAttributeIter *iter,
523 GIBaseInfo *base = (GIBaseInfo *)info;
524 Header *header = (Header *)base->typelib->data;
525 AttributeBlob *next, *after;
527 after = (AttributeBlob *) &base->typelib->data[header->attributes +
528 header->n_attributes * header->attribute_blob_size];
530 if (iter->data != NULL)
531 next = (AttributeBlob *) iter->data;
533 next = find_first_attribute (info);
535 if (next == NULL || next->offset != base->offset || next >= after)
538 *name = (gchar*) g_typelib_get_string (base->typelib, next->name);
539 *value = (gchar*) g_typelib_get_string (base->typelib, next->value);
540 iter->data = next + 1;
546 g_base_info_get_container (GIBaseInfo *info)
548 return info->container;
552 g_base_info_get_typelib (GIBaseInfo *info)
554 return info->typelib;
559 * @info1: A #GIBaseInfo
560 * @info2: A #GIBaseInfo
562 * Compare two #GIBaseInfo.
564 * Using pointer comparison is not practical since many functions return
565 * different instances of #GIBaseInfo that refers to the same part of the
566 * TypeLib; use this function instead to do #GIBaseInfo comparisons.
568 * Return value: TRUE if and only if @info1 equals @info2.
571 g_base_info_equal (GIBaseInfo *info1, GIBaseInfo *info2)
573 /* Compare the TypeLib pointers, which are mmapped. */
574 return info1->typelib->data + info1->offset == info2->typelib->data + info2->offset;
577 /* GIFunctionInfo functions */
579 g_function_info_get_symbol (GIFunctionInfo *info)
581 GIBaseInfo *base = (GIBaseInfo *)info;
582 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
584 return g_typelib_get_string (base->typelib, blob->symbol);
588 g_function_info_get_flags (GIFunctionInfo *info)
590 GIFunctionInfoFlags flags;
591 GIBaseInfo *base = (GIBaseInfo *)info;
592 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
596 /* Make sure we don't flag Constructors as methods */
597 if (!blob->constructor && !blob->is_static)
598 flags = flags | GI_FUNCTION_IS_METHOD;
600 if (blob->constructor)
601 flags = flags | GI_FUNCTION_IS_CONSTRUCTOR;
604 flags = flags | GI_FUNCTION_IS_GETTER;
607 flags = flags | GI_FUNCTION_IS_SETTER;
609 if (blob->wraps_vfunc)
610 flags = flags | GI_FUNCTION_WRAPS_VFUNC;
613 flags = flags | GI_FUNCTION_THROWS;
619 g_function_info_get_property (GIFunctionInfo *info)
621 GIBaseInfo *base = (GIBaseInfo *)info;
622 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
623 GIInterfaceInfo *container = (GIInterfaceInfo *)base->container;
625 return g_interface_info_get_property (container, blob->index);
629 g_function_info_get_vfunc (GIFunctionInfo *info)
631 GIBaseInfo *base = (GIBaseInfo *)info;
632 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
633 GIInterfaceInfo *container = (GIInterfaceInfo *)base->container;
635 return g_interface_info_get_vfunc (container, blob->index);
639 /* GICallableInfo functions */
641 signature_offset (GICallableInfo *info)
644 switch (info->base.type)
646 case GI_INFO_TYPE_FUNCTION:
647 sigoff = G_STRUCT_OFFSET (FunctionBlob, signature);
649 case GI_INFO_TYPE_VFUNC:
650 sigoff = G_STRUCT_OFFSET (VFuncBlob, signature);
652 case GI_INFO_TYPE_CALLBACK:
653 sigoff = G_STRUCT_OFFSET (CallbackBlob, signature);
655 case GI_INFO_TYPE_SIGNAL:
656 sigoff = G_STRUCT_OFFSET (SignalBlob, signature);
660 return *(guint32 *)&info->base.typelib->data[info->base.offset + sigoff];
665 g_type_info_new (GIBaseInfo *container,
669 SimpleTypeBlob *type = (SimpleTypeBlob *)&typelib->data[offset];
670 GITypeInfo *type_info;
672 type_info = (GITypeInfo *) g_info_new (GI_INFO_TYPE_TYPE, container, typelib,
673 (type->flags.reserved == 0 && type->flags.reserved2 == 0) ? offset : type->offset);
674 type_info->is_embedded = FALSE;
680 * g_callable_info_get_return_type:
681 * @info: a #GICallableInfo
683 * Get the return type of a callable item as
686 * Returns: a #GITypeInfo idexing the TypeBlob for the
687 * return type of #info
690 g_callable_info_get_return_type (GICallableInfo *info)
692 GIBaseInfo *base = (GIBaseInfo *)info;
695 offset = signature_offset (info);
697 return g_type_info_new (base, base->typelib, offset);
701 * g_callable_info_may_return_null:
702 * @info: a #GICallableInfo
704 * See if a callable could return NULL.
706 * Returns: TRUE if callable could return NULL
709 g_callable_info_may_return_null (GICallableInfo *info)
711 GIBaseInfo *base = (GIBaseInfo *)info;
712 SignatureBlob *blob = (SignatureBlob *)&base->typelib->data[signature_offset (info)];
714 return blob->may_return_null;
718 * g_callable_info_get_caller_owns:
719 * @info: a #GICallableInfo
721 * See whether the caller owns the return value
724 * Returns: TRUE if the caller owns the return value, FALSE otherwise.
727 g_callable_info_get_caller_owns (GICallableInfo *info)
729 GIBaseInfo *base = (GIBaseInfo *)info;
730 SignatureBlob *blob = (SignatureBlob *)&base->typelib->data[signature_offset (info)];
732 if (blob->caller_owns_return_value)
733 return GI_TRANSFER_EVERYTHING;
734 else if (blob->caller_owns_return_container)
735 return GI_TRANSFER_CONTAINER;
737 return GI_TRANSFER_NOTHING;
741 * g_callable_info_get_n_args:
742 * @info: a #GICallableInfo
744 * Get the number of arguments (both IN and OUT) for this callable.
746 * Returns: The number of arguments this callable expects.
749 g_callable_info_get_n_args (GICallableInfo *info)
751 GIBaseInfo *base = (GIBaseInfo *)info;
755 offset = signature_offset (info);
756 blob = (SignatureBlob *)&base->typelib->data[offset];
758 return blob->n_arguments;
762 * g_callable_info_get_arg:
763 * @info: a #GICallableInfo
764 * @n: the argument index to fetch
766 * Get information about a particular argument of this callable.
768 * Returns: A #GIArgInfo indexing the typelib on the given argument.
771 g_callable_info_get_arg (GICallableInfo *info,
774 GIBaseInfo *base = (GIBaseInfo *)info;
775 Header *header = (Header *)base->typelib->data;
778 offset = signature_offset (info);
780 return (GIArgInfo *) g_info_new (GI_INFO_TYPE_ARG, base, base->typelib,
781 offset + header->signature_blob_size + n * header->arg_blob_size);
784 /* GIArgInfo function */
786 g_arg_info_get_direction (GIArgInfo *info)
788 GIBaseInfo *base = (GIBaseInfo *)info;
789 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
791 if (blob->in && blob->out)
792 return GI_DIRECTION_INOUT;
794 return GI_DIRECTION_OUT;
796 return GI_DIRECTION_IN;
800 g_arg_info_is_return_value (GIArgInfo *info)
802 GIBaseInfo *base = (GIBaseInfo *)info;
803 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
805 return blob->return_value;
809 g_arg_info_is_dipper (GIArgInfo *info)
811 GIBaseInfo *base = (GIBaseInfo *)info;
812 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
818 g_arg_info_is_optional (GIArgInfo *info)
820 GIBaseInfo *base = (GIBaseInfo *)info;
821 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
823 return blob->optional;
827 g_arg_info_may_be_null (GIArgInfo *info)
829 GIBaseInfo *base = (GIBaseInfo *)info;
830 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
832 return blob->allow_none;
836 g_arg_info_get_ownership_transfer (GIArgInfo *info)
838 GIBaseInfo *base = (GIBaseInfo *)info;
839 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
841 if (blob->transfer_ownership)
842 return GI_TRANSFER_EVERYTHING;
843 else if (blob->transfer_container_ownership)
844 return GI_TRANSFER_CONTAINER;
846 return GI_TRANSFER_NOTHING;
850 g_arg_info_get_scope (GIArgInfo *info)
852 GIBaseInfo *base = (GIBaseInfo *)info;
853 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
859 g_arg_info_get_closure (GIArgInfo *info)
861 GIBaseInfo *base = (GIBaseInfo *)info;
862 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
864 return blob->closure;
868 g_arg_info_get_destroy (GIArgInfo *info)
870 GIBaseInfo *base = (GIBaseInfo *)info;
871 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
873 return blob->destroy;
877 g_arg_info_get_type (GIArgInfo *info)
879 GIBaseInfo *base = (GIBaseInfo *)info;
881 return g_type_info_new (base, base->typelib, base->offset + G_STRUCT_OFFSET (ArgBlob, arg_type));
884 /* GITypeInfo functions */
886 g_type_info_is_pointer (GITypeInfo *info)
888 GIBaseInfo *base = (GIBaseInfo *)info;
889 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
891 if (type->flags.reserved == 0 && type->flags.reserved2 == 0)
892 return type->flags.pointer;
895 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
897 return iface->pointer;
902 g_type_info_get_tag (GITypeInfo *info)
904 GIBaseInfo *base = (GIBaseInfo *)info;
905 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
907 if (info->is_embedded)
908 return GI_TYPE_TAG_INTERFACE;
909 else if (type->flags.reserved == 0 && type->flags.reserved2 == 0)
910 return type->flags.tag;
913 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
920 g_type_info_get_param_type (GITypeInfo *info,
923 GIBaseInfo *base = (GIBaseInfo *)info;
924 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
926 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
928 ParamTypeBlob *param = (ParamTypeBlob *)&base->typelib->data[base->offset];
932 case GI_TYPE_TAG_ARRAY:
933 case GI_TYPE_TAG_GLIST:
934 case GI_TYPE_TAG_GSLIST:
935 case GI_TYPE_TAG_GHASH:
936 return g_type_info_new (base, base->typelib,
937 base->offset + sizeof (ParamTypeBlob)
938 + sizeof (SimpleTypeBlob) * n);
949 g_type_info_get_interface (GITypeInfo *info)
951 GIBaseInfo *base = (GIBaseInfo *)info;
952 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
954 if (info->is_embedded)
955 return (GIBaseInfo *) g_info_new (type->offset, base, base->typelib,
958 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
960 InterfaceTypeBlob *blob = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
962 if (blob->tag == GI_TYPE_TAG_INTERFACE)
963 return g_info_from_entry (base->repository, base->typelib, blob->interface);
970 g_type_info_get_array_length (GITypeInfo *info)
972 GIBaseInfo *base = (GIBaseInfo *)info;
973 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
975 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
977 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
979 if (blob->tag == GI_TYPE_TAG_ARRAY)
981 if (blob->has_length)
982 return blob->dimensions.length;
990 g_type_info_get_array_fixed_size (GITypeInfo *info)
992 GIBaseInfo *base = (GIBaseInfo *)info;
993 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
995 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
997 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
999 if (blob->tag == GI_TYPE_TAG_ARRAY)
1002 return blob->dimensions.size;
1010 g_type_info_is_zero_terminated (GITypeInfo *info)
1012 GIBaseInfo *base = (GIBaseInfo *)info;
1013 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
1015 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1017 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
1019 if (blob->tag == GI_TYPE_TAG_ARRAY)
1020 return blob->zero_terminated;
1027 g_type_info_get_n_error_domains (GITypeInfo *info)
1029 GIBaseInfo *base = (GIBaseInfo *)info;
1030 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
1032 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1034 ErrorTypeBlob *blob = (ErrorTypeBlob *)&base->typelib->data[base->offset];
1036 if (blob->tag == GI_TYPE_TAG_ERROR)
1037 return blob->n_domains;
1044 g_type_info_get_error_domain (GITypeInfo *info,
1047 GIBaseInfo *base = (GIBaseInfo *)info;
1048 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
1050 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1052 ErrorTypeBlob *blob = (ErrorTypeBlob *)&base->typelib->data[base->offset];
1054 if (blob->tag == GI_TYPE_TAG_ERROR)
1055 return (GIErrorDomainInfo *) g_info_from_entry (base->repository,
1064 /* GIErrorDomainInfo functions */
1066 g_error_domain_info_get_quark (GIErrorDomainInfo *info)
1068 GIBaseInfo *base = (GIBaseInfo *)info;
1069 ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->typelib->data[base->offset];
1071 return g_typelib_get_string (base->typelib, blob->get_quark);
1075 g_error_domain_info_get_codes (GIErrorDomainInfo *info)
1077 GIBaseInfo *base = (GIBaseInfo *)info;
1078 ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->typelib->data[base->offset];
1080 return (GIInterfaceInfo *) g_info_from_entry (base->repository,
1081 base->typelib, blob->error_codes);
1085 /* GIValueInfo functions */
1087 g_value_info_get_value (GIValueInfo *info)
1089 GIBaseInfo *base = (GIBaseInfo *)info;
1090 ValueBlob *blob = (ValueBlob *)&base->typelib->data[base->offset];
1092 return (glong)blob->value;
1095 /* GIFieldInfo functions */
1097 g_field_info_get_flags (GIFieldInfo *info)
1099 GIFieldInfoFlags flags;
1101 GIBaseInfo *base = (GIBaseInfo *)info;
1102 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
1107 flags = flags | GI_FIELD_IS_READABLE;
1110 flags = flags | GI_FIELD_IS_WRITABLE;
1116 g_field_info_get_size (GIFieldInfo *info)
1118 GIBaseInfo *base = (GIBaseInfo *)info;
1119 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
1125 g_field_info_get_offset (GIFieldInfo *info)
1127 GIBaseInfo *base = (GIBaseInfo *)info;
1128 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
1130 return blob->struct_offset;
1134 g_field_info_get_type (GIFieldInfo *info)
1136 GIBaseInfo *base = (GIBaseInfo *)info;
1137 Header *header = (Header *)base->typelib->data;
1138 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
1139 GITypeInfo *type_info;
1141 if (blob->has_embedded_type)
1143 type_info = (GITypeInfo *) g_info_new (GI_INFO_TYPE_TYPE,
1144 (GIBaseInfo*)info, base->typelib,
1145 base->offset + header->field_blob_size);
1146 type_info->is_embedded = TRUE;
1149 return g_type_info_new (base, base->typelib, base->offset + G_STRUCT_OFFSET (FieldBlob, type));
1154 /* GIRegisteredTypeInfo functions */
1156 g_registered_type_info_get_type_name (GIRegisteredTypeInfo *info)
1158 GIBaseInfo *base = (GIBaseInfo *)info;
1159 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&base->typelib->data[base->offset];
1161 if (blob->gtype_name)
1162 return g_typelib_get_string (base->typelib, blob->gtype_name);
1168 g_registered_type_info_get_type_init (GIRegisteredTypeInfo *info)
1170 GIBaseInfo *base = (GIBaseInfo *)info;
1171 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&base->typelib->data[base->offset];
1173 if (blob->gtype_init)
1174 return g_typelib_get_string (base->typelib, blob->gtype_init);
1180 g_registered_type_info_get_g_type (GIRegisteredTypeInfo *info)
1182 const char *type_init;
1183 GType (* get_type_func) (void);
1185 type_init = g_registered_type_info_get_type_init (info);
1187 if (type_init == NULL)
1189 else if (!strcmp (type_init, "intern"))
1190 return G_TYPE_OBJECT;
1192 get_type_func = NULL;
1193 if (!g_typelib_symbol (((GIBaseInfo*)info)->typelib,
1195 (void**) &get_type_func))
1198 return (* get_type_func) ();
1201 /* GIStructInfo functions */
1203 g_struct_info_get_n_fields (GIStructInfo *info)
1205 GIBaseInfo *base = (GIBaseInfo *)info;
1206 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1208 return blob->n_fields;
1212 g_struct_get_field_offset (GIStructInfo *info,
1215 GIBaseInfo *base = (GIBaseInfo *)info;
1216 Header *header = (Header *)base->typelib->data;
1217 guint32 offset = base->offset + header->struct_blob_size;
1219 FieldBlob *field_blob;
1221 for (i = 0; i < n; i++)
1223 field_blob = (FieldBlob *)&base->typelib->data[offset];
1224 offset += header->field_blob_size;
1225 if (field_blob->has_embedded_type)
1226 offset += header->callback_blob_size;
1233 g_struct_info_get_field (GIStructInfo *info,
1236 GIBaseInfo *base = (GIBaseInfo *)info;
1238 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib,
1239 g_struct_get_field_offset (info, n));
1243 g_struct_info_get_n_methods (GIStructInfo *info)
1245 GIBaseInfo *base = (GIBaseInfo *)info;
1246 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1248 return blob->n_methods;
1252 g_struct_info_get_method (GIStructInfo *info,
1255 GIBaseInfo *base = (GIBaseInfo *)info;
1256 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1257 Header *header = (Header *)base->typelib->data;
1260 offset = g_struct_get_field_offset (info, blob->n_fields)
1261 + n * header->function_blob_size;
1262 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1263 base->typelib, offset);
1266 static GIFunctionInfo *
1267 find_method (GIBaseInfo *base,
1273 Header *header = (Header *)base->typelib->data;
1276 for (i = 0; i < n_methods; i++)
1278 FunctionBlob *fblob = (FunctionBlob *)&base->typelib->data[offset];
1279 const gchar *fname = (const gchar *)&base->typelib->data[fblob->name];
1281 if (strcmp (name, fname) == 0)
1282 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1283 base->typelib, offset);
1285 offset += header->function_blob_size;
1292 g_struct_info_find_method (GIStructInfo *info,
1296 GIBaseInfo *base = (GIBaseInfo *)info;
1297 Header *header = (Header *)base->typelib->data;
1298 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1300 offset = base->offset + header->struct_blob_size
1301 + blob->n_fields * header->field_blob_size;
1303 return find_method (base, offset, blob->n_methods, name);
1307 g_struct_info_get_size (GIStructInfo *info)
1309 GIBaseInfo *base = (GIBaseInfo *)info;
1310 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1316 g_struct_info_get_alignment (GIStructInfo *info)
1318 GIBaseInfo *base = (GIBaseInfo *)info;
1319 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1321 return blob->alignment;
1325 * g_struct_info_is_gtype_struct:
1326 * @info: GIStructInfo
1328 * Return true if this structure represents the "class structure" for some
1329 * #GObject or #GInterface. This function is mainly useful to hide this kind of structure
1330 * from generated public APIs.
1332 * Returns: %TRUE if this is a class struct, %FALSE otherwise
1335 g_struct_info_is_gtype_struct (GIStructInfo *info)
1337 GIBaseInfo *base = (GIBaseInfo *)info;
1338 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1340 return blob->is_gtype_struct;
1344 g_enum_info_get_n_values (GIEnumInfo *info)
1346 GIBaseInfo *base = (GIBaseInfo *)info;
1347 EnumBlob *blob = (EnumBlob *)&base->typelib->data[base->offset];
1349 return blob->n_values;
1353 g_enum_info_get_value (GIEnumInfo *info,
1356 GIBaseInfo *base = (GIBaseInfo *)info;
1357 Header *header = (Header *)base->typelib->data;
1360 offset = base->offset + header->enum_blob_size
1361 + n * header->value_blob_size;
1362 return (GIValueInfo *) g_info_new (GI_INFO_TYPE_VALUE, base, base->typelib, offset);
1366 * g_enum_info_get_storage_type:
1369 * Gets the tag of the type used for the enum in the C ABI. This will
1370 * will be a signed or unsigned integral type.
1372 * Note that in the current implementation the width of the type is
1373 * computed correctly, but the signed or unsigned nature of the type
1374 * may not match the sign of the type used by the C compiler.
1376 * Return Value: the storage type for the enumeration
1379 g_enum_info_get_storage_type (GIEnumInfo *info)
1381 GIBaseInfo *base = (GIBaseInfo *)info;
1382 EnumBlob *blob = (EnumBlob *)&base->typelib->data[base->offset];
1384 return blob->storage_type;
1387 /* GIObjectInfo functions */
1389 g_object_info_get_parent (GIObjectInfo *info)
1391 GIBaseInfo *base = (GIBaseInfo *)info;
1392 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1395 return (GIObjectInfo *) g_info_from_entry (base->repository,
1396 base->typelib, blob->parent);
1402 g_object_info_get_abstract (GIObjectInfo *info)
1404 GIBaseInfo *base = (GIBaseInfo *)info;
1405 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1406 return blob->abstract != 0;
1410 g_object_info_get_type_name (GIObjectInfo *info)
1412 GIBaseInfo *base = (GIBaseInfo *)info;
1413 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1415 return g_typelib_get_string (base->typelib, blob->gtype_name);
1419 g_object_info_get_type_init (GIObjectInfo *info)
1421 GIBaseInfo *base = (GIBaseInfo *)info;
1422 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1424 return g_typelib_get_string (base->typelib, blob->gtype_init);
1428 g_object_info_get_n_interfaces (GIObjectInfo *info)
1430 GIBaseInfo *base = (GIBaseInfo *)info;
1431 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1433 return blob->n_interfaces;
1437 g_object_info_get_interface (GIObjectInfo *info,
1440 GIBaseInfo *base = (GIBaseInfo *)info;
1441 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1443 return (GIInterfaceInfo *) g_info_from_entry (base->repository,
1444 base->typelib, blob->interfaces[n]);
1448 g_object_info_get_n_fields (GIObjectInfo *info)
1450 GIBaseInfo *base = (GIBaseInfo *)info;
1451 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1453 return blob->n_fields;
1457 g_object_info_get_field (GIObjectInfo *info,
1461 GIBaseInfo *base = (GIBaseInfo *)info;
1462 Header *header = (Header *)base->typelib->data;
1463 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1465 offset = base->offset + header->object_blob_size
1466 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1467 + n * header->field_blob_size;
1469 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib, offset);
1473 g_object_info_get_n_properties (GIObjectInfo *info)
1475 GIBaseInfo *base = (GIBaseInfo *)info;
1476 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1478 return blob->n_properties;
1482 g_object_info_get_property (GIObjectInfo *info,
1486 GIBaseInfo *base = (GIBaseInfo *)info;
1487 Header *header = (Header *)base->typelib->data;
1488 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1490 offset = base->offset + header->object_blob_size
1491 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1492 + blob->n_fields * header->field_blob_size
1493 + n * header->property_blob_size;
1495 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base,
1496 base->typelib, offset);
1500 g_object_info_get_n_methods (GIObjectInfo *info)
1502 GIBaseInfo *base = (GIBaseInfo *)info;
1503 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1505 return blob->n_methods;
1509 g_object_info_get_method (GIObjectInfo *info,
1513 GIBaseInfo *base = (GIBaseInfo *)info;
1514 Header *header = (Header *)base->typelib->data;
1515 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1517 offset = base->offset + header->object_blob_size
1518 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1519 + blob->n_fields * header->field_blob_size
1520 + blob->n_properties * header->property_blob_size
1521 + n * header->function_blob_size;
1523 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1524 base->typelib, offset);
1528 g_object_info_find_method (GIObjectInfo *info,
1532 GIBaseInfo *base = (GIBaseInfo *)info;
1533 Header *header = (Header *)base->typelib->data;
1534 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1536 offset = base->offset + header->object_blob_size
1537 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1538 + blob->n_fields * header->field_blob_size +
1539 + blob->n_properties * header->property_blob_size;
1541 return find_method (base, offset, blob->n_methods, name);
1545 g_object_info_get_n_signals (GIObjectInfo *info)
1547 GIBaseInfo *base = (GIBaseInfo *)info;
1548 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1550 return blob->n_signals;
1554 g_object_info_get_signal (GIObjectInfo *info,
1558 GIBaseInfo *base = (GIBaseInfo *)info;
1559 Header *header = (Header *)base->typelib->data;
1560 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1562 offset = base->offset + header->object_blob_size
1563 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1564 + blob->n_fields * header->field_blob_size
1565 + blob->n_properties * header->property_blob_size
1566 + blob->n_methods * header->function_blob_size
1567 + n * header->signal_blob_size;
1569 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base,
1570 base->typelib, offset);
1574 g_object_info_get_n_vfuncs (GIObjectInfo *info)
1576 GIBaseInfo *base = (GIBaseInfo *)info;
1577 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1579 return blob->n_vfuncs;
1583 g_object_info_get_vfunc (GIObjectInfo *info,
1587 GIBaseInfo *base = (GIBaseInfo *)info;
1588 Header *header = (Header *)base->typelib->data;
1589 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1591 offset = base->offset + header->object_blob_size
1592 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1593 + blob->n_fields * header->field_blob_size
1594 + blob->n_properties * header->property_blob_size
1595 + blob->n_methods * header->function_blob_size
1596 + blob->n_signals * header->signal_blob_size
1597 + n * header->vfunc_blob_size;
1599 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1600 base->typelib, offset);
1603 static GIVFuncInfo *
1604 find_vfunc (GIBaseInfo *base,
1610 Header *header = (Header *)base->typelib->data;
1613 for (i = 0; i < n_vfuncs; i++)
1615 VFuncBlob *fblob = (VFuncBlob *)&base->typelib->data[offset];
1616 const gchar *fname = (const gchar *)&base->typelib->data[fblob->name];
1618 if (strcmp (name, fname) == 0)
1619 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1620 base->typelib, offset);
1622 offset += header->vfunc_blob_size;
1629 * g_object_info_find_vfunc:
1630 * @info: An #GIObjectInfo
1631 * @name: The name of a virtual function to find.
1633 * Locate a virtual function slot with name @name. Note that the namespace
1634 * for virtuals is distinct from that of methods; there may or may not be
1635 * a concrete method associated for a virtual. If there is one, it may
1636 * be retrieved using #g_vfunc_info_get_invoker. See the documentation for
1637 * that function for more information on invoking virtuals.
1639 * Return value: (transfer full): A #GIVFuncInfo, or %NULL if none with name @name.
1642 g_object_info_find_vfunc (GIObjectInfo *info,
1646 GIBaseInfo *base = (GIBaseInfo *)info;
1647 Header *header = (Header *)base->typelib->data;
1648 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1650 offset = base->offset + header->object_blob_size
1651 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1652 + blob->n_fields * header->field_blob_size
1653 + blob->n_properties * header->property_blob_size
1654 + blob->n_methods * header->function_blob_size
1655 + blob->n_signals * header->signal_blob_size;
1657 return find_vfunc (base, offset, blob->n_vfuncs, name);
1661 g_object_info_get_n_constants (GIObjectInfo *info)
1663 GIBaseInfo *base = (GIBaseInfo *)info;
1664 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1666 return blob->n_constants;
1670 g_object_info_get_constant (GIObjectInfo *info,
1674 GIBaseInfo *base = (GIBaseInfo *)info;
1675 Header *header = (Header *)base->typelib->data;
1676 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1678 offset = base->offset + header->object_blob_size
1679 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1680 + blob->n_fields * header->field_blob_size
1681 + blob->n_properties * header->property_blob_size
1682 + blob->n_methods * header->function_blob_size
1683 + blob->n_signals * header->signal_blob_size
1684 + blob->n_vfuncs * header->vfunc_blob_size
1685 + n * header->constant_blob_size;
1687 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1688 base->typelib, offset);
1692 * g_object_info_get_class_struct:
1693 * @info: A #GIObjectInfo to query
1695 * Every #GObject has two structures; an instance structure and a class
1696 * structure. This function returns the metadata for the class structure.
1698 * Returns: a #GIStructInfo for the class struct or %NULL if none found.
1701 g_object_info_get_class_struct (GIObjectInfo *info)
1703 GIBaseInfo *base = (GIBaseInfo *)info;
1704 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1706 if (blob->gtype_struct)
1707 return (GIStructInfo *) g_info_from_entry (base->repository,
1708 base->typelib, blob->gtype_struct);
1713 /* GIInterfaceInfo functions */
1715 g_interface_info_get_n_prerequisites (GIInterfaceInfo *info)
1717 GIBaseInfo *base = (GIBaseInfo *)info;
1718 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1720 return blob->n_prerequisites;
1724 g_interface_info_get_prerequisite (GIInterfaceInfo *info,
1727 GIBaseInfo *base = (GIBaseInfo *)info;
1728 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1730 return g_info_from_entry (base->repository,
1731 base->typelib, blob->prerequisites[n]);
1736 g_interface_info_get_n_properties (GIInterfaceInfo *info)
1738 GIBaseInfo *base = (GIBaseInfo *)info;
1739 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1741 return blob->n_properties;
1745 g_interface_info_get_property (GIInterfaceInfo *info,
1749 GIBaseInfo *base = (GIBaseInfo *)info;
1750 Header *header = (Header *)base->typelib->data;
1751 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1753 offset = base->offset + header->interface_blob_size
1754 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1755 + n * header->property_blob_size;
1757 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base,
1758 base->typelib, offset);
1762 g_interface_info_get_n_methods (GIInterfaceInfo *info)
1764 GIBaseInfo *base = (GIBaseInfo *)info;
1765 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1767 return blob->n_methods;
1771 g_interface_info_get_method (GIInterfaceInfo *info,
1775 GIBaseInfo *base = (GIBaseInfo *)info;
1776 Header *header = (Header *)base->typelib->data;
1777 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1779 offset = base->offset + header->interface_blob_size
1780 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1781 + blob->n_properties * header->property_blob_size
1782 + n * header->function_blob_size;
1784 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1785 base->typelib, offset);
1789 g_interface_info_find_method (GIInterfaceInfo *info,
1793 GIBaseInfo *base = (GIBaseInfo *)info;
1794 Header *header = (Header *)base->typelib->data;
1795 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1797 offset = base->offset + header->interface_blob_size
1798 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1799 + blob->n_properties * header->property_blob_size;
1801 return find_method (base, offset, blob->n_methods, name);
1805 g_interface_info_get_n_signals (GIInterfaceInfo *info)
1807 GIBaseInfo *base = (GIBaseInfo *)info;
1808 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1810 return blob->n_signals;
1814 g_interface_info_get_signal (GIInterfaceInfo *info,
1818 GIBaseInfo *base = (GIBaseInfo *)info;
1819 Header *header = (Header *)base->typelib->data;
1820 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1822 offset = base->offset + header->interface_blob_size
1823 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1824 + blob->n_properties * header->property_blob_size
1825 + blob->n_methods * header->function_blob_size
1826 + n * header->signal_blob_size;
1828 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base,
1829 base->typelib, offset);
1833 g_interface_info_get_n_vfuncs (GIInterfaceInfo *info)
1835 GIBaseInfo *base = (GIBaseInfo *)info;
1836 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1838 return blob->n_vfuncs;
1842 g_interface_info_get_vfunc (GIInterfaceInfo *info,
1846 GIBaseInfo *base = (GIBaseInfo *)info;
1847 Header *header = (Header *)base->typelib->data;
1848 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1850 offset = base->offset + header->interface_blob_size
1851 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1852 + blob->n_properties * header->property_blob_size
1853 + blob->n_methods * header->function_blob_size
1854 + blob->n_signals * header->signal_blob_size
1855 + n * header->vfunc_blob_size;
1857 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1858 base->typelib, offset);
1862 * g_interface_info_find_vfunc:
1863 * @info: An #GIObjectInfo
1864 * @name: The name of a virtual function to find.
1866 * Locate a virtual function slot with name @name. See the documentation
1867 * for #g_object_info_find_vfunc for more information on virtuals.
1869 * Return value: (transfer full): A #GIVFuncInfo, or %NULL if none with name @name.
1872 g_interface_info_find_vfunc (GIInterfaceInfo *info,
1876 GIBaseInfo *base = (GIBaseInfo *)info;
1877 Header *header = (Header *)base->typelib->data;
1878 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1880 offset = base->offset + header->interface_blob_size
1881 + (blob->n_prerequisites + blob->n_prerequisites % 2) * 2
1882 + blob->n_properties * header->property_blob_size
1883 + blob->n_methods * header->function_blob_size
1884 + blob->n_signals * header->signal_blob_size;
1886 return find_vfunc (base, offset, blob->n_vfuncs, name);
1890 g_interface_info_get_n_constants (GIInterfaceInfo *info)
1892 GIBaseInfo *base = (GIBaseInfo *)info;
1893 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1895 return blob->n_constants;
1899 g_interface_info_get_constant (GIInterfaceInfo *info,
1903 GIBaseInfo *base = (GIBaseInfo *)info;
1904 Header *header = (Header *)base->typelib->data;
1905 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1907 offset = base->offset + header->interface_blob_size
1908 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1909 + blob->n_properties * header->property_blob_size
1910 + blob->n_methods * header->function_blob_size
1911 + blob->n_signals * header->signal_blob_size
1912 + blob->n_vfuncs * header->vfunc_blob_size
1913 + n * header->constant_blob_size;
1915 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1916 base->typelib, offset);
1920 * g_interface_info_get_iface_struct:
1921 * @info: A #GIInterfaceInfo to query
1923 * Returns the layout C structure associated with this #GInterface.
1925 * Returns: A #GIStructInfo for the class struct or %NULL if none found.
1928 g_interface_info_get_iface_struct (GIInterfaceInfo *info)
1930 GIBaseInfo *base = (GIBaseInfo *)info;
1931 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1933 if (blob->gtype_struct)
1934 return (GIStructInfo *) g_info_from_entry (base->repository,
1935 base->typelib, blob->gtype_struct);
1940 /* GIPropertyInfo functions */
1942 g_property_info_get_flags (GIPropertyInfo *info)
1945 GIBaseInfo *base = (GIBaseInfo *)info;
1946 PropertyBlob *blob = (PropertyBlob *)&base->typelib->data[base->offset];
1951 flags = flags | G_PARAM_READABLE;
1954 flags = flags | G_PARAM_WRITABLE;
1956 if (blob->construct)
1957 flags = flags | G_PARAM_CONSTRUCT;
1959 if (blob->construct_only)
1960 flags = flags | G_PARAM_CONSTRUCT_ONLY;
1966 g_property_info_get_type (GIPropertyInfo *info)
1968 GIBaseInfo *base = (GIBaseInfo *)info;
1970 return g_type_info_new (base, base->typelib, base->offset + G_STRUCT_OFFSET (PropertyBlob, type));
1974 /* GISignalInfo functions */
1976 g_signal_info_get_flags (GISignalInfo *info)
1980 GIBaseInfo *base = (GIBaseInfo *)info;
1981 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1985 if (blob->run_first)
1986 flags = flags | G_SIGNAL_RUN_FIRST;
1989 flags = flags | G_SIGNAL_RUN_LAST;
1991 if (blob->run_cleanup)
1992 flags = flags | G_SIGNAL_RUN_CLEANUP;
1994 if (blob->no_recurse)
1995 flags = flags | G_SIGNAL_NO_RECURSE;
1998 flags = flags | G_SIGNAL_DETAILED;
2001 flags = flags | G_SIGNAL_ACTION;
2004 flags = flags | G_SIGNAL_NO_HOOKS;
2010 g_signal_info_get_class_closure (GISignalInfo *info)
2012 GIBaseInfo *base = (GIBaseInfo *)info;
2013 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
2015 if (blob->has_class_closure)
2016 return g_interface_info_get_vfunc ((GIInterfaceInfo *)base->container, blob->class_closure);
2022 g_signal_info_true_stops_emit (GISignalInfo *info)
2024 GIBaseInfo *base = (GIBaseInfo *)info;
2025 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
2027 return blob->true_stops_emit;
2030 /* GIVFuncInfo functions */
2032 g_vfunc_info_get_flags (GIVFuncInfo *info)
2034 GIVFuncInfoFlags flags;
2036 GIBaseInfo *base = (GIBaseInfo *)info;
2037 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
2041 if (blob->must_chain_up)
2042 flags = flags | GI_VFUNC_MUST_CHAIN_UP;
2044 if (blob->must_be_implemented)
2045 flags = flags | GI_VFUNC_MUST_OVERRIDE;
2047 if (blob->must_not_be_implemented)
2048 flags = flags | GI_VFUNC_MUST_NOT_OVERRIDE;
2054 g_vfunc_info_get_offset (GIVFuncInfo *info)
2056 GIBaseInfo *base = (GIBaseInfo *)info;
2057 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
2059 return blob->struct_offset;
2063 g_vfunc_info_get_signal (GIVFuncInfo *info)
2065 GIBaseInfo *base = (GIBaseInfo *)info;
2066 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
2068 if (blob->class_closure)
2069 return g_interface_info_get_signal ((GIInterfaceInfo *)base->container, blob->signal);
2075 * g_vfunc_info_get_invoker:
2076 * @info: A #GIVFuncInfo
2078 * If this virtual function has an associated invoker method, this
2079 * method will return it. An invoker method is a C entry point.
2081 * Not all virtuals will have invokers.
2083 * Return value: (transfer full): An invoker function, or %NULL if none known
2086 g_vfunc_info_get_invoker (GIVFuncInfo *info)
2088 GIBaseInfo *base = (GIBaseInfo *)info;
2089 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
2090 GIBaseInfo *container = base->container;
2091 GIInfoType parent_type;
2093 /* 1023 = 0x3ff is the maximum of the 10 bits for invoker index */
2094 if (blob->invoker == 1023)
2097 parent_type = g_base_info_get_type (container);
2098 if (parent_type == GI_INFO_TYPE_OBJECT)
2099 return g_object_info_get_method ((GIObjectInfo*)container, blob->invoker);
2100 else if (parent_type == GI_INFO_TYPE_INTERFACE)
2101 return g_interface_info_get_method ((GIInterfaceInfo*)container, blob->invoker);
2103 g_assert_not_reached ();
2106 /* GIConstantInfo functions */
2108 g_constant_info_get_type (GIConstantInfo *info)
2110 GIBaseInfo *base = (GIBaseInfo *)info;
2112 return g_type_info_new (base, base->typelib, base->offset + 8);
2116 g_constant_info_get_value (GIConstantInfo *info,
2119 GIBaseInfo *base = (GIBaseInfo *)info;
2120 ConstantBlob *blob = (ConstantBlob *)&base->typelib->data[base->offset];
2122 /* FIXME non-basic types ? */
2123 if (blob->type.flags.reserved == 0 && blob->type.flags.reserved2 == 0)
2125 if (blob->type.flags.pointer)
2126 value->v_pointer = g_memdup (&base->typelib->data[blob->offset], blob->size);
2129 switch (blob->type.flags.tag)
2131 case GI_TYPE_TAG_BOOLEAN:
2132 value->v_boolean = *(gboolean*)&base->typelib->data[blob->offset];
2134 case GI_TYPE_TAG_INT8:
2135 value->v_int8 = *(gint8*)&base->typelib->data[blob->offset];
2137 case GI_TYPE_TAG_UINT8:
2138 value->v_uint8 = *(guint8*)&base->typelib->data[blob->offset];
2140 case GI_TYPE_TAG_INT16:
2141 value->v_int16 = *(gint16*)&base->typelib->data[blob->offset];
2143 case GI_TYPE_TAG_UINT16:
2144 value->v_uint16 = *(guint16*)&base->typelib->data[blob->offset];
2146 case GI_TYPE_TAG_INT32:
2147 value->v_int32 = *(gint32*)&base->typelib->data[blob->offset];
2149 case GI_TYPE_TAG_UINT32:
2150 value->v_uint32 = *(guint32*)&base->typelib->data[blob->offset];
2152 case GI_TYPE_TAG_INT64:
2153 value->v_int64 = *(gint64*)&base->typelib->data[blob->offset];
2155 case GI_TYPE_TAG_UINT64:
2156 value->v_uint64 = *(guint64*)&base->typelib->data[blob->offset];
2158 case GI_TYPE_TAG_FLOAT:
2159 value->v_float = *(gfloat*)&base->typelib->data[blob->offset];
2161 case GI_TYPE_TAG_DOUBLE:
2162 value->v_double = *(gdouble*)&base->typelib->data[blob->offset];
2164 case GI_TYPE_TAG_TIME_T:
2165 value->v_long = *(long*)&base->typelib->data[blob->offset];
2167 case GI_TYPE_TAG_SHORT:
2168 value->v_short = *(gshort*)&base->typelib->data[blob->offset];
2170 case GI_TYPE_TAG_USHORT:
2171 value->v_ushort = *(gushort*)&base->typelib->data[blob->offset];
2173 case GI_TYPE_TAG_INT:
2174 value->v_int = *(gint*)&base->typelib->data[blob->offset];
2176 case GI_TYPE_TAG_UINT:
2177 value->v_uint = *(guint*)&base->typelib->data[blob->offset];
2179 case GI_TYPE_TAG_LONG:
2180 value->v_long = *(glong*)&base->typelib->data[blob->offset];
2182 case GI_TYPE_TAG_ULONG:
2183 value->v_ulong = *(gulong*)&base->typelib->data[blob->offset];
2192 /* GIUnionInfo functions */
2194 g_union_info_get_n_fields (GIUnionInfo *info)
2196 GIBaseInfo *base = (GIBaseInfo *)info;
2197 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2199 return blob->n_fields;
2203 g_union_info_get_field (GIUnionInfo *info,
2206 GIBaseInfo *base = (GIBaseInfo *)info;
2207 Header *header = (Header *)base->typelib->data;
2209 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib,
2210 base->offset + header->union_blob_size +
2211 n * header->field_blob_size);
2215 g_union_info_get_n_methods (GIUnionInfo *info)
2217 GIBaseInfo *base = (GIBaseInfo *)info;
2218 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2220 return blob->n_functions;
2224 g_union_info_get_method (GIUnionInfo *info,
2227 GIBaseInfo *base = (GIBaseInfo *)info;
2228 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2229 Header *header = (Header *)base->typelib->data;
2232 offset = base->offset + header->union_blob_size
2233 + blob->n_fields * header->field_blob_size
2234 + n * header->function_blob_size;
2235 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
2236 base->typelib, offset);
2240 g_union_info_is_discriminated (GIUnionInfo *info)
2242 GIBaseInfo *base = (GIBaseInfo *)info;
2243 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2245 return blob->discriminated;
2249 g_union_info_get_discriminator_offset (GIUnionInfo *info)
2251 GIBaseInfo *base = (GIBaseInfo *)info;
2252 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2254 return blob->discriminator_offset;
2258 g_union_info_get_discriminator_type (GIUnionInfo *info)
2260 GIBaseInfo *base = (GIBaseInfo *)info;
2262 return g_type_info_new (base, base->typelib, base->offset + 24);
2266 g_union_info_get_discriminator (GIUnionInfo *info,
2269 GIBaseInfo *base = (GIBaseInfo *)info;
2270 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2272 if (blob->discriminated)
2274 Header *header = (Header *)base->typelib->data;
2277 offset = base->offset + header->union_blob_size
2278 + blob->n_fields * header->field_blob_size
2279 + blob->n_functions * header->function_blob_size
2280 + n * header->constant_blob_size;
2282 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
2283 base->typelib, offset);
2290 g_union_info_find_method (GIUnionInfo *info,
2294 GIBaseInfo *base = (GIBaseInfo *)info;
2295 Header *header = (Header *)base->typelib->data;
2296 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2298 offset = base->offset + header->union_blob_size
2299 + blob->n_fields * header->field_blob_size;
2301 return find_method (base, offset, blob->n_functions, name);
2305 g_union_info_get_size (GIUnionInfo *info)
2307 GIBaseInfo *base = (GIBaseInfo *)info;
2308 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2314 g_union_info_get_alignment (GIUnionInfo *info)
2316 GIBaseInfo *base = (GIBaseInfo *)info;
2317 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2319 return blob->alignment;