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;
1001 /* For embedded types, the given offset is a pointer to the actual blob,
1002 * after the end of the field. In that case we know it's a "subclass" of
1003 * CommonBlob, so use that to determine the info type.
1005 if (rinfo->type_is_embedded)
1007 CommonBlob *common = (CommonBlob *)&rinfo->typelib->data[rinfo->offset];
1008 GIInfoType info_type;
1010 switch (common->blob_type)
1012 case BLOB_TYPE_CALLBACK:
1013 info_type = GI_INFO_TYPE_CALLBACK;
1016 g_assert_not_reached ();
1019 return (GIBaseInfo *) g_info_new (info_type, (GIBaseInfo*)info, rinfo->typelib,
1024 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1025 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1027 InterfaceTypeBlob *blob = (InterfaceTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1029 if (blob->tag == GI_TYPE_TAG_INTERFACE)
1030 return g_info_from_entry (rinfo->repository, rinfo->typelib, blob->interface);
1038 g_type_info_get_array_length (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)
1049 if (blob->has_length)
1050 return blob->dimensions.length;
1058 g_type_info_get_array_fixed_size (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)
1070 return blob->dimensions.size;
1078 g_type_info_is_zero_terminated (GITypeInfo *info)
1080 GIRealInfo *rinfo = (GIRealInfo *)info;
1081 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1083 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1085 ArrayTypeBlob *blob = (ArrayTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1087 if (blob->tag == GI_TYPE_TAG_ARRAY)
1088 return blob->zero_terminated;
1095 g_type_info_get_n_error_domains (GITypeInfo *info)
1097 GIRealInfo *rinfo = (GIRealInfo *)info;
1098 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1100 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1102 ErrorTypeBlob *blob = (ErrorTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1104 if (blob->tag == GI_TYPE_TAG_ERROR)
1105 return blob->n_domains;
1112 g_type_info_get_error_domain (GITypeInfo *info,
1115 GIRealInfo *rinfo = (GIRealInfo *)info;
1116 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1118 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1120 ErrorTypeBlob *blob = (ErrorTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1122 if (blob->tag == GI_TYPE_TAG_ERROR)
1123 return (GIErrorDomainInfo *) g_info_from_entry (rinfo->repository,
1132 /* GIErrorDomainInfo functions */
1134 g_error_domain_info_get_quark (GIErrorDomainInfo *info)
1136 GIRealInfo *rinfo = (GIRealInfo *)info;
1137 ErrorDomainBlob *blob = (ErrorDomainBlob *)&rinfo->typelib->data[rinfo->offset];
1139 return g_typelib_get_string (rinfo->typelib, blob->get_quark);
1143 g_error_domain_info_get_codes (GIErrorDomainInfo *info)
1145 GIRealInfo *rinfo = (GIRealInfo *)info;
1146 ErrorDomainBlob *blob = (ErrorDomainBlob *)&rinfo->typelib->data[rinfo->offset];
1148 return (GIInterfaceInfo *) g_info_from_entry (rinfo->repository,
1149 rinfo->typelib, blob->error_codes);
1153 /* GIValueInfo functions */
1155 g_value_info_get_value (GIValueInfo *info)
1157 GIRealInfo *rinfo = (GIRealInfo *)info;
1158 ValueBlob *blob = (ValueBlob *)&rinfo->typelib->data[rinfo->offset];
1160 return (glong)blob->value;
1163 /* GIFieldInfo functions */
1165 g_field_info_get_flags (GIFieldInfo *info)
1167 GIFieldInfoFlags flags;
1169 GIRealInfo *rinfo = (GIRealInfo *)info;
1170 FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset];
1175 flags = flags | GI_FIELD_IS_READABLE;
1178 flags = flags | GI_FIELD_IS_WRITABLE;
1184 g_field_info_get_size (GIFieldInfo *info)
1186 GIRealInfo *rinfo = (GIRealInfo *)info;
1187 FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset];
1193 g_field_info_get_offset (GIFieldInfo *info)
1195 GIRealInfo *rinfo = (GIRealInfo *)info;
1196 FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset];
1198 return blob->struct_offset;
1202 g_field_info_get_type (GIFieldInfo *info)
1204 GIRealInfo *rinfo = (GIRealInfo *)info;
1205 Header *header = (Header *)rinfo->typelib->data;
1206 FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset];
1207 GIRealInfo *type_info;
1209 if (blob->has_embedded_type)
1211 type_info = (GIRealInfo *) g_info_new (GI_INFO_TYPE_TYPE,
1212 (GIBaseInfo*)info, rinfo->typelib,
1213 rinfo->offset + header->field_blob_size);
1214 type_info->type_is_embedded = TRUE;
1217 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (FieldBlob, type));
1219 return (GIBaseInfo*)type_info;
1222 /* GIRegisteredTypeInfo functions */
1224 g_registered_type_info_get_type_name (GIRegisteredTypeInfo *info)
1226 GIRealInfo *rinfo = (GIRealInfo *)info;
1227 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1229 if (blob->gtype_name)
1230 return g_typelib_get_string (rinfo->typelib, blob->gtype_name);
1236 g_registered_type_info_get_type_init (GIRegisteredTypeInfo *info)
1238 GIRealInfo *rinfo = (GIRealInfo *)info;
1239 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1241 if (blob->gtype_init)
1242 return g_typelib_get_string (rinfo->typelib, blob->gtype_init);
1248 g_registered_type_info_get_g_type (GIRegisteredTypeInfo *info)
1250 const char *type_init;
1251 GType (* get_type_func) (void);
1252 GIRealInfo *rinfo = (GIRealInfo*)info;
1254 type_init = g_registered_type_info_get_type_init (info);
1256 if (type_init == NULL)
1258 else if (!strcmp (type_init, "intern"))
1259 return G_TYPE_OBJECT;
1261 get_type_func = NULL;
1262 if (!g_typelib_symbol (rinfo->typelib,
1264 (void**) &get_type_func))
1267 return (* get_type_func) ();
1270 /* GIStructInfo functions */
1272 g_struct_info_get_n_fields (GIStructInfo *info)
1274 GIRealInfo *rinfo = (GIRealInfo *)info;
1275 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1277 return blob->n_fields;
1281 g_struct_get_field_offset (GIStructInfo *info,
1284 GIRealInfo *rinfo = (GIRealInfo *)info;
1285 Header *header = (Header *)rinfo->typelib->data;
1286 guint32 offset = rinfo->offset + header->struct_blob_size;
1288 FieldBlob *field_blob;
1290 for (i = 0; i < n; i++)
1292 field_blob = (FieldBlob *)&rinfo->typelib->data[offset];
1293 offset += header->field_blob_size;
1294 if (field_blob->has_embedded_type)
1295 offset += header->callback_blob_size;
1302 g_struct_info_get_field (GIStructInfo *info,
1305 GIRealInfo *rinfo = (GIRealInfo *)info;
1307 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, (GIBaseInfo*)info, rinfo->typelib,
1308 g_struct_get_field_offset (info, n));
1312 g_struct_info_get_n_methods (GIStructInfo *info)
1314 GIRealInfo *rinfo = (GIRealInfo *)info;
1315 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1317 return blob->n_methods;
1321 g_struct_info_get_method (GIStructInfo *info,
1324 GIRealInfo *rinfo = (GIRealInfo *)info;
1325 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1326 Header *header = (Header *)rinfo->typelib->data;
1329 offset = g_struct_get_field_offset (info, blob->n_fields) + n * header->function_blob_size;
1330 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info,
1331 rinfo->typelib, offset);
1334 static GIFunctionInfo *
1335 find_method (GIBaseInfo *base,
1341 GIRealInfo *rinfo = (GIRealInfo*)base;
1342 Header *header = (Header *)rinfo->typelib->data;
1345 for (i = 0; i < n_methods; i++)
1347 FunctionBlob *fblob = (FunctionBlob *)&rinfo->typelib->data[offset];
1348 const gchar *fname = (const gchar *)&rinfo->typelib->data[fblob->name];
1350 if (strcmp (name, fname) == 0)
1351 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1352 rinfo->typelib, offset);
1354 offset += header->function_blob_size;
1361 g_struct_info_find_method (GIStructInfo *info,
1365 GIRealInfo *rinfo = (GIRealInfo *)info;
1366 Header *header = (Header *)rinfo->typelib->data;
1367 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1369 offset = rinfo->offset + header->struct_blob_size
1370 + blob->n_fields * header->field_blob_size;
1372 return find_method ((GIBaseInfo*)info, offset, blob->n_methods, name);
1376 g_struct_info_get_size (GIStructInfo *info)
1378 GIRealInfo *rinfo = (GIRealInfo *)info;
1379 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1385 g_struct_info_get_alignment (GIStructInfo *info)
1387 GIRealInfo *rinfo = (GIRealInfo *)info;
1388 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1390 return blob->alignment;
1394 * g_struct_info_is_gtype_struct:
1395 * @info: GIStructInfo
1397 * Return true if this structure represents the "class structure" for some
1398 * #GObject or #GInterface. This function is mainly useful to hide this kind of structure
1399 * from generated public APIs.
1401 * Returns: %TRUE if this is a class struct, %FALSE otherwise
1404 g_struct_info_is_gtype_struct (GIStructInfo *info)
1406 GIRealInfo *rinfo = (GIRealInfo *)info;
1407 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1409 return blob->is_gtype_struct;
1413 g_enum_info_get_n_values (GIEnumInfo *info)
1415 GIRealInfo *rinfo = (GIRealInfo *)info;
1416 EnumBlob *blob = (EnumBlob *)&rinfo->typelib->data[rinfo->offset];
1418 return blob->n_values;
1422 g_enum_info_get_value (GIEnumInfo *info,
1425 GIRealInfo *rinfo = (GIRealInfo *)info;
1426 Header *header = (Header *)rinfo->typelib->data;
1429 offset = rinfo->offset + header->enum_blob_size
1430 + n * header->value_blob_size;
1431 return (GIValueInfo *) g_info_new (GI_INFO_TYPE_VALUE, (GIBaseInfo*)info, rinfo->typelib, offset);
1435 * g_enum_info_get_storage_type:
1438 * Gets the tag of the type used for the enum in the C ABI. This will
1439 * will be a signed or unsigned integral type.
1441 * Note that in the current implementation the width of the type is
1442 * computed correctly, but the signed or unsigned nature of the type
1443 * may not match the sign of the type used by the C compiler.
1445 * Return Value: the storage type for the enumeration
1448 g_enum_info_get_storage_type (GIEnumInfo *info)
1450 GIRealInfo *rinfo = (GIRealInfo *)info;
1451 EnumBlob *blob = (EnumBlob *)&rinfo->typelib->data[rinfo->offset];
1453 return blob->storage_type;
1456 /* GIObjectInfo functions */
1458 g_object_info_get_parent (GIObjectInfo *info)
1460 GIRealInfo *rinfo = (GIRealInfo *)info;
1461 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1464 return (GIObjectInfo *) g_info_from_entry (rinfo->repository,
1465 rinfo->typelib, blob->parent);
1471 g_object_info_get_abstract (GIObjectInfo *info)
1473 GIRealInfo *rinfo = (GIRealInfo *)info;
1474 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1475 return blob->abstract != 0;
1479 g_object_info_get_type_name (GIObjectInfo *info)
1481 GIRealInfo *rinfo = (GIRealInfo *)info;
1482 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1484 return g_typelib_get_string (rinfo->typelib, blob->gtype_name);
1488 g_object_info_get_type_init (GIObjectInfo *info)
1490 GIRealInfo *rinfo = (GIRealInfo *)info;
1491 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1493 return g_typelib_get_string (rinfo->typelib, blob->gtype_init);
1497 g_object_info_get_n_interfaces (GIObjectInfo *info)
1499 GIRealInfo *rinfo = (GIRealInfo *)info;
1500 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1502 return blob->n_interfaces;
1506 g_object_info_get_interface (GIObjectInfo *info,
1509 GIRealInfo *rinfo = (GIRealInfo *)info;
1510 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1512 return (GIInterfaceInfo *) g_info_from_entry (rinfo->repository,
1513 rinfo->typelib, blob->interfaces[n]);
1517 g_object_info_get_n_fields (GIObjectInfo *info)
1519 GIRealInfo *rinfo = (GIRealInfo *)info;
1520 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1522 return blob->n_fields;
1526 g_object_info_get_field (GIObjectInfo *info,
1530 GIRealInfo *rinfo = (GIRealInfo *)info;
1531 Header *header = (Header *)rinfo->typelib->data;
1532 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1534 offset = rinfo->offset + header->object_blob_size
1535 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1536 + n * header->field_blob_size;
1538 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, (GIBaseInfo*)info, rinfo->typelib, offset);
1542 g_object_info_get_n_properties (GIObjectInfo *info)
1544 GIRealInfo *rinfo = (GIRealInfo *)info;
1545 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1547 return blob->n_properties;
1551 g_object_info_get_property (GIObjectInfo *info,
1555 GIRealInfo *rinfo = (GIRealInfo *)info;
1556 Header *header = (Header *)rinfo->typelib->data;
1557 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1559 offset = rinfo->offset + header->object_blob_size
1560 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1561 + blob->n_fields * header->field_blob_size
1562 + n * header->property_blob_size;
1564 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, (GIBaseInfo*)info,
1565 rinfo->typelib, offset);
1569 g_object_info_get_n_methods (GIObjectInfo *info)
1571 GIRealInfo *rinfo = (GIRealInfo *)info;
1572 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1574 return blob->n_methods;
1578 g_object_info_get_method (GIObjectInfo *info,
1582 GIRealInfo *rinfo = (GIRealInfo *)info;
1583 Header *header = (Header *)rinfo->typelib->data;
1584 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1586 offset = rinfo->offset + header->object_blob_size
1587 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1588 + blob->n_fields * header->field_blob_size
1589 + blob->n_properties * header->property_blob_size
1590 + n * header->function_blob_size;
1592 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info,
1593 rinfo->typelib, offset);
1597 g_object_info_find_method (GIObjectInfo *info,
1601 GIRealInfo *rinfo = (GIRealInfo *)info;
1602 Header *header = (Header *)rinfo->typelib->data;
1603 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1605 offset = rinfo->offset + header->object_blob_size
1606 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1607 + blob->n_fields * header->field_blob_size +
1608 + blob->n_properties * header->property_blob_size;
1610 return find_method ((GIBaseInfo*)info, offset, blob->n_methods, name);
1614 g_object_info_get_n_signals (GIObjectInfo *info)
1616 GIRealInfo *rinfo = (GIRealInfo *)info;
1617 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1619 return blob->n_signals;
1623 g_object_info_get_signal (GIObjectInfo *info,
1627 GIRealInfo *rinfo = (GIRealInfo *)info;
1628 Header *header = (Header *)rinfo->typelib->data;
1629 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1631 offset = rinfo->offset + header->object_blob_size
1632 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1633 + blob->n_fields * header->field_blob_size
1634 + blob->n_properties * header->property_blob_size
1635 + blob->n_methods * header->function_blob_size
1636 + n * header->signal_blob_size;
1638 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, (GIBaseInfo*)info,
1639 rinfo->typelib, offset);
1643 g_object_info_get_n_vfuncs (GIObjectInfo *info)
1645 GIRealInfo *rinfo = (GIRealInfo *)info;
1646 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1648 return blob->n_vfuncs;
1652 g_object_info_get_vfunc (GIObjectInfo *info,
1656 GIRealInfo *rinfo = (GIRealInfo *)info;
1657 Header *header = (Header *)rinfo->typelib->data;
1658 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1660 offset = rinfo->offset + header->object_blob_size
1661 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1662 + blob->n_fields * header->field_blob_size
1663 + blob->n_properties * header->property_blob_size
1664 + blob->n_methods * header->function_blob_size
1665 + blob->n_signals * header->signal_blob_size
1666 + n * header->vfunc_blob_size;
1668 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, (GIBaseInfo*)info,
1669 rinfo->typelib, offset);
1672 static GIVFuncInfo *
1673 find_vfunc (GIRealInfo *rinfo,
1679 Header *header = (Header *)rinfo->typelib->data;
1682 for (i = 0; i < n_vfuncs; i++)
1684 VFuncBlob *fblob = (VFuncBlob *)&rinfo->typelib->data[offset];
1685 const gchar *fname = (const gchar *)&rinfo->typelib->data[fblob->name];
1687 if (strcmp (name, fname) == 0)
1688 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, (GIBaseInfo*) rinfo,
1689 rinfo->typelib, offset);
1691 offset += header->vfunc_blob_size;
1698 * g_object_info_find_vfunc:
1699 * @info: An #GIObjectInfo
1700 * @name: The name of a virtual function to find.
1702 * Locate a virtual function slot with name @name. Note that the namespace
1703 * for virtuals is distinct from that of methods; there may or may not be
1704 * a concrete method associated for a virtual. If there is one, it may
1705 * be retrieved using #g_vfunc_info_get_invoker. See the documentation for
1706 * that function for more information on invoking virtuals.
1708 * Return value: (transfer full): A #GIVFuncInfo, or %NULL if none with name @name.
1711 g_object_info_find_vfunc (GIObjectInfo *info,
1715 GIRealInfo *rinfo = (GIRealInfo *)info;
1716 Header *header = (Header *)rinfo->typelib->data;
1717 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1719 offset = rinfo->offset + header->object_blob_size
1720 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1721 + blob->n_fields * header->field_blob_size
1722 + blob->n_properties * header->property_blob_size
1723 + blob->n_methods * header->function_blob_size
1724 + blob->n_signals * header->signal_blob_size;
1726 return find_vfunc (rinfo, offset, blob->n_vfuncs, name);
1730 g_object_info_get_n_constants (GIObjectInfo *info)
1732 GIRealInfo *rinfo = (GIRealInfo *)info;
1733 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1735 return blob->n_constants;
1739 g_object_info_get_constant (GIObjectInfo *info,
1743 GIRealInfo *rinfo = (GIRealInfo *)info;
1744 Header *header = (Header *)rinfo->typelib->data;
1745 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1747 offset = rinfo->offset + header->object_blob_size
1748 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1749 + blob->n_fields * header->field_blob_size
1750 + blob->n_properties * header->property_blob_size
1751 + blob->n_methods * header->function_blob_size
1752 + blob->n_signals * header->signal_blob_size
1753 + blob->n_vfuncs * header->vfunc_blob_size
1754 + n * header->constant_blob_size;
1756 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, (GIBaseInfo*)info,
1757 rinfo->typelib, offset);
1761 * g_object_info_get_class_struct:
1762 * @info: A #GIObjectInfo to query
1764 * Every #GObject has two structures; an instance structure and a class
1765 * structure. This function returns the metadata for the class structure.
1767 * Returns: a #GIStructInfo for the class struct or %NULL if none found.
1770 g_object_info_get_class_struct (GIObjectInfo *info)
1772 GIRealInfo *rinfo = (GIRealInfo *)info;
1773 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1775 if (blob->gtype_struct)
1776 return (GIStructInfo *) g_info_from_entry (rinfo->repository,
1777 rinfo->typelib, blob->gtype_struct);
1782 /* GIInterfaceInfo functions */
1784 g_interface_info_get_n_prerequisites (GIInterfaceInfo *info)
1786 GIRealInfo *rinfo = (GIRealInfo *)info;
1787 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1789 return blob->n_prerequisites;
1793 g_interface_info_get_prerequisite (GIInterfaceInfo *info,
1796 GIRealInfo *rinfo = (GIRealInfo *)info;
1797 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1799 return g_info_from_entry (rinfo->repository,
1800 rinfo->typelib, blob->prerequisites[n]);
1805 g_interface_info_get_n_properties (GIInterfaceInfo *info)
1807 GIRealInfo *rinfo = (GIRealInfo *)info;
1808 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1810 return blob->n_properties;
1814 g_interface_info_get_property (GIInterfaceInfo *info,
1818 GIRealInfo *rinfo = (GIRealInfo *)info;
1819 Header *header = (Header *)rinfo->typelib->data;
1820 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1822 offset = rinfo->offset + header->interface_blob_size
1823 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1824 + n * header->property_blob_size;
1826 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, (GIBaseInfo*)info,
1827 rinfo->typelib, offset);
1831 g_interface_info_get_n_methods (GIInterfaceInfo *info)
1833 GIRealInfo *rinfo = (GIRealInfo *)info;
1834 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1836 return blob->n_methods;
1840 g_interface_info_get_method (GIInterfaceInfo *info,
1844 GIRealInfo *rinfo = (GIRealInfo *)info;
1845 Header *header = (Header *)rinfo->typelib->data;
1846 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1848 offset = rinfo->offset + header->interface_blob_size
1849 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1850 + blob->n_properties * header->property_blob_size
1851 + n * header->function_blob_size;
1853 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info,
1854 rinfo->typelib, offset);
1858 g_interface_info_find_method (GIInterfaceInfo *info,
1862 GIRealInfo *rinfo = (GIRealInfo *)info;
1863 Header *header = (Header *)rinfo->typelib->data;
1864 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1866 offset = rinfo->offset + header->interface_blob_size
1867 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1868 + blob->n_properties * header->property_blob_size;
1870 return find_method ((GIBaseInfo*)info, offset, blob->n_methods, name);
1874 g_interface_info_get_n_signals (GIInterfaceInfo *info)
1876 GIRealInfo *rinfo = (GIRealInfo *)info;
1877 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1879 return blob->n_signals;
1883 g_interface_info_get_signal (GIInterfaceInfo *info,
1887 GIRealInfo *rinfo = (GIRealInfo *)info;
1888 Header *header = (Header *)rinfo->typelib->data;
1889 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1891 offset = rinfo->offset + header->interface_blob_size
1892 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1893 + blob->n_properties * header->property_blob_size
1894 + blob->n_methods * header->function_blob_size
1895 + n * header->signal_blob_size;
1897 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, (GIBaseInfo*)info,
1898 rinfo->typelib, offset);
1902 g_interface_info_get_n_vfuncs (GIInterfaceInfo *info)
1904 GIRealInfo *rinfo = (GIRealInfo *)info;
1905 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1907 return blob->n_vfuncs;
1911 g_interface_info_get_vfunc (GIInterfaceInfo *info,
1915 GIRealInfo *rinfo = (GIRealInfo *)info;
1916 Header *header = (Header *)rinfo->typelib->data;
1917 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1919 offset = rinfo->offset + header->interface_blob_size
1920 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1921 + blob->n_properties * header->property_blob_size
1922 + blob->n_methods * header->function_blob_size
1923 + blob->n_signals * header->signal_blob_size
1924 + n * header->vfunc_blob_size;
1926 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, (GIBaseInfo*)info,
1927 rinfo->typelib, offset);
1931 * g_interface_info_find_vfunc:
1932 * @info: An #GIObjectInfo
1933 * @name: The name of a virtual function to find.
1935 * Locate a virtual function slot with name @name. See the documentation
1936 * for #g_object_info_find_vfunc for more information on virtuals.
1938 * Return value: (transfer full): A #GIVFuncInfo, or %NULL if none with name @name.
1941 g_interface_info_find_vfunc (GIInterfaceInfo *info,
1945 GIRealInfo *rinfo = (GIRealInfo *)info;
1946 Header *header = (Header *)rinfo->typelib->data;
1947 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1949 offset = rinfo->offset + header->interface_blob_size
1950 + (blob->n_prerequisites + blob->n_prerequisites % 2) * 2
1951 + blob->n_properties * header->property_blob_size
1952 + blob->n_methods * header->function_blob_size
1953 + blob->n_signals * header->signal_blob_size;
1955 return find_vfunc (rinfo, offset, blob->n_vfuncs, name);
1959 g_interface_info_get_n_constants (GIInterfaceInfo *info)
1961 GIRealInfo *rinfo = (GIRealInfo *)info;
1962 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1964 return blob->n_constants;
1968 g_interface_info_get_constant (GIInterfaceInfo *info,
1972 GIRealInfo *rinfo = (GIRealInfo *)info;
1973 Header *header = (Header *)rinfo->typelib->data;
1974 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1976 offset = rinfo->offset + header->interface_blob_size
1977 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1978 + blob->n_properties * header->property_blob_size
1979 + blob->n_methods * header->function_blob_size
1980 + blob->n_signals * header->signal_blob_size
1981 + blob->n_vfuncs * header->vfunc_blob_size
1982 + n * header->constant_blob_size;
1984 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, (GIBaseInfo*)info,
1985 rinfo->typelib, offset);
1989 * g_interface_info_get_iface_struct:
1990 * @info: A #GIInterfaceInfo to query
1992 * Returns the layout C structure associated with this #GInterface.
1994 * Returns: A #GIStructInfo for the class struct or %NULL if none found.
1997 g_interface_info_get_iface_struct (GIInterfaceInfo *info)
1999 GIRealInfo *rinfo = (GIRealInfo *)info;
2000 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
2002 if (blob->gtype_struct)
2003 return (GIStructInfo *) g_info_from_entry (rinfo->repository,
2004 rinfo->typelib, blob->gtype_struct);
2009 /* GIPropertyInfo functions */
2011 g_property_info_get_flags (GIPropertyInfo *info)
2014 GIRealInfo *rinfo = (GIRealInfo *)info;
2015 PropertyBlob *blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset];
2020 flags = flags | G_PARAM_READABLE;
2023 flags = flags | G_PARAM_WRITABLE;
2025 if (blob->construct)
2026 flags = flags | G_PARAM_CONSTRUCT;
2028 if (blob->construct_only)
2029 flags = flags | G_PARAM_CONSTRUCT_ONLY;
2035 g_property_info_get_type (GIPropertyInfo *info)
2037 GIRealInfo *rinfo = (GIRealInfo *)info;
2039 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (PropertyBlob, type));
2043 /* GISignalInfo functions */
2045 g_signal_info_get_flags (GISignalInfo *info)
2049 GIRealInfo *rinfo = (GIRealInfo *)info;
2050 SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset];
2054 if (blob->run_first)
2055 flags = flags | G_SIGNAL_RUN_FIRST;
2058 flags = flags | G_SIGNAL_RUN_LAST;
2060 if (blob->run_cleanup)
2061 flags = flags | G_SIGNAL_RUN_CLEANUP;
2063 if (blob->no_recurse)
2064 flags = flags | G_SIGNAL_NO_RECURSE;
2067 flags = flags | G_SIGNAL_DETAILED;
2070 flags = flags | G_SIGNAL_ACTION;
2073 flags = flags | G_SIGNAL_NO_HOOKS;
2079 g_signal_info_get_class_closure (GISignalInfo *info)
2081 GIRealInfo *rinfo = (GIRealInfo *)info;
2082 SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset];
2084 if (blob->has_class_closure)
2085 return g_interface_info_get_vfunc ((GIInterfaceInfo *)rinfo->container, blob->class_closure);
2091 g_signal_info_true_stops_emit (GISignalInfo *info)
2093 GIRealInfo *rinfo = (GIRealInfo *)info;
2094 SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset];
2096 return blob->true_stops_emit;
2099 /* GIVFuncInfo functions */
2101 g_vfunc_info_get_flags (GIVFuncInfo *info)
2103 GIVFuncInfoFlags flags;
2105 GIRealInfo *rinfo = (GIRealInfo *)info;
2106 VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset];
2110 if (blob->must_chain_up)
2111 flags = flags | GI_VFUNC_MUST_CHAIN_UP;
2113 if (blob->must_be_implemented)
2114 flags = flags | GI_VFUNC_MUST_OVERRIDE;
2116 if (blob->must_not_be_implemented)
2117 flags = flags | GI_VFUNC_MUST_NOT_OVERRIDE;
2123 g_vfunc_info_get_offset (GIVFuncInfo *info)
2125 GIRealInfo *rinfo = (GIRealInfo *)info;
2126 VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset];
2128 return blob->struct_offset;
2132 g_vfunc_info_get_signal (GIVFuncInfo *info)
2134 GIRealInfo *rinfo = (GIRealInfo *)info;
2135 VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset];
2137 if (blob->class_closure)
2138 return g_interface_info_get_signal ((GIInterfaceInfo *)rinfo->container, blob->signal);
2144 * g_vfunc_info_get_invoker:
2145 * @info: A #GIVFuncInfo
2147 * If this virtual function has an associated invoker method, this
2148 * method will return it. An invoker method is a C entry point.
2150 * Not all virtuals will have invokers.
2152 * Return value: (transfer full): An invoker function, or %NULL if none known
2155 g_vfunc_info_get_invoker (GIVFuncInfo *info)
2157 GIRealInfo *rinfo = (GIRealInfo *)info;
2158 VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset];
2159 GIBaseInfo *container = rinfo->container;
2160 GIInfoType parent_type;
2162 /* 1023 = 0x3ff is the maximum of the 10 bits for invoker index */
2163 if (blob->invoker == 1023)
2166 parent_type = g_base_info_get_type (container);
2167 if (parent_type == GI_INFO_TYPE_OBJECT)
2168 return g_object_info_get_method ((GIObjectInfo*)container, blob->invoker);
2169 else if (parent_type == GI_INFO_TYPE_INTERFACE)
2170 return g_interface_info_get_method ((GIInterfaceInfo*)container, blob->invoker);
2172 g_assert_not_reached ();
2175 /* GIConstantInfo functions */
2177 g_constant_info_get_type (GIConstantInfo *info)
2179 GIRealInfo *rinfo = (GIRealInfo *)info;
2181 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + 8);
2185 g_constant_info_get_value (GIConstantInfo *info,
2188 GIRealInfo *rinfo = (GIRealInfo *)info;
2189 ConstantBlob *blob = (ConstantBlob *)&rinfo->typelib->data[rinfo->offset];
2191 /* FIXME non-basic types ? */
2192 if (blob->type.flags.reserved == 0 && blob->type.flags.reserved2 == 0)
2194 if (blob->type.flags.pointer)
2195 value->v_pointer = g_memdup (&rinfo->typelib->data[blob->offset], blob->size);
2198 switch (blob->type.flags.tag)
2200 case GI_TYPE_TAG_BOOLEAN:
2201 value->v_boolean = *(gboolean*)&rinfo->typelib->data[blob->offset];
2203 case GI_TYPE_TAG_INT8:
2204 value->v_int8 = *(gint8*)&rinfo->typelib->data[blob->offset];
2206 case GI_TYPE_TAG_UINT8:
2207 value->v_uint8 = *(guint8*)&rinfo->typelib->data[blob->offset];
2209 case GI_TYPE_TAG_INT16:
2210 value->v_int16 = *(gint16*)&rinfo->typelib->data[blob->offset];
2212 case GI_TYPE_TAG_UINT16:
2213 value->v_uint16 = *(guint16*)&rinfo->typelib->data[blob->offset];
2215 case GI_TYPE_TAG_INT32:
2216 value->v_int32 = *(gint32*)&rinfo->typelib->data[blob->offset];
2218 case GI_TYPE_TAG_UINT32:
2219 value->v_uint32 = *(guint32*)&rinfo->typelib->data[blob->offset];
2221 case GI_TYPE_TAG_INT64:
2222 value->v_int64 = *(gint64*)&rinfo->typelib->data[blob->offset];
2224 case GI_TYPE_TAG_UINT64:
2225 value->v_uint64 = *(guint64*)&rinfo->typelib->data[blob->offset];
2227 case GI_TYPE_TAG_FLOAT:
2228 value->v_float = *(gfloat*)&rinfo->typelib->data[blob->offset];
2230 case GI_TYPE_TAG_DOUBLE:
2231 value->v_double = *(gdouble*)&rinfo->typelib->data[blob->offset];
2233 case GI_TYPE_TAG_TIME_T:
2234 value->v_long = *(long*)&rinfo->typelib->data[blob->offset];
2236 case GI_TYPE_TAG_SHORT:
2237 value->v_short = *(gshort*)&rinfo->typelib->data[blob->offset];
2239 case GI_TYPE_TAG_USHORT:
2240 value->v_ushort = *(gushort*)&rinfo->typelib->data[blob->offset];
2242 case GI_TYPE_TAG_INT:
2243 value->v_int = *(gint*)&rinfo->typelib->data[blob->offset];
2245 case GI_TYPE_TAG_UINT:
2246 value->v_uint = *(guint*)&rinfo->typelib->data[blob->offset];
2248 case GI_TYPE_TAG_LONG:
2249 value->v_long = *(glong*)&rinfo->typelib->data[blob->offset];
2251 case GI_TYPE_TAG_ULONG:
2252 value->v_ulong = *(gulong*)&rinfo->typelib->data[blob->offset];
2261 /* GIUnionInfo functions */
2263 g_union_info_get_n_fields (GIUnionInfo *info)
2265 GIRealInfo *rinfo = (GIRealInfo *)info;
2266 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2268 return blob->n_fields;
2272 g_union_info_get_field (GIUnionInfo *info,
2275 GIRealInfo *rinfo = (GIRealInfo *)info;
2276 Header *header = (Header *)rinfo->typelib->data;
2278 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, (GIBaseInfo*)info, rinfo->typelib,
2279 rinfo->offset + header->union_blob_size +
2280 n * header->field_blob_size);
2284 g_union_info_get_n_methods (GIUnionInfo *info)
2286 GIRealInfo *rinfo = (GIRealInfo *)info;
2287 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2289 return blob->n_functions;
2293 g_union_info_get_method (GIUnionInfo *info,
2296 GIRealInfo *rinfo = (GIRealInfo *)info;
2297 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2298 Header *header = (Header *)rinfo->typelib->data;
2301 offset = rinfo->offset + header->union_blob_size
2302 + blob->n_fields * header->field_blob_size
2303 + n * header->function_blob_size;
2304 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info,
2305 rinfo->typelib, offset);
2309 g_union_info_is_discriminated (GIUnionInfo *info)
2311 GIRealInfo *rinfo = (GIRealInfo *)info;
2312 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2314 return blob->discriminated;
2318 g_union_info_get_discriminator_offset (GIUnionInfo *info)
2320 GIRealInfo *rinfo = (GIRealInfo *)info;
2321 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2323 return blob->discriminator_offset;
2327 g_union_info_get_discriminator_type (GIUnionInfo *info)
2329 GIRealInfo *rinfo = (GIRealInfo *)info;
2331 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + 24);
2335 g_union_info_get_discriminator (GIUnionInfo *info,
2338 GIRealInfo *rinfo = (GIRealInfo *)info;
2339 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2341 if (blob->discriminated)
2343 Header *header = (Header *)rinfo->typelib->data;
2346 offset = rinfo->offset + header->union_blob_size
2347 + blob->n_fields * header->field_blob_size
2348 + blob->n_functions * header->function_blob_size
2349 + n * header->constant_blob_size;
2351 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, (GIBaseInfo*)info,
2352 rinfo->typelib, offset);
2359 g_union_info_find_method (GIUnionInfo *info,
2363 GIRealInfo *rinfo = (GIRealInfo *)info;
2364 Header *header = (Header *)rinfo->typelib->data;
2365 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2367 offset = rinfo->offset + header->union_blob_size
2368 + blob->n_fields * header->field_blob_size;
2370 return find_method ((GIBaseInfo*)info, offset, blob->n_functions, name);
2374 g_union_info_get_size (GIUnionInfo *info)
2376 GIRealInfo *rinfo = (GIRealInfo *)info;
2377 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2383 g_union_info_get_alignment (GIUnionInfo *info)
2385 GIRealInfo *rinfo = (GIRealInfo *)info;
2386 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2388 return blob->alignment;