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;
72 #define INVALID_REFCOUNT 0x7FFFFFFF
75 g_info_init (GIRealInfo *info,
77 GIRepository *repository,
78 GIBaseInfo *container,
82 memset (info, 0, sizeof (GIRealInfo));
84 /* Invalid refcount used to flag stack-allocated infos */
85 info->ref_count = INVALID_REFCOUNT;
88 info->typelib = typelib;
89 info->offset = offset;
92 info->container = container;
94 g_assert (G_IS_IREPOSITORY (repository));
95 info->repository = repository;
100 g_info_new_full (GIInfoType type,
101 GIRepository *repository,
102 GIBaseInfo *container,
108 g_return_val_if_fail (container != NULL || repository != NULL, NULL);
110 info = g_new (GIRealInfo, 1);
112 g_info_init (info, type, repository, container, typelib, offset);
115 if (container && ((GIRealInfo *) container)->ref_count != INVALID_REFCOUNT)
116 g_base_info_ref (info->container);
118 g_object_ref (info->repository);
120 return (GIBaseInfo*)info;
124 g_info_new (GIInfoType type,
125 GIBaseInfo *container,
129 return g_info_new_full (type, ((GIRealInfo*)container)->repository, container, typelib, offset);
133 g_info_from_entry (GIRepository *repository,
138 DirEntry *entry = g_typelib_get_dir_entry (typelib, index);
141 result = g_info_new_full (entry->blob_type, repository, NULL, typelib, entry->offset);
144 const gchar *namespace = g_typelib_get_string (typelib, entry->offset);
145 const gchar *name = g_typelib_get_string (typelib, entry->name);
147 result = g_irepository_find_by_name (repository, namespace, name);
150 GIUnresolvedInfo *unresolved;
152 unresolved = g_new0 (GIUnresolvedInfo, 1);
154 unresolved->type = GI_INFO_TYPE_UNRESOLVED;
155 unresolved->ref_count = 1;
156 unresolved->repository = g_object_ref (repository);
157 unresolved->container = NULL;
158 unresolved->name = name;
159 unresolved->namespace = namespace;
161 return (GIBaseInfo *)unresolved;
163 return (GIBaseInfo *)result;
166 return (GIBaseInfo *)result;
169 /* GIBaseInfo functions */
171 g_base_info_ref (GIBaseInfo *info)
173 GIRealInfo *rinfo = (GIRealInfo*)info;
175 g_assert (rinfo->ref_count != INVALID_REFCOUNT);
176 ((GIRealInfo*)info)->ref_count++;
182 g_base_info_unref (GIBaseInfo *info)
184 GIRealInfo *rinfo = (GIRealInfo*)info;
186 g_assert (rinfo->ref_count > 0 && rinfo->ref_count != INVALID_REFCOUNT);
189 if (!rinfo->ref_count)
191 if (rinfo->container && ((GIRealInfo *) rinfo->container)->ref_count != INVALID_REFCOUNT)
192 g_base_info_unref (rinfo->container);
194 if (rinfo->repository)
195 g_object_unref (rinfo->repository);
202 g_base_info_get_type (GIBaseInfo *info)
205 return ((GIRealInfo*)info)->type;
209 g_base_info_get_name (GIBaseInfo *info)
211 GIRealInfo *rinfo = (GIRealInfo*)info;
212 g_assert (rinfo->ref_count > 0);
215 case GI_INFO_TYPE_FUNCTION:
216 case GI_INFO_TYPE_CALLBACK:
217 case GI_INFO_TYPE_STRUCT:
218 case GI_INFO_TYPE_BOXED:
219 case GI_INFO_TYPE_ENUM:
220 case GI_INFO_TYPE_FLAGS:
221 case GI_INFO_TYPE_OBJECT:
222 case GI_INFO_TYPE_INTERFACE:
223 case GI_INFO_TYPE_CONSTANT:
224 case GI_INFO_TYPE_ERROR_DOMAIN:
225 case GI_INFO_TYPE_UNION:
227 CommonBlob *blob = (CommonBlob *)&rinfo->typelib->data[rinfo->offset];
229 return g_typelib_get_string (rinfo->typelib, blob->name);
233 case GI_INFO_TYPE_VALUE:
235 ValueBlob *blob = (ValueBlob *)&rinfo->typelib->data[rinfo->offset];
237 return g_typelib_get_string (rinfo->typelib, blob->name);
241 case GI_INFO_TYPE_SIGNAL:
243 SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset];
245 return g_typelib_get_string (rinfo->typelib, blob->name);
249 case GI_INFO_TYPE_PROPERTY:
251 PropertyBlob *blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset];
253 return g_typelib_get_string (rinfo->typelib, blob->name);
257 case GI_INFO_TYPE_VFUNC:
259 VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset];
261 return g_typelib_get_string (rinfo->typelib, blob->name);
265 case GI_INFO_TYPE_FIELD:
267 FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset];
269 return g_typelib_get_string (rinfo->typelib, blob->name);
273 case GI_INFO_TYPE_ARG:
275 ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
277 return g_typelib_get_string (rinfo->typelib, blob->name);
280 case GI_INFO_TYPE_UNRESOLVED:
282 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
284 return unresolved->name;
287 case GI_INFO_TYPE_TYPE:
289 g_assert_not_reached ();
297 g_base_info_get_namespace (GIBaseInfo *info)
299 GIRealInfo *rinfo = (GIRealInfo*) info;
300 Header *header = (Header *)rinfo->typelib->data;
302 g_assert (rinfo->ref_count > 0);
304 if (rinfo->type == GI_INFO_TYPE_UNRESOLVED)
306 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
308 return unresolved->namespace;
311 return g_typelib_get_string (rinfo->typelib, header->namespace);
315 g_base_info_is_deprecated (GIBaseInfo *info)
317 GIRealInfo *rinfo = (GIRealInfo*) info;
320 case GI_INFO_TYPE_FUNCTION:
321 case GI_INFO_TYPE_CALLBACK:
322 case GI_INFO_TYPE_STRUCT:
323 case GI_INFO_TYPE_BOXED:
324 case GI_INFO_TYPE_ENUM:
325 case GI_INFO_TYPE_FLAGS:
326 case GI_INFO_TYPE_OBJECT:
327 case GI_INFO_TYPE_INTERFACE:
328 case GI_INFO_TYPE_CONSTANT:
329 case GI_INFO_TYPE_ERROR_DOMAIN:
331 CommonBlob *blob = (CommonBlob *)&rinfo->typelib->data[rinfo->offset];
333 return blob->deprecated;
337 case GI_INFO_TYPE_VALUE:
339 ValueBlob *blob = (ValueBlob *)&rinfo->typelib->data[rinfo->offset];
341 return blob->deprecated;
345 case GI_INFO_TYPE_SIGNAL:
347 SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset];
349 return blob->deprecated;
353 case GI_INFO_TYPE_PROPERTY:
355 PropertyBlob *blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset];
357 return blob->deprecated;
361 case GI_INFO_TYPE_VFUNC:
362 case GI_INFO_TYPE_FIELD:
363 case GI_INFO_TYPE_ARG:
364 case GI_INFO_TYPE_TYPE:
366 /* no deprecation flag for these */
373 * g_base_info_get_attribute:
374 * @info: A #GIBaseInfo
375 * @name: A freeform string naming an attribute
377 * Retrieve an arbitrary attribute associated with this node.
379 * Return value: The value of the attribute, or %NULL if no such attribute exists
382 g_base_info_get_attribute (GIBaseInfo *info,
385 GIAttributeIter iter = { 0, };
386 gchar *curname, *curvalue;
387 while (g_base_info_iterate_attributes (info, &iter, &curname, &curvalue))
389 if (strcmp (name, curname) == 0)
390 return (const gchar*) curvalue;
397 cmp_attribute (const void *av,
400 const AttributeBlob *a = av;
401 const AttributeBlob *b = bv;
403 if (a->offset < b->offset)
405 else if (a->offset == b->offset)
411 static AttributeBlob *
412 find_first_attribute (GIRealInfo *rinfo)
414 Header *header = (Header *)rinfo->typelib->data;
415 AttributeBlob blob, *first, *res, *previous;
417 blob.offset = rinfo->offset;
419 first = (AttributeBlob *) &rinfo->typelib->data[header->attributes];
421 res = bsearch (&blob, first, header->n_attributes,
422 header->attribute_blob_size, cmp_attribute);
428 while (previous >= first && previous->offset == rinfo->offset)
438 * g_base_info_iterate_attributes:
439 * @info: A #GIBaseInfo
440 * @iter: A #GIAttributeIter structure, must be initialized; see below
441 * @name: (out) (transfer none): Returned name, must not be freed
442 * @value: (out) (transfer none): Returned name, must not be freed
444 * Iterate over all attributes associated with this node. The iterator
445 * structure is typically stack allocated, and must have its first
446 * member initialized to %NULL.
448 * Both the @name and @value should be treated as constants
449 * and must not be freed.
452 * <title>Iterating over attributes</title>
455 * print_attributes (GIBaseInfo *info)
457 * GIAttributeIter iter = { 0, };
460 * while (g_base_info_iterate_attributes (info, &iter, &name, &value))
462 * g_print ("attribute name: %s value: %s", name, value);
468 * Return value: %TRUE if there are more attributes, %FALSE otherwise
471 g_base_info_iterate_attributes (GIBaseInfo *info,
472 GIAttributeIter *iter,
476 GIRealInfo *rinfo = (GIRealInfo *)info;
477 Header *header = (Header *)rinfo->typelib->data;
478 AttributeBlob *next, *after;
480 after = (AttributeBlob *) &rinfo->typelib->data[header->attributes +
481 header->n_attributes * header->attribute_blob_size];
483 if (iter->data != NULL)
484 next = (AttributeBlob *) iter->data;
486 next = find_first_attribute (rinfo);
488 if (next == NULL || next->offset != rinfo->offset || next >= after)
491 *name = (gchar*) g_typelib_get_string (rinfo->typelib, next->name);
492 *value = (gchar*) g_typelib_get_string (rinfo->typelib, next->value);
493 iter->data = next + 1;
499 g_base_info_get_container (GIBaseInfo *info)
501 return ((GIRealInfo*)info)->container;
505 g_base_info_get_typelib (GIBaseInfo *info)
507 return ((GIRealInfo*)info)->typelib;
512 * @info1: A #GIBaseInfo
513 * @info2: A #GIBaseInfo
515 * Compare two #GIBaseInfo.
517 * Using pointer comparison is not practical since many functions return
518 * different instances of #GIBaseInfo that refers to the same part of the
519 * TypeLib; use this function instead to do #GIBaseInfo comparisons.
521 * Return value: TRUE if and only if @info1 equals @info2.
524 g_base_info_equal (GIBaseInfo *info1, GIBaseInfo *info2)
526 /* Compare the TypeLib pointers, which are mmapped. */
527 GIRealInfo *rinfo1 = (GIRealInfo*)info1;
528 GIRealInfo *rinfo2 = (GIRealInfo*)info2;
529 return rinfo1->typelib->data + rinfo1->offset == rinfo2->typelib->data + rinfo2->offset;
532 /* GIFunctionInfo functions */
534 g_function_info_get_symbol (GIFunctionInfo *info)
536 GIRealInfo *rinfo = (GIRealInfo *)info;
537 FunctionBlob *blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset];
539 return g_typelib_get_string (rinfo->typelib, blob->symbol);
543 g_function_info_get_flags (GIFunctionInfo *info)
545 GIFunctionInfoFlags flags;
546 GIRealInfo *rinfo = (GIRealInfo *)info;
547 FunctionBlob *blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset];
551 /* Make sure we don't flag Constructors as methods */
552 if (!blob->constructor && !blob->is_static)
553 flags = flags | GI_FUNCTION_IS_METHOD;
555 if (blob->constructor)
556 flags = flags | GI_FUNCTION_IS_CONSTRUCTOR;
559 flags = flags | GI_FUNCTION_IS_GETTER;
562 flags = flags | GI_FUNCTION_IS_SETTER;
564 if (blob->wraps_vfunc)
565 flags = flags | GI_FUNCTION_WRAPS_VFUNC;
568 flags = flags | GI_FUNCTION_THROWS;
574 g_function_info_get_property (GIFunctionInfo *info)
576 GIRealInfo *rinfo = (GIRealInfo *)info;
577 FunctionBlob *blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset];
578 GIInterfaceInfo *container = (GIInterfaceInfo *)rinfo->container;
580 return g_interface_info_get_property (container, blob->index);
584 g_function_info_get_vfunc (GIFunctionInfo *info)
586 GIRealInfo *rinfo = (GIRealInfo*)info;
587 FunctionBlob *blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset];
588 GIInterfaceInfo *container = (GIInterfaceInfo *)rinfo->container;
590 return g_interface_info_get_vfunc (container, blob->index);
593 /* GICallableInfo functions */
595 signature_offset (GICallableInfo *info)
597 GIRealInfo *rinfo = (GIRealInfo*)info;
602 case GI_INFO_TYPE_FUNCTION:
603 sigoff = G_STRUCT_OFFSET (FunctionBlob, signature);
605 case GI_INFO_TYPE_VFUNC:
606 sigoff = G_STRUCT_OFFSET (VFuncBlob, signature);
608 case GI_INFO_TYPE_CALLBACK:
609 sigoff = G_STRUCT_OFFSET (CallbackBlob, signature);
611 case GI_INFO_TYPE_SIGNAL:
612 sigoff = G_STRUCT_OFFSET (SignalBlob, signature);
616 return *(guint32 *)&rinfo->typelib->data[rinfo->offset + sigoff];
621 g_type_info_new (GIBaseInfo *container,
625 SimpleTypeBlob *type = (SimpleTypeBlob *)&typelib->data[offset];
627 return (GITypeInfo *) g_info_new (GI_INFO_TYPE_TYPE, container, typelib,
628 (type->flags.reserved == 0 && type->flags.reserved2 == 0) ? offset : type->offset);
632 g_type_info_init (GIBaseInfo *info,
633 GIBaseInfo *container,
637 GIRealInfo *rinfo = (GIRealInfo*)container;
638 SimpleTypeBlob *type = (SimpleTypeBlob *)&typelib->data[offset];
640 g_info_init ((GIRealInfo*)info, GI_INFO_TYPE_TYPE, rinfo->repository, container, typelib,
641 (type->flags.reserved == 0 && type->flags.reserved2 == 0) ? offset : type->offset);
645 * g_callable_info_get_return_type:
646 * @info: a #GICallableInfo
648 * Get the return type of a callable item as
651 * Returns: a #GITypeInfo idexing the TypeBlob for the
652 * return type of #info
655 g_callable_info_get_return_type (GICallableInfo *info)
657 GIRealInfo *rinfo = (GIRealInfo *)info;
660 offset = signature_offset (info);
662 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, offset);
667 * g_callable_info_load_return_type:
668 * @info: a #GICallableInfo
669 * @type: (out caller-allocates): Initialized with return type of @info
671 * Get information about a return value of callable; this
672 * function is a variant of g_callable_info_get_return_type() designed for stack
675 * The initialized @type must not be referenced after @info is deallocated.
678 g_callable_info_load_return_type (GICallableInfo *info,
681 GIRealInfo *rinfo = (GIRealInfo *)info;
684 offset = signature_offset (info);
686 g_type_info_init (type, (GIBaseInfo*)info, rinfo->typelib, offset);
690 * g_callable_info_may_return_null:
691 * @info: a #GICallableInfo
693 * See if a callable could return NULL.
695 * Returns: TRUE if callable could return NULL
698 g_callable_info_may_return_null (GICallableInfo *info)
700 GIRealInfo *rinfo = (GIRealInfo *)info;
701 SignatureBlob *blob = (SignatureBlob *)&rinfo->typelib->data[signature_offset (info)];
703 return blob->may_return_null;
707 * g_callable_info_get_caller_owns:
708 * @info: a #GICallableInfo
710 * See whether the caller owns the return value
713 * Returns: TRUE if the caller owns the return value, FALSE otherwise.
716 g_callable_info_get_caller_owns (GICallableInfo *info)
718 GIRealInfo *rinfo = (GIRealInfo*) info;
719 SignatureBlob *blob = (SignatureBlob *)&rinfo->typelib->data[signature_offset (info)];
721 if (blob->caller_owns_return_value)
722 return GI_TRANSFER_EVERYTHING;
723 else if (blob->caller_owns_return_container)
724 return GI_TRANSFER_CONTAINER;
726 return GI_TRANSFER_NOTHING;
730 * g_callable_info_get_n_args:
731 * @info: a #GICallableInfo
733 * Get the number of arguments (both IN and OUT) for this callable.
735 * Returns: The number of arguments this callable expects.
738 g_callable_info_get_n_args (GICallableInfo *info)
740 GIRealInfo *rinfo = (GIRealInfo *)info;
744 offset = signature_offset (info);
745 blob = (SignatureBlob *)&rinfo->typelib->data[offset];
747 return blob->n_arguments;
751 * g_callable_info_get_arg:
752 * @info: a #GICallableInfo
753 * @n: the argument index to fetch
755 * Get information about a particular argument of this callable.
757 * Returns: A #GIArgInfo indexing the typelib on the given argument.
760 g_callable_info_get_arg (GICallableInfo *info,
763 GIRealInfo *rinfo = (GIRealInfo *)info;
764 Header *header = (Header *)rinfo->typelib->data;
767 offset = signature_offset (info);
769 return (GIArgInfo *) g_info_new (GI_INFO_TYPE_ARG, (GIBaseInfo*)info, rinfo->typelib,
770 offset + header->signature_blob_size + n * header->arg_blob_size);
774 * g_callable_info_load_arg:
775 * @info: a #GICallableInfo
776 * @n: the argument index to fetch
777 * @arg: (out caller-allocates): Initialize with argument number @n
779 * Get information about a particular argument of this callable; this
780 * function is a variant of g_callable_info_get_arg() designed for stack
783 * The initialized @arg must not be referenced after @info is deallocated.
786 g_callable_info_load_arg (GICallableInfo *info,
790 GIRealInfo *rinfo = (GIRealInfo *)info;
791 Header *header = (Header *)rinfo->typelib->data;
794 offset = signature_offset (info);
796 g_info_init ((GIRealInfo*)arg, GI_INFO_TYPE_ARG, rinfo->repository, (GIBaseInfo*)info, rinfo->typelib,
797 offset + header->signature_blob_size + n * header->arg_blob_size);
800 /* GIArgInfo function */
802 g_arg_info_get_direction (GIArgInfo *info)
804 GIRealInfo *rinfo = (GIRealInfo *)info;
805 ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
807 if (blob->in && blob->out)
808 return GI_DIRECTION_INOUT;
810 return GI_DIRECTION_OUT;
812 return GI_DIRECTION_IN;
816 g_arg_info_is_return_value (GIArgInfo *info)
818 GIRealInfo *rinfo = (GIRealInfo *)info;
819 ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
821 return blob->return_value;
825 g_arg_info_is_dipper (GIArgInfo *info)
827 GIRealInfo *rinfo = (GIRealInfo *)info;
828 ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
834 g_arg_info_is_optional (GIArgInfo *info)
836 GIRealInfo *rinfo = (GIRealInfo *)info;
837 ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
839 return blob->optional;
843 g_arg_info_may_be_null (GIArgInfo *info)
845 GIRealInfo *rinfo = (GIRealInfo *)info;
846 ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
848 return blob->allow_none;
852 g_arg_info_get_ownership_transfer (GIArgInfo *info)
854 GIRealInfo *rinfo = (GIRealInfo *)info;
855 ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
857 if (blob->transfer_ownership)
858 return GI_TRANSFER_EVERYTHING;
859 else if (blob->transfer_container_ownership)
860 return GI_TRANSFER_CONTAINER;
862 return GI_TRANSFER_NOTHING;
866 g_arg_info_get_scope (GIArgInfo *info)
868 GIRealInfo *rinfo = (GIRealInfo *)info;
869 ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
875 g_arg_info_get_closure (GIArgInfo *info)
877 GIRealInfo *rinfo = (GIRealInfo *)info;
878 ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
880 return blob->closure;
884 g_arg_info_get_destroy (GIArgInfo *info)
886 GIRealInfo *rinfo = (GIRealInfo *)info;
887 ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
889 return blob->destroy;
893 * g_arg_info_get_type:
894 * @info: A #GIArgInfo
896 * Returns: (transfer full): Information about the type of argument @info
899 g_arg_info_get_type (GIArgInfo *info)
901 GIRealInfo *rinfo = (GIRealInfo *)info;
903 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (ArgBlob, arg_type));
907 * g_arg_info_load_type:
908 * @info: A #GIArgInfo
909 * @type: (out caller-allocates): Initialized with information about type of @info
911 * Get information about a the type of given argument @info; this
912 * function is a variant of g_arg_info_get_type() designed for stack
915 * The initialized @type must not be referenced after @info is deallocated.
918 g_arg_info_load_type (GIArgInfo *info,
921 GIRealInfo *rinfo = (GIRealInfo*) info;
922 g_type_info_init (type, (GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (ArgBlob, arg_type));
925 /* GITypeInfo functions */
927 g_type_info_is_pointer (GITypeInfo *info)
929 GIRealInfo *rinfo = (GIRealInfo *)info;
930 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
932 if (type->flags.reserved == 0 && type->flags.reserved2 == 0)
933 return type->flags.pointer;
936 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&rinfo->typelib->data[rinfo->offset];
938 return iface->pointer;
943 g_type_info_get_tag (GITypeInfo *info)
945 GIRealInfo *rinfo = (GIRealInfo *)info;
946 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
948 if (rinfo->type_is_embedded)
949 return GI_TYPE_TAG_INTERFACE;
950 else if (type->flags.reserved == 0 && type->flags.reserved2 == 0)
951 return type->flags.tag;
954 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&rinfo->typelib->data[rinfo->offset];
961 g_type_info_get_param_type (GITypeInfo *info,
964 GIRealInfo *rinfo = (GIRealInfo *)info;
965 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
967 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
969 ParamTypeBlob *param = (ParamTypeBlob *)&rinfo->typelib->data[rinfo->offset];
973 case GI_TYPE_TAG_ARRAY:
974 case GI_TYPE_TAG_GLIST:
975 case GI_TYPE_TAG_GSLIST:
976 case GI_TYPE_TAG_GHASH:
977 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib,
978 rinfo->offset + sizeof (ParamTypeBlob)
979 + sizeof (SimpleTypeBlob) * n);
990 * g_type_info_get_interface:
991 * @info: A #GITypeInfo
993 * For types which have #GI_TYPE_TAG_INTERFACE such as GObjects and boxed values,
994 * this function returns full information about the referenced type. You can then
995 * inspect the type of the returned #GIBaseInfo to further query whether it is
996 * a concrete GObject, a GInterface, a structure, etc. using g_base_info_get_type().
999 g_type_info_get_interface (GITypeInfo *info)
1001 GIRealInfo *rinfo = (GIRealInfo *)info;
1003 /* For embedded types, the given offset is a pointer to the actual blob,
1004 * after the end of the field. In that case we know it's a "subclass" of
1005 * CommonBlob, so use that to determine the info type.
1007 if (rinfo->type_is_embedded)
1009 CommonBlob *common = (CommonBlob *)&rinfo->typelib->data[rinfo->offset];
1010 GIInfoType info_type;
1012 switch (common->blob_type)
1014 case BLOB_TYPE_CALLBACK:
1015 info_type = GI_INFO_TYPE_CALLBACK;
1018 g_assert_not_reached ();
1021 return (GIBaseInfo *) g_info_new (info_type, (GIBaseInfo*)info, rinfo->typelib,
1026 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1027 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1029 InterfaceTypeBlob *blob = (InterfaceTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1031 if (blob->tag == GI_TYPE_TAG_INTERFACE)
1032 return g_info_from_entry (rinfo->repository, rinfo->typelib, blob->interface);
1040 g_type_info_get_array_length (GITypeInfo *info)
1042 GIRealInfo *rinfo = (GIRealInfo *)info;
1043 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1045 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1047 ArrayTypeBlob *blob = (ArrayTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1049 if (blob->tag == GI_TYPE_TAG_ARRAY)
1051 if (blob->has_length)
1052 return blob->dimensions.length;
1060 g_type_info_get_array_fixed_size (GITypeInfo *info)
1062 GIRealInfo *rinfo = (GIRealInfo *)info;
1063 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1065 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1067 ArrayTypeBlob *blob = (ArrayTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1069 if (blob->tag == GI_TYPE_TAG_ARRAY)
1072 return blob->dimensions.size;
1080 g_type_info_is_zero_terminated (GITypeInfo *info)
1082 GIRealInfo *rinfo = (GIRealInfo *)info;
1083 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1085 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1087 ArrayTypeBlob *blob = (ArrayTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1089 if (blob->tag == GI_TYPE_TAG_ARRAY)
1090 return blob->zero_terminated;
1097 g_type_info_get_n_error_domains (GITypeInfo *info)
1099 GIRealInfo *rinfo = (GIRealInfo *)info;
1100 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1102 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1104 ErrorTypeBlob *blob = (ErrorTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1106 if (blob->tag == GI_TYPE_TAG_ERROR)
1107 return blob->n_domains;
1114 g_type_info_get_error_domain (GITypeInfo *info,
1117 GIRealInfo *rinfo = (GIRealInfo *)info;
1118 SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1120 if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0))
1122 ErrorTypeBlob *blob = (ErrorTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1124 if (blob->tag == GI_TYPE_TAG_ERROR)
1125 return (GIErrorDomainInfo *) g_info_from_entry (rinfo->repository,
1134 /* GIErrorDomainInfo functions */
1136 g_error_domain_info_get_quark (GIErrorDomainInfo *info)
1138 GIRealInfo *rinfo = (GIRealInfo *)info;
1139 ErrorDomainBlob *blob = (ErrorDomainBlob *)&rinfo->typelib->data[rinfo->offset];
1141 return g_typelib_get_string (rinfo->typelib, blob->get_quark);
1145 g_error_domain_info_get_codes (GIErrorDomainInfo *info)
1147 GIRealInfo *rinfo = (GIRealInfo *)info;
1148 ErrorDomainBlob *blob = (ErrorDomainBlob *)&rinfo->typelib->data[rinfo->offset];
1150 return (GIInterfaceInfo *) g_info_from_entry (rinfo->repository,
1151 rinfo->typelib, blob->error_codes);
1155 /* GIValueInfo functions */
1157 g_value_info_get_value (GIValueInfo *info)
1159 GIRealInfo *rinfo = (GIRealInfo *)info;
1160 ValueBlob *blob = (ValueBlob *)&rinfo->typelib->data[rinfo->offset];
1162 return (glong)blob->value;
1165 /* GIFieldInfo functions */
1167 g_field_info_get_flags (GIFieldInfo *info)
1169 GIFieldInfoFlags flags;
1171 GIRealInfo *rinfo = (GIRealInfo *)info;
1172 FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset];
1177 flags = flags | GI_FIELD_IS_READABLE;
1180 flags = flags | GI_FIELD_IS_WRITABLE;
1186 g_field_info_get_size (GIFieldInfo *info)
1188 GIRealInfo *rinfo = (GIRealInfo *)info;
1189 FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset];
1195 g_field_info_get_offset (GIFieldInfo *info)
1197 GIRealInfo *rinfo = (GIRealInfo *)info;
1198 FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset];
1200 return blob->struct_offset;
1204 g_field_info_get_type (GIFieldInfo *info)
1206 GIRealInfo *rinfo = (GIRealInfo *)info;
1207 Header *header = (Header *)rinfo->typelib->data;
1208 FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset];
1209 GIRealInfo *type_info;
1211 if (blob->has_embedded_type)
1213 type_info = (GIRealInfo *) g_info_new (GI_INFO_TYPE_TYPE,
1214 (GIBaseInfo*)info, rinfo->typelib,
1215 rinfo->offset + header->field_blob_size);
1216 type_info->type_is_embedded = TRUE;
1219 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (FieldBlob, type));
1221 return (GIBaseInfo*)type_info;
1224 /* GIRegisteredTypeInfo functions */
1226 g_registered_type_info_get_type_name (GIRegisteredTypeInfo *info)
1228 GIRealInfo *rinfo = (GIRealInfo *)info;
1229 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1231 if (blob->gtype_name)
1232 return g_typelib_get_string (rinfo->typelib, blob->gtype_name);
1238 g_registered_type_info_get_type_init (GIRegisteredTypeInfo *info)
1240 GIRealInfo *rinfo = (GIRealInfo *)info;
1241 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&rinfo->typelib->data[rinfo->offset];
1243 if (blob->gtype_init)
1244 return g_typelib_get_string (rinfo->typelib, blob->gtype_init);
1250 g_registered_type_info_get_g_type (GIRegisteredTypeInfo *info)
1252 const char *type_init;
1253 GType (* get_type_func) (void);
1254 GIRealInfo *rinfo = (GIRealInfo*)info;
1256 type_init = g_registered_type_info_get_type_init (info);
1258 if (type_init == NULL)
1260 else if (!strcmp (type_init, "intern"))
1261 return G_TYPE_OBJECT;
1263 get_type_func = NULL;
1264 if (!g_typelib_symbol (rinfo->typelib,
1266 (void**) &get_type_func))
1269 return (* get_type_func) ();
1272 /* GIStructInfo functions */
1274 g_struct_info_get_n_fields (GIStructInfo *info)
1276 GIRealInfo *rinfo = (GIRealInfo *)info;
1277 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1279 return blob->n_fields;
1283 g_struct_get_field_offset (GIStructInfo *info,
1286 GIRealInfo *rinfo = (GIRealInfo *)info;
1287 Header *header = (Header *)rinfo->typelib->data;
1288 guint32 offset = rinfo->offset + header->struct_blob_size;
1290 FieldBlob *field_blob;
1292 for (i = 0; i < n; i++)
1294 field_blob = (FieldBlob *)&rinfo->typelib->data[offset];
1295 offset += header->field_blob_size;
1296 if (field_blob->has_embedded_type)
1297 offset += header->callback_blob_size;
1304 g_struct_info_get_field (GIStructInfo *info,
1307 GIRealInfo *rinfo = (GIRealInfo *)info;
1309 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, (GIBaseInfo*)info, rinfo->typelib,
1310 g_struct_get_field_offset (info, n));
1314 g_struct_info_get_n_methods (GIStructInfo *info)
1316 GIRealInfo *rinfo = (GIRealInfo *)info;
1317 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1319 return blob->n_methods;
1323 g_struct_info_get_method (GIStructInfo *info,
1326 GIRealInfo *rinfo = (GIRealInfo *)info;
1327 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1328 Header *header = (Header *)rinfo->typelib->data;
1331 offset = g_struct_get_field_offset (info, blob->n_fields) + n * header->function_blob_size;
1332 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info,
1333 rinfo->typelib, offset);
1336 static GIFunctionInfo *
1337 find_method (GIBaseInfo *base,
1343 GIRealInfo *rinfo = (GIRealInfo*)base;
1344 Header *header = (Header *)rinfo->typelib->data;
1347 for (i = 0; i < n_methods; i++)
1349 FunctionBlob *fblob = (FunctionBlob *)&rinfo->typelib->data[offset];
1350 const gchar *fname = (const gchar *)&rinfo->typelib->data[fblob->name];
1352 if (strcmp (name, fname) == 0)
1353 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1354 rinfo->typelib, offset);
1356 offset += header->function_blob_size;
1363 g_struct_info_find_method (GIStructInfo *info,
1367 GIRealInfo *rinfo = (GIRealInfo *)info;
1368 Header *header = (Header *)rinfo->typelib->data;
1369 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1371 offset = rinfo->offset + header->struct_blob_size
1372 + blob->n_fields * header->field_blob_size;
1374 return find_method ((GIBaseInfo*)info, offset, blob->n_methods, name);
1378 g_struct_info_get_size (GIStructInfo *info)
1380 GIRealInfo *rinfo = (GIRealInfo *)info;
1381 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1387 g_struct_info_get_alignment (GIStructInfo *info)
1389 GIRealInfo *rinfo = (GIRealInfo *)info;
1390 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1392 return blob->alignment;
1396 g_struct_info_is_foreign (GIStructInfo *info)
1398 GIRealInfo *rinfo = (GIRealInfo *)info;
1399 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1401 return blob->foreign;
1405 * g_struct_info_is_gtype_struct:
1406 * @info: GIStructInfo
1408 * Return true if this structure represents the "class structure" for some
1409 * #GObject or #GInterface. This function is mainly useful to hide this kind of structure
1410 * from generated public APIs.
1412 * Returns: %TRUE if this is a class struct, %FALSE otherwise
1415 g_struct_info_is_gtype_struct (GIStructInfo *info)
1417 GIRealInfo *rinfo = (GIRealInfo *)info;
1418 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1420 return blob->is_gtype_struct;
1424 g_enum_info_get_n_values (GIEnumInfo *info)
1426 GIRealInfo *rinfo = (GIRealInfo *)info;
1427 EnumBlob *blob = (EnumBlob *)&rinfo->typelib->data[rinfo->offset];
1429 return blob->n_values;
1433 g_enum_info_get_value (GIEnumInfo *info,
1436 GIRealInfo *rinfo = (GIRealInfo *)info;
1437 Header *header = (Header *)rinfo->typelib->data;
1440 offset = rinfo->offset + header->enum_blob_size
1441 + n * header->value_blob_size;
1442 return (GIValueInfo *) g_info_new (GI_INFO_TYPE_VALUE, (GIBaseInfo*)info, rinfo->typelib, offset);
1446 * g_enum_info_get_storage_type:
1449 * Gets the tag of the type used for the enum in the C ABI. This will
1450 * will be a signed or unsigned integral type.
1452 * Note that in the current implementation the width of the type is
1453 * computed correctly, but the signed or unsigned nature of the type
1454 * may not match the sign of the type used by the C compiler.
1456 * Return Value: the storage type for the enumeration
1459 g_enum_info_get_storage_type (GIEnumInfo *info)
1461 GIRealInfo *rinfo = (GIRealInfo *)info;
1462 EnumBlob *blob = (EnumBlob *)&rinfo->typelib->data[rinfo->offset];
1464 return blob->storage_type;
1467 /* GIObjectInfo functions */
1469 g_object_info_get_parent (GIObjectInfo *info)
1471 GIRealInfo *rinfo = (GIRealInfo *)info;
1472 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1475 return (GIObjectInfo *) g_info_from_entry (rinfo->repository,
1476 rinfo->typelib, blob->parent);
1482 g_object_info_get_abstract (GIObjectInfo *info)
1484 GIRealInfo *rinfo = (GIRealInfo *)info;
1485 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1486 return blob->abstract != 0;
1490 g_object_info_get_type_name (GIObjectInfo *info)
1492 GIRealInfo *rinfo = (GIRealInfo *)info;
1493 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1495 return g_typelib_get_string (rinfo->typelib, blob->gtype_name);
1499 g_object_info_get_type_init (GIObjectInfo *info)
1501 GIRealInfo *rinfo = (GIRealInfo *)info;
1502 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1504 return g_typelib_get_string (rinfo->typelib, blob->gtype_init);
1508 g_object_info_get_n_interfaces (GIObjectInfo *info)
1510 GIRealInfo *rinfo = (GIRealInfo *)info;
1511 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1513 return blob->n_interfaces;
1517 g_object_info_get_interface (GIObjectInfo *info,
1520 GIRealInfo *rinfo = (GIRealInfo *)info;
1521 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1523 return (GIInterfaceInfo *) g_info_from_entry (rinfo->repository,
1524 rinfo->typelib, blob->interfaces[n]);
1528 g_object_info_get_n_fields (GIObjectInfo *info)
1530 GIRealInfo *rinfo = (GIRealInfo *)info;
1531 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1533 return blob->n_fields;
1537 g_object_info_get_field (GIObjectInfo *info,
1541 GIRealInfo *rinfo = (GIRealInfo *)info;
1542 Header *header = (Header *)rinfo->typelib->data;
1543 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1545 offset = rinfo->offset + header->object_blob_size
1546 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1547 + n * header->field_blob_size;
1549 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, (GIBaseInfo*)info, rinfo->typelib, offset);
1553 g_object_info_get_n_properties (GIObjectInfo *info)
1555 GIRealInfo *rinfo = (GIRealInfo *)info;
1556 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1558 return blob->n_properties;
1562 g_object_info_get_property (GIObjectInfo *info,
1566 GIRealInfo *rinfo = (GIRealInfo *)info;
1567 Header *header = (Header *)rinfo->typelib->data;
1568 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1570 offset = rinfo->offset + header->object_blob_size
1571 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1572 + blob->n_fields * header->field_blob_size
1573 + n * header->property_blob_size;
1575 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, (GIBaseInfo*)info,
1576 rinfo->typelib, offset);
1580 g_object_info_get_n_methods (GIObjectInfo *info)
1582 GIRealInfo *rinfo = (GIRealInfo *)info;
1583 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1585 return blob->n_methods;
1589 g_object_info_get_method (GIObjectInfo *info,
1593 GIRealInfo *rinfo = (GIRealInfo *)info;
1594 Header *header = (Header *)rinfo->typelib->data;
1595 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1597 offset = rinfo->offset + header->object_blob_size
1598 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1599 + blob->n_fields * header->field_blob_size
1600 + blob->n_properties * header->property_blob_size
1601 + n * header->function_blob_size;
1603 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info,
1604 rinfo->typelib, offset);
1608 g_object_info_find_method (GIObjectInfo *info,
1612 GIRealInfo *rinfo = (GIRealInfo *)info;
1613 Header *header = (Header *)rinfo->typelib->data;
1614 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1616 offset = rinfo->offset + header->object_blob_size
1617 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1618 + blob->n_fields * header->field_blob_size +
1619 + blob->n_properties * header->property_blob_size;
1621 return find_method ((GIBaseInfo*)info, offset, blob->n_methods, name);
1625 g_object_info_get_n_signals (GIObjectInfo *info)
1627 GIRealInfo *rinfo = (GIRealInfo *)info;
1628 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1630 return blob->n_signals;
1634 g_object_info_get_signal (GIObjectInfo *info,
1638 GIRealInfo *rinfo = (GIRealInfo *)info;
1639 Header *header = (Header *)rinfo->typelib->data;
1640 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1642 offset = rinfo->offset + header->object_blob_size
1643 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1644 + blob->n_fields * header->field_blob_size
1645 + blob->n_properties * header->property_blob_size
1646 + blob->n_methods * header->function_blob_size
1647 + n * header->signal_blob_size;
1649 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, (GIBaseInfo*)info,
1650 rinfo->typelib, offset);
1654 g_object_info_get_n_vfuncs (GIObjectInfo *info)
1656 GIRealInfo *rinfo = (GIRealInfo *)info;
1657 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1659 return blob->n_vfuncs;
1663 g_object_info_get_vfunc (GIObjectInfo *info,
1667 GIRealInfo *rinfo = (GIRealInfo *)info;
1668 Header *header = (Header *)rinfo->typelib->data;
1669 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1671 offset = rinfo->offset + header->object_blob_size
1672 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1673 + blob->n_fields * header->field_blob_size
1674 + blob->n_properties * header->property_blob_size
1675 + blob->n_methods * header->function_blob_size
1676 + blob->n_signals * header->signal_blob_size
1677 + n * header->vfunc_blob_size;
1679 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, (GIBaseInfo*)info,
1680 rinfo->typelib, offset);
1683 static GIVFuncInfo *
1684 find_vfunc (GIRealInfo *rinfo,
1690 Header *header = (Header *)rinfo->typelib->data;
1693 for (i = 0; i < n_vfuncs; i++)
1695 VFuncBlob *fblob = (VFuncBlob *)&rinfo->typelib->data[offset];
1696 const gchar *fname = (const gchar *)&rinfo->typelib->data[fblob->name];
1698 if (strcmp (name, fname) == 0)
1699 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, (GIBaseInfo*) rinfo,
1700 rinfo->typelib, offset);
1702 offset += header->vfunc_blob_size;
1709 * g_object_info_find_vfunc:
1710 * @info: An #GIObjectInfo
1711 * @name: The name of a virtual function to find.
1713 * Locate a virtual function slot with name @name. Note that the namespace
1714 * for virtuals is distinct from that of methods; there may or may not be
1715 * a concrete method associated for a virtual. If there is one, it may
1716 * be retrieved using #g_vfunc_info_get_invoker. See the documentation for
1717 * that function for more information on invoking virtuals.
1719 * Return value: (transfer full): A #GIVFuncInfo, or %NULL if none with name @name.
1722 g_object_info_find_vfunc (GIObjectInfo *info,
1726 GIRealInfo *rinfo = (GIRealInfo *)info;
1727 Header *header = (Header *)rinfo->typelib->data;
1728 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1730 offset = rinfo->offset + header->object_blob_size
1731 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1732 + blob->n_fields * header->field_blob_size
1733 + blob->n_properties * header->property_blob_size
1734 + blob->n_methods * header->function_blob_size
1735 + blob->n_signals * header->signal_blob_size;
1737 return find_vfunc (rinfo, offset, blob->n_vfuncs, name);
1741 g_object_info_get_n_constants (GIObjectInfo *info)
1743 GIRealInfo *rinfo = (GIRealInfo *)info;
1744 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1746 return blob->n_constants;
1750 g_object_info_get_constant (GIObjectInfo *info,
1754 GIRealInfo *rinfo = (GIRealInfo *)info;
1755 Header *header = (Header *)rinfo->typelib->data;
1756 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1758 offset = rinfo->offset + header->object_blob_size
1759 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1760 + blob->n_fields * header->field_blob_size
1761 + blob->n_properties * header->property_blob_size
1762 + blob->n_methods * header->function_blob_size
1763 + blob->n_signals * header->signal_blob_size
1764 + blob->n_vfuncs * header->vfunc_blob_size
1765 + n * header->constant_blob_size;
1767 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, (GIBaseInfo*)info,
1768 rinfo->typelib, offset);
1772 * g_object_info_get_class_struct:
1773 * @info: A #GIObjectInfo to query
1775 * Every #GObject has two structures; an instance structure and a class
1776 * structure. This function returns the metadata for the class structure.
1778 * Returns: a #GIStructInfo for the class struct or %NULL if none found.
1781 g_object_info_get_class_struct (GIObjectInfo *info)
1783 GIRealInfo *rinfo = (GIRealInfo *)info;
1784 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1786 if (blob->gtype_struct)
1787 return (GIStructInfo *) g_info_from_entry (rinfo->repository,
1788 rinfo->typelib, blob->gtype_struct);
1793 /* GIInterfaceInfo functions */
1795 g_interface_info_get_n_prerequisites (GIInterfaceInfo *info)
1797 GIRealInfo *rinfo = (GIRealInfo *)info;
1798 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1800 return blob->n_prerequisites;
1804 g_interface_info_get_prerequisite (GIInterfaceInfo *info,
1807 GIRealInfo *rinfo = (GIRealInfo *)info;
1808 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1810 return g_info_from_entry (rinfo->repository,
1811 rinfo->typelib, blob->prerequisites[n]);
1816 g_interface_info_get_n_properties (GIInterfaceInfo *info)
1818 GIRealInfo *rinfo = (GIRealInfo *)info;
1819 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1821 return blob->n_properties;
1825 g_interface_info_get_property (GIInterfaceInfo *info,
1829 GIRealInfo *rinfo = (GIRealInfo *)info;
1830 Header *header = (Header *)rinfo->typelib->data;
1831 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1833 offset = rinfo->offset + header->interface_blob_size
1834 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1835 + n * header->property_blob_size;
1837 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, (GIBaseInfo*)info,
1838 rinfo->typelib, offset);
1842 g_interface_info_get_n_methods (GIInterfaceInfo *info)
1844 GIRealInfo *rinfo = (GIRealInfo *)info;
1845 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1847 return blob->n_methods;
1851 g_interface_info_get_method (GIInterfaceInfo *info,
1855 GIRealInfo *rinfo = (GIRealInfo *)info;
1856 Header *header = (Header *)rinfo->typelib->data;
1857 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1859 offset = rinfo->offset + header->interface_blob_size
1860 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1861 + blob->n_properties * header->property_blob_size
1862 + n * header->function_blob_size;
1864 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info,
1865 rinfo->typelib, offset);
1869 g_interface_info_find_method (GIInterfaceInfo *info,
1873 GIRealInfo *rinfo = (GIRealInfo *)info;
1874 Header *header = (Header *)rinfo->typelib->data;
1875 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1877 offset = rinfo->offset + header->interface_blob_size
1878 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1879 + blob->n_properties * header->property_blob_size;
1881 return find_method ((GIBaseInfo*)info, offset, blob->n_methods, name);
1885 g_interface_info_get_n_signals (GIInterfaceInfo *info)
1887 GIRealInfo *rinfo = (GIRealInfo *)info;
1888 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1890 return blob->n_signals;
1894 g_interface_info_get_signal (GIInterfaceInfo *info,
1898 GIRealInfo *rinfo = (GIRealInfo *)info;
1899 Header *header = (Header *)rinfo->typelib->data;
1900 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1902 offset = rinfo->offset + header->interface_blob_size
1903 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1904 + blob->n_properties * header->property_blob_size
1905 + blob->n_methods * header->function_blob_size
1906 + n * header->signal_blob_size;
1908 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, (GIBaseInfo*)info,
1909 rinfo->typelib, offset);
1913 g_interface_info_get_n_vfuncs (GIInterfaceInfo *info)
1915 GIRealInfo *rinfo = (GIRealInfo *)info;
1916 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1918 return blob->n_vfuncs;
1922 g_interface_info_get_vfunc (GIInterfaceInfo *info,
1926 GIRealInfo *rinfo = (GIRealInfo *)info;
1927 Header *header = (Header *)rinfo->typelib->data;
1928 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1930 offset = rinfo->offset + header->interface_blob_size
1931 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1932 + blob->n_properties * header->property_blob_size
1933 + blob->n_methods * header->function_blob_size
1934 + blob->n_signals * header->signal_blob_size
1935 + n * header->vfunc_blob_size;
1937 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, (GIBaseInfo*)info,
1938 rinfo->typelib, offset);
1942 * g_interface_info_find_vfunc:
1943 * @info: An #GIObjectInfo
1944 * @name: The name of a virtual function to find.
1946 * Locate a virtual function slot with name @name. See the documentation
1947 * for #g_object_info_find_vfunc for more information on virtuals.
1949 * Return value: (transfer full): A #GIVFuncInfo, or %NULL if none with name @name.
1952 g_interface_info_find_vfunc (GIInterfaceInfo *info,
1956 GIRealInfo *rinfo = (GIRealInfo *)info;
1957 Header *header = (Header *)rinfo->typelib->data;
1958 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1960 offset = rinfo->offset + header->interface_blob_size
1961 + (blob->n_prerequisites + blob->n_prerequisites % 2) * 2
1962 + blob->n_properties * header->property_blob_size
1963 + blob->n_methods * header->function_blob_size
1964 + blob->n_signals * header->signal_blob_size;
1966 return find_vfunc (rinfo, offset, blob->n_vfuncs, name);
1970 g_interface_info_get_n_constants (GIInterfaceInfo *info)
1972 GIRealInfo *rinfo = (GIRealInfo *)info;
1973 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1975 return blob->n_constants;
1979 g_interface_info_get_constant (GIInterfaceInfo *info,
1983 GIRealInfo *rinfo = (GIRealInfo *)info;
1984 Header *header = (Header *)rinfo->typelib->data;
1985 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1987 offset = rinfo->offset + header->interface_blob_size
1988 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1989 + blob->n_properties * header->property_blob_size
1990 + blob->n_methods * header->function_blob_size
1991 + blob->n_signals * header->signal_blob_size
1992 + blob->n_vfuncs * header->vfunc_blob_size
1993 + n * header->constant_blob_size;
1995 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, (GIBaseInfo*)info,
1996 rinfo->typelib, offset);
2000 * g_interface_info_get_iface_struct:
2001 * @info: A #GIInterfaceInfo to query
2003 * Returns the layout C structure associated with this #GInterface.
2005 * Returns: A #GIStructInfo for the class struct or %NULL if none found.
2008 g_interface_info_get_iface_struct (GIInterfaceInfo *info)
2010 GIRealInfo *rinfo = (GIRealInfo *)info;
2011 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
2013 if (blob->gtype_struct)
2014 return (GIStructInfo *) g_info_from_entry (rinfo->repository,
2015 rinfo->typelib, blob->gtype_struct);
2020 /* GIPropertyInfo functions */
2022 g_property_info_get_flags (GIPropertyInfo *info)
2025 GIRealInfo *rinfo = (GIRealInfo *)info;
2026 PropertyBlob *blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset];
2031 flags = flags | G_PARAM_READABLE;
2034 flags = flags | G_PARAM_WRITABLE;
2036 if (blob->construct)
2037 flags = flags | G_PARAM_CONSTRUCT;
2039 if (blob->construct_only)
2040 flags = flags | G_PARAM_CONSTRUCT_ONLY;
2046 g_property_info_get_type (GIPropertyInfo *info)
2048 GIRealInfo *rinfo = (GIRealInfo *)info;
2050 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (PropertyBlob, type));
2054 /* GISignalInfo functions */
2056 g_signal_info_get_flags (GISignalInfo *info)
2060 GIRealInfo *rinfo = (GIRealInfo *)info;
2061 SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset];
2065 if (blob->run_first)
2066 flags = flags | G_SIGNAL_RUN_FIRST;
2069 flags = flags | G_SIGNAL_RUN_LAST;
2071 if (blob->run_cleanup)
2072 flags = flags | G_SIGNAL_RUN_CLEANUP;
2074 if (blob->no_recurse)
2075 flags = flags | G_SIGNAL_NO_RECURSE;
2078 flags = flags | G_SIGNAL_DETAILED;
2081 flags = flags | G_SIGNAL_ACTION;
2084 flags = flags | G_SIGNAL_NO_HOOKS;
2090 g_signal_info_get_class_closure (GISignalInfo *info)
2092 GIRealInfo *rinfo = (GIRealInfo *)info;
2093 SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset];
2095 if (blob->has_class_closure)
2096 return g_interface_info_get_vfunc ((GIInterfaceInfo *)rinfo->container, blob->class_closure);
2102 g_signal_info_true_stops_emit (GISignalInfo *info)
2104 GIRealInfo *rinfo = (GIRealInfo *)info;
2105 SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset];
2107 return blob->true_stops_emit;
2110 /* GIVFuncInfo functions */
2112 g_vfunc_info_get_flags (GIVFuncInfo *info)
2114 GIVFuncInfoFlags flags;
2116 GIRealInfo *rinfo = (GIRealInfo *)info;
2117 VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset];
2121 if (blob->must_chain_up)
2122 flags = flags | GI_VFUNC_MUST_CHAIN_UP;
2124 if (blob->must_be_implemented)
2125 flags = flags | GI_VFUNC_MUST_OVERRIDE;
2127 if (blob->must_not_be_implemented)
2128 flags = flags | GI_VFUNC_MUST_NOT_OVERRIDE;
2134 g_vfunc_info_get_offset (GIVFuncInfo *info)
2136 GIRealInfo *rinfo = (GIRealInfo *)info;
2137 VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset];
2139 return blob->struct_offset;
2143 g_vfunc_info_get_signal (GIVFuncInfo *info)
2145 GIRealInfo *rinfo = (GIRealInfo *)info;
2146 VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset];
2148 if (blob->class_closure)
2149 return g_interface_info_get_signal ((GIInterfaceInfo *)rinfo->container, blob->signal);
2155 * g_vfunc_info_get_invoker:
2156 * @info: A #GIVFuncInfo
2158 * If this virtual function has an associated invoker method, this
2159 * method will return it. An invoker method is a C entry point.
2161 * Not all virtuals will have invokers.
2163 * Return value: (transfer full): An invoker function, or %NULL if none known
2166 g_vfunc_info_get_invoker (GIVFuncInfo *info)
2168 GIRealInfo *rinfo = (GIRealInfo *)info;
2169 VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset];
2170 GIBaseInfo *container = rinfo->container;
2171 GIInfoType parent_type;
2173 /* 1023 = 0x3ff is the maximum of the 10 bits for invoker index */
2174 if (blob->invoker == 1023)
2177 parent_type = g_base_info_get_type (container);
2178 if (parent_type == GI_INFO_TYPE_OBJECT)
2179 return g_object_info_get_method ((GIObjectInfo*)container, blob->invoker);
2180 else if (parent_type == GI_INFO_TYPE_INTERFACE)
2181 return g_interface_info_get_method ((GIInterfaceInfo*)container, blob->invoker);
2183 g_assert_not_reached ();
2186 /* GIConstantInfo functions */
2188 g_constant_info_get_type (GIConstantInfo *info)
2190 GIRealInfo *rinfo = (GIRealInfo *)info;
2192 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + 8);
2196 g_constant_info_get_value (GIConstantInfo *info,
2199 GIRealInfo *rinfo = (GIRealInfo *)info;
2200 ConstantBlob *blob = (ConstantBlob *)&rinfo->typelib->data[rinfo->offset];
2202 /* FIXME non-basic types ? */
2203 if (blob->type.flags.reserved == 0 && blob->type.flags.reserved2 == 0)
2205 if (blob->type.flags.pointer)
2206 value->v_pointer = g_memdup (&rinfo->typelib->data[blob->offset], blob->size);
2209 switch (blob->type.flags.tag)
2211 case GI_TYPE_TAG_BOOLEAN:
2212 value->v_boolean = *(gboolean*)&rinfo->typelib->data[blob->offset];
2214 case GI_TYPE_TAG_INT8:
2215 value->v_int8 = *(gint8*)&rinfo->typelib->data[blob->offset];
2217 case GI_TYPE_TAG_UINT8:
2218 value->v_uint8 = *(guint8*)&rinfo->typelib->data[blob->offset];
2220 case GI_TYPE_TAG_INT16:
2221 value->v_int16 = *(gint16*)&rinfo->typelib->data[blob->offset];
2223 case GI_TYPE_TAG_UINT16:
2224 value->v_uint16 = *(guint16*)&rinfo->typelib->data[blob->offset];
2226 case GI_TYPE_TAG_INT32:
2227 value->v_int32 = *(gint32*)&rinfo->typelib->data[blob->offset];
2229 case GI_TYPE_TAG_UINT32:
2230 value->v_uint32 = *(guint32*)&rinfo->typelib->data[blob->offset];
2232 case GI_TYPE_TAG_INT64:
2233 value->v_int64 = *(gint64*)&rinfo->typelib->data[blob->offset];
2235 case GI_TYPE_TAG_UINT64:
2236 value->v_uint64 = *(guint64*)&rinfo->typelib->data[blob->offset];
2238 case GI_TYPE_TAG_FLOAT:
2239 value->v_float = *(gfloat*)&rinfo->typelib->data[blob->offset];
2241 case GI_TYPE_TAG_DOUBLE:
2242 value->v_double = *(gdouble*)&rinfo->typelib->data[blob->offset];
2244 case GI_TYPE_TAG_TIME_T:
2245 value->v_long = *(long*)&rinfo->typelib->data[blob->offset];
2247 case GI_TYPE_TAG_SHORT:
2248 value->v_short = *(gshort*)&rinfo->typelib->data[blob->offset];
2250 case GI_TYPE_TAG_USHORT:
2251 value->v_ushort = *(gushort*)&rinfo->typelib->data[blob->offset];
2253 case GI_TYPE_TAG_INT:
2254 value->v_int = *(gint*)&rinfo->typelib->data[blob->offset];
2256 case GI_TYPE_TAG_UINT:
2257 value->v_uint = *(guint*)&rinfo->typelib->data[blob->offset];
2259 case GI_TYPE_TAG_LONG:
2260 value->v_long = *(glong*)&rinfo->typelib->data[blob->offset];
2262 case GI_TYPE_TAG_ULONG:
2263 value->v_ulong = *(gulong*)&rinfo->typelib->data[blob->offset];
2272 /* GIUnionInfo functions */
2274 g_union_info_get_n_fields (GIUnionInfo *info)
2276 GIRealInfo *rinfo = (GIRealInfo *)info;
2277 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2279 return blob->n_fields;
2283 g_union_info_get_field (GIUnionInfo *info,
2286 GIRealInfo *rinfo = (GIRealInfo *)info;
2287 Header *header = (Header *)rinfo->typelib->data;
2289 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, (GIBaseInfo*)info, rinfo->typelib,
2290 rinfo->offset + header->union_blob_size +
2291 n * header->field_blob_size);
2295 g_union_info_get_n_methods (GIUnionInfo *info)
2297 GIRealInfo *rinfo = (GIRealInfo *)info;
2298 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2300 return blob->n_functions;
2304 g_union_info_get_method (GIUnionInfo *info,
2307 GIRealInfo *rinfo = (GIRealInfo *)info;
2308 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2309 Header *header = (Header *)rinfo->typelib->data;
2312 offset = rinfo->offset + header->union_blob_size
2313 + blob->n_fields * header->field_blob_size
2314 + n * header->function_blob_size;
2315 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info,
2316 rinfo->typelib, offset);
2320 g_union_info_is_discriminated (GIUnionInfo *info)
2322 GIRealInfo *rinfo = (GIRealInfo *)info;
2323 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2325 return blob->discriminated;
2329 g_union_info_get_discriminator_offset (GIUnionInfo *info)
2331 GIRealInfo *rinfo = (GIRealInfo *)info;
2332 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2334 return blob->discriminator_offset;
2338 g_union_info_get_discriminator_type (GIUnionInfo *info)
2340 GIRealInfo *rinfo = (GIRealInfo *)info;
2342 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + 24);
2346 g_union_info_get_discriminator (GIUnionInfo *info,
2349 GIRealInfo *rinfo = (GIRealInfo *)info;
2350 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2352 if (blob->discriminated)
2354 Header *header = (Header *)rinfo->typelib->data;
2357 offset = rinfo->offset + header->union_blob_size
2358 + blob->n_fields * header->field_blob_size
2359 + blob->n_functions * header->function_blob_size
2360 + n * header->constant_blob_size;
2362 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, (GIBaseInfo*)info,
2363 rinfo->typelib, offset);
2370 g_union_info_find_method (GIUnionInfo *info,
2374 GIRealInfo *rinfo = (GIRealInfo *)info;
2375 Header *header = (Header *)rinfo->typelib->data;
2376 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2378 offset = rinfo->offset + header->union_blob_size
2379 + blob->n_fields * header->field_blob_size;
2381 return find_method ((GIBaseInfo*)info, offset, blob->n_functions, name);
2385 g_union_info_get_size (GIUnionInfo *info)
2387 GIRealInfo *rinfo = (GIRealInfo *)info;
2388 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2394 g_union_info_get_alignment (GIUnionInfo *info)
2396 GIRealInfo *rinfo = (GIRealInfo *)info;
2397 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2399 return blob->alignment;