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>
31 typedef struct _GIRealInfo GIRealInfo;
34 * We just use one structure for all of the info object
35 * types; in general, we should be reading data directly
36 * from the typelib, and not having computed data in
37 * per-type structures.
41 /* Keep this part in sync with GIUnresolvedInfo below */
44 GIRepository *repository;
45 GIBaseInfo *container;
47 /* Resolved specific */
52 guint32 type_is_embedded : 1; /* Used by GITypeInfo */
53 guint32 reserved : 31;
55 gpointer reserved2[4];
58 struct _GIUnresolvedInfo
60 /* Keep this part in sync with GIBaseInfo above */
63 GIRepository *repository;
64 GIBaseInfo *container;
66 /* Unresolved specific */
69 const gchar *namespace;
73 g_info_init (GIRealInfo *info,
75 GIRepository *repository,
76 GIBaseInfo *container,
80 memset (info, 0, sizeof (GIRealInfo));
82 /* Invalid refcount used to flag stack-allocated infos */
83 info->ref_count = 0xFFFF;
86 info->typelib = typelib;
87 info->offset = offset;
90 info->container = container;
92 g_assert (G_IS_IREPOSITORY (repository));
93 info->repository = repository;
98 g_info_new_full (GIInfoType type,
99 GIRepository *repository,
100 GIBaseInfo *container,
106 g_return_val_if_fail (container != NULL || repository != NULL, NULL);
108 info = g_new (GIRealInfo, 1);
110 g_info_init (info, type, repository, container, typelib, offset);
113 if (container && ((GIRealInfo *) container)->ref_count != 0xFFFF)
114 g_base_info_ref (info->container);
116 g_object_ref (info->repository);
118 return (GIBaseInfo*)info;
122 g_info_new (GIInfoType type,
123 GIBaseInfo *container,
127 return g_info_new_full (type, ((GIRealInfo*)container)->repository, container, typelib, offset);
131 g_info_from_entry (GIRepository *repository,
136 DirEntry *entry = g_typelib_get_dir_entry (typelib, index);
139 result = g_info_new_full (entry->blob_type, repository, NULL, typelib, entry->offset);
142 const gchar *namespace = g_typelib_get_string (typelib, entry->offset);
143 const gchar *name = g_typelib_get_string (typelib, entry->name);
145 result = g_irepository_find_by_name (repository, namespace, name);
148 GIUnresolvedInfo *unresolved;
150 unresolved = g_new0 (GIUnresolvedInfo, 1);
152 unresolved->type = GI_INFO_TYPE_UNRESOLVED;
153 unresolved->ref_count = 1;
154 unresolved->repository = g_object_ref (repository);
155 unresolved->container = NULL;
156 unresolved->name = name;
157 unresolved->namespace = namespace;
159 return (GIBaseInfo *)unresolved;
161 return (GIBaseInfo *)result;
164 return (GIBaseInfo *)result;
167 /* GIBaseInfo functions */
169 g_base_info_ref (GIBaseInfo *info)
171 GIRealInfo *rinfo = (GIRealInfo*)info;
173 g_assert (rinfo->ref_count != 0xFFFF);
174 ((GIRealInfo*)info)->ref_count++;
180 g_base_info_unref (GIBaseInfo *info)
182 GIRealInfo *rinfo = (GIRealInfo*)info;
184 g_assert (rinfo->ref_count > 0 && rinfo->ref_count != 0xFFFF);
187 if (!rinfo->ref_count)
189 if (rinfo->container && ((GIRealInfo *) rinfo->container)->ref_count != 0xFFFF)
190 g_base_info_unref (rinfo->container);
192 if (rinfo->repository)
193 g_object_unref (rinfo->repository);
200 g_base_info_get_type (GIBaseInfo *info)
203 return ((GIRealInfo*)info)->type;
207 g_base_info_get_name (GIBaseInfo *info)
209 GIRealInfo *rinfo = (GIRealInfo*)info;
210 g_assert (rinfo->ref_count > 0);
213 case GI_INFO_TYPE_FUNCTION:
214 case GI_INFO_TYPE_CALLBACK:
215 case GI_INFO_TYPE_STRUCT:
216 case GI_INFO_TYPE_BOXED:
217 case GI_INFO_TYPE_ENUM:
218 case GI_INFO_TYPE_FLAGS:
219 case GI_INFO_TYPE_OBJECT:
220 case GI_INFO_TYPE_INTERFACE:
221 case GI_INFO_TYPE_CONSTANT:
222 case GI_INFO_TYPE_ERROR_DOMAIN:
223 case GI_INFO_TYPE_UNION:
225 CommonBlob *blob = (CommonBlob *)&rinfo->typelib->data[rinfo->offset];
227 return g_typelib_get_string (rinfo->typelib, blob->name);
231 case GI_INFO_TYPE_VALUE:
233 ValueBlob *blob = (ValueBlob *)&rinfo->typelib->data[rinfo->offset];
235 return g_typelib_get_string (rinfo->typelib, blob->name);
239 case GI_INFO_TYPE_SIGNAL:
241 SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset];
243 return g_typelib_get_string (rinfo->typelib, blob->name);
247 case GI_INFO_TYPE_PROPERTY:
249 PropertyBlob *blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset];
251 return g_typelib_get_string (rinfo->typelib, blob->name);
255 case GI_INFO_TYPE_VFUNC:
257 VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset];
259 return g_typelib_get_string (rinfo->typelib, blob->name);
263 case GI_INFO_TYPE_FIELD:
265 FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset];
267 return g_typelib_get_string (rinfo->typelib, blob->name);
271 case GI_INFO_TYPE_ARG:
273 ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
275 return g_typelib_get_string (rinfo->typelib, blob->name);
278 case GI_INFO_TYPE_UNRESOLVED:
280 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
282 return unresolved->name;
285 case GI_INFO_TYPE_TYPE:
287 g_assert_not_reached ();
295 g_base_info_get_namespace (GIBaseInfo *info)
297 GIRealInfo *rinfo = (GIRealInfo*) info;
298 Header *header = (Header *)rinfo->typelib->data;
300 g_assert (rinfo->ref_count > 0);
302 if (rinfo->type == GI_INFO_TYPE_UNRESOLVED)
304 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
306 return unresolved->namespace;
309 return g_typelib_get_string (rinfo->typelib, header->namespace);
313 g_base_info_is_deprecated (GIBaseInfo *info)
315 GIRealInfo *rinfo = (GIRealInfo*) info;
318 case GI_INFO_TYPE_FUNCTION:
319 case GI_INFO_TYPE_CALLBACK:
320 case GI_INFO_TYPE_STRUCT:
321 case GI_INFO_TYPE_BOXED:
322 case GI_INFO_TYPE_ENUM:
323 case GI_INFO_TYPE_FLAGS:
324 case GI_INFO_TYPE_OBJECT:
325 case GI_INFO_TYPE_INTERFACE:
326 case GI_INFO_TYPE_CONSTANT:
327 case GI_INFO_TYPE_ERROR_DOMAIN:
329 CommonBlob *blob = (CommonBlob *)&rinfo->typelib->data[rinfo->offset];
331 return blob->deprecated;
335 case GI_INFO_TYPE_VALUE:
337 ValueBlob *blob = (ValueBlob *)&rinfo->typelib->data[rinfo->offset];
339 return blob->deprecated;
343 case GI_INFO_TYPE_SIGNAL:
345 SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset];
347 return blob->deprecated;
351 case GI_INFO_TYPE_PROPERTY:
353 PropertyBlob *blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset];
355 return blob->deprecated;
359 case GI_INFO_TYPE_VFUNC:
360 case GI_INFO_TYPE_FIELD:
361 case GI_INFO_TYPE_ARG:
362 case GI_INFO_TYPE_TYPE:
364 /* no deprecation flag for these */
371 * g_base_info_get_attribute:
372 * @info: A #GIBaseInfo
373 * @name: A freeform string naming an attribute
375 * Retrieve an arbitrary attribute associated with this node.
377 * Return value: The value of the attribute, or %NULL if no such attribute exists
380 g_base_info_get_attribute (GIBaseInfo *info,
383 GIAttributeIter iter = { 0, };
384 gchar *curname, *curvalue;
385 while (g_base_info_iterate_attributes (info, &iter, &curname, &curvalue))
387 if (strcmp (name, curname) == 0)
388 return (const gchar*) curvalue;
395 cmp_attribute (const void *av,
398 const AttributeBlob *a = av;
399 const AttributeBlob *b = bv;
401 if (a->offset < b->offset)
403 else if (a->offset == b->offset)
409 static AttributeBlob *
410 find_first_attribute (GIRealInfo *rinfo)
412 Header *header = (Header *)rinfo->typelib->data;
413 AttributeBlob blob, *first, *res, *previous;
415 blob.offset = rinfo->offset;
417 first = (AttributeBlob *) &rinfo->typelib->data[header->attributes];
419 res = bsearch (&blob, first, header->n_attributes,
420 header->attribute_blob_size, cmp_attribute);
426 while (previous >= first && previous->offset == rinfo->offset)
436 * g_base_info_iterate_attributes:
437 * @info: A #GIBaseInfo
438 * @iter: A #GIAttributeIter structure, must be initialized; see below
439 * @name: (out) (transfer none): Returned name, must not be freed
440 * @value: (out) (transfer none): Returned name, must not be freed
442 * Iterate over all attributes associated with this node. The iterator
443 * structure is typically stack allocated, and must have its first
444 * member initialized to %NULL.
446 * Both the @name and @value should be treated as constants
447 * and must not be freed.
450 * <title>Iterating over attributes</title>
453 * print_attributes (GIBaseInfo *info)
455 * GIAttributeIter iter = { 0, };
458 * while (g_base_info_iterate_attributes (info, &iter, &name, &value))
460 * g_print ("attribute name: %s value: %s", name, value);
466 * Return value: %TRUE if there are more attributes, %FALSE otherwise
469 g_base_info_iterate_attributes (GIBaseInfo *info,
470 GIAttributeIter *iter,
474 GIRealInfo *rinfo = (GIRealInfo *)info;
475 Header *header = (Header *)rinfo->typelib->data;
476 AttributeBlob *next, *after;
478 after = (AttributeBlob *) &rinfo->typelib->data[header->attributes +
479 header->n_attributes * header->attribute_blob_size];
481 if (iter->data != NULL)
482 next = (AttributeBlob *) iter->data;
484 next = find_first_attribute (rinfo);
486 if (next == NULL || next->offset != rinfo->offset || next >= after)
489 *name = (gchar*) g_typelib_get_string (rinfo->typelib, next->name);
490 *value = (gchar*) g_typelib_get_string (rinfo->typelib, next->value);
491 iter->data = next + 1;
497 g_base_info_get_container (GIBaseInfo *info)
499 return ((GIRealInfo*)info)->container;
503 g_base_info_get_typelib (GIBaseInfo *info)
505 return ((GIRealInfo*)info)->typelib;
510 * @info1: A #GIBaseInfo
511 * @info2: A #GIBaseInfo
513 * Compare two #GIBaseInfo.
515 * Using pointer comparison is not practical since many functions return
516 * different instances of #GIBaseInfo that refers to the same part of the
517 * TypeLib; use this function instead to do #GIBaseInfo comparisons.
519 * Return value: TRUE if and only if @info1 equals @info2.
522 g_base_info_equal (GIBaseInfo *info1, GIBaseInfo *info2)
524 /* Compare the TypeLib pointers, which are mmapped. */
525 GIRealInfo *rinfo1 = (GIRealInfo*)info1;
526 GIRealInfo *rinfo2 = (GIRealInfo*)info2;
527 return rinfo1->typelib->data + rinfo1->offset == rinfo2->typelib->data + rinfo2->offset;
530 /* GIFunctionInfo functions */
532 g_function_info_get_symbol (GIFunctionInfo *info)
534 GIRealInfo *rinfo = (GIRealInfo *)info;
535 FunctionBlob *blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset];
537 return g_typelib_get_string (rinfo->typelib, blob->symbol);
541 g_function_info_get_flags (GIFunctionInfo *info)
543 GIFunctionInfoFlags flags;
544 GIRealInfo *rinfo = (GIRealInfo *)info;
545 FunctionBlob *blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset];
549 /* Make sure we don't flag Constructors as methods */
550 if (!blob->constructor && !blob->is_static)
551 flags = flags | GI_FUNCTION_IS_METHOD;
553 if (blob->constructor)
554 flags = flags | GI_FUNCTION_IS_CONSTRUCTOR;
557 flags = flags | GI_FUNCTION_IS_GETTER;
560 flags = flags | GI_FUNCTION_IS_SETTER;
562 if (blob->wraps_vfunc)
563 flags = flags | GI_FUNCTION_WRAPS_VFUNC;
566 flags = flags | GI_FUNCTION_THROWS;
572 g_function_info_get_property (GIFunctionInfo *info)
574 GIRealInfo *rinfo = (GIRealInfo *)info;
575 FunctionBlob *blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset];
576 GIInterfaceInfo *container = (GIInterfaceInfo *)rinfo->container;
578 return g_interface_info_get_property (container, blob->index);
582 g_function_info_get_vfunc (GIFunctionInfo *info)
584 GIRealInfo *rinfo = (GIRealInfo*)info;
585 FunctionBlob *blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset];
586 GIInterfaceInfo *container = (GIInterfaceInfo *)rinfo->container;
588 return g_interface_info_get_vfunc (container, blob->index);
591 /* GICallableInfo functions */
593 signature_offset (GICallableInfo *info)
595 GIRealInfo *rinfo = (GIRealInfo*)info;
600 case GI_INFO_TYPE_FUNCTION:
601 sigoff = G_STRUCT_OFFSET (FunctionBlob, signature);
603 case GI_INFO_TYPE_VFUNC:
604 sigoff = G_STRUCT_OFFSET (VFuncBlob, signature);
606 case GI_INFO_TYPE_CALLBACK:
607 sigoff = G_STRUCT_OFFSET (CallbackBlob, signature);
609 case GI_INFO_TYPE_SIGNAL:
610 sigoff = G_STRUCT_OFFSET (SignalBlob, signature);
614 return *(guint32 *)&rinfo->typelib->data[rinfo->offset + sigoff];
619 g_type_info_new (GIBaseInfo *container,
623 SimpleTypeBlob *type = (SimpleTypeBlob *)&typelib->data[offset];
625 return (GITypeInfo *) g_info_new (GI_INFO_TYPE_TYPE, container, typelib,
626 (type->flags.reserved == 0 && type->flags.reserved2 == 0) ? offset : type->offset);
630 g_type_info_init (GIBaseInfo *info,
631 GIBaseInfo *container,
635 GIRealInfo *rinfo = (GIRealInfo*)container;
636 SimpleTypeBlob *type = (SimpleTypeBlob *)&typelib->data[offset];
638 g_info_init ((GIRealInfo*)info, GI_INFO_TYPE_TYPE, rinfo->repository, container, typelib,
639 (type->flags.reserved == 0 && type->flags.reserved2 == 0) ? offset : type->offset);
643 * g_callable_info_get_return_type:
644 * @info: a #GICallableInfo
646 * Get the return type of a callable item as
649 * Returns: a #GITypeInfo idexing the TypeBlob for the
650 * return type of #info
653 g_callable_info_get_return_type (GICallableInfo *info)
655 GIRealInfo *rinfo = (GIRealInfo *)info;
658 offset = signature_offset (info);
660 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, offset);
665 * g_callable_info_load_return_type:
666 * @info: a #GICallableInfo
667 * @type: (out caller-allocates): Initialized with return type of @info
669 * Get information about a return value of callable; this
670 * function is a variant of g_callable_info_get_return_type() designed for stack
673 * The initialized @type must not be referenced after @info is deallocated.
676 g_callable_info_load_return_type (GICallableInfo *info,
679 GIRealInfo *rinfo = (GIRealInfo *)info;
682 offset = signature_offset (info);
684 g_type_info_init (type, (GIBaseInfo*)info, rinfo->typelib, offset);
688 * g_callable_info_may_return_null:
689 * @info: a #GICallableInfo
691 * See if a callable could return NULL.
693 * Returns: TRUE if callable could return NULL
696 g_callable_info_may_return_null (GICallableInfo *info)
698 GIRealInfo *rinfo = (GIRealInfo *)info;
699 SignatureBlob *blob = (SignatureBlob *)&rinfo->typelib->data[signature_offset (info)];
701 return blob->may_return_null;
705 * g_callable_info_get_caller_owns:
706 * @info: a #GICallableInfo
708 * See whether the caller owns the return value
711 * Returns: TRUE if the caller owns the return value, FALSE otherwise.
714 g_callable_info_get_caller_owns (GICallableInfo *info)
716 GIRealInfo *rinfo = (GIRealInfo*) info;
717 SignatureBlob *blob = (SignatureBlob *)&rinfo->typelib->data[signature_offset (info)];
719 if (blob->caller_owns_return_value)
720 return GI_TRANSFER_EVERYTHING;
721 else if (blob->caller_owns_return_container)
722 return GI_TRANSFER_CONTAINER;
724 return GI_TRANSFER_NOTHING;
728 * g_callable_info_get_n_args:
729 * @info: a #GICallableInfo
731 * Get the number of arguments (both IN and OUT) for this callable.
733 * Returns: The number of arguments this callable expects.
736 g_callable_info_get_n_args (GICallableInfo *info)
738 GIRealInfo *rinfo = (GIRealInfo *)info;
742 offset = signature_offset (info);
743 blob = (SignatureBlob *)&rinfo->typelib->data[offset];
745 return blob->n_arguments;
749 * g_callable_info_get_arg:
750 * @info: a #GICallableInfo
751 * @n: the argument index to fetch
753 * Get information about a particular argument of this callable.
755 * Returns: A #GIArgInfo indexing the typelib on the given argument.
758 g_callable_info_get_arg (GICallableInfo *info,
761 GIRealInfo *rinfo = (GIRealInfo *)info;
762 Header *header = (Header *)rinfo->typelib->data;
765 offset = signature_offset (info);
767 return (GIArgInfo *) g_info_new (GI_INFO_TYPE_ARG, (GIBaseInfo*)info, rinfo->typelib,
768 offset + header->signature_blob_size + n * header->arg_blob_size);
772 * g_callable_info_load_arg:
773 * @info: a #GICallableInfo
774 * @n: the argument index to fetch
775 * @arg: (out caller-allocates): Initialize with argument number @n
777 * Get information about a particular argument of this callable; this
778 * function is a variant of g_callable_info_get_arg() designed for stack
781 * The initialized @arg must not be referenced after @info is deallocated.
784 g_callable_info_load_arg (GICallableInfo *info,
788 GIRealInfo *rinfo = (GIRealInfo *)info;
789 Header *header = (Header *)rinfo->typelib->data;
792 offset = signature_offset (info);
794 g_info_init ((GIRealInfo*)arg, GI_INFO_TYPE_ARG, rinfo->repository, (GIBaseInfo*)info, rinfo->typelib,
795 offset + header->signature_blob_size + n * header->arg_blob_size);
798 /* GIArgInfo function */
800 g_arg_info_get_direction (GIArgInfo *info)
802 GIRealInfo *rinfo = (GIRealInfo *)info;
803 ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
805 if (blob->in && blob->out)
806 return GI_DIRECTION_INOUT;
808 return GI_DIRECTION_OUT;
810 return GI_DIRECTION_IN;
814 g_arg_info_is_return_value (GIArgInfo *info)
816 GIRealInfo *rinfo = (GIRealInfo *)info;
817 ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
819 return blob->return_value;
823 g_arg_info_is_dipper (GIArgInfo *info)
825 GIRealInfo *rinfo = (GIRealInfo *)info;
826 ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
832 g_arg_info_is_optional (GIArgInfo *info)
834 GIRealInfo *rinfo = (GIRealInfo *)info;
835 ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
837 return blob->optional;
841 g_arg_info_may_be_null (GIArgInfo *info)
843 GIRealInfo *rinfo = (GIRealInfo *)info;
844 ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
846 return blob->allow_none;
850 g_arg_info_get_ownership_transfer (GIArgInfo *info)
852 GIRealInfo *rinfo = (GIRealInfo *)info;
853 ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
855 if (blob->transfer_ownership)
856 return GI_TRANSFER_EVERYTHING;
857 else if (blob->transfer_container_ownership)
858 return GI_TRANSFER_CONTAINER;
860 return GI_TRANSFER_NOTHING;
864 g_arg_info_get_scope (GIArgInfo *info)
866 GIRealInfo *rinfo = (GIRealInfo *)info;
867 ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
873 g_arg_info_get_closure (GIArgInfo *info)
875 GIRealInfo *rinfo = (GIRealInfo *)info;
876 ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
878 return blob->closure;
882 g_arg_info_get_destroy (GIArgInfo *info)
884 GIRealInfo *rinfo = (GIRealInfo *)info;
885 ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
887 return blob->destroy;
891 * g_arg_info_get_type:
892 * @info: A #GIArgInfo
894 * Returns: (transfer full): Information about the type of argument @info
897 g_arg_info_get_type (GIArgInfo *info)
899 GIRealInfo *rinfo = (GIRealInfo *)info;
901 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (ArgBlob, arg_type));
905 * g_arg_info_load_type:
906 * @info: A #GIArgInfo
907 * @type: (out caller-allocates): Initialized with information about type of @info
909 * Get information about a the type of given argument @info; this
910 * function is a variant of g_arg_info_get_type() designed for stack
913 * The initialized @type must not be referenced after @info is deallocated.
916 g_arg_info_load_type (GIArgInfo *info,
919 GIRealInfo *rinfo = (GIRealInfo*) info;
920 g_type_info_init (type, (GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (ArgBlob, arg_type));
923 /* GITypeInfo functions */
925 g_type_info_is_pointer (GITypeInfo *info)
927 GIRealInfo *rinfo = (GIRealInfo *)info;
928 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
930 if (type->flags.reserved == 0 && type->flags.reserved2 == 0)
931 return type->flags.pointer;
934 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&rinfo->typelib->data[rinfo->offset];
936 return iface->pointer;
941 g_type_info_get_tag (GITypeInfo *info)
943 GIRealInfo *rinfo = (GIRealInfo *)info;
944 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
946 if (rinfo->type_is_embedded)
947 return GI_TYPE_TAG_INTERFACE;
948 else if (type->flags.reserved == 0 && type->flags.reserved2 == 0)
949 return type->flags.tag;
952 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&rinfo->typelib->data[rinfo->offset];
959 g_type_info_get_param_type (GITypeInfo *info,
962 GIRealInfo *rinfo = (GIRealInfo *)info;
963 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
965 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
967 ParamTypeBlob *param = (ParamTypeBlob *)&rinfo->typelib->data[rinfo->offset];
971 case GI_TYPE_TAG_ARRAY:
972 case GI_TYPE_TAG_GLIST:
973 case GI_TYPE_TAG_GSLIST:
974 case GI_TYPE_TAG_GHASH:
975 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib,
976 rinfo->offset + sizeof (ParamTypeBlob)
977 + sizeof (SimpleTypeBlob) * n);
988 * g_type_info_get_interface:
989 * @info: A #GITypeInfo
991 * For types which have #GI_TYPE_TAG_INTERFACE such as GObjects and boxed values,
992 * this function returns full information about the referenced type. You can then
993 * inspect the type of the returned #GIBaseInfo to further query whether it is
994 * a concrete GObject, a GInterface, a structure, etc. using g_base_info_get_type().
997 g_type_info_get_interface (GITypeInfo *info)
999 GIRealInfo *rinfo = (GIRealInfo *)info;
1000 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1002 if (rinfo->type_is_embedded)
1003 return (GIBaseInfo *) g_info_new (type->offset, (GIBaseInfo*)info, rinfo->typelib,
1006 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1008 InterfaceTypeBlob *blob = (InterfaceTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1010 if (blob->tag == GI_TYPE_TAG_INTERFACE)
1011 return g_info_from_entry (rinfo->repository, rinfo->typelib, blob->interface);
1018 g_type_info_get_array_length (GITypeInfo *info)
1020 GIRealInfo *rinfo = (GIRealInfo *)info;
1021 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1023 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1025 ArrayTypeBlob *blob = (ArrayTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1027 if (blob->tag == GI_TYPE_TAG_ARRAY)
1029 if (blob->has_length)
1030 return blob->dimensions.length;
1038 g_type_info_get_array_fixed_size (GITypeInfo *info)
1040 GIRealInfo *rinfo = (GIRealInfo *)info;
1041 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1043 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1045 ArrayTypeBlob *blob = (ArrayTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1047 if (blob->tag == GI_TYPE_TAG_ARRAY)
1050 return blob->dimensions.size;
1058 g_type_info_is_zero_terminated (GITypeInfo *info)
1060 GIRealInfo *rinfo = (GIRealInfo *)info;
1061 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1063 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1065 ArrayTypeBlob *blob = (ArrayTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1067 if (blob->tag == GI_TYPE_TAG_ARRAY)
1068 return blob->zero_terminated;
1075 g_type_info_get_n_error_domains (GITypeInfo *info)
1077 GIRealInfo *rinfo = (GIRealInfo *)info;
1078 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1080 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1082 ErrorTypeBlob *blob = (ErrorTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1084 if (blob->tag == GI_TYPE_TAG_ERROR)
1085 return blob->n_domains;
1092 g_type_info_get_error_domain (GITypeInfo *info,
1095 GIRealInfo *rinfo = (GIRealInfo *)info;
1096 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1098 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1100 ErrorTypeBlob *blob = (ErrorTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1102 if (blob->tag == GI_TYPE_TAG_ERROR)
1103 return (GIErrorDomainInfo *) g_info_from_entry (rinfo->repository,
1112 /* GIErrorDomainInfo functions */
1114 g_error_domain_info_get_quark (GIErrorDomainInfo *info)
1116 GIRealInfo *rinfo = (GIRealInfo *)info;
1117 ErrorDomainBlob *blob = (ErrorDomainBlob *)&rinfo->typelib->data[rinfo->offset];
1119 return g_typelib_get_string (rinfo->typelib, blob->get_quark);
1123 g_error_domain_info_get_codes (GIErrorDomainInfo *info)
1125 GIRealInfo *rinfo = (GIRealInfo *)info;
1126 ErrorDomainBlob *blob = (ErrorDomainBlob *)&rinfo->typelib->data[rinfo->offset];
1128 return (GIInterfaceInfo *) g_info_from_entry (rinfo->repository,
1129 rinfo->typelib, blob->error_codes);
1133 /* GIValueInfo functions */
1135 g_value_info_get_value (GIValueInfo *info)
1137 GIRealInfo *rinfo = (GIRealInfo *)info;
1138 ValueBlob *blob = (ValueBlob *)&rinfo->typelib->data[rinfo->offset];
1140 return (glong)blob->value;
1143 /* GIFieldInfo functions */
1145 g_field_info_get_flags (GIFieldInfo *info)
1147 GIFieldInfoFlags flags;
1149 GIRealInfo *rinfo = (GIRealInfo *)info;
1150 FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset];
1155 flags = flags | GI_FIELD_IS_READABLE;
1158 flags = flags | GI_FIELD_IS_WRITABLE;
1164 g_field_info_get_size (GIFieldInfo *info)
1166 GIRealInfo *rinfo = (GIRealInfo *)info;
1167 FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset];
1173 g_field_info_get_offset (GIFieldInfo *info)
1175 GIRealInfo *rinfo = (GIRealInfo *)info;
1176 FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset];
1178 return blob->struct_offset;
1182 g_field_info_get_type (GIFieldInfo *info)
1184 GIRealInfo *rinfo = (GIRealInfo *)info;
1185 Header *header = (Header *)rinfo->typelib->data;
1186 FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset];
1187 GIRealInfo *type_info;
1189 if (blob->has_embedded_type)
1191 type_info = (GIRealInfo *) g_info_new (GI_INFO_TYPE_TYPE,
1192 (GIBaseInfo*)info, rinfo->typelib,
1193 rinfo->offset + header->field_blob_size);
1194 type_info->type_is_embedded = TRUE;
1197 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (FieldBlob, type));
1199 return (GIBaseInfo*)type_info;
1202 /* GIRegisteredTypeInfo functions */
1204 g_registered_type_info_get_type_name (GIRegisteredTypeInfo *info)
1206 GIRealInfo *rinfo = (GIRealInfo *)info;
1207 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1209 if (blob->gtype_name)
1210 return g_typelib_get_string (rinfo->typelib, blob->gtype_name);
1216 g_registered_type_info_get_type_init (GIRegisteredTypeInfo *info)
1218 GIRealInfo *rinfo = (GIRealInfo *)info;
1219 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1221 if (blob->gtype_init)
1222 return g_typelib_get_string (rinfo->typelib, blob->gtype_init);
1228 g_registered_type_info_get_g_type (GIRegisteredTypeInfo *info)
1230 const char *type_init;
1231 GType (* get_type_func) (void);
1232 GIRealInfo *rinfo = (GIRealInfo*)info;
1234 type_init = g_registered_type_info_get_type_init (info);
1236 if (type_init == NULL)
1238 else if (!strcmp (type_init, "intern"))
1239 return G_TYPE_OBJECT;
1241 get_type_func = NULL;
1242 if (!g_typelib_symbol (rinfo->typelib,
1244 (void**) &get_type_func))
1247 return (* get_type_func) ();
1250 /* GIStructInfo functions */
1252 g_struct_info_get_n_fields (GIStructInfo *info)
1254 GIRealInfo *rinfo = (GIRealInfo *)info;
1255 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1257 return blob->n_fields;
1261 g_struct_get_field_offset (GIStructInfo *info,
1264 GIRealInfo *rinfo = (GIRealInfo *)info;
1265 Header *header = (Header *)rinfo->typelib->data;
1266 guint32 offset = rinfo->offset + header->struct_blob_size;
1268 FieldBlob *field_blob;
1270 for (i = 0; i < n; i++)
1272 field_blob = (FieldBlob *)&rinfo->typelib->data[offset];
1273 offset += header->field_blob_size;
1274 if (field_blob->has_embedded_type)
1275 offset += header->callback_blob_size;
1282 g_struct_info_get_field (GIStructInfo *info,
1285 GIRealInfo *rinfo = (GIRealInfo *)info;
1287 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, (GIBaseInfo*)info, rinfo->typelib,
1288 g_struct_get_field_offset (info, n));
1292 g_struct_info_get_n_methods (GIStructInfo *info)
1294 GIRealInfo *rinfo = (GIRealInfo *)info;
1295 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1297 return blob->n_methods;
1301 g_struct_info_get_method (GIStructInfo *info,
1304 GIRealInfo *rinfo = (GIRealInfo *)info;
1305 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1306 Header *header = (Header *)rinfo->typelib->data;
1309 offset = g_struct_get_field_offset (info, blob->n_fields) + n * header->function_blob_size;
1310 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info,
1311 rinfo->typelib, offset);
1314 static GIFunctionInfo *
1315 find_method (GIBaseInfo *base,
1321 GIRealInfo *rinfo = (GIRealInfo*)base;
1322 Header *header = (Header *)rinfo->typelib->data;
1325 for (i = 0; i < n_methods; i++)
1327 FunctionBlob *fblob = (FunctionBlob *)&rinfo->typelib->data[offset];
1328 const gchar *fname = (const gchar *)&rinfo->typelib->data[fblob->name];
1330 if (strcmp (name, fname) == 0)
1331 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1332 rinfo->typelib, offset);
1334 offset += header->function_blob_size;
1341 g_struct_info_find_method (GIStructInfo *info,
1345 GIRealInfo *rinfo = (GIRealInfo *)info;
1346 Header *header = (Header *)rinfo->typelib->data;
1347 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1349 offset = rinfo->offset + header->struct_blob_size
1350 + blob->n_fields * header->field_blob_size;
1352 return find_method ((GIBaseInfo*)info, offset, blob->n_methods, name);
1356 g_struct_info_get_size (GIStructInfo *info)
1358 GIRealInfo *rinfo = (GIRealInfo *)info;
1359 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1365 g_struct_info_get_alignment (GIStructInfo *info)
1367 GIRealInfo *rinfo = (GIRealInfo *)info;
1368 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1370 return blob->alignment;
1374 * g_struct_info_is_gtype_struct:
1375 * @info: GIStructInfo
1377 * Return true if this structure represents the "class structure" for some
1378 * #GObject or #GInterface. This function is mainly useful to hide this kind of structure
1379 * from generated public APIs.
1381 * Returns: %TRUE if this is a class struct, %FALSE otherwise
1384 g_struct_info_is_gtype_struct (GIStructInfo *info)
1386 GIRealInfo *rinfo = (GIRealInfo *)info;
1387 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1389 return blob->is_gtype_struct;
1393 g_enum_info_get_n_values (GIEnumInfo *info)
1395 GIRealInfo *rinfo = (GIRealInfo *)info;
1396 EnumBlob *blob = (EnumBlob *)&rinfo->typelib->data[rinfo->offset];
1398 return blob->n_values;
1402 g_enum_info_get_value (GIEnumInfo *info,
1405 GIRealInfo *rinfo = (GIRealInfo *)info;
1406 Header *header = (Header *)rinfo->typelib->data;
1409 offset = rinfo->offset + header->enum_blob_size
1410 + n * header->value_blob_size;
1411 return (GIValueInfo *) g_info_new (GI_INFO_TYPE_VALUE, (GIBaseInfo*)info, rinfo->typelib, offset);
1415 * g_enum_info_get_storage_type:
1418 * Gets the tag of the type used for the enum in the C ABI. This will
1419 * will be a signed or unsigned integral type.
1421 * Note that in the current implementation the width of the type is
1422 * computed correctly, but the signed or unsigned nature of the type
1423 * may not match the sign of the type used by the C compiler.
1425 * Return Value: the storage type for the enumeration
1428 g_enum_info_get_storage_type (GIEnumInfo *info)
1430 GIRealInfo *rinfo = (GIRealInfo *)info;
1431 EnumBlob *blob = (EnumBlob *)&rinfo->typelib->data[rinfo->offset];
1433 return blob->storage_type;
1436 /* GIObjectInfo functions */
1438 g_object_info_get_parent (GIObjectInfo *info)
1440 GIRealInfo *rinfo = (GIRealInfo *)info;
1441 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1444 return (GIObjectInfo *) g_info_from_entry (rinfo->repository,
1445 rinfo->typelib, blob->parent);
1451 g_object_info_get_abstract (GIObjectInfo *info)
1453 GIRealInfo *rinfo = (GIRealInfo *)info;
1454 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1455 return blob->abstract != 0;
1459 g_object_info_get_type_name (GIObjectInfo *info)
1461 GIRealInfo *rinfo = (GIRealInfo *)info;
1462 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1464 return g_typelib_get_string (rinfo->typelib, blob->gtype_name);
1468 g_object_info_get_type_init (GIObjectInfo *info)
1470 GIRealInfo *rinfo = (GIRealInfo *)info;
1471 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1473 return g_typelib_get_string (rinfo->typelib, blob->gtype_init);
1477 g_object_info_get_n_interfaces (GIObjectInfo *info)
1479 GIRealInfo *rinfo = (GIRealInfo *)info;
1480 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1482 return blob->n_interfaces;
1486 g_object_info_get_interface (GIObjectInfo *info,
1489 GIRealInfo *rinfo = (GIRealInfo *)info;
1490 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1492 return (GIInterfaceInfo *) g_info_from_entry (rinfo->repository,
1493 rinfo->typelib, blob->interfaces[n]);
1497 g_object_info_get_n_fields (GIObjectInfo *info)
1499 GIRealInfo *rinfo = (GIRealInfo *)info;
1500 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1502 return blob->n_fields;
1506 g_object_info_get_field (GIObjectInfo *info,
1510 GIRealInfo *rinfo = (GIRealInfo *)info;
1511 Header *header = (Header *)rinfo->typelib->data;
1512 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1514 offset = rinfo->offset + header->object_blob_size
1515 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1516 + n * header->field_blob_size;
1518 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, (GIBaseInfo*)info, rinfo->typelib, offset);
1522 g_object_info_get_n_properties (GIObjectInfo *info)
1524 GIRealInfo *rinfo = (GIRealInfo *)info;
1525 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1527 return blob->n_properties;
1531 g_object_info_get_property (GIObjectInfo *info,
1535 GIRealInfo *rinfo = (GIRealInfo *)info;
1536 Header *header = (Header *)rinfo->typelib->data;
1537 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1539 offset = rinfo->offset + header->object_blob_size
1540 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1541 + blob->n_fields * header->field_blob_size
1542 + n * header->property_blob_size;
1544 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, (GIBaseInfo*)info,
1545 rinfo->typelib, offset);
1549 g_object_info_get_n_methods (GIObjectInfo *info)
1551 GIRealInfo *rinfo = (GIRealInfo *)info;
1552 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1554 return blob->n_methods;
1558 g_object_info_get_method (GIObjectInfo *info,
1562 GIRealInfo *rinfo = (GIRealInfo *)info;
1563 Header *header = (Header *)rinfo->typelib->data;
1564 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1566 offset = rinfo->offset + header->object_blob_size
1567 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1568 + blob->n_fields * header->field_blob_size
1569 + blob->n_properties * header->property_blob_size
1570 + n * header->function_blob_size;
1572 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info,
1573 rinfo->typelib, offset);
1577 g_object_info_find_method (GIObjectInfo *info,
1581 GIRealInfo *rinfo = (GIRealInfo *)info;
1582 Header *header = (Header *)rinfo->typelib->data;
1583 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1585 offset = rinfo->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;
1590 return find_method ((GIBaseInfo*)info, offset, blob->n_methods, name);
1594 g_object_info_get_n_signals (GIObjectInfo *info)
1596 GIRealInfo *rinfo = (GIRealInfo *)info;
1597 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1599 return blob->n_signals;
1603 g_object_info_get_signal (GIObjectInfo *info,
1607 GIRealInfo *rinfo = (GIRealInfo *)info;
1608 Header *header = (Header *)rinfo->typelib->data;
1609 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1611 offset = rinfo->offset + header->object_blob_size
1612 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1613 + blob->n_fields * header->field_blob_size
1614 + blob->n_properties * header->property_blob_size
1615 + blob->n_methods * header->function_blob_size
1616 + n * header->signal_blob_size;
1618 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, (GIBaseInfo*)info,
1619 rinfo->typelib, offset);
1623 g_object_info_get_n_vfuncs (GIObjectInfo *info)
1625 GIRealInfo *rinfo = (GIRealInfo *)info;
1626 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1628 return blob->n_vfuncs;
1632 g_object_info_get_vfunc (GIObjectInfo *info,
1636 GIRealInfo *rinfo = (GIRealInfo *)info;
1637 Header *header = (Header *)rinfo->typelib->data;
1638 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1640 offset = rinfo->offset + header->object_blob_size
1641 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1642 + blob->n_fields * header->field_blob_size
1643 + blob->n_properties * header->property_blob_size
1644 + blob->n_methods * header->function_blob_size
1645 + blob->n_signals * header->signal_blob_size
1646 + n * header->vfunc_blob_size;
1648 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, (GIBaseInfo*)info,
1649 rinfo->typelib, offset);
1652 static GIVFuncInfo *
1653 find_vfunc (GIRealInfo *rinfo,
1659 Header *header = (Header *)rinfo->typelib->data;
1662 for (i = 0; i < n_vfuncs; i++)
1664 VFuncBlob *fblob = (VFuncBlob *)&rinfo->typelib->data[offset];
1665 const gchar *fname = (const gchar *)&rinfo->typelib->data[fblob->name];
1667 if (strcmp (name, fname) == 0)
1668 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, (GIBaseInfo*) rinfo,
1669 rinfo->typelib, offset);
1671 offset += header->vfunc_blob_size;
1678 * g_object_info_find_vfunc:
1679 * @info: An #GIObjectInfo
1680 * @name: The name of a virtual function to find.
1682 * Locate a virtual function slot with name @name. Note that the namespace
1683 * for virtuals is distinct from that of methods; there may or may not be
1684 * a concrete method associated for a virtual. If there is one, it may
1685 * be retrieved using #g_vfunc_info_get_invoker. See the documentation for
1686 * that function for more information on invoking virtuals.
1688 * Return value: (transfer full): A #GIVFuncInfo, or %NULL if none with name @name.
1691 g_object_info_find_vfunc (GIObjectInfo *info,
1695 GIRealInfo *rinfo = (GIRealInfo *)info;
1696 Header *header = (Header *)rinfo->typelib->data;
1697 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1699 offset = rinfo->offset + header->object_blob_size
1700 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1701 + blob->n_fields * header->field_blob_size
1702 + blob->n_properties * header->property_blob_size
1703 + blob->n_methods * header->function_blob_size
1704 + blob->n_signals * header->signal_blob_size;
1706 return find_vfunc (rinfo, offset, blob->n_vfuncs, name);
1710 g_object_info_get_n_constants (GIObjectInfo *info)
1712 GIRealInfo *rinfo = (GIRealInfo *)info;
1713 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1715 return blob->n_constants;
1719 g_object_info_get_constant (GIObjectInfo *info,
1723 GIRealInfo *rinfo = (GIRealInfo *)info;
1724 Header *header = (Header *)rinfo->typelib->data;
1725 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1727 offset = rinfo->offset + header->object_blob_size
1728 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1729 + blob->n_fields * header->field_blob_size
1730 + blob->n_properties * header->property_blob_size
1731 + blob->n_methods * header->function_blob_size
1732 + blob->n_signals * header->signal_blob_size
1733 + blob->n_vfuncs * header->vfunc_blob_size
1734 + n * header->constant_blob_size;
1736 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, (GIBaseInfo*)info,
1737 rinfo->typelib, offset);
1741 * g_object_info_get_class_struct:
1742 * @info: A #GIObjectInfo to query
1744 * Every #GObject has two structures; an instance structure and a class
1745 * structure. This function returns the metadata for the class structure.
1747 * Returns: a #GIStructInfo for the class struct or %NULL if none found.
1750 g_object_info_get_class_struct (GIObjectInfo *info)
1752 GIRealInfo *rinfo = (GIRealInfo *)info;
1753 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1755 if (blob->gtype_struct)
1756 return (GIStructInfo *) g_info_from_entry (rinfo->repository,
1757 rinfo->typelib, blob->gtype_struct);
1762 /* GIInterfaceInfo functions */
1764 g_interface_info_get_n_prerequisites (GIInterfaceInfo *info)
1766 GIRealInfo *rinfo = (GIRealInfo *)info;
1767 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1769 return blob->n_prerequisites;
1773 g_interface_info_get_prerequisite (GIInterfaceInfo *info,
1776 GIRealInfo *rinfo = (GIRealInfo *)info;
1777 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1779 return g_info_from_entry (rinfo->repository,
1780 rinfo->typelib, blob->prerequisites[n]);
1785 g_interface_info_get_n_properties (GIInterfaceInfo *info)
1787 GIRealInfo *rinfo = (GIRealInfo *)info;
1788 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1790 return blob->n_properties;
1794 g_interface_info_get_property (GIInterfaceInfo *info,
1798 GIRealInfo *rinfo = (GIRealInfo *)info;
1799 Header *header = (Header *)rinfo->typelib->data;
1800 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1802 offset = rinfo->offset + header->interface_blob_size
1803 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1804 + n * header->property_blob_size;
1806 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, (GIBaseInfo*)info,
1807 rinfo->typelib, offset);
1811 g_interface_info_get_n_methods (GIInterfaceInfo *info)
1813 GIRealInfo *rinfo = (GIRealInfo *)info;
1814 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1816 return blob->n_methods;
1820 g_interface_info_get_method (GIInterfaceInfo *info,
1824 GIRealInfo *rinfo = (GIRealInfo *)info;
1825 Header *header = (Header *)rinfo->typelib->data;
1826 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1828 offset = rinfo->offset + header->interface_blob_size
1829 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1830 + blob->n_properties * header->property_blob_size
1831 + n * header->function_blob_size;
1833 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info,
1834 rinfo->typelib, offset);
1838 g_interface_info_find_method (GIInterfaceInfo *info,
1842 GIRealInfo *rinfo = (GIRealInfo *)info;
1843 Header *header = (Header *)rinfo->typelib->data;
1844 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1846 offset = rinfo->offset + header->interface_blob_size
1847 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1848 + blob->n_properties * header->property_blob_size;
1850 return find_method ((GIBaseInfo*)info, offset, blob->n_methods, name);
1854 g_interface_info_get_n_signals (GIInterfaceInfo *info)
1856 GIRealInfo *rinfo = (GIRealInfo *)info;
1857 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1859 return blob->n_signals;
1863 g_interface_info_get_signal (GIInterfaceInfo *info,
1867 GIRealInfo *rinfo = (GIRealInfo *)info;
1868 Header *header = (Header *)rinfo->typelib->data;
1869 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1871 offset = rinfo->offset + header->interface_blob_size
1872 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1873 + blob->n_properties * header->property_blob_size
1874 + blob->n_methods * header->function_blob_size
1875 + n * header->signal_blob_size;
1877 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, (GIBaseInfo*)info,
1878 rinfo->typelib, offset);
1882 g_interface_info_get_n_vfuncs (GIInterfaceInfo *info)
1884 GIRealInfo *rinfo = (GIRealInfo *)info;
1885 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1887 return blob->n_vfuncs;
1891 g_interface_info_get_vfunc (GIInterfaceInfo *info,
1895 GIRealInfo *rinfo = (GIRealInfo *)info;
1896 Header *header = (Header *)rinfo->typelib->data;
1897 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1899 offset = rinfo->offset + header->interface_blob_size
1900 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1901 + blob->n_properties * header->property_blob_size
1902 + blob->n_methods * header->function_blob_size
1903 + blob->n_signals * header->signal_blob_size
1904 + n * header->vfunc_blob_size;
1906 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, (GIBaseInfo*)info,
1907 rinfo->typelib, offset);
1911 * g_interface_info_find_vfunc:
1912 * @info: An #GIObjectInfo
1913 * @name: The name of a virtual function to find.
1915 * Locate a virtual function slot with name @name. See the documentation
1916 * for #g_object_info_find_vfunc for more information on virtuals.
1918 * Return value: (transfer full): A #GIVFuncInfo, or %NULL if none with name @name.
1921 g_interface_info_find_vfunc (GIInterfaceInfo *info,
1925 GIRealInfo *rinfo = (GIRealInfo *)info;
1926 Header *header = (Header *)rinfo->typelib->data;
1927 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1929 offset = rinfo->offset + header->interface_blob_size
1930 + (blob->n_prerequisites + blob->n_prerequisites % 2) * 2
1931 + blob->n_properties * header->property_blob_size
1932 + blob->n_methods * header->function_blob_size
1933 + blob->n_signals * header->signal_blob_size;
1935 return find_vfunc (rinfo, offset, blob->n_vfuncs, name);
1939 g_interface_info_get_n_constants (GIInterfaceInfo *info)
1941 GIRealInfo *rinfo = (GIRealInfo *)info;
1942 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1944 return blob->n_constants;
1948 g_interface_info_get_constant (GIInterfaceInfo *info,
1952 GIRealInfo *rinfo = (GIRealInfo *)info;
1953 Header *header = (Header *)rinfo->typelib->data;
1954 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1956 offset = rinfo->offset + header->interface_blob_size
1957 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1958 + blob->n_properties * header->property_blob_size
1959 + blob->n_methods * header->function_blob_size
1960 + blob->n_signals * header->signal_blob_size
1961 + blob->n_vfuncs * header->vfunc_blob_size
1962 + n * header->constant_blob_size;
1964 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, (GIBaseInfo*)info,
1965 rinfo->typelib, offset);
1969 * g_interface_info_get_iface_struct:
1970 * @info: A #GIInterfaceInfo to query
1972 * Returns the layout C structure associated with this #GInterface.
1974 * Returns: A #GIStructInfo for the class struct or %NULL if none found.
1977 g_interface_info_get_iface_struct (GIInterfaceInfo *info)
1979 GIRealInfo *rinfo = (GIRealInfo *)info;
1980 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1982 if (blob->gtype_struct)
1983 return (GIStructInfo *) g_info_from_entry (rinfo->repository,
1984 rinfo->typelib, blob->gtype_struct);
1989 /* GIPropertyInfo functions */
1991 g_property_info_get_flags (GIPropertyInfo *info)
1994 GIRealInfo *rinfo = (GIRealInfo *)info;
1995 PropertyBlob *blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset];
2000 flags = flags | G_PARAM_READABLE;
2003 flags = flags | G_PARAM_WRITABLE;
2005 if (blob->construct)
2006 flags = flags | G_PARAM_CONSTRUCT;
2008 if (blob->construct_only)
2009 flags = flags | G_PARAM_CONSTRUCT_ONLY;
2015 g_property_info_get_type (GIPropertyInfo *info)
2017 GIRealInfo *rinfo = (GIRealInfo *)info;
2019 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (PropertyBlob, type));
2023 /* GISignalInfo functions */
2025 g_signal_info_get_flags (GISignalInfo *info)
2029 GIRealInfo *rinfo = (GIRealInfo *)info;
2030 SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset];
2034 if (blob->run_first)
2035 flags = flags | G_SIGNAL_RUN_FIRST;
2038 flags = flags | G_SIGNAL_RUN_LAST;
2040 if (blob->run_cleanup)
2041 flags = flags | G_SIGNAL_RUN_CLEANUP;
2043 if (blob->no_recurse)
2044 flags = flags | G_SIGNAL_NO_RECURSE;
2047 flags = flags | G_SIGNAL_DETAILED;
2050 flags = flags | G_SIGNAL_ACTION;
2053 flags = flags | G_SIGNAL_NO_HOOKS;
2059 g_signal_info_get_class_closure (GISignalInfo *info)
2061 GIRealInfo *rinfo = (GIRealInfo *)info;
2062 SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset];
2064 if (blob->has_class_closure)
2065 return g_interface_info_get_vfunc ((GIInterfaceInfo *)rinfo->container, blob->class_closure);
2071 g_signal_info_true_stops_emit (GISignalInfo *info)
2073 GIRealInfo *rinfo = (GIRealInfo *)info;
2074 SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset];
2076 return blob->true_stops_emit;
2079 /* GIVFuncInfo functions */
2081 g_vfunc_info_get_flags (GIVFuncInfo *info)
2083 GIVFuncInfoFlags flags;
2085 GIRealInfo *rinfo = (GIRealInfo *)info;
2086 VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset];
2090 if (blob->must_chain_up)
2091 flags = flags | GI_VFUNC_MUST_CHAIN_UP;
2093 if (blob->must_be_implemented)
2094 flags = flags | GI_VFUNC_MUST_OVERRIDE;
2096 if (blob->must_not_be_implemented)
2097 flags = flags | GI_VFUNC_MUST_NOT_OVERRIDE;
2103 g_vfunc_info_get_offset (GIVFuncInfo *info)
2105 GIRealInfo *rinfo = (GIRealInfo *)info;
2106 VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset];
2108 return blob->struct_offset;
2112 g_vfunc_info_get_signal (GIVFuncInfo *info)
2114 GIRealInfo *rinfo = (GIRealInfo *)info;
2115 VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset];
2117 if (blob->class_closure)
2118 return g_interface_info_get_signal ((GIInterfaceInfo *)rinfo->container, blob->signal);
2124 * g_vfunc_info_get_invoker:
2125 * @info: A #GIVFuncInfo
2127 * If this virtual function has an associated invoker method, this
2128 * method will return it. An invoker method is a C entry point.
2130 * Not all virtuals will have invokers.
2132 * Return value: (transfer full): An invoker function, or %NULL if none known
2135 g_vfunc_info_get_invoker (GIVFuncInfo *info)
2137 GIRealInfo *rinfo = (GIRealInfo *)info;
2138 VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset];
2139 GIBaseInfo *container = rinfo->container;
2140 GIInfoType parent_type;
2142 /* 1023 = 0x3ff is the maximum of the 10 bits for invoker index */
2143 if (blob->invoker == 1023)
2146 parent_type = g_base_info_get_type (container);
2147 if (parent_type == GI_INFO_TYPE_OBJECT)
2148 return g_object_info_get_method ((GIObjectInfo*)container, blob->invoker);
2149 else if (parent_type == GI_INFO_TYPE_INTERFACE)
2150 return g_interface_info_get_method ((GIInterfaceInfo*)container, blob->invoker);
2152 g_assert_not_reached ();
2155 /* GIConstantInfo functions */
2157 g_constant_info_get_type (GIConstantInfo *info)
2159 GIRealInfo *rinfo = (GIRealInfo *)info;
2161 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + 8);
2165 g_constant_info_get_value (GIConstantInfo *info,
2168 GIRealInfo *rinfo = (GIRealInfo *)info;
2169 ConstantBlob *blob = (ConstantBlob *)&rinfo->typelib->data[rinfo->offset];
2171 /* FIXME non-basic types ? */
2172 if (blob->type.flags.reserved == 0 && blob->type.flags.reserved2 == 0)
2174 if (blob->type.flags.pointer)
2175 value->v_pointer = g_memdup (&rinfo->typelib->data[blob->offset], blob->size);
2178 switch (blob->type.flags.tag)
2180 case GI_TYPE_TAG_BOOLEAN:
2181 value->v_boolean = *(gboolean*)&rinfo->typelib->data[blob->offset];
2183 case GI_TYPE_TAG_INT8:
2184 value->v_int8 = *(gint8*)&rinfo->typelib->data[blob->offset];
2186 case GI_TYPE_TAG_UINT8:
2187 value->v_uint8 = *(guint8*)&rinfo->typelib->data[blob->offset];
2189 case GI_TYPE_TAG_INT16:
2190 value->v_int16 = *(gint16*)&rinfo->typelib->data[blob->offset];
2192 case GI_TYPE_TAG_UINT16:
2193 value->v_uint16 = *(guint16*)&rinfo->typelib->data[blob->offset];
2195 case GI_TYPE_TAG_INT32:
2196 value->v_int32 = *(gint32*)&rinfo->typelib->data[blob->offset];
2198 case GI_TYPE_TAG_UINT32:
2199 value->v_uint32 = *(guint32*)&rinfo->typelib->data[blob->offset];
2201 case GI_TYPE_TAG_INT64:
2202 value->v_int64 = *(gint64*)&rinfo->typelib->data[blob->offset];
2204 case GI_TYPE_TAG_UINT64:
2205 value->v_uint64 = *(guint64*)&rinfo->typelib->data[blob->offset];
2207 case GI_TYPE_TAG_FLOAT:
2208 value->v_float = *(gfloat*)&rinfo->typelib->data[blob->offset];
2210 case GI_TYPE_TAG_DOUBLE:
2211 value->v_double = *(gdouble*)&rinfo->typelib->data[blob->offset];
2213 case GI_TYPE_TAG_TIME_T:
2214 value->v_long = *(long*)&rinfo->typelib->data[blob->offset];
2216 case GI_TYPE_TAG_SHORT:
2217 value->v_short = *(gshort*)&rinfo->typelib->data[blob->offset];
2219 case GI_TYPE_TAG_USHORT:
2220 value->v_ushort = *(gushort*)&rinfo->typelib->data[blob->offset];
2222 case GI_TYPE_TAG_INT:
2223 value->v_int = *(gint*)&rinfo->typelib->data[blob->offset];
2225 case GI_TYPE_TAG_UINT:
2226 value->v_uint = *(guint*)&rinfo->typelib->data[blob->offset];
2228 case GI_TYPE_TAG_LONG:
2229 value->v_long = *(glong*)&rinfo->typelib->data[blob->offset];
2231 case GI_TYPE_TAG_ULONG:
2232 value->v_ulong = *(gulong*)&rinfo->typelib->data[blob->offset];
2241 /* GIUnionInfo functions */
2243 g_union_info_get_n_fields (GIUnionInfo *info)
2245 GIRealInfo *rinfo = (GIRealInfo *)info;
2246 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2248 return blob->n_fields;
2252 g_union_info_get_field (GIUnionInfo *info,
2255 GIRealInfo *rinfo = (GIRealInfo *)info;
2256 Header *header = (Header *)rinfo->typelib->data;
2258 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, (GIBaseInfo*)info, rinfo->typelib,
2259 rinfo->offset + header->union_blob_size +
2260 n * header->field_blob_size);
2264 g_union_info_get_n_methods (GIUnionInfo *info)
2266 GIRealInfo *rinfo = (GIRealInfo *)info;
2267 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2269 return blob->n_functions;
2273 g_union_info_get_method (GIUnionInfo *info,
2276 GIRealInfo *rinfo = (GIRealInfo *)info;
2277 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2278 Header *header = (Header *)rinfo->typelib->data;
2281 offset = rinfo->offset + header->union_blob_size
2282 + blob->n_fields * header->field_blob_size
2283 + n * header->function_blob_size;
2284 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info,
2285 rinfo->typelib, offset);
2289 g_union_info_is_discriminated (GIUnionInfo *info)
2291 GIRealInfo *rinfo = (GIRealInfo *)info;
2292 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2294 return blob->discriminated;
2298 g_union_info_get_discriminator_offset (GIUnionInfo *info)
2300 GIRealInfo *rinfo = (GIRealInfo *)info;
2301 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2303 return blob->discriminator_offset;
2307 g_union_info_get_discriminator_type (GIUnionInfo *info)
2309 GIRealInfo *rinfo = (GIRealInfo *)info;
2311 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + 24);
2315 g_union_info_get_discriminator (GIUnionInfo *info,
2318 GIRealInfo *rinfo = (GIRealInfo *)info;
2319 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2321 if (blob->discriminated)
2323 Header *header = (Header *)rinfo->typelib->data;
2326 offset = rinfo->offset + header->union_blob_size
2327 + blob->n_fields * header->field_blob_size
2328 + blob->n_functions * header->function_blob_size
2329 + n * header->constant_blob_size;
2331 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, (GIBaseInfo*)info,
2332 rinfo->typelib, offset);
2339 g_union_info_find_method (GIUnionInfo *info,
2343 GIRealInfo *rinfo = (GIRealInfo *)info;
2344 Header *header = (Header *)rinfo->typelib->data;
2345 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2347 offset = rinfo->offset + header->union_blob_size
2348 + blob->n_fields * header->field_blob_size;
2350 return find_method ((GIBaseInfo*)info, offset, blob->n_functions, name);
2354 g_union_info_get_size (GIUnionInfo *info)
2356 GIRealInfo *rinfo = (GIRealInfo *)info;
2357 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2363 g_union_info_get_alignment (GIUnionInfo *info)
2365 GIRealInfo *rinfo = (GIRealInfo *)info;
2366 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2368 return blob->alignment;