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_gtype_struct:
1397 * @info: GIStructInfo
1399 * Return true if this structure represents the "class structure" for some
1400 * #GObject or #GInterface. This function is mainly useful to hide this kind of structure
1401 * from generated public APIs.
1403 * Returns: %TRUE if this is a class struct, %FALSE otherwise
1406 g_struct_info_is_gtype_struct (GIStructInfo *info)
1408 GIRealInfo *rinfo = (GIRealInfo *)info;
1409 StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset];
1411 return blob->is_gtype_struct;
1415 g_enum_info_get_n_values (GIEnumInfo *info)
1417 GIRealInfo *rinfo = (GIRealInfo *)info;
1418 EnumBlob *blob = (EnumBlob *)&rinfo->typelib->data[rinfo->offset];
1420 return blob->n_values;
1424 g_enum_info_get_value (GIEnumInfo *info,
1427 GIRealInfo *rinfo = (GIRealInfo *)info;
1428 Header *header = (Header *)rinfo->typelib->data;
1431 offset = rinfo->offset + header->enum_blob_size
1432 + n * header->value_blob_size;
1433 return (GIValueInfo *) g_info_new (GI_INFO_TYPE_VALUE, (GIBaseInfo*)info, rinfo->typelib, offset);
1437 * g_enum_info_get_storage_type:
1440 * Gets the tag of the type used for the enum in the C ABI. This will
1441 * will be a signed or unsigned integral type.
1443 * Note that in the current implementation the width of the type is
1444 * computed correctly, but the signed or unsigned nature of the type
1445 * may not match the sign of the type used by the C compiler.
1447 * Return Value: the storage type for the enumeration
1450 g_enum_info_get_storage_type (GIEnumInfo *info)
1452 GIRealInfo *rinfo = (GIRealInfo *)info;
1453 EnumBlob *blob = (EnumBlob *)&rinfo->typelib->data[rinfo->offset];
1455 return blob->storage_type;
1458 /* GIObjectInfo functions */
1460 g_object_info_get_parent (GIObjectInfo *info)
1462 GIRealInfo *rinfo = (GIRealInfo *)info;
1463 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1466 return (GIObjectInfo *) g_info_from_entry (rinfo->repository,
1467 rinfo->typelib, blob->parent);
1473 g_object_info_get_abstract (GIObjectInfo *info)
1475 GIRealInfo *rinfo = (GIRealInfo *)info;
1476 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1477 return blob->abstract != 0;
1481 g_object_info_get_type_name (GIObjectInfo *info)
1483 GIRealInfo *rinfo = (GIRealInfo *)info;
1484 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1486 return g_typelib_get_string (rinfo->typelib, blob->gtype_name);
1490 g_object_info_get_type_init (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_init);
1499 g_object_info_get_n_interfaces (GIObjectInfo *info)
1501 GIRealInfo *rinfo = (GIRealInfo *)info;
1502 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1504 return blob->n_interfaces;
1508 g_object_info_get_interface (GIObjectInfo *info,
1511 GIRealInfo *rinfo = (GIRealInfo *)info;
1512 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1514 return (GIInterfaceInfo *) g_info_from_entry (rinfo->repository,
1515 rinfo->typelib, blob->interfaces[n]);
1519 g_object_info_get_n_fields (GIObjectInfo *info)
1521 GIRealInfo *rinfo = (GIRealInfo *)info;
1522 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1524 return blob->n_fields;
1528 g_object_info_get_field (GIObjectInfo *info,
1532 GIRealInfo *rinfo = (GIRealInfo *)info;
1533 Header *header = (Header *)rinfo->typelib->data;
1534 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1536 offset = rinfo->offset + header->object_blob_size
1537 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1538 + n * header->field_blob_size;
1540 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, (GIBaseInfo*)info, rinfo->typelib, offset);
1544 g_object_info_get_n_properties (GIObjectInfo *info)
1546 GIRealInfo *rinfo = (GIRealInfo *)info;
1547 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1549 return blob->n_properties;
1553 g_object_info_get_property (GIObjectInfo *info,
1557 GIRealInfo *rinfo = (GIRealInfo *)info;
1558 Header *header = (Header *)rinfo->typelib->data;
1559 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1561 offset = rinfo->offset + header->object_blob_size
1562 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1563 + blob->n_fields * header->field_blob_size
1564 + n * header->property_blob_size;
1566 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, (GIBaseInfo*)info,
1567 rinfo->typelib, offset);
1571 g_object_info_get_n_methods (GIObjectInfo *info)
1573 GIRealInfo *rinfo = (GIRealInfo *)info;
1574 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1576 return blob->n_methods;
1580 g_object_info_get_method (GIObjectInfo *info,
1584 GIRealInfo *rinfo = (GIRealInfo *)info;
1585 Header *header = (Header *)rinfo->typelib->data;
1586 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1588 offset = rinfo->offset + header->object_blob_size
1589 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1590 + blob->n_fields * header->field_blob_size
1591 + blob->n_properties * header->property_blob_size
1592 + n * header->function_blob_size;
1594 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info,
1595 rinfo->typelib, offset);
1599 g_object_info_find_method (GIObjectInfo *info,
1603 GIRealInfo *rinfo = (GIRealInfo *)info;
1604 Header *header = (Header *)rinfo->typelib->data;
1605 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1607 offset = rinfo->offset + header->object_blob_size
1608 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1609 + blob->n_fields * header->field_blob_size +
1610 + blob->n_properties * header->property_blob_size;
1612 return find_method ((GIBaseInfo*)info, offset, blob->n_methods, name);
1616 g_object_info_get_n_signals (GIObjectInfo *info)
1618 GIRealInfo *rinfo = (GIRealInfo *)info;
1619 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1621 return blob->n_signals;
1625 g_object_info_get_signal (GIObjectInfo *info,
1629 GIRealInfo *rinfo = (GIRealInfo *)info;
1630 Header *header = (Header *)rinfo->typelib->data;
1631 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1633 offset = rinfo->offset + header->object_blob_size
1634 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1635 + blob->n_fields * header->field_blob_size
1636 + blob->n_properties * header->property_blob_size
1637 + blob->n_methods * header->function_blob_size
1638 + n * header->signal_blob_size;
1640 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, (GIBaseInfo*)info,
1641 rinfo->typelib, offset);
1645 g_object_info_get_n_vfuncs (GIObjectInfo *info)
1647 GIRealInfo *rinfo = (GIRealInfo *)info;
1648 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1650 return blob->n_vfuncs;
1654 g_object_info_get_vfunc (GIObjectInfo *info,
1658 GIRealInfo *rinfo = (GIRealInfo *)info;
1659 Header *header = (Header *)rinfo->typelib->data;
1660 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1662 offset = rinfo->offset + header->object_blob_size
1663 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1664 + blob->n_fields * header->field_blob_size
1665 + blob->n_properties * header->property_blob_size
1666 + blob->n_methods * header->function_blob_size
1667 + blob->n_signals * header->signal_blob_size
1668 + n * header->vfunc_blob_size;
1670 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, (GIBaseInfo*)info,
1671 rinfo->typelib, offset);
1674 static GIVFuncInfo *
1675 find_vfunc (GIRealInfo *rinfo,
1681 Header *header = (Header *)rinfo->typelib->data;
1684 for (i = 0; i < n_vfuncs; i++)
1686 VFuncBlob *fblob = (VFuncBlob *)&rinfo->typelib->data[offset];
1687 const gchar *fname = (const gchar *)&rinfo->typelib->data[fblob->name];
1689 if (strcmp (name, fname) == 0)
1690 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, (GIBaseInfo*) rinfo,
1691 rinfo->typelib, offset);
1693 offset += header->vfunc_blob_size;
1700 * g_object_info_find_vfunc:
1701 * @info: An #GIObjectInfo
1702 * @name: The name of a virtual function to find.
1704 * Locate a virtual function slot with name @name. Note that the namespace
1705 * for virtuals is distinct from that of methods; there may or may not be
1706 * a concrete method associated for a virtual. If there is one, it may
1707 * be retrieved using #g_vfunc_info_get_invoker. See the documentation for
1708 * that function for more information on invoking virtuals.
1710 * Return value: (transfer full): A #GIVFuncInfo, or %NULL if none with name @name.
1713 g_object_info_find_vfunc (GIObjectInfo *info,
1717 GIRealInfo *rinfo = (GIRealInfo *)info;
1718 Header *header = (Header *)rinfo->typelib->data;
1719 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1721 offset = rinfo->offset + header->object_blob_size
1722 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1723 + blob->n_fields * header->field_blob_size
1724 + blob->n_properties * header->property_blob_size
1725 + blob->n_methods * header->function_blob_size
1726 + blob->n_signals * header->signal_blob_size;
1728 return find_vfunc (rinfo, offset, blob->n_vfuncs, name);
1732 g_object_info_get_n_constants (GIObjectInfo *info)
1734 GIRealInfo *rinfo = (GIRealInfo *)info;
1735 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1737 return blob->n_constants;
1741 g_object_info_get_constant (GIObjectInfo *info,
1745 GIRealInfo *rinfo = (GIRealInfo *)info;
1746 Header *header = (Header *)rinfo->typelib->data;
1747 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1749 offset = rinfo->offset + header->object_blob_size
1750 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1751 + blob->n_fields * header->field_blob_size
1752 + blob->n_properties * header->property_blob_size
1753 + blob->n_methods * header->function_blob_size
1754 + blob->n_signals * header->signal_blob_size
1755 + blob->n_vfuncs * header->vfunc_blob_size
1756 + n * header->constant_blob_size;
1758 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, (GIBaseInfo*)info,
1759 rinfo->typelib, offset);
1763 * g_object_info_get_class_struct:
1764 * @info: A #GIObjectInfo to query
1766 * Every #GObject has two structures; an instance structure and a class
1767 * structure. This function returns the metadata for the class structure.
1769 * Returns: a #GIStructInfo for the class struct or %NULL if none found.
1772 g_object_info_get_class_struct (GIObjectInfo *info)
1774 GIRealInfo *rinfo = (GIRealInfo *)info;
1775 ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
1777 if (blob->gtype_struct)
1778 return (GIStructInfo *) g_info_from_entry (rinfo->repository,
1779 rinfo->typelib, blob->gtype_struct);
1784 /* GIInterfaceInfo functions */
1786 g_interface_info_get_n_prerequisites (GIInterfaceInfo *info)
1788 GIRealInfo *rinfo = (GIRealInfo *)info;
1789 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1791 return blob->n_prerequisites;
1795 g_interface_info_get_prerequisite (GIInterfaceInfo *info,
1798 GIRealInfo *rinfo = (GIRealInfo *)info;
1799 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1801 return g_info_from_entry (rinfo->repository,
1802 rinfo->typelib, blob->prerequisites[n]);
1807 g_interface_info_get_n_properties (GIInterfaceInfo *info)
1809 GIRealInfo *rinfo = (GIRealInfo *)info;
1810 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1812 return blob->n_properties;
1816 g_interface_info_get_property (GIInterfaceInfo *info,
1820 GIRealInfo *rinfo = (GIRealInfo *)info;
1821 Header *header = (Header *)rinfo->typelib->data;
1822 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1824 offset = rinfo->offset + header->interface_blob_size
1825 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1826 + n * header->property_blob_size;
1828 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, (GIBaseInfo*)info,
1829 rinfo->typelib, offset);
1833 g_interface_info_get_n_methods (GIInterfaceInfo *info)
1835 GIRealInfo *rinfo = (GIRealInfo *)info;
1836 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1838 return blob->n_methods;
1842 g_interface_info_get_method (GIInterfaceInfo *info,
1846 GIRealInfo *rinfo = (GIRealInfo *)info;
1847 Header *header = (Header *)rinfo->typelib->data;
1848 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1850 offset = rinfo->offset + header->interface_blob_size
1851 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1852 + blob->n_properties * header->property_blob_size
1853 + n * header->function_blob_size;
1855 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info,
1856 rinfo->typelib, offset);
1860 g_interface_info_find_method (GIInterfaceInfo *info,
1864 GIRealInfo *rinfo = (GIRealInfo *)info;
1865 Header *header = (Header *)rinfo->typelib->data;
1866 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1868 offset = rinfo->offset + header->interface_blob_size
1869 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1870 + blob->n_properties * header->property_blob_size;
1872 return find_method ((GIBaseInfo*)info, offset, blob->n_methods, name);
1876 g_interface_info_get_n_signals (GIInterfaceInfo *info)
1878 GIRealInfo *rinfo = (GIRealInfo *)info;
1879 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1881 return blob->n_signals;
1885 g_interface_info_get_signal (GIInterfaceInfo *info,
1889 GIRealInfo *rinfo = (GIRealInfo *)info;
1890 Header *header = (Header *)rinfo->typelib->data;
1891 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1893 offset = rinfo->offset + header->interface_blob_size
1894 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1895 + blob->n_properties * header->property_blob_size
1896 + blob->n_methods * header->function_blob_size
1897 + n * header->signal_blob_size;
1899 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, (GIBaseInfo*)info,
1900 rinfo->typelib, offset);
1904 g_interface_info_get_n_vfuncs (GIInterfaceInfo *info)
1906 GIRealInfo *rinfo = (GIRealInfo *)info;
1907 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1909 return blob->n_vfuncs;
1913 g_interface_info_get_vfunc (GIInterfaceInfo *info,
1917 GIRealInfo *rinfo = (GIRealInfo *)info;
1918 Header *header = (Header *)rinfo->typelib->data;
1919 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1921 offset = rinfo->offset + header->interface_blob_size
1922 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1923 + blob->n_properties * header->property_blob_size
1924 + blob->n_methods * header->function_blob_size
1925 + blob->n_signals * header->signal_blob_size
1926 + n * header->vfunc_blob_size;
1928 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, (GIBaseInfo*)info,
1929 rinfo->typelib, offset);
1933 * g_interface_info_find_vfunc:
1934 * @info: An #GIObjectInfo
1935 * @name: The name of a virtual function to find.
1937 * Locate a virtual function slot with name @name. See the documentation
1938 * for #g_object_info_find_vfunc for more information on virtuals.
1940 * Return value: (transfer full): A #GIVFuncInfo, or %NULL if none with name @name.
1943 g_interface_info_find_vfunc (GIInterfaceInfo *info,
1947 GIRealInfo *rinfo = (GIRealInfo *)info;
1948 Header *header = (Header *)rinfo->typelib->data;
1949 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1951 offset = rinfo->offset + header->interface_blob_size
1952 + (blob->n_prerequisites + blob->n_prerequisites % 2) * 2
1953 + blob->n_properties * header->property_blob_size
1954 + blob->n_methods * header->function_blob_size
1955 + blob->n_signals * header->signal_blob_size;
1957 return find_vfunc (rinfo, offset, blob->n_vfuncs, name);
1961 g_interface_info_get_n_constants (GIInterfaceInfo *info)
1963 GIRealInfo *rinfo = (GIRealInfo *)info;
1964 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1966 return blob->n_constants;
1970 g_interface_info_get_constant (GIInterfaceInfo *info,
1974 GIRealInfo *rinfo = (GIRealInfo *)info;
1975 Header *header = (Header *)rinfo->typelib->data;
1976 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
1978 offset = rinfo->offset + header->interface_blob_size
1979 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1980 + blob->n_properties * header->property_blob_size
1981 + blob->n_methods * header->function_blob_size
1982 + blob->n_signals * header->signal_blob_size
1983 + blob->n_vfuncs * header->vfunc_blob_size
1984 + n * header->constant_blob_size;
1986 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, (GIBaseInfo*)info,
1987 rinfo->typelib, offset);
1991 * g_interface_info_get_iface_struct:
1992 * @info: A #GIInterfaceInfo to query
1994 * Returns the layout C structure associated with this #GInterface.
1996 * Returns: A #GIStructInfo for the class struct or %NULL if none found.
1999 g_interface_info_get_iface_struct (GIInterfaceInfo *info)
2001 GIRealInfo *rinfo = (GIRealInfo *)info;
2002 InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
2004 if (blob->gtype_struct)
2005 return (GIStructInfo *) g_info_from_entry (rinfo->repository,
2006 rinfo->typelib, blob->gtype_struct);
2011 /* GIPropertyInfo functions */
2013 g_property_info_get_flags (GIPropertyInfo *info)
2016 GIRealInfo *rinfo = (GIRealInfo *)info;
2017 PropertyBlob *blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset];
2022 flags = flags | G_PARAM_READABLE;
2025 flags = flags | G_PARAM_WRITABLE;
2027 if (blob->construct)
2028 flags = flags | G_PARAM_CONSTRUCT;
2030 if (blob->construct_only)
2031 flags = flags | G_PARAM_CONSTRUCT_ONLY;
2037 g_property_info_get_type (GIPropertyInfo *info)
2039 GIRealInfo *rinfo = (GIRealInfo *)info;
2041 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (PropertyBlob, type));
2045 /* GISignalInfo functions */
2047 g_signal_info_get_flags (GISignalInfo *info)
2051 GIRealInfo *rinfo = (GIRealInfo *)info;
2052 SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset];
2056 if (blob->run_first)
2057 flags = flags | G_SIGNAL_RUN_FIRST;
2060 flags = flags | G_SIGNAL_RUN_LAST;
2062 if (blob->run_cleanup)
2063 flags = flags | G_SIGNAL_RUN_CLEANUP;
2065 if (blob->no_recurse)
2066 flags = flags | G_SIGNAL_NO_RECURSE;
2069 flags = flags | G_SIGNAL_DETAILED;
2072 flags = flags | G_SIGNAL_ACTION;
2075 flags = flags | G_SIGNAL_NO_HOOKS;
2081 g_signal_info_get_class_closure (GISignalInfo *info)
2083 GIRealInfo *rinfo = (GIRealInfo *)info;
2084 SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset];
2086 if (blob->has_class_closure)
2087 return g_interface_info_get_vfunc ((GIInterfaceInfo *)rinfo->container, blob->class_closure);
2093 g_signal_info_true_stops_emit (GISignalInfo *info)
2095 GIRealInfo *rinfo = (GIRealInfo *)info;
2096 SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset];
2098 return blob->true_stops_emit;
2101 /* GIVFuncInfo functions */
2103 g_vfunc_info_get_flags (GIVFuncInfo *info)
2105 GIVFuncInfoFlags flags;
2107 GIRealInfo *rinfo = (GIRealInfo *)info;
2108 VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset];
2112 if (blob->must_chain_up)
2113 flags = flags | GI_VFUNC_MUST_CHAIN_UP;
2115 if (blob->must_be_implemented)
2116 flags = flags | GI_VFUNC_MUST_OVERRIDE;
2118 if (blob->must_not_be_implemented)
2119 flags = flags | GI_VFUNC_MUST_NOT_OVERRIDE;
2125 g_vfunc_info_get_offset (GIVFuncInfo *info)
2127 GIRealInfo *rinfo = (GIRealInfo *)info;
2128 VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset];
2130 return blob->struct_offset;
2134 g_vfunc_info_get_signal (GIVFuncInfo *info)
2136 GIRealInfo *rinfo = (GIRealInfo *)info;
2137 VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset];
2139 if (blob->class_closure)
2140 return g_interface_info_get_signal ((GIInterfaceInfo *)rinfo->container, blob->signal);
2146 * g_vfunc_info_get_invoker:
2147 * @info: A #GIVFuncInfo
2149 * If this virtual function has an associated invoker method, this
2150 * method will return it. An invoker method is a C entry point.
2152 * Not all virtuals will have invokers.
2154 * Return value: (transfer full): An invoker function, or %NULL if none known
2157 g_vfunc_info_get_invoker (GIVFuncInfo *info)
2159 GIRealInfo *rinfo = (GIRealInfo *)info;
2160 VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset];
2161 GIBaseInfo *container = rinfo->container;
2162 GIInfoType parent_type;
2164 /* 1023 = 0x3ff is the maximum of the 10 bits for invoker index */
2165 if (blob->invoker == 1023)
2168 parent_type = g_base_info_get_type (container);
2169 if (parent_type == GI_INFO_TYPE_OBJECT)
2170 return g_object_info_get_method ((GIObjectInfo*)container, blob->invoker);
2171 else if (parent_type == GI_INFO_TYPE_INTERFACE)
2172 return g_interface_info_get_method ((GIInterfaceInfo*)container, blob->invoker);
2174 g_assert_not_reached ();
2177 /* GIConstantInfo functions */
2179 g_constant_info_get_type (GIConstantInfo *info)
2181 GIRealInfo *rinfo = (GIRealInfo *)info;
2183 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + 8);
2187 g_constant_info_get_value (GIConstantInfo *info,
2190 GIRealInfo *rinfo = (GIRealInfo *)info;
2191 ConstantBlob *blob = (ConstantBlob *)&rinfo->typelib->data[rinfo->offset];
2193 /* FIXME non-basic types ? */
2194 if (blob->type.flags.reserved == 0 && blob->type.flags.reserved2 == 0)
2196 if (blob->type.flags.pointer)
2197 value->v_pointer = g_memdup (&rinfo->typelib->data[blob->offset], blob->size);
2200 switch (blob->type.flags.tag)
2202 case GI_TYPE_TAG_BOOLEAN:
2203 value->v_boolean = *(gboolean*)&rinfo->typelib->data[blob->offset];
2205 case GI_TYPE_TAG_INT8:
2206 value->v_int8 = *(gint8*)&rinfo->typelib->data[blob->offset];
2208 case GI_TYPE_TAG_UINT8:
2209 value->v_uint8 = *(guint8*)&rinfo->typelib->data[blob->offset];
2211 case GI_TYPE_TAG_INT16:
2212 value->v_int16 = *(gint16*)&rinfo->typelib->data[blob->offset];
2214 case GI_TYPE_TAG_UINT16:
2215 value->v_uint16 = *(guint16*)&rinfo->typelib->data[blob->offset];
2217 case GI_TYPE_TAG_INT32:
2218 value->v_int32 = *(gint32*)&rinfo->typelib->data[blob->offset];
2220 case GI_TYPE_TAG_UINT32:
2221 value->v_uint32 = *(guint32*)&rinfo->typelib->data[blob->offset];
2223 case GI_TYPE_TAG_INT64:
2224 value->v_int64 = *(gint64*)&rinfo->typelib->data[blob->offset];
2226 case GI_TYPE_TAG_UINT64:
2227 value->v_uint64 = *(guint64*)&rinfo->typelib->data[blob->offset];
2229 case GI_TYPE_TAG_FLOAT:
2230 value->v_float = *(gfloat*)&rinfo->typelib->data[blob->offset];
2232 case GI_TYPE_TAG_DOUBLE:
2233 value->v_double = *(gdouble*)&rinfo->typelib->data[blob->offset];
2235 case GI_TYPE_TAG_TIME_T:
2236 value->v_long = *(long*)&rinfo->typelib->data[blob->offset];
2238 case GI_TYPE_TAG_SHORT:
2239 value->v_short = *(gshort*)&rinfo->typelib->data[blob->offset];
2241 case GI_TYPE_TAG_USHORT:
2242 value->v_ushort = *(gushort*)&rinfo->typelib->data[blob->offset];
2244 case GI_TYPE_TAG_INT:
2245 value->v_int = *(gint*)&rinfo->typelib->data[blob->offset];
2247 case GI_TYPE_TAG_UINT:
2248 value->v_uint = *(guint*)&rinfo->typelib->data[blob->offset];
2250 case GI_TYPE_TAG_LONG:
2251 value->v_long = *(glong*)&rinfo->typelib->data[blob->offset];
2253 case GI_TYPE_TAG_ULONG:
2254 value->v_ulong = *(gulong*)&rinfo->typelib->data[blob->offset];
2263 /* GIUnionInfo functions */
2265 g_union_info_get_n_fields (GIUnionInfo *info)
2267 GIRealInfo *rinfo = (GIRealInfo *)info;
2268 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2270 return blob->n_fields;
2274 g_union_info_get_field (GIUnionInfo *info,
2277 GIRealInfo *rinfo = (GIRealInfo *)info;
2278 Header *header = (Header *)rinfo->typelib->data;
2280 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, (GIBaseInfo*)info, rinfo->typelib,
2281 rinfo->offset + header->union_blob_size +
2282 n * header->field_blob_size);
2286 g_union_info_get_n_methods (GIUnionInfo *info)
2288 GIRealInfo *rinfo = (GIRealInfo *)info;
2289 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2291 return blob->n_functions;
2295 g_union_info_get_method (GIUnionInfo *info,
2298 GIRealInfo *rinfo = (GIRealInfo *)info;
2299 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2300 Header *header = (Header *)rinfo->typelib->data;
2303 offset = rinfo->offset + header->union_blob_size
2304 + blob->n_fields * header->field_blob_size
2305 + n * header->function_blob_size;
2306 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info,
2307 rinfo->typelib, offset);
2311 g_union_info_is_discriminated (GIUnionInfo *info)
2313 GIRealInfo *rinfo = (GIRealInfo *)info;
2314 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2316 return blob->discriminated;
2320 g_union_info_get_discriminator_offset (GIUnionInfo *info)
2322 GIRealInfo *rinfo = (GIRealInfo *)info;
2323 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2325 return blob->discriminator_offset;
2329 g_union_info_get_discriminator_type (GIUnionInfo *info)
2331 GIRealInfo *rinfo = (GIRealInfo *)info;
2333 return g_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + 24);
2337 g_union_info_get_discriminator (GIUnionInfo *info,
2340 GIRealInfo *rinfo = (GIRealInfo *)info;
2341 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2343 if (blob->discriminated)
2345 Header *header = (Header *)rinfo->typelib->data;
2348 offset = rinfo->offset + header->union_blob_size
2349 + blob->n_fields * header->field_blob_size
2350 + blob->n_functions * header->function_blob_size
2351 + n * header->constant_blob_size;
2353 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, (GIBaseInfo*)info,
2354 rinfo->typelib, offset);
2361 g_union_info_find_method (GIUnionInfo *info,
2365 GIRealInfo *rinfo = (GIRealInfo *)info;
2366 Header *header = (Header *)rinfo->typelib->data;
2367 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2369 offset = rinfo->offset + header->union_blob_size
2370 + blob->n_fields * header->field_blob_size;
2372 return find_method ((GIBaseInfo*)info, offset, blob->n_functions, name);
2376 g_union_info_get_size (GIUnionInfo *info)
2378 GIRealInfo *rinfo = (GIRealInfo *)info;
2379 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2385 g_union_info_get_alignment (GIUnionInfo *info)
2387 GIRealInfo *rinfo = (GIRealInfo *)info;
2388 UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset];
2390 return blob->alignment;