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
141 GIRegisteredTypeInfo registered;
147 g_info_new_full (GIInfoType type,
148 GIRepository *repository,
149 GIBaseInfo *container,
155 g_return_val_if_fail (container != NULL || repository != NULL, NULL);
157 info = g_new0 (GIBaseInfo, 1);
162 info->typelib = typelib;
163 info->offset = offset;
166 info->container = g_base_info_ref (container);
168 info->repository = g_object_ref (repository);
174 g_info_new (GIInfoType type,
175 GIBaseInfo *container,
179 return g_info_new_full (type, container->repository, container, typelib, offset);
183 g_info_from_entry (GIRepository *repository,
188 DirEntry *entry = g_typelib_get_dir_entry (typelib, index);
191 result = g_info_new_full (entry->blob_type, repository, NULL, typelib, entry->offset);
194 const gchar *namespace = g_typelib_get_string (typelib, entry->offset);
195 const gchar *name = g_typelib_get_string (typelib, entry->name);
197 result = g_irepository_find_by_name (repository, namespace, name);
200 GIUnresolvedInfo *unresolved;
202 unresolved = g_new0 (GIUnresolvedInfo, 1);
204 unresolved->type = GI_INFO_TYPE_UNRESOLVED;
205 unresolved->ref_count = 1;
206 unresolved->repository = repository;
207 unresolved->container = NULL;
208 unresolved->name = name;
209 unresolved->namespace = namespace;
211 return (GIBaseInfo*)unresolved;
219 /* GIBaseInfo functions */
221 g_base_info_ref (GIBaseInfo *info)
229 g_base_info_unref (GIBaseInfo *info)
231 g_assert (info->ref_count > 0);
234 if (!info->ref_count)
237 g_base_info_unref (info->container);
239 if (info->repository)
240 g_object_unref (info->repository);
247 g_base_info_get_type (GIBaseInfo *info)
254 g_base_info_get_name (GIBaseInfo *info)
256 g_assert (info->ref_count > 0);
259 case GI_INFO_TYPE_FUNCTION:
260 case GI_INFO_TYPE_CALLBACK:
261 case GI_INFO_TYPE_STRUCT:
262 case GI_INFO_TYPE_BOXED:
263 case GI_INFO_TYPE_ENUM:
264 case GI_INFO_TYPE_FLAGS:
265 case GI_INFO_TYPE_OBJECT:
266 case GI_INFO_TYPE_INTERFACE:
267 case GI_INFO_TYPE_CONSTANT:
268 case GI_INFO_TYPE_ERROR_DOMAIN:
269 case GI_INFO_TYPE_UNION:
271 CommonBlob *blob = (CommonBlob *)&info->typelib->data[info->offset];
273 return g_typelib_get_string (info->typelib, blob->name);
277 case GI_INFO_TYPE_VALUE:
279 ValueBlob *blob = (ValueBlob *)&info->typelib->data[info->offset];
281 return g_typelib_get_string (info->typelib, blob->name);
285 case GI_INFO_TYPE_SIGNAL:
287 SignalBlob *blob = (SignalBlob *)&info->typelib->data[info->offset];
289 return g_typelib_get_string (info->typelib, blob->name);
293 case GI_INFO_TYPE_PROPERTY:
295 PropertyBlob *blob = (PropertyBlob *)&info->typelib->data[info->offset];
297 return g_typelib_get_string (info->typelib, blob->name);
301 case GI_INFO_TYPE_VFUNC:
303 VFuncBlob *blob = (VFuncBlob *)&info->typelib->data[info->offset];
305 return g_typelib_get_string (info->typelib, blob->name);
309 case GI_INFO_TYPE_FIELD:
311 FieldBlob *blob = (FieldBlob *)&info->typelib->data[info->offset];
313 return g_typelib_get_string (info->typelib, blob->name);
317 case GI_INFO_TYPE_ARG:
319 ArgBlob *blob = (ArgBlob *)&info->typelib->data[info->offset];
321 return g_typelib_get_string (info->typelib, blob->name);
324 case GI_INFO_TYPE_UNRESOLVED:
326 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
328 return unresolved->name;
331 case GI_INFO_TYPE_TYPE:
333 g_assert_not_reached ();
341 g_base_info_get_namespace (GIBaseInfo *info)
343 Header *header = (Header *)info->typelib->data;
345 g_assert (info->ref_count > 0);
347 if (info->type == GI_INFO_TYPE_UNRESOLVED)
349 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
351 return unresolved->namespace;
354 return g_typelib_get_string (info->typelib, header->namespace);
358 g_base_info_is_deprecated (GIBaseInfo *info)
362 case GI_INFO_TYPE_FUNCTION:
363 case GI_INFO_TYPE_CALLBACK:
364 case GI_INFO_TYPE_STRUCT:
365 case GI_INFO_TYPE_BOXED:
366 case GI_INFO_TYPE_ENUM:
367 case GI_INFO_TYPE_FLAGS:
368 case GI_INFO_TYPE_OBJECT:
369 case GI_INFO_TYPE_INTERFACE:
370 case GI_INFO_TYPE_CONSTANT:
371 case GI_INFO_TYPE_ERROR_DOMAIN:
373 CommonBlob *blob = (CommonBlob *)&info->typelib->data[info->offset];
375 return blob->deprecated;
379 case GI_INFO_TYPE_VALUE:
381 ValueBlob *blob = (ValueBlob *)&info->typelib->data[info->offset];
383 return blob->deprecated;
387 case GI_INFO_TYPE_SIGNAL:
389 SignalBlob *blob = (SignalBlob *)&info->typelib->data[info->offset];
391 return blob->deprecated;
395 case GI_INFO_TYPE_PROPERTY:
397 PropertyBlob *blob = (PropertyBlob *)&info->typelib->data[info->offset];
399 return blob->deprecated;
403 case GI_INFO_TYPE_VFUNC:
404 case GI_INFO_TYPE_FIELD:
405 case GI_INFO_TYPE_ARG:
406 case GI_INFO_TYPE_TYPE:
408 /* no deprecation flag for these */
415 * g_base_info_get_attribute:
416 * @info: A #GIBaseInfo
417 * @name: A freeform string naming an attribute
419 * Retrieve an arbitrary attribute associated with this node.
421 * Return value: The value of the attribute, or %NULL if no such attribute exists
424 g_base_info_get_attribute (GIBaseInfo *info,
427 GIAttributeIter iter = { 0, };
428 gchar *curname, *curvalue;
429 while (g_base_info_iterate_attributes (info, &iter, &curname, &curvalue))
431 if (strcmp (name, curname) == 0)
432 return (const gchar*) curvalue;
439 cmp_attribute (const void *av,
442 const AttributeBlob *a = av;
443 const AttributeBlob *b = bv;
445 if (a->offset < b->offset)
447 else if (a->offset == b->offset)
453 static AttributeBlob *
454 find_first_attribute (GIBaseInfo *info)
456 GIBaseInfo *base = (GIBaseInfo *)info;
457 Header *header = (Header *)base->typelib->data;
458 AttributeBlob blob, *first, *res, *previous;
460 blob.offset = base->offset;
462 first = (AttributeBlob *) &base->typelib->data[header->attributes];
464 res = bsearch (&blob, first, header->n_attributes,
465 header->attribute_blob_size, cmp_attribute);
471 while (previous >= first && previous->offset == base->offset)
481 * g_base_info_iterate_attributes:
482 * @info: A #GIBaseInfo
483 * @iter: A #GIAttributeIter structure, must be initialized; see below
484 * @name: (out) (transfer none): Returned name, must not be freed
485 * @value: (out) (transfer none): Returned name, must not be freed
487 * Iterate over all attributes associated with this node. The iterator
488 * structure is typically stack allocated, and must have its first
489 * member initialized to %NULL.
491 * Both the @name and @value should be treated as constants
492 * and must not be freed.
495 * <title>Iterating over attributes</title>
498 * print_attributes (GIBaseInfo *info)
500 * GIAttributeIter iter = { 0, };
503 * while (g_base_info_iterate_attributes (info, &iter, &name, &value))
505 * g_print ("attribute name: %s value: %s", name, value);
511 * Return value: %TRUE if there are more attributes, %FALSE otherwise
514 g_base_info_iterate_attributes (GIBaseInfo *info,
515 GIAttributeIter *iter,
519 GIBaseInfo *base = (GIBaseInfo *)info;
520 Header *header = (Header *)base->typelib->data;
521 AttributeBlob *next, *after;
523 after = (AttributeBlob *) &base->typelib->data[header->attributes +
524 header->n_attributes * header->attribute_blob_size];
526 if (iter->data != NULL)
527 next = (AttributeBlob *) iter->data;
529 next = find_first_attribute (info);
531 if (next == NULL || next->offset != base->offset || next >= after)
534 *name = (gchar*) g_typelib_get_string (base->typelib, next->name);
535 *value = (gchar*) g_typelib_get_string (base->typelib, next->value);
536 iter->data = next + 1;
542 g_base_info_get_container (GIBaseInfo *info)
544 return info->container;
548 g_base_info_get_typelib (GIBaseInfo *info)
550 return info->typelib;
553 /* GIFunctionInfo functions */
555 g_function_info_get_symbol (GIFunctionInfo *info)
557 GIBaseInfo *base = (GIBaseInfo *)info;
558 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
560 return g_typelib_get_string (base->typelib, blob->symbol);
564 g_function_info_get_flags (GIFunctionInfo *info)
566 GIFunctionInfoFlags flags;
567 GIBaseInfo *base = (GIBaseInfo *)info;
568 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
572 /* Make sure we don't flag Constructors as methods */
573 if (!blob->constructor && !blob->is_static)
574 flags = flags | GI_FUNCTION_IS_METHOD;
576 if (blob->constructor)
577 flags = flags | GI_FUNCTION_IS_CONSTRUCTOR;
580 flags = flags | GI_FUNCTION_IS_GETTER;
583 flags = flags | GI_FUNCTION_IS_SETTER;
585 if (blob->wraps_vfunc)
586 flags = flags | GI_FUNCTION_WRAPS_VFUNC;
589 flags = flags | GI_FUNCTION_THROWS;
595 g_function_info_get_property (GIFunctionInfo *info)
597 GIBaseInfo *base = (GIBaseInfo *)info;
598 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
599 GIInterfaceInfo *container = (GIInterfaceInfo *)base->container;
601 return g_interface_info_get_property (container, blob->index);
605 g_function_info_get_vfunc (GIFunctionInfo *info)
607 GIBaseInfo *base = (GIBaseInfo *)info;
608 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
609 GIInterfaceInfo *container = (GIInterfaceInfo *)base->container;
611 return g_interface_info_get_vfunc (container, blob->index);
615 /* GICallableInfo functions */
617 signature_offset (GICallableInfo *info)
620 switch (info->base.type)
622 case GI_INFO_TYPE_FUNCTION:
623 sigoff = G_STRUCT_OFFSET (FunctionBlob, signature);
625 case GI_INFO_TYPE_VFUNC:
626 sigoff = G_STRUCT_OFFSET (VFuncBlob, signature);
628 case GI_INFO_TYPE_CALLBACK:
629 sigoff = G_STRUCT_OFFSET (CallbackBlob, signature);
631 case GI_INFO_TYPE_SIGNAL:
632 sigoff = G_STRUCT_OFFSET (SignalBlob, signature);
636 return *(guint32 *)&info->base.typelib->data[info->base.offset + sigoff];
641 g_type_info_new (GIBaseInfo *container,
645 SimpleTypeBlob *type = (SimpleTypeBlob *)&typelib->data[offset];
647 return (GITypeInfo *) g_info_new (GI_INFO_TYPE_TYPE, container, typelib,
648 (type->flags.reserved == 0 && type->flags.reserved2 == 0) ? offset : type->offset);
652 * g_callable_info_get_return_type:
653 * @info: a #GICallableInfo
655 * Get the return type of a callable item as
658 * Returns: a #GITypeInfo idexing the TypeBlob for the
659 * return type of #info
662 g_callable_info_get_return_type (GICallableInfo *info)
664 GIBaseInfo *base = (GIBaseInfo *)info;
667 offset = signature_offset (info);
669 return g_type_info_new (base, base->typelib, offset);
673 * g_callable_info_may_return_null:
674 * @info: a #GICallableInfo
676 * See if a callable could return NULL.
678 * Returns: TRUE if callable could return NULL
681 g_callable_info_may_return_null (GICallableInfo *info)
683 GIBaseInfo *base = (GIBaseInfo *)info;
684 SignatureBlob *blob = (SignatureBlob *)&base->typelib->data[signature_offset (info)];
686 return blob->may_return_null;
690 * g_callable_info_get_caller_owns:
691 * @info: a #GICallableInfo
693 * See whether the caller owns the return value
696 * Returns: TRUE if the caller owns the return value, FALSE otherwise.
699 g_callable_info_get_caller_owns (GICallableInfo *info)
701 GIBaseInfo *base = (GIBaseInfo *)info;
702 SignatureBlob *blob = (SignatureBlob *)&base->typelib->data[signature_offset (info)];
704 if (blob->caller_owns_return_value)
705 return GI_TRANSFER_EVERYTHING;
706 else if (blob->caller_owns_return_container)
707 return GI_TRANSFER_CONTAINER;
709 return GI_TRANSFER_NOTHING;
713 * g_callable_info_get_n_args:
714 * @info: a #GICallableInfo
716 * Get the number of arguments (both IN and OUT) for this callable.
718 * Returns: The number of arguments this callable expects.
721 g_callable_info_get_n_args (GICallableInfo *info)
723 GIBaseInfo *base = (GIBaseInfo *)info;
727 offset = signature_offset (info);
728 blob = (SignatureBlob *)&base->typelib->data[offset];
730 return blob->n_arguments;
734 * g_callable_info_get_arg:
735 * @info: a #GICallableInfo
736 * @n: the argument index to fetch
738 * Get information about a particular argument of this callable.
740 * Returns: A #GIArgInfo indexing the typelib on the given argument.
743 g_callable_info_get_arg (GICallableInfo *info,
746 GIBaseInfo *base = (GIBaseInfo *)info;
747 Header *header = (Header *)base->typelib->data;
750 offset = signature_offset (info);
752 return (GIArgInfo *) g_info_new (GI_INFO_TYPE_ARG, base, base->typelib,
753 offset + header->signature_blob_size + n * header->arg_blob_size);
756 /* GIArgInfo function */
758 g_arg_info_get_direction (GIArgInfo *info)
760 GIBaseInfo *base = (GIBaseInfo *)info;
761 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
763 if (blob->in && blob->out)
764 return GI_DIRECTION_INOUT;
766 return GI_DIRECTION_OUT;
768 return GI_DIRECTION_IN;
772 g_arg_info_is_return_value (GIArgInfo *info)
774 GIBaseInfo *base = (GIBaseInfo *)info;
775 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
777 return blob->return_value;
781 g_arg_info_is_dipper (GIArgInfo *info)
783 GIBaseInfo *base = (GIBaseInfo *)info;
784 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
790 g_arg_info_is_optional (GIArgInfo *info)
792 GIBaseInfo *base = (GIBaseInfo *)info;
793 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
795 return blob->optional;
799 g_arg_info_may_be_null (GIArgInfo *info)
801 GIBaseInfo *base = (GIBaseInfo *)info;
802 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
804 return blob->allow_none;
808 g_arg_info_get_ownership_transfer (GIArgInfo *info)
810 GIBaseInfo *base = (GIBaseInfo *)info;
811 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
813 if (blob->transfer_ownership)
814 return GI_TRANSFER_EVERYTHING;
815 else if (blob->transfer_container_ownership)
816 return GI_TRANSFER_CONTAINER;
818 return GI_TRANSFER_NOTHING;
822 g_arg_info_get_scope (GIArgInfo *info)
824 GIBaseInfo *base = (GIBaseInfo *)info;
825 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
831 g_arg_info_get_closure (GIArgInfo *info)
833 GIBaseInfo *base = (GIBaseInfo *)info;
834 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
836 return blob->closure;
840 g_arg_info_get_destroy (GIArgInfo *info)
842 GIBaseInfo *base = (GIBaseInfo *)info;
843 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
845 return blob->destroy;
849 g_arg_info_get_type (GIArgInfo *info)
851 GIBaseInfo *base = (GIBaseInfo *)info;
853 return g_type_info_new (base, base->typelib, base->offset + G_STRUCT_OFFSET (ArgBlob, arg_type));
856 /* GITypeInfo functions */
858 g_type_info_is_pointer (GITypeInfo *info)
860 GIBaseInfo *base = (GIBaseInfo *)info;
861 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
863 if (type->flags.reserved == 0 && type->flags.reserved2 == 0)
864 return type->flags.pointer;
867 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
869 return iface->pointer;
874 g_type_info_get_tag (GITypeInfo *info)
876 GIBaseInfo *base = (GIBaseInfo *)info;
877 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
879 if (type->flags.reserved == 0 && type->flags.reserved2 == 0)
880 return type->flags.tag;
883 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
890 g_type_info_get_param_type (GITypeInfo *info,
893 GIBaseInfo *base = (GIBaseInfo *)info;
894 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
896 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
898 ParamTypeBlob *param = (ParamTypeBlob *)&base->typelib->data[base->offset];
902 case GI_TYPE_TAG_ARRAY:
903 case GI_TYPE_TAG_GLIST:
904 case GI_TYPE_TAG_GSLIST:
905 case GI_TYPE_TAG_GHASH:
906 return g_type_info_new (base, base->typelib,
907 base->offset + sizeof (ParamTypeBlob)
908 + sizeof (SimpleTypeBlob) * n);
919 g_type_info_get_interface (GITypeInfo *info)
921 GIBaseInfo *base = (GIBaseInfo *)info;
922 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
924 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
926 InterfaceTypeBlob *blob = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
928 if (blob->tag == GI_TYPE_TAG_INTERFACE)
929 return g_info_from_entry (base->repository, base->typelib, blob->interface);
936 g_type_info_get_array_length (GITypeInfo *info)
938 GIBaseInfo *base = (GIBaseInfo *)info;
939 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
941 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
943 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
945 if (blob->tag == GI_TYPE_TAG_ARRAY)
947 if (blob->has_length)
948 return blob->dimensions.length;
956 g_type_info_get_array_fixed_size (GITypeInfo *info)
958 GIBaseInfo *base = (GIBaseInfo *)info;
959 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
961 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
963 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
965 if (blob->tag == GI_TYPE_TAG_ARRAY)
968 return blob->dimensions.size;
976 g_type_info_is_zero_terminated (GITypeInfo *info)
978 GIBaseInfo *base = (GIBaseInfo *)info;
979 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
981 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
983 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
985 if (blob->tag == GI_TYPE_TAG_ARRAY)
986 return blob->zero_terminated;
993 g_type_info_get_n_error_domains (GITypeInfo *info)
995 GIBaseInfo *base = (GIBaseInfo *)info;
996 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
998 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1000 ErrorTypeBlob *blob = (ErrorTypeBlob *)&base->typelib->data[base->offset];
1002 if (blob->tag == GI_TYPE_TAG_ERROR)
1003 return blob->n_domains;
1010 g_type_info_get_error_domain (GITypeInfo *info,
1013 GIBaseInfo *base = (GIBaseInfo *)info;
1014 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
1016 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1018 ErrorTypeBlob *blob = (ErrorTypeBlob *)&base->typelib->data[base->offset];
1020 if (blob->tag == GI_TYPE_TAG_ERROR)
1021 return (GIErrorDomainInfo *) g_info_from_entry (base->repository,
1030 /* GIErrorDomainInfo functions */
1032 g_error_domain_info_get_quark (GIErrorDomainInfo *info)
1034 GIBaseInfo *base = (GIBaseInfo *)info;
1035 ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->typelib->data[base->offset];
1037 return g_typelib_get_string (base->typelib, blob->get_quark);
1041 g_error_domain_info_get_codes (GIErrorDomainInfo *info)
1043 GIBaseInfo *base = (GIBaseInfo *)info;
1044 ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->typelib->data[base->offset];
1046 return (GIInterfaceInfo *) g_info_from_entry (base->repository,
1047 base->typelib, blob->error_codes);
1051 /* GIValueInfo functions */
1053 g_value_info_get_value (GIValueInfo *info)
1055 GIBaseInfo *base = (GIBaseInfo *)info;
1056 ValueBlob *blob = (ValueBlob *)&base->typelib->data[base->offset];
1058 return (glong)blob->value;
1061 /* GIFieldInfo functions */
1063 g_field_info_get_flags (GIFieldInfo *info)
1065 GIFieldInfoFlags flags;
1067 GIBaseInfo *base = (GIBaseInfo *)info;
1068 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
1073 flags = flags | GI_FIELD_IS_READABLE;
1076 flags = flags | GI_FIELD_IS_WRITABLE;
1082 g_field_info_get_size (GIFieldInfo *info)
1084 GIBaseInfo *base = (GIBaseInfo *)info;
1085 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
1091 g_field_info_get_offset (GIFieldInfo *info)
1093 GIBaseInfo *base = (GIBaseInfo *)info;
1094 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
1096 return blob->struct_offset;
1100 g_field_info_get_type (GIFieldInfo *info)
1102 GIBaseInfo *base = (GIBaseInfo *)info;
1104 return g_type_info_new (base, base->typelib, base->offset + G_STRUCT_OFFSET (FieldBlob, type));
1107 /* GIRegisteredTypeInfo functions */
1109 g_registered_type_info_get_type_name (GIRegisteredTypeInfo *info)
1111 GIBaseInfo *base = (GIBaseInfo *)info;
1112 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&base->typelib->data[base->offset];
1114 if (blob->gtype_name)
1115 return g_typelib_get_string (base->typelib, blob->gtype_name);
1121 g_registered_type_info_get_type_init (GIRegisteredTypeInfo *info)
1123 GIBaseInfo *base = (GIBaseInfo *)info;
1124 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&base->typelib->data[base->offset];
1126 if (blob->gtype_init)
1127 return g_typelib_get_string (base->typelib, blob->gtype_init);
1133 g_registered_type_info_get_g_type (GIRegisteredTypeInfo *info)
1135 const char *type_init;
1136 GType (* get_type_func) (void);
1138 type_init = g_registered_type_info_get_type_init (info);
1140 if (type_init == NULL)
1142 else if (!strcmp (type_init, "intern"))
1143 return G_TYPE_OBJECT;
1145 get_type_func = NULL;
1146 if (!g_typelib_symbol (((GIBaseInfo*)info)->typelib,
1148 (void**) &get_type_func))
1151 return (* get_type_func) ();
1154 /* GIStructInfo functions */
1156 g_struct_info_get_n_fields (GIStructInfo *info)
1158 GIBaseInfo *base = (GIBaseInfo *)info;
1159 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1161 return blob->n_fields;
1165 g_struct_info_get_field (GIStructInfo *info,
1168 GIBaseInfo *base = (GIBaseInfo *)info;
1169 Header *header = (Header *)base->typelib->data;
1171 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib,
1172 base->offset + header->struct_blob_size +
1173 n * header->field_blob_size);
1177 g_struct_info_get_n_methods (GIStructInfo *info)
1179 GIBaseInfo *base = (GIBaseInfo *)info;
1180 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1182 return blob->n_methods;
1186 g_struct_info_get_method (GIStructInfo *info,
1189 GIBaseInfo *base = (GIBaseInfo *)info;
1190 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1191 Header *header = (Header *)base->typelib->data;
1194 offset = base->offset + header->struct_blob_size
1195 + blob->n_fields * header->field_blob_size
1196 + n * header->function_blob_size;
1197 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1198 base->typelib, offset);
1201 static GIFunctionInfo *
1202 find_method (GIBaseInfo *base,
1208 Header *header = (Header *)base->typelib->data;
1211 for (i = 0; i < n_methods; i++)
1213 FunctionBlob *fblob = (FunctionBlob *)&base->typelib->data[offset];
1214 const gchar *fname = (const gchar *)&base->typelib->data[fblob->name];
1216 if (strcmp (name, fname) == 0)
1217 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1218 base->typelib, offset);
1220 offset += header->function_blob_size;
1227 g_struct_info_find_method (GIStructInfo *info,
1231 GIBaseInfo *base = (GIBaseInfo *)info;
1232 Header *header = (Header *)base->typelib->data;
1233 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1235 offset = base->offset + header->struct_blob_size
1236 + blob->n_fields * header->field_blob_size;
1238 return find_method (base, offset, blob->n_methods, name);
1242 g_struct_info_get_size (GIStructInfo *info)
1244 GIBaseInfo *base = (GIBaseInfo *)info;
1245 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1251 g_struct_info_get_alignment (GIStructInfo *info)
1253 GIBaseInfo *base = (GIBaseInfo *)info;
1254 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1256 return blob->alignment;
1260 * g_struct_info_is_gtype_struct:
1261 * @info: GIStructInfo
1263 * Return true if this structure represents the "class structure" for some
1264 * #GObject or #GInterface. This function is mainly useful to hide this kind of structure
1265 * from generated public APIs.
1267 * Returns: %TRUE if this is a class struct, %FALSE otherwise
1270 g_struct_info_is_gtype_struct (GIStructInfo *info)
1272 GIBaseInfo *base = (GIBaseInfo *)info;
1273 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1275 return blob->is_gtype_struct;
1279 g_enum_info_get_n_values (GIEnumInfo *info)
1281 GIBaseInfo *base = (GIBaseInfo *)info;
1282 EnumBlob *blob = (EnumBlob *)&base->typelib->data[base->offset];
1284 return blob->n_values;
1288 g_enum_info_get_value (GIEnumInfo *info,
1291 GIBaseInfo *base = (GIBaseInfo *)info;
1292 Header *header = (Header *)base->typelib->data;
1295 offset = base->offset + header->enum_blob_size
1296 + n * header->value_blob_size;
1297 return (GIValueInfo *) g_info_new (GI_INFO_TYPE_VALUE, base, base->typelib, offset);
1301 * g_enum_info_get_storage_type:
1304 * Gets the tag of the type used for the enum in the C ABI. This will
1305 * will be a signed or unsigned integral type.
1307 * Note that in the current implementation the width of the type is
1308 * computed correctly, but the signed or unsigned nature of the type
1309 * may not match the sign of the type used by the C compiler.
1311 * Return Value: the storage type for the enumeration
1314 g_enum_info_get_storage_type (GIEnumInfo *info)
1316 GIBaseInfo *base = (GIBaseInfo *)info;
1317 EnumBlob *blob = (EnumBlob *)&base->typelib->data[base->offset];
1319 return blob->storage_type;
1322 /* GIObjectInfo functions */
1324 g_object_info_get_parent (GIObjectInfo *info)
1326 GIBaseInfo *base = (GIBaseInfo *)info;
1327 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1330 return (GIObjectInfo *) g_info_from_entry (base->repository,
1331 base->typelib, blob->parent);
1337 g_object_info_get_abstract (GIObjectInfo *info)
1339 GIBaseInfo *base = (GIBaseInfo *)info;
1340 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1341 return blob->abstract != 0;
1345 g_object_info_get_type_name (GIObjectInfo *info)
1347 GIBaseInfo *base = (GIBaseInfo *)info;
1348 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1350 return g_typelib_get_string (base->typelib, blob->gtype_name);
1354 g_object_info_get_type_init (GIObjectInfo *info)
1356 GIBaseInfo *base = (GIBaseInfo *)info;
1357 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1359 return g_typelib_get_string (base->typelib, blob->gtype_init);
1363 g_object_info_get_n_interfaces (GIObjectInfo *info)
1365 GIBaseInfo *base = (GIBaseInfo *)info;
1366 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1368 return blob->n_interfaces;
1372 g_object_info_get_interface (GIObjectInfo *info,
1375 GIBaseInfo *base = (GIBaseInfo *)info;
1376 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1378 return (GIInterfaceInfo *) g_info_from_entry (base->repository,
1379 base->typelib, blob->interfaces[n]);
1383 g_object_info_get_n_fields (GIObjectInfo *info)
1385 GIBaseInfo *base = (GIBaseInfo *)info;
1386 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1388 return blob->n_fields;
1392 g_object_info_get_field (GIObjectInfo *info,
1396 GIBaseInfo *base = (GIBaseInfo *)info;
1397 Header *header = (Header *)base->typelib->data;
1398 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1400 offset = base->offset + header->object_blob_size
1401 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1402 + n * header->field_blob_size;
1404 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib, offset);
1408 g_object_info_get_n_properties (GIObjectInfo *info)
1410 GIBaseInfo *base = (GIBaseInfo *)info;
1411 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1413 return blob->n_properties;
1417 g_object_info_get_property (GIObjectInfo *info,
1421 GIBaseInfo *base = (GIBaseInfo *)info;
1422 Header *header = (Header *)base->typelib->data;
1423 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1425 offset = base->offset + header->object_blob_size
1426 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1427 + blob->n_fields * header->field_blob_size
1428 + n * header->property_blob_size;
1430 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base,
1431 base->typelib, offset);
1435 g_object_info_get_n_methods (GIObjectInfo *info)
1437 GIBaseInfo *base = (GIBaseInfo *)info;
1438 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1440 return blob->n_methods;
1444 g_object_info_get_method (GIObjectInfo *info,
1448 GIBaseInfo *base = (GIBaseInfo *)info;
1449 Header *header = (Header *)base->typelib->data;
1450 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1452 offset = base->offset + header->object_blob_size
1453 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1454 + blob->n_fields * header->field_blob_size
1455 + blob->n_properties * header->property_blob_size
1456 + n * header->function_blob_size;
1458 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1459 base->typelib, offset);
1463 g_object_info_find_method (GIObjectInfo *info,
1467 GIBaseInfo *base = (GIBaseInfo *)info;
1468 Header *header = (Header *)base->typelib->data;
1469 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1471 offset = base->offset + header->object_blob_size
1472 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1473 + blob->n_fields * header->field_blob_size +
1474 + blob->n_properties * header->property_blob_size;
1476 return find_method (base, offset, blob->n_methods, name);
1480 g_object_info_get_n_signals (GIObjectInfo *info)
1482 GIBaseInfo *base = (GIBaseInfo *)info;
1483 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1485 return blob->n_signals;
1489 g_object_info_get_signal (GIObjectInfo *info,
1493 GIBaseInfo *base = (GIBaseInfo *)info;
1494 Header *header = (Header *)base->typelib->data;
1495 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1497 offset = base->offset + header->object_blob_size
1498 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1499 + blob->n_fields * header->field_blob_size
1500 + blob->n_properties * header->property_blob_size
1501 + blob->n_methods * header->function_blob_size
1502 + n * header->signal_blob_size;
1504 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base,
1505 base->typelib, offset);
1509 g_object_info_get_n_vfuncs (GIObjectInfo *info)
1511 GIBaseInfo *base = (GIBaseInfo *)info;
1512 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1514 return blob->n_vfuncs;
1518 g_object_info_get_vfunc (GIObjectInfo *info,
1522 GIBaseInfo *base = (GIBaseInfo *)info;
1523 Header *header = (Header *)base->typelib->data;
1524 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1526 offset = base->offset + header->object_blob_size
1527 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1528 + blob->n_fields * header->field_blob_size
1529 + blob->n_properties * header->property_blob_size
1530 + blob->n_methods * header->function_blob_size
1531 + blob->n_signals * header->signal_blob_size
1532 + n * header->vfunc_blob_size;
1534 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1535 base->typelib, offset);
1538 static GIVFuncInfo *
1539 find_vfunc (GIBaseInfo *base,
1545 Header *header = (Header *)base->typelib->data;
1548 for (i = 0; i < n_vfuncs; i++)
1550 VFuncBlob *fblob = (VFuncBlob *)&base->typelib->data[offset];
1551 const gchar *fname = (const gchar *)&base->typelib->data[fblob->name];
1553 if (strcmp (name, fname) == 0)
1554 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1555 base->typelib, offset);
1557 offset += header->vfunc_blob_size;
1564 * g_object_info_find_vfunc:
1565 * @info: An #GIObjectInfo
1566 * @name: The name of a virtual function to find.
1568 * Locate a virtual function slot with name @name. Note that the namespace
1569 * for virtuals is distinct from that of methods; there may or may not be
1570 * a concrete method associated for a virtual. If there is one, it may
1571 * be retrieved using #g_vfunc_info_get_invoker. See the documentation for
1572 * that function for more information on invoking virtuals.
1574 * Return value: (transfer full): A #GIVFuncInfo, or %NULL if none with name @name.
1577 g_object_info_find_vfunc (GIObjectInfo *info,
1581 GIBaseInfo *base = (GIBaseInfo *)info;
1582 Header *header = (Header *)base->typelib->data;
1583 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1585 offset = base->offset + header->object_blob_size
1586 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1587 + blob->n_fields * header->field_blob_size
1588 + blob->n_properties * header->property_blob_size
1589 + blob->n_methods * header->function_blob_size
1590 + blob->n_signals * header->signal_blob_size;
1592 return find_vfunc (base, offset, blob->n_vfuncs, name);
1596 g_object_info_get_n_constants (GIObjectInfo *info)
1598 GIBaseInfo *base = (GIBaseInfo *)info;
1599 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1601 return blob->n_constants;
1605 g_object_info_get_constant (GIObjectInfo *info,
1609 GIBaseInfo *base = (GIBaseInfo *)info;
1610 Header *header = (Header *)base->typelib->data;
1611 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1613 offset = base->offset + header->object_blob_size
1614 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1615 + blob->n_fields * header->field_blob_size
1616 + blob->n_properties * header->property_blob_size
1617 + blob->n_methods * header->function_blob_size
1618 + blob->n_signals * header->signal_blob_size
1619 + blob->n_vfuncs * header->vfunc_blob_size
1620 + n * header->constant_blob_size;
1622 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1623 base->typelib, offset);
1627 * g_object_info_get_class_struct:
1628 * @info: A #GIObjectInfo to query
1630 * Every #GObject has two structures; an instance structure and a class
1631 * structure. This function returns the metadata for the class structure.
1633 * Returns: a #GIStructInfo for the class struct or %NULL if none found.
1636 g_object_info_get_class_struct (GIObjectInfo *info)
1638 GIBaseInfo *base = (GIBaseInfo *)info;
1639 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1641 if (blob->gtype_struct)
1642 return (GIStructInfo *) g_info_from_entry (base->repository,
1643 base->typelib, blob->gtype_struct);
1648 /* GIInterfaceInfo functions */
1650 g_interface_info_get_n_prerequisites (GIInterfaceInfo *info)
1652 GIBaseInfo *base = (GIBaseInfo *)info;
1653 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1655 return blob->n_prerequisites;
1659 g_interface_info_get_prerequisite (GIInterfaceInfo *info,
1662 GIBaseInfo *base = (GIBaseInfo *)info;
1663 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1665 return g_info_from_entry (base->repository,
1666 base->typelib, blob->prerequisites[n]);
1671 g_interface_info_get_n_properties (GIInterfaceInfo *info)
1673 GIBaseInfo *base = (GIBaseInfo *)info;
1674 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1676 return blob->n_properties;
1680 g_interface_info_get_property (GIInterfaceInfo *info,
1684 GIBaseInfo *base = (GIBaseInfo *)info;
1685 Header *header = (Header *)base->typelib->data;
1686 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1688 offset = base->offset + header->interface_blob_size
1689 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1690 + n * header->property_blob_size;
1692 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base,
1693 base->typelib, offset);
1697 g_interface_info_get_n_methods (GIInterfaceInfo *info)
1699 GIBaseInfo *base = (GIBaseInfo *)info;
1700 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1702 return blob->n_methods;
1706 g_interface_info_get_method (GIInterfaceInfo *info,
1710 GIBaseInfo *base = (GIBaseInfo *)info;
1711 Header *header = (Header *)base->typelib->data;
1712 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1714 offset = base->offset + header->interface_blob_size
1715 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1716 + blob->n_properties * header->property_blob_size
1717 + n * header->function_blob_size;
1719 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1720 base->typelib, offset);
1724 g_interface_info_find_method (GIInterfaceInfo *info,
1728 GIBaseInfo *base = (GIBaseInfo *)info;
1729 Header *header = (Header *)base->typelib->data;
1730 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1732 offset = base->offset + header->interface_blob_size
1733 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1734 + blob->n_properties * header->property_blob_size;
1736 return find_method (base, offset, blob->n_methods, name);
1740 g_interface_info_get_n_signals (GIInterfaceInfo *info)
1742 GIBaseInfo *base = (GIBaseInfo *)info;
1743 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1745 return blob->n_signals;
1749 g_interface_info_get_signal (GIInterfaceInfo *info,
1753 GIBaseInfo *base = (GIBaseInfo *)info;
1754 Header *header = (Header *)base->typelib->data;
1755 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1757 offset = base->offset + header->interface_blob_size
1758 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1759 + blob->n_properties * header->property_blob_size
1760 + blob->n_methods * header->function_blob_size
1761 + n * header->signal_blob_size;
1763 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base,
1764 base->typelib, offset);
1768 g_interface_info_get_n_vfuncs (GIInterfaceInfo *info)
1770 GIBaseInfo *base = (GIBaseInfo *)info;
1771 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1773 return blob->n_vfuncs;
1777 g_interface_info_get_vfunc (GIInterfaceInfo *info,
1781 GIBaseInfo *base = (GIBaseInfo *)info;
1782 Header *header = (Header *)base->typelib->data;
1783 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1785 offset = base->offset + header->interface_blob_size
1786 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1787 + blob->n_properties * header->property_blob_size
1788 + blob->n_methods * header->function_blob_size
1789 + blob->n_signals * header->signal_blob_size
1790 + n * header->vfunc_blob_size;
1792 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1793 base->typelib, offset);
1797 * g_interface_info_find_vfunc:
1798 * @info: An #GIObjectInfo
1799 * @name: The name of a virtual function to find.
1801 * Locate a virtual function slot with name @name. See the documentation
1802 * for #g_object_info_find_vfunc for more information on virtuals.
1804 * Return value: (transfer full): A #GIVFuncInfo, or %NULL if none with name @name.
1807 g_interface_info_find_vfunc (GIInterfaceInfo *info,
1811 GIBaseInfo *base = (GIBaseInfo *)info;
1812 Header *header = (Header *)base->typelib->data;
1813 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1815 offset = base->offset + header->interface_blob_size
1816 + (blob->n_prerequisites + blob->n_prerequisites % 2) * 2
1817 + blob->n_properties * header->property_blob_size
1818 + blob->n_methods * header->function_blob_size
1819 + blob->n_signals * header->signal_blob_size;
1821 return find_vfunc (base, offset, blob->n_vfuncs, name);
1825 g_interface_info_get_n_constants (GIInterfaceInfo *info)
1827 GIBaseInfo *base = (GIBaseInfo *)info;
1828 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1830 return blob->n_constants;
1834 g_interface_info_get_constant (GIInterfaceInfo *info,
1838 GIBaseInfo *base = (GIBaseInfo *)info;
1839 Header *header = (Header *)base->typelib->data;
1840 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1842 offset = base->offset + header->interface_blob_size
1843 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1844 + blob->n_properties * header->property_blob_size
1845 + blob->n_methods * header->function_blob_size
1846 + blob->n_signals * header->signal_blob_size
1847 + blob->n_vfuncs * header->vfunc_blob_size
1848 + n * header->constant_blob_size;
1850 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1851 base->typelib, offset);
1855 * g_interface_info_get_iface_struct:
1856 * @info: A #GIInterfaceInfo to query
1858 * Returns the layout C structure associated with this #GInterface.
1860 * Returns: A #GIStructInfo for the class struct or %NULL if none found.
1863 g_interface_info_get_iface_struct (GIInterfaceInfo *info)
1865 GIBaseInfo *base = (GIBaseInfo *)info;
1866 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1868 if (blob->gtype_struct)
1869 return (GIStructInfo *) g_info_from_entry (base->repository,
1870 base->typelib, blob->gtype_struct);
1875 /* GIPropertyInfo functions */
1877 g_property_info_get_flags (GIPropertyInfo *info)
1880 GIBaseInfo *base = (GIBaseInfo *)info;
1881 PropertyBlob *blob = (PropertyBlob *)&base->typelib->data[base->offset];
1886 flags = flags | G_PARAM_READABLE;
1889 flags = flags | G_PARAM_WRITABLE;
1891 if (blob->construct)
1892 flags = flags | G_PARAM_CONSTRUCT;
1894 if (blob->construct_only)
1895 flags = flags | G_PARAM_CONSTRUCT_ONLY;
1901 g_property_info_get_type (GIPropertyInfo *info)
1903 GIBaseInfo *base = (GIBaseInfo *)info;
1905 return g_type_info_new (base, base->typelib, base->offset + G_STRUCT_OFFSET (PropertyBlob, type));
1909 /* GISignalInfo functions */
1911 g_signal_info_get_flags (GISignalInfo *info)
1915 GIBaseInfo *base = (GIBaseInfo *)info;
1916 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1920 if (blob->run_first)
1921 flags = flags | G_SIGNAL_RUN_FIRST;
1924 flags = flags | G_SIGNAL_RUN_LAST;
1926 if (blob->run_cleanup)
1927 flags = flags | G_SIGNAL_RUN_CLEANUP;
1929 if (blob->no_recurse)
1930 flags = flags | G_SIGNAL_NO_RECURSE;
1933 flags = flags | G_SIGNAL_DETAILED;
1936 flags = flags | G_SIGNAL_ACTION;
1939 flags = flags | G_SIGNAL_NO_HOOKS;
1945 g_signal_info_get_class_closure (GISignalInfo *info)
1947 GIBaseInfo *base = (GIBaseInfo *)info;
1948 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1950 if (blob->has_class_closure)
1951 return g_interface_info_get_vfunc ((GIInterfaceInfo *)base->container, blob->class_closure);
1957 g_signal_info_true_stops_emit (GISignalInfo *info)
1959 GIBaseInfo *base = (GIBaseInfo *)info;
1960 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1962 return blob->true_stops_emit;
1965 /* GIVFuncInfo functions */
1967 g_vfunc_info_get_flags (GIVFuncInfo *info)
1969 GIVFuncInfoFlags flags;
1971 GIBaseInfo *base = (GIBaseInfo *)info;
1972 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
1976 if (blob->must_chain_up)
1977 flags = flags | GI_VFUNC_MUST_CHAIN_UP;
1979 if (blob->must_be_implemented)
1980 flags = flags | GI_VFUNC_MUST_OVERRIDE;
1982 if (blob->must_not_be_implemented)
1983 flags = flags | GI_VFUNC_MUST_NOT_OVERRIDE;
1989 g_vfunc_info_get_offset (GIVFuncInfo *info)
1991 GIBaseInfo *base = (GIBaseInfo *)info;
1992 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
1994 return blob->struct_offset;
1998 g_vfunc_info_get_signal (GIVFuncInfo *info)
2000 GIBaseInfo *base = (GIBaseInfo *)info;
2001 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
2003 if (blob->class_closure)
2004 return g_interface_info_get_signal ((GIInterfaceInfo *)base->container, blob->signal);
2010 * g_vfunc_info_get_invoker:
2011 * @info: A #GIVFuncInfo
2013 * If this virtual function has an associated invoker method, this
2014 * method will return it. An invoker method is a C entry point.
2016 * Not all virtuals will have invokers.
2018 * Return value: (transfer full): An invoker function, or %NULL if none known
2021 g_vfunc_info_get_invoker (GIVFuncInfo *info)
2023 GIBaseInfo *base = (GIBaseInfo *)info;
2024 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
2025 GIBaseInfo *container = base->container;
2026 GIInfoType parent_type;
2028 /* 1023 = 0x3ff is the maximum of the 10 bits for invoker index */
2029 if (blob->invoker == 1023)
2032 parent_type = g_base_info_get_type (container);
2033 if (parent_type == GI_INFO_TYPE_OBJECT)
2034 return g_object_info_get_method ((GIObjectInfo*)container, blob->invoker);
2035 else if (parent_type == GI_INFO_TYPE_INTERFACE)
2036 return g_interface_info_get_method ((GIInterfaceInfo*)container, blob->invoker);
2038 g_assert_not_reached ();
2041 /* GIConstantInfo functions */
2043 g_constant_info_get_type (GIConstantInfo *info)
2045 GIBaseInfo *base = (GIBaseInfo *)info;
2047 return g_type_info_new (base, base->typelib, base->offset + 8);
2051 g_constant_info_get_value (GIConstantInfo *info,
2054 GIBaseInfo *base = (GIBaseInfo *)info;
2055 ConstantBlob *blob = (ConstantBlob *)&base->typelib->data[base->offset];
2057 /* FIXME non-basic types ? */
2058 if (blob->type.flags.reserved == 0 && blob->type.flags.reserved2 == 0)
2060 if (blob->type.flags.pointer)
2061 value->v_pointer = g_memdup (&base->typelib->data[blob->offset], blob->size);
2064 switch (blob->type.flags.tag)
2066 case GI_TYPE_TAG_BOOLEAN:
2067 value->v_boolean = *(gboolean*)&base->typelib->data[blob->offset];
2069 case GI_TYPE_TAG_INT8:
2070 value->v_int8 = *(gint8*)&base->typelib->data[blob->offset];
2072 case GI_TYPE_TAG_UINT8:
2073 value->v_uint8 = *(guint8*)&base->typelib->data[blob->offset];
2075 case GI_TYPE_TAG_INT16:
2076 value->v_int16 = *(gint16*)&base->typelib->data[blob->offset];
2078 case GI_TYPE_TAG_UINT16:
2079 value->v_uint16 = *(guint16*)&base->typelib->data[blob->offset];
2081 case GI_TYPE_TAG_INT32:
2082 value->v_int32 = *(gint32*)&base->typelib->data[blob->offset];
2084 case GI_TYPE_TAG_UINT32:
2085 value->v_uint32 = *(guint32*)&base->typelib->data[blob->offset];
2087 case GI_TYPE_TAG_INT64:
2088 value->v_int64 = *(gint64*)&base->typelib->data[blob->offset];
2090 case GI_TYPE_TAG_UINT64:
2091 value->v_uint64 = *(guint64*)&base->typelib->data[blob->offset];
2093 case GI_TYPE_TAG_FLOAT:
2094 value->v_float = *(gfloat*)&base->typelib->data[blob->offset];
2096 case GI_TYPE_TAG_DOUBLE:
2097 value->v_double = *(gdouble*)&base->typelib->data[blob->offset];
2099 case GI_TYPE_TAG_TIME_T:
2100 value->v_long = *(long*)&base->typelib->data[blob->offset];
2102 case GI_TYPE_TAG_SHORT:
2103 value->v_short = *(gshort*)&base->typelib->data[blob->offset];
2105 case GI_TYPE_TAG_USHORT:
2106 value->v_ushort = *(gushort*)&base->typelib->data[blob->offset];
2108 case GI_TYPE_TAG_INT:
2109 value->v_int = *(gint*)&base->typelib->data[blob->offset];
2111 case GI_TYPE_TAG_UINT:
2112 value->v_uint = *(guint*)&base->typelib->data[blob->offset];
2114 case GI_TYPE_TAG_LONG:
2115 value->v_long = *(glong*)&base->typelib->data[blob->offset];
2117 case GI_TYPE_TAG_ULONG:
2118 value->v_ulong = *(gulong*)&base->typelib->data[blob->offset];
2127 /* GIUnionInfo functions */
2129 g_union_info_get_n_fields (GIUnionInfo *info)
2131 GIBaseInfo *base = (GIBaseInfo *)info;
2132 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2134 return blob->n_fields;
2138 g_union_info_get_field (GIUnionInfo *info,
2141 GIBaseInfo *base = (GIBaseInfo *)info;
2142 Header *header = (Header *)base->typelib->data;
2144 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib,
2145 base->offset + header->union_blob_size +
2146 n * header->field_blob_size);
2150 g_union_info_get_n_methods (GIUnionInfo *info)
2152 GIBaseInfo *base = (GIBaseInfo *)info;
2153 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2155 return blob->n_functions;
2159 g_union_info_get_method (GIUnionInfo *info,
2162 GIBaseInfo *base = (GIBaseInfo *)info;
2163 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2164 Header *header = (Header *)base->typelib->data;
2167 offset = base->offset + header->union_blob_size
2168 + blob->n_fields * header->field_blob_size
2169 + n * header->function_blob_size;
2170 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
2171 base->typelib, offset);
2175 g_union_info_is_discriminated (GIUnionInfo *info)
2177 GIBaseInfo *base = (GIBaseInfo *)info;
2178 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2180 return blob->discriminated;
2184 g_union_info_get_discriminator_offset (GIUnionInfo *info)
2186 GIBaseInfo *base = (GIBaseInfo *)info;
2187 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2189 return blob->discriminator_offset;
2193 g_union_info_get_discriminator_type (GIUnionInfo *info)
2195 GIBaseInfo *base = (GIBaseInfo *)info;
2197 return g_type_info_new (base, base->typelib, base->offset + 24);
2201 g_union_info_get_discriminator (GIUnionInfo *info,
2204 GIBaseInfo *base = (GIBaseInfo *)info;
2205 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2207 if (blob->discriminated)
2209 Header *header = (Header *)base->typelib->data;
2212 offset = base->offset + header->union_blob_size
2213 + blob->n_fields * header->field_blob_size
2214 + blob->n_functions * header->function_blob_size
2215 + n * header->constant_blob_size;
2217 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
2218 base->typelib, offset);
2225 g_union_info_find_method (GIUnionInfo *info,
2229 GIBaseInfo *base = (GIBaseInfo *)info;
2230 Header *header = (Header *)base->typelib->data;
2231 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2233 offset = base->offset + header->union_blob_size
2234 + blob->n_fields * header->field_blob_size;
2236 return find_method (base, offset, blob->n_functions, name);
2240 g_union_info_get_size (GIUnionInfo *info)
2242 GIBaseInfo *base = (GIBaseInfo *)info;
2243 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2249 g_union_info_get_alignment (GIUnionInfo *info)
2251 GIBaseInfo *base = (GIBaseInfo *)info;
2252 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2254 return blob->alignment;