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>
35 GIRepository *repository;
36 GIBaseInfo *container;
42 struct _GIUnresolvedInfo
46 GIBaseInfo *container;
49 const gchar *namespace;
52 struct _GICallableInfo
57 struct _GIFunctionInfo
59 GICallableInfo callable;
62 struct _GICallbackInfo
64 GICallableInfo callable;
67 struct _GIRegisteredTypeInfo
74 GIRegisteredTypeInfo registered;
79 GIRegisteredTypeInfo registered;
84 GIRegisteredTypeInfo registered;
87 struct _GIInterfaceInfo
89 GIRegisteredTypeInfo registered;
92 struct _GIConstantInfo
104 GICallableInfo callable;
109 GICallableInfo callable;
112 struct _GIPropertyInfo
134 GIRegisteredTypeInfo registered;
140 g_info_new_full (GIInfoType type,
141 GIRepository *repository,
142 GIBaseInfo *container,
148 g_return_val_if_fail (container != NULL || repository != NULL, NULL);
150 info = g_new0 (GIBaseInfo, 1);
155 info->typelib = typelib;
156 info->offset = offset;
159 info->container = g_base_info_ref (container);
161 info->repository = g_object_ref (repository);
167 g_info_new (GIInfoType type,
168 GIBaseInfo *container,
172 return g_info_new_full (type, container->repository, container, typelib, offset);
176 g_info_from_entry (GIRepository *repository,
181 DirEntry *entry = g_typelib_get_dir_entry (typelib, index);
184 result = g_info_new_full (entry->blob_type, repository, NULL, typelib, entry->offset);
187 const gchar *namespace = g_typelib_get_string (typelib, entry->offset);
188 const gchar *name = g_typelib_get_string (typelib, entry->name);
190 result = g_irepository_find_by_name (repository, namespace, name);
193 GIUnresolvedInfo *unresolved;
195 unresolved = g_new0 (GIUnresolvedInfo, 1);
197 unresolved->type = GI_INFO_TYPE_UNRESOLVED;
198 unresolved->ref_count = 1;
199 unresolved->container = NULL;
200 unresolved->name = name;
201 unresolved->namespace = namespace;
203 return (GIBaseInfo*)unresolved;
211 /* GIBaseInfo functions */
213 g_base_info_ref (GIBaseInfo *info)
221 g_base_info_unref (GIBaseInfo *info)
223 g_assert (info->ref_count > 0);
226 if (!info->ref_count)
229 g_base_info_unref (info->container);
231 if (info->repository)
232 g_object_unref (info->repository);
239 g_base_info_get_type (GIBaseInfo *info)
246 g_base_info_get_name (GIBaseInfo *info)
248 g_assert (info->ref_count > 0);
251 case GI_INFO_TYPE_FUNCTION:
252 case GI_INFO_TYPE_CALLBACK:
253 case GI_INFO_TYPE_STRUCT:
254 case GI_INFO_TYPE_BOXED:
255 case GI_INFO_TYPE_ENUM:
256 case GI_INFO_TYPE_FLAGS:
257 case GI_INFO_TYPE_OBJECT:
258 case GI_INFO_TYPE_INTERFACE:
259 case GI_INFO_TYPE_CONSTANT:
260 case GI_INFO_TYPE_ERROR_DOMAIN:
261 case GI_INFO_TYPE_UNION:
263 CommonBlob *blob = (CommonBlob *)&info->typelib->data[info->offset];
265 return g_typelib_get_string (info->typelib, blob->name);
269 case GI_INFO_TYPE_VALUE:
271 ValueBlob *blob = (ValueBlob *)&info->typelib->data[info->offset];
273 return g_typelib_get_string (info->typelib, blob->name);
277 case GI_INFO_TYPE_SIGNAL:
279 SignalBlob *blob = (SignalBlob *)&info->typelib->data[info->offset];
281 return g_typelib_get_string (info->typelib, blob->name);
285 case GI_INFO_TYPE_PROPERTY:
287 PropertyBlob *blob = (PropertyBlob *)&info->typelib->data[info->offset];
289 return g_typelib_get_string (info->typelib, blob->name);
293 case GI_INFO_TYPE_VFUNC:
295 VFuncBlob *blob = (VFuncBlob *)&info->typelib->data[info->offset];
297 return g_typelib_get_string (info->typelib, blob->name);
301 case GI_INFO_TYPE_FIELD:
303 FieldBlob *blob = (FieldBlob *)&info->typelib->data[info->offset];
305 return g_typelib_get_string (info->typelib, blob->name);
309 case GI_INFO_TYPE_ARG:
311 ArgBlob *blob = (ArgBlob *)&info->typelib->data[info->offset];
313 return g_typelib_get_string (info->typelib, blob->name);
316 case GI_INFO_TYPE_UNRESOLVED:
318 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
320 return unresolved->name;
323 case GI_INFO_TYPE_TYPE:
325 g_assert_not_reached ();
333 g_base_info_get_namespace (GIBaseInfo *info)
335 Header *header = (Header *)info->typelib->data;
337 g_assert (info->ref_count > 0);
339 if (info->type == GI_INFO_TYPE_UNRESOLVED)
341 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
343 return unresolved->namespace;
346 return g_typelib_get_string (info->typelib, header->namespace);
350 g_base_info_is_deprecated (GIBaseInfo *info)
354 case GI_INFO_TYPE_FUNCTION:
355 case GI_INFO_TYPE_CALLBACK:
356 case GI_INFO_TYPE_STRUCT:
357 case GI_INFO_TYPE_BOXED:
358 case GI_INFO_TYPE_ENUM:
359 case GI_INFO_TYPE_FLAGS:
360 case GI_INFO_TYPE_OBJECT:
361 case GI_INFO_TYPE_INTERFACE:
362 case GI_INFO_TYPE_CONSTANT:
363 case GI_INFO_TYPE_ERROR_DOMAIN:
365 CommonBlob *blob = (CommonBlob *)&info->typelib->data[info->offset];
367 return blob->deprecated;
371 case GI_INFO_TYPE_VALUE:
373 ValueBlob *blob = (ValueBlob *)&info->typelib->data[info->offset];
375 return blob->deprecated;
379 case GI_INFO_TYPE_SIGNAL:
381 SignalBlob *blob = (SignalBlob *)&info->typelib->data[info->offset];
383 return blob->deprecated;
387 case GI_INFO_TYPE_PROPERTY:
389 PropertyBlob *blob = (PropertyBlob *)&info->typelib->data[info->offset];
391 return blob->deprecated;
395 case GI_INFO_TYPE_VFUNC:
396 case GI_INFO_TYPE_FIELD:
397 case GI_INFO_TYPE_ARG:
398 case GI_INFO_TYPE_TYPE:
400 /* no deprecation flag for these */
407 * g_base_info_get_attribute:
408 * @info: A #GIBaseInfo
409 * @name: A freeform string naming an attribute
411 * Retrieve an arbitrary attribute associated with this node.
413 * Return value: The value of the attribute, or %NULL if no such attribute exists
416 g_base_info_get_attribute (GIBaseInfo *info,
419 GIAttributeIter iter = { 0, };
420 gchar *curname, *curvalue;
421 while (g_base_info_iterate_attributes (info, &iter, &curname, &curvalue))
423 if (strcmp (name, curname) == 0)
424 return (const gchar*) curvalue;
431 cmp_attribute (const void *av,
434 const AttributeBlob *a = av;
435 const AttributeBlob *b = bv;
437 if (a->offset < b->offset)
439 else if (a->offset == b->offset)
445 static AttributeBlob *
446 find_first_attribute (GIBaseInfo *info)
448 GIBaseInfo *base = (GIBaseInfo *)info;
449 Header *header = (Header *)base->typelib->data;
450 AttributeBlob blob, *first, *res, *previous;
452 blob.offset = base->offset;
454 first = (AttributeBlob *) &base->typelib->data[header->attributes];
456 res = bsearch (&blob, first, header->n_attributes,
457 header->attribute_blob_size, cmp_attribute);
463 while (previous >= first && previous->offset == base->offset)
473 * g_base_info_iterate_attributes:
474 * @info: A #GIBaseInfo
475 * @iter: A #GIAttributeIter structure, must be initialized; see below
476 * @name: (out) (transfer none): Returned name, must not be freed
477 * @value: (out) (transfer none): Returned name, must not be freed
479 * Iterate over all attributes associated with this node. The iterator
480 * structure is typically stack allocated, and must have its first
481 * member initialized to %NULL.
483 * Both the @name and @value should be treated as constants
484 * and must not be freed.
487 * <title>Iterating over attributes</title>
490 * print_attributes (GIBaseInfo *info)
492 * GIAttributeIter iter = { 0, };
495 * while (g_base_info_iterate_attributes (info, &iter, &name, &value))
497 * g_print ("attribute name: %s value: %s", name, value);
503 * Return value: %TRUE if there are more attributes, %FALSE otherwise
506 g_base_info_iterate_attributes (GIBaseInfo *info,
507 GIAttributeIter *iter,
511 GIBaseInfo *base = (GIBaseInfo *)info;
512 Header *header = (Header *)base->typelib->data;
513 AttributeBlob *next, *after;
515 after = (AttributeBlob *) &base->typelib->data[header->attributes +
516 header->n_attributes * header->attribute_blob_size];
518 if (iter->data != NULL)
519 next = (AttributeBlob *) iter->data;
521 next = find_first_attribute (info);
523 if (next == NULL || next->offset != base->offset || next >= after)
526 *name = (gchar*) g_typelib_get_string (base->typelib, next->name);
527 *value = (gchar*) g_typelib_get_string (base->typelib, next->value);
528 iter->data = next + 1;
534 g_base_info_get_container (GIBaseInfo *info)
536 return info->container;
540 g_base_info_get_typelib (GIBaseInfo *info)
542 return info->typelib;
545 /* GIFunctionInfo functions */
547 g_function_info_get_symbol (GIFunctionInfo *info)
549 GIBaseInfo *base = (GIBaseInfo *)info;
550 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
552 return g_typelib_get_string (base->typelib, blob->symbol);
556 g_function_info_get_flags (GIFunctionInfo *info)
558 GIFunctionInfoFlags flags;
559 GIBaseInfo *base = (GIBaseInfo *)info;
560 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
564 /* Make sure we don't flag Constructors as methods */
565 if (!blob->constructor && !blob->is_static)
566 flags = flags | GI_FUNCTION_IS_METHOD;
568 if (blob->constructor)
569 flags = flags | GI_FUNCTION_IS_CONSTRUCTOR;
572 flags = flags | GI_FUNCTION_IS_GETTER;
575 flags = flags | GI_FUNCTION_IS_SETTER;
577 if (blob->wraps_vfunc)
578 flags = flags | GI_FUNCTION_WRAPS_VFUNC;
581 flags = flags | GI_FUNCTION_THROWS;
587 g_function_info_get_property (GIFunctionInfo *info)
589 GIBaseInfo *base = (GIBaseInfo *)info;
590 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
591 GIInterfaceInfo *container = (GIInterfaceInfo *)base->container;
593 return g_interface_info_get_property (container, blob->index);
597 g_function_info_get_vfunc (GIFunctionInfo *info)
599 GIBaseInfo *base = (GIBaseInfo *)info;
600 FunctionBlob *blob = (FunctionBlob *)&base->typelib->data[base->offset];
601 GIInterfaceInfo *container = (GIInterfaceInfo *)base->container;
603 return g_interface_info_get_vfunc (container, blob->index);
607 /* GICallableInfo functions */
609 signature_offset (GICallableInfo *info)
612 switch (info->base.type)
614 case GI_INFO_TYPE_FUNCTION:
615 sigoff = G_STRUCT_OFFSET (FunctionBlob, signature);
617 case GI_INFO_TYPE_VFUNC:
618 sigoff = G_STRUCT_OFFSET (VFuncBlob, signature);
620 case GI_INFO_TYPE_CALLBACK:
621 sigoff = G_STRUCT_OFFSET (CallbackBlob, signature);
623 case GI_INFO_TYPE_SIGNAL:
624 sigoff = G_STRUCT_OFFSET (SignalBlob, signature);
628 return *(guint32 *)&info->base.typelib->data[info->base.offset + sigoff];
633 g_type_info_new (GIBaseInfo *container,
637 SimpleTypeBlob *type = (SimpleTypeBlob *)&typelib->data[offset];
639 return (GITypeInfo *) g_info_new (GI_INFO_TYPE_TYPE, container, typelib,
640 (type->reserved == 0 && type->reserved2 == 0) ? offset : type->offset);
644 * g_callable_info_get_return_type:
645 * @info: a #GICallableInfo
647 * Get the return type of a callable item as
650 * Returns: a #GITypeInfo idexing the TypeBlob for the
651 * return type of #info
654 g_callable_info_get_return_type (GICallableInfo *info)
656 GIBaseInfo *base = (GIBaseInfo *)info;
659 offset = signature_offset (info);
661 return g_type_info_new (base, base->typelib, offset);
665 * g_callable_info_may_return_null:
666 * @info: a #GICallableInfo
668 * See if a callable could return NULL.
670 * Returns: TRUE if callable could return NULL
673 g_callable_info_may_return_null (GICallableInfo *info)
675 GIBaseInfo *base = (GIBaseInfo *)info;
676 SignatureBlob *blob = (SignatureBlob *)&base->typelib->data[signature_offset (info)];
678 return blob->may_return_null;
682 * g_callable_info_get_caller_owns:
683 * @info: a #GICallableInfo
685 * See whether the caller owns the return value
688 * Returns: TRUE if the caller owns the return value, FALSE otherwise.
691 g_callable_info_get_caller_owns (GICallableInfo *info)
693 GIBaseInfo *base = (GIBaseInfo *)info;
694 SignatureBlob *blob = (SignatureBlob *)&base->typelib->data[signature_offset (info)];
696 if (blob->caller_owns_return_value)
697 return GI_TRANSFER_EVERYTHING;
698 else if (blob->caller_owns_return_container)
699 return GI_TRANSFER_CONTAINER;
701 return GI_TRANSFER_NOTHING;
705 * g_callable_info_get_n_args:
706 * @info: a #GICallableInfo
708 * Get the number of arguments (both IN and OUT) for this callable.
710 * Returns: The number of arguments this callable expects.
713 g_callable_info_get_n_args (GICallableInfo *info)
715 GIBaseInfo *base = (GIBaseInfo *)info;
719 offset = signature_offset (info);
720 blob = (SignatureBlob *)&base->typelib->data[offset];
722 return blob->n_arguments;
726 * g_callable_info_get_arg:
727 * @info: a #GICallableInfo
728 * @n: the argument index to fetch
730 * Get information about a particular argument of this callable.
732 * Returns: A #GIArgInfo indexing the typelib on the given argument.
735 g_callable_info_get_arg (GICallableInfo *info,
738 GIBaseInfo *base = (GIBaseInfo *)info;
739 Header *header = (Header *)base->typelib->data;
742 offset = signature_offset (info);
744 return (GIArgInfo *) g_info_new (GI_INFO_TYPE_ARG, base, base->typelib,
745 offset + header->signature_blob_size + n * header->arg_blob_size);
748 /* GIArgInfo function */
750 g_arg_info_get_direction (GIArgInfo *info)
752 GIBaseInfo *base = (GIBaseInfo *)info;
753 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
755 if (blob->in && blob->out)
756 return GI_DIRECTION_INOUT;
758 return GI_DIRECTION_OUT;
760 return GI_DIRECTION_IN;
764 g_arg_info_is_return_value (GIArgInfo *info)
766 GIBaseInfo *base = (GIBaseInfo *)info;
767 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
769 return blob->return_value;
773 g_arg_info_is_dipper (GIArgInfo *info)
775 GIBaseInfo *base = (GIBaseInfo *)info;
776 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
782 g_arg_info_is_optional (GIArgInfo *info)
784 GIBaseInfo *base = (GIBaseInfo *)info;
785 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
787 return blob->optional;
791 g_arg_info_may_be_null (GIArgInfo *info)
793 GIBaseInfo *base = (GIBaseInfo *)info;
794 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
796 return blob->allow_none;
800 g_arg_info_get_ownership_transfer (GIArgInfo *info)
802 GIBaseInfo *base = (GIBaseInfo *)info;
803 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
805 if (blob->transfer_ownership)
806 return GI_TRANSFER_EVERYTHING;
807 else if (blob->transfer_container_ownership)
808 return GI_TRANSFER_CONTAINER;
810 return GI_TRANSFER_NOTHING;
814 g_arg_info_get_scope (GIArgInfo *info)
816 GIBaseInfo *base = (GIBaseInfo *)info;
817 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
823 g_arg_info_get_closure (GIArgInfo *info)
825 GIBaseInfo *base = (GIBaseInfo *)info;
826 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
828 return blob->closure;
832 g_arg_info_get_destroy (GIArgInfo *info)
834 GIBaseInfo *base = (GIBaseInfo *)info;
835 ArgBlob *blob = (ArgBlob *)&base->typelib->data[base->offset];
837 return blob->destroy;
841 g_arg_info_get_type (GIArgInfo *info)
843 GIBaseInfo *base = (GIBaseInfo *)info;
845 return g_type_info_new (base, base->typelib, base->offset + G_STRUCT_OFFSET (ArgBlob, arg_type));
848 /* GITypeInfo functions */
850 g_type_info_is_pointer (GITypeInfo *info)
852 GIBaseInfo *base = (GIBaseInfo *)info;
853 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
855 if (type->reserved == 0 && type->reserved2 == 0)
856 return type->pointer;
859 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
861 return iface->pointer;
866 g_type_info_get_tag (GITypeInfo *info)
868 GIBaseInfo *base = (GIBaseInfo *)info;
869 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
871 if (type->reserved == 0 && type->reserved2 == 0)
875 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
882 g_type_info_get_param_type (GITypeInfo *info,
885 GIBaseInfo *base = (GIBaseInfo *)info;
886 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
888 if (!(type->reserved == 0 && type->reserved2 == 0))
890 ParamTypeBlob *param = (ParamTypeBlob *)&base->typelib->data[base->offset];
894 case GI_TYPE_TAG_ARRAY:
895 case GI_TYPE_TAG_GLIST:
896 case GI_TYPE_TAG_GSLIST:
897 case GI_TYPE_TAG_GHASH:
898 return g_type_info_new (base, base->typelib,
899 base->offset + sizeof (ParamTypeBlob)
900 + sizeof (SimpleTypeBlob) * n);
911 g_type_info_get_interface (GITypeInfo *info)
913 GIBaseInfo *base = (GIBaseInfo *)info;
914 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
916 if (!(type->reserved == 0 && type->reserved2 == 0))
918 InterfaceTypeBlob *blob = (InterfaceTypeBlob *)&base->typelib->data[base->offset];
920 if (blob->tag == GI_TYPE_TAG_INTERFACE)
921 return g_info_from_entry (base->repository, base->typelib, blob->interface);
928 g_type_info_get_array_length (GITypeInfo *info)
930 GIBaseInfo *base = (GIBaseInfo *)info;
931 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
933 if (!(type->reserved == 0 && type->reserved2 == 0))
935 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
937 if (blob->tag == GI_TYPE_TAG_ARRAY)
939 if (blob->has_length)
948 g_type_info_get_array_fixed_size (GITypeInfo *info)
950 GIBaseInfo *base = (GIBaseInfo *)info;
951 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
953 if (!(type->reserved == 0 && type->reserved2 == 0))
955 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
957 if (blob->tag == GI_TYPE_TAG_ARRAY)
968 g_type_info_is_zero_terminated (GITypeInfo *info)
970 GIBaseInfo *base = (GIBaseInfo *)info;
971 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
973 if (!(type->reserved == 0 && type->reserved2 == 0))
975 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->typelib->data[base->offset];
977 if (blob->tag == GI_TYPE_TAG_ARRAY)
978 return blob->zero_terminated;
985 g_type_info_get_n_error_domains (GITypeInfo *info)
987 GIBaseInfo *base = (GIBaseInfo *)info;
988 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
990 if (!(type->reserved == 0 && type->reserved2 == 0))
992 ErrorTypeBlob *blob = (ErrorTypeBlob *)&base->typelib->data[base->offset];
994 if (blob->tag == GI_TYPE_TAG_ERROR)
995 return blob->n_domains;
1002 g_type_info_get_error_domain (GITypeInfo *info,
1005 GIBaseInfo *base = (GIBaseInfo *)info;
1006 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->typelib->data[base->offset];
1008 if (!(type->reserved == 0 && type->reserved2 == 0))
1010 ErrorTypeBlob *blob = (ErrorTypeBlob *)&base->typelib->data[base->offset];
1012 if (blob->tag == GI_TYPE_TAG_ERROR)
1013 return (GIErrorDomainInfo *) g_info_from_entry (base->repository,
1022 /* GIErrorDomainInfo functions */
1024 g_error_domain_info_get_quark (GIErrorDomainInfo *info)
1026 GIBaseInfo *base = (GIBaseInfo *)info;
1027 ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->typelib->data[base->offset];
1029 return g_typelib_get_string (base->typelib, blob->get_quark);
1033 g_error_domain_info_get_codes (GIErrorDomainInfo *info)
1035 GIBaseInfo *base = (GIBaseInfo *)info;
1036 ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->typelib->data[base->offset];
1038 return (GIInterfaceInfo *) g_info_from_entry (base->repository,
1039 base->typelib, blob->error_codes);
1043 /* GIValueInfo functions */
1045 g_value_info_get_value (GIValueInfo *info)
1047 GIBaseInfo *base = (GIBaseInfo *)info;
1048 ValueBlob *blob = (ValueBlob *)&base->typelib->data[base->offset];
1050 return (glong)blob->value;
1053 /* GIFieldInfo functions */
1055 g_field_info_get_flags (GIFieldInfo *info)
1057 GIFieldInfoFlags flags;
1059 GIBaseInfo *base = (GIBaseInfo *)info;
1060 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
1065 flags = flags | GI_FIELD_IS_READABLE;
1068 flags = flags | GI_FIELD_IS_WRITABLE;
1074 g_field_info_get_size (GIFieldInfo *info)
1076 GIBaseInfo *base = (GIBaseInfo *)info;
1077 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
1083 g_field_info_get_offset (GIFieldInfo *info)
1085 GIBaseInfo *base = (GIBaseInfo *)info;
1086 FieldBlob *blob = (FieldBlob *)&base->typelib->data[base->offset];
1088 return blob->struct_offset;
1092 g_field_info_get_type (GIFieldInfo *info)
1094 GIBaseInfo *base = (GIBaseInfo *)info;
1096 return g_type_info_new (base, base->typelib, base->offset + G_STRUCT_OFFSET (FieldBlob, type));
1099 /* GIRegisteredTypeInfo functions */
1101 g_registered_type_info_get_type_name (GIRegisteredTypeInfo *info)
1103 GIBaseInfo *base = (GIBaseInfo *)info;
1104 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&base->typelib->data[base->offset];
1106 if (blob->gtype_name)
1107 return g_typelib_get_string (base->typelib, blob->gtype_name);
1113 g_registered_type_info_get_type_init (GIRegisteredTypeInfo *info)
1115 GIBaseInfo *base = (GIBaseInfo *)info;
1116 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&base->typelib->data[base->offset];
1118 if (blob->gtype_init)
1119 return g_typelib_get_string (base->typelib, blob->gtype_init);
1125 g_registered_type_info_get_g_type (GIRegisteredTypeInfo *info)
1127 const char *type_init;
1128 GType (* get_type_func) (void);
1130 type_init = g_registered_type_info_get_type_init (info);
1132 if (type_init == NULL)
1134 else if (!strcmp (type_init, "intern"))
1135 return G_TYPE_OBJECT;
1137 get_type_func = NULL;
1138 if (!g_typelib_symbol (((GIBaseInfo*)info)->typelib,
1140 (void**) &get_type_func))
1143 return (* get_type_func) ();
1146 /* GIStructInfo functions */
1148 g_struct_info_get_n_fields (GIStructInfo *info)
1150 GIBaseInfo *base = (GIBaseInfo *)info;
1151 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1153 return blob->n_fields;
1157 g_struct_info_get_field (GIStructInfo *info,
1160 GIBaseInfo *base = (GIBaseInfo *)info;
1161 Header *header = (Header *)base->typelib->data;
1163 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib,
1164 base->offset + header->struct_blob_size +
1165 n * header->field_blob_size);
1169 g_struct_info_get_n_methods (GIStructInfo *info)
1171 GIBaseInfo *base = (GIBaseInfo *)info;
1172 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1174 return blob->n_methods;
1178 g_struct_info_get_method (GIStructInfo *info,
1181 GIBaseInfo *base = (GIBaseInfo *)info;
1182 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1183 Header *header = (Header *)base->typelib->data;
1186 offset = base->offset + header->struct_blob_size
1187 + blob->n_fields * header->field_blob_size
1188 + n * header->function_blob_size;
1189 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1190 base->typelib, offset);
1193 static GIFunctionInfo *
1194 find_method (GIBaseInfo *base,
1200 Header *header = (Header *)base->typelib->data;
1203 for (i = 0; i < n_methods; i++)
1205 FunctionBlob *fblob = (FunctionBlob *)&base->typelib->data[offset];
1206 const gchar *fname = (const gchar *)&base->typelib->data[fblob->name];
1208 if (strcmp (name, fname) == 0)
1209 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1210 base->typelib, offset);
1212 offset += header->function_blob_size;
1219 g_struct_info_find_method (GIStructInfo *info,
1223 GIBaseInfo *base = (GIBaseInfo *)info;
1224 Header *header = (Header *)base->typelib->data;
1225 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1227 offset = base->offset + header->struct_blob_size
1228 + blob->n_fields * header->field_blob_size;
1230 return find_method (base, offset, blob->n_methods, name);
1234 g_struct_info_get_size (GIStructInfo *info)
1236 GIBaseInfo *base = (GIBaseInfo *)info;
1237 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1243 g_struct_info_get_alignment (GIStructInfo *info)
1245 GIBaseInfo *base = (GIBaseInfo *)info;
1246 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1248 return blob->alignment;
1252 * g_struct_info_is_gtype_struct:
1253 * @info: GIStructInfo
1255 * Return true if this structure represents the "class structure" for some
1256 * #GObject or #GInterface. This function is mainly useful to hide this kind of structure
1257 * from generated public APIs.
1259 * Returns: %TRUE if this is a class struct, %FALSE otherwise
1262 g_struct_info_is_gtype_struct (GIStructInfo *info)
1264 GIBaseInfo *base = (GIBaseInfo *)info;
1265 StructBlob *blob = (StructBlob *)&base->typelib->data[base->offset];
1267 return blob->is_gtype_struct;
1271 g_enum_info_get_n_values (GIEnumInfo *info)
1273 GIBaseInfo *base = (GIBaseInfo *)info;
1274 EnumBlob *blob = (EnumBlob *)&base->typelib->data[base->offset];
1276 return blob->n_values;
1280 g_enum_info_get_value (GIEnumInfo *info,
1283 GIBaseInfo *base = (GIBaseInfo *)info;
1284 Header *header = (Header *)base->typelib->data;
1287 offset = base->offset + header->enum_blob_size
1288 + n * header->value_blob_size;
1289 return (GIValueInfo *) g_info_new (GI_INFO_TYPE_VALUE, base, base->typelib, offset);
1293 * g_enum_info_get_storage_type:
1296 * Gets the tag of the type used for the enum in the C ABI. This will
1297 * will be a signed or unsigned integral type.
1299 * Note that in the current implementation the width of the type is
1300 * computed correctly, but the signed or unsigned nature of the type
1301 * may not match the sign of the type used by the C compiler.
1303 * Return Value: the storage type for the enumeration
1306 g_enum_info_get_storage_type (GIEnumInfo *info)
1308 GIBaseInfo *base = (GIBaseInfo *)info;
1309 EnumBlob *blob = (EnumBlob *)&base->typelib->data[base->offset];
1311 return blob->storage_type;
1314 /* GIObjectInfo functions */
1316 g_object_info_get_parent (GIObjectInfo *info)
1318 GIBaseInfo *base = (GIBaseInfo *)info;
1319 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1322 return (GIObjectInfo *) g_info_from_entry (base->repository,
1323 base->typelib, blob->parent);
1329 g_object_info_get_abstract (GIObjectInfo *info)
1331 GIBaseInfo *base = (GIBaseInfo *)info;
1332 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1333 return blob->abstract != 0;
1337 g_object_info_get_type_name (GIObjectInfo *info)
1339 GIBaseInfo *base = (GIBaseInfo *)info;
1340 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1342 return g_typelib_get_string (base->typelib, blob->gtype_name);
1346 g_object_info_get_type_init (GIObjectInfo *info)
1348 GIBaseInfo *base = (GIBaseInfo *)info;
1349 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1351 return g_typelib_get_string (base->typelib, blob->gtype_init);
1355 g_object_info_get_n_interfaces (GIObjectInfo *info)
1357 GIBaseInfo *base = (GIBaseInfo *)info;
1358 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1360 return blob->n_interfaces;
1364 g_object_info_get_interface (GIObjectInfo *info,
1367 GIBaseInfo *base = (GIBaseInfo *)info;
1368 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1370 return (GIInterfaceInfo *) g_info_from_entry (base->repository,
1371 base->typelib, blob->interfaces[n]);
1375 g_object_info_get_n_fields (GIObjectInfo *info)
1377 GIBaseInfo *base = (GIBaseInfo *)info;
1378 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1380 return blob->n_fields;
1384 g_object_info_get_field (GIObjectInfo *info,
1388 GIBaseInfo *base = (GIBaseInfo *)info;
1389 Header *header = (Header *)base->typelib->data;
1390 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1392 offset = base->offset + header->object_blob_size
1393 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1394 + n * header->field_blob_size;
1396 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib, offset);
1400 g_object_info_get_n_properties (GIObjectInfo *info)
1402 GIBaseInfo *base = (GIBaseInfo *)info;
1403 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1405 return blob->n_properties;
1409 g_object_info_get_property (GIObjectInfo *info,
1413 GIBaseInfo *base = (GIBaseInfo *)info;
1414 Header *header = (Header *)base->typelib->data;
1415 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1417 offset = base->offset + header->object_blob_size
1418 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1419 + blob->n_fields * header->field_blob_size
1420 + n * header->property_blob_size;
1422 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base,
1423 base->typelib, offset);
1427 g_object_info_get_n_methods (GIObjectInfo *info)
1429 GIBaseInfo *base = (GIBaseInfo *)info;
1430 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1432 return blob->n_methods;
1436 g_object_info_get_method (GIObjectInfo *info,
1440 GIBaseInfo *base = (GIBaseInfo *)info;
1441 Header *header = (Header *)base->typelib->data;
1442 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1444 offset = base->offset + header->object_blob_size
1445 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1446 + blob->n_fields * header->field_blob_size
1447 + blob->n_properties * header->property_blob_size
1448 + n * header->function_blob_size;
1450 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1451 base->typelib, offset);
1455 g_object_info_find_method (GIObjectInfo *info,
1459 GIBaseInfo *base = (GIBaseInfo *)info;
1460 Header *header = (Header *)base->typelib->data;
1461 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1463 offset = base->offset + header->object_blob_size
1464 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1465 + blob->n_fields * header->field_blob_size +
1466 + blob->n_properties * header->property_blob_size;
1468 return find_method (base, offset, blob->n_methods, name);
1472 g_object_info_get_n_signals (GIObjectInfo *info)
1474 GIBaseInfo *base = (GIBaseInfo *)info;
1475 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1477 return blob->n_signals;
1481 g_object_info_get_signal (GIObjectInfo *info,
1485 GIBaseInfo *base = (GIBaseInfo *)info;
1486 Header *header = (Header *)base->typelib->data;
1487 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1489 offset = base->offset + header->object_blob_size
1490 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1491 + blob->n_fields * header->field_blob_size
1492 + blob->n_properties * header->property_blob_size
1493 + blob->n_methods * header->function_blob_size
1494 + n * header->signal_blob_size;
1496 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base,
1497 base->typelib, offset);
1501 g_object_info_get_n_vfuncs (GIObjectInfo *info)
1503 GIBaseInfo *base = (GIBaseInfo *)info;
1504 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1506 return blob->n_vfuncs;
1510 g_object_info_get_vfunc (GIObjectInfo *info,
1514 GIBaseInfo *base = (GIBaseInfo *)info;
1515 Header *header = (Header *)base->typelib->data;
1516 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1518 offset = base->offset + header->object_blob_size
1519 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1520 + blob->n_fields * header->field_blob_size
1521 + blob->n_properties * header->property_blob_size
1522 + blob->n_methods * header->function_blob_size
1523 + blob->n_signals * header->signal_blob_size
1524 + n * header->vfunc_blob_size;
1526 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1527 base->typelib, offset);
1530 static GIVFuncInfo *
1531 find_vfunc (GIBaseInfo *base,
1537 Header *header = (Header *)base->typelib->data;
1540 for (i = 0; i < n_vfuncs; i++)
1542 VFuncBlob *fblob = (VFuncBlob *)&base->typelib->data[offset];
1543 const gchar *fname = (const gchar *)&base->typelib->data[fblob->name];
1545 if (strcmp (name, fname) == 0)
1546 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1547 base->typelib, offset);
1549 offset += header->vfunc_blob_size;
1556 * g_object_info_find_vfunc:
1557 * @info: An #GIObjectInfo
1558 * @name: The name of a virtual function to find.
1560 * Locate a virtual function slot with name @name. Note that the namespace
1561 * for virtuals is distinct from that of methods; there may or may not be
1562 * a concrete method associated for a virtual. If there is one, it may
1563 * be retrieved using #g_vfunc_info_get_invoker. See the documentation for
1564 * that function for more information on invoking virtuals.
1566 * Return value: (transfer full): A #GIVFuncInfo, or %NULL if none with name @name.
1569 g_object_info_find_vfunc (GIObjectInfo *info,
1573 GIBaseInfo *base = (GIBaseInfo *)info;
1574 Header *header = (Header *)base->typelib->data;
1575 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1577 offset = base->offset + header->object_blob_size
1578 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1579 + blob->n_fields * header->field_blob_size
1580 + blob->n_properties * header->property_blob_size
1581 + blob->n_methods * header->function_blob_size
1582 + blob->n_signals * header->signal_blob_size;
1584 return find_vfunc (base, offset, blob->n_vfuncs, name);
1588 g_object_info_get_n_constants (GIObjectInfo *info)
1590 GIBaseInfo *base = (GIBaseInfo *)info;
1591 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1593 return blob->n_constants;
1597 g_object_info_get_constant (GIObjectInfo *info,
1601 GIBaseInfo *base = (GIBaseInfo *)info;
1602 Header *header = (Header *)base->typelib->data;
1603 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1605 offset = base->offset + header->object_blob_size
1606 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1607 + blob->n_fields * header->field_blob_size
1608 + blob->n_properties * header->property_blob_size
1609 + blob->n_methods * header->function_blob_size
1610 + blob->n_signals * header->signal_blob_size
1611 + blob->n_vfuncs * header->vfunc_blob_size
1612 + n * header->constant_blob_size;
1614 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1615 base->typelib, offset);
1619 * g_object_info_get_class_struct:
1620 * @info: A #GIObjectInfo to query
1622 * Every #GObject has two structures; an instance structure and a class
1623 * structure. This function returns the metadata for the class structure.
1625 * Returns: a #GIStructInfo for the class struct or %NULL if none found.
1628 g_object_info_get_class_struct (GIObjectInfo *info)
1630 GIBaseInfo *base = (GIBaseInfo *)info;
1631 ObjectBlob *blob = (ObjectBlob *)&base->typelib->data[base->offset];
1633 if (blob->gtype_struct)
1634 return (GIStructInfo *) g_info_from_entry (base->repository,
1635 base->typelib, blob->gtype_struct);
1640 /* GIInterfaceInfo functions */
1642 g_interface_info_get_n_prerequisites (GIInterfaceInfo *info)
1644 GIBaseInfo *base = (GIBaseInfo *)info;
1645 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1647 return blob->n_prerequisites;
1651 g_interface_info_get_prerequisite (GIInterfaceInfo *info,
1654 GIBaseInfo *base = (GIBaseInfo *)info;
1655 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1657 return g_info_from_entry (base->repository,
1658 base->typelib, blob->prerequisites[n]);
1663 g_interface_info_get_n_properties (GIInterfaceInfo *info)
1665 GIBaseInfo *base = (GIBaseInfo *)info;
1666 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1668 return blob->n_properties;
1672 g_interface_info_get_property (GIInterfaceInfo *info,
1676 GIBaseInfo *base = (GIBaseInfo *)info;
1677 Header *header = (Header *)base->typelib->data;
1678 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1680 offset = base->offset + header->interface_blob_size
1681 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1682 + n * header->property_blob_size;
1684 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base,
1685 base->typelib, offset);
1689 g_interface_info_get_n_methods (GIInterfaceInfo *info)
1691 GIBaseInfo *base = (GIBaseInfo *)info;
1692 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1694 return blob->n_methods;
1698 g_interface_info_get_method (GIInterfaceInfo *info,
1702 GIBaseInfo *base = (GIBaseInfo *)info;
1703 Header *header = (Header *)base->typelib->data;
1704 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1706 offset = base->offset + header->interface_blob_size
1707 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1708 + blob->n_properties * header->property_blob_size
1709 + n * header->function_blob_size;
1711 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1712 base->typelib, offset);
1716 g_interface_info_find_method (GIInterfaceInfo *info,
1720 GIBaseInfo *base = (GIBaseInfo *)info;
1721 Header *header = (Header *)base->typelib->data;
1722 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1724 offset = base->offset + header->interface_blob_size
1725 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1726 + blob->n_properties * header->property_blob_size;
1728 return find_method (base, offset, blob->n_methods, name);
1732 g_interface_info_get_n_signals (GIInterfaceInfo *info)
1734 GIBaseInfo *base = (GIBaseInfo *)info;
1735 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1737 return blob->n_signals;
1741 g_interface_info_get_signal (GIInterfaceInfo *info,
1745 GIBaseInfo *base = (GIBaseInfo *)info;
1746 Header *header = (Header *)base->typelib->data;
1747 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1749 offset = base->offset + header->interface_blob_size
1750 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1751 + blob->n_properties * header->property_blob_size
1752 + blob->n_methods * header->function_blob_size
1753 + n * header->signal_blob_size;
1755 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base,
1756 base->typelib, offset);
1760 g_interface_info_get_n_vfuncs (GIInterfaceInfo *info)
1762 GIBaseInfo *base = (GIBaseInfo *)info;
1763 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1765 return blob->n_vfuncs;
1769 g_interface_info_get_vfunc (GIInterfaceInfo *info,
1773 GIBaseInfo *base = (GIBaseInfo *)info;
1774 Header *header = (Header *)base->typelib->data;
1775 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1777 offset = base->offset + header->interface_blob_size
1778 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1779 + blob->n_properties * header->property_blob_size
1780 + blob->n_methods * header->function_blob_size
1781 + blob->n_signals * header->signal_blob_size
1782 + n * header->vfunc_blob_size;
1784 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1785 base->typelib, offset);
1789 * g_interface_info_find_vfunc:
1790 * @info: An #GIObjectInfo
1791 * @name: The name of a virtual function to find.
1793 * Locate a virtual function slot with name @name. See the documentation
1794 * for #g_object_info_find_vfunc for more information on virtuals.
1796 * Return value: (transfer full): A #GIVFuncInfo, or %NULL if none with name @name.
1799 g_interface_info_find_vfunc (GIInterfaceInfo *info,
1803 GIBaseInfo *base = (GIBaseInfo *)info;
1804 Header *header = (Header *)base->typelib->data;
1805 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1807 offset = base->offset + header->interface_blob_size
1808 + (blob->n_prerequisites + blob->n_prerequisites % 2) * 2
1809 + blob->n_properties * header->property_blob_size
1810 + blob->n_methods * header->function_blob_size
1811 + blob->n_signals * header->signal_blob_size;
1813 return find_vfunc (base, offset, blob->n_vfuncs, name);
1817 g_interface_info_get_n_constants (GIInterfaceInfo *info)
1819 GIBaseInfo *base = (GIBaseInfo *)info;
1820 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1822 return blob->n_constants;
1826 g_interface_info_get_constant (GIInterfaceInfo *info,
1830 GIBaseInfo *base = (GIBaseInfo *)info;
1831 Header *header = (Header *)base->typelib->data;
1832 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1834 offset = base->offset + header->interface_blob_size
1835 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1836 + blob->n_properties * header->property_blob_size
1837 + blob->n_methods * header->function_blob_size
1838 + blob->n_signals * header->signal_blob_size
1839 + blob->n_vfuncs * header->vfunc_blob_size
1840 + n * header->constant_blob_size;
1842 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1843 base->typelib, offset);
1847 * g_interface_info_get_iface_struct:
1848 * @info: A #GIInterfaceInfo to query
1850 * Returns the layout C structure associated with this #GInterface.
1852 * Returns: A #GIStructInfo for the class struct or %NULL if none found.
1855 g_interface_info_get_iface_struct (GIInterfaceInfo *info)
1857 GIBaseInfo *base = (GIBaseInfo *)info;
1858 InterfaceBlob *blob = (InterfaceBlob *)&base->typelib->data[base->offset];
1860 if (blob->gtype_struct)
1861 return (GIStructInfo *) g_info_from_entry (base->repository,
1862 base->typelib, blob->gtype_struct);
1867 /* GIPropertyInfo functions */
1869 g_property_info_get_flags (GIPropertyInfo *info)
1872 GIBaseInfo *base = (GIBaseInfo *)info;
1873 PropertyBlob *blob = (PropertyBlob *)&base->typelib->data[base->offset];
1878 flags = flags | G_PARAM_READABLE;
1881 flags = flags | G_PARAM_WRITABLE;
1883 if (blob->construct)
1884 flags = flags | G_PARAM_CONSTRUCT;
1886 if (blob->construct_only)
1887 flags = flags | G_PARAM_CONSTRUCT_ONLY;
1893 g_property_info_get_type (GIPropertyInfo *info)
1895 GIBaseInfo *base = (GIBaseInfo *)info;
1897 return g_type_info_new (base, base->typelib, base->offset + G_STRUCT_OFFSET (PropertyBlob, type));
1901 /* GISignalInfo functions */
1903 g_signal_info_get_flags (GISignalInfo *info)
1907 GIBaseInfo *base = (GIBaseInfo *)info;
1908 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1912 if (blob->run_first)
1913 flags = flags | G_SIGNAL_RUN_FIRST;
1916 flags = flags | G_SIGNAL_RUN_LAST;
1918 if (blob->run_cleanup)
1919 flags = flags | G_SIGNAL_RUN_CLEANUP;
1921 if (blob->no_recurse)
1922 flags = flags | G_SIGNAL_NO_RECURSE;
1925 flags = flags | G_SIGNAL_DETAILED;
1928 flags = flags | G_SIGNAL_ACTION;
1931 flags = flags | G_SIGNAL_NO_HOOKS;
1937 g_signal_info_get_class_closure (GISignalInfo *info)
1939 GIBaseInfo *base = (GIBaseInfo *)info;
1940 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1942 if (blob->has_class_closure)
1943 return g_interface_info_get_vfunc ((GIInterfaceInfo *)base->container, blob->class_closure);
1949 g_signal_info_true_stops_emit (GISignalInfo *info)
1951 GIBaseInfo *base = (GIBaseInfo *)info;
1952 SignalBlob *blob = (SignalBlob *)&base->typelib->data[base->offset];
1954 return blob->true_stops_emit;
1957 /* GIVFuncInfo functions */
1959 g_vfunc_info_get_flags (GIVFuncInfo *info)
1961 GIVFuncInfoFlags flags;
1963 GIBaseInfo *base = (GIBaseInfo *)info;
1964 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
1968 if (blob->must_chain_up)
1969 flags = flags | GI_VFUNC_MUST_CHAIN_UP;
1971 if (blob->must_be_implemented)
1972 flags = flags | GI_VFUNC_MUST_OVERRIDE;
1974 if (blob->must_not_be_implemented)
1975 flags = flags | GI_VFUNC_MUST_NOT_OVERRIDE;
1981 g_vfunc_info_get_offset (GIVFuncInfo *info)
1983 GIBaseInfo *base = (GIBaseInfo *)info;
1984 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
1986 return blob->struct_offset;
1990 g_vfunc_info_get_signal (GIVFuncInfo *info)
1992 GIBaseInfo *base = (GIBaseInfo *)info;
1993 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
1995 if (blob->class_closure)
1996 return g_interface_info_get_signal ((GIInterfaceInfo *)base->container, blob->signal);
2002 * g_vfunc_info_get_invoker:
2003 * @info: A #GIVFuncInfo
2005 * If this virtual function has an associated invoker method, this
2006 * method will return it. An invoker method is a C entry point.
2008 * Not all virtuals will have invokers.
2010 * Return value: (transfer full): An invoker function, or %NULL if none known
2013 g_vfunc_info_get_invoker (GIVFuncInfo *info)
2015 GIBaseInfo *base = (GIBaseInfo *)info;
2016 VFuncBlob *blob = (VFuncBlob *)&base->typelib->data[base->offset];
2017 GIBaseInfo *container = base->container;
2018 GIInfoType parent_type;
2020 /* 1023 = 0x3ff is the maximum of the 10 bits for invoker index */
2021 if (blob->invoker == 1023)
2024 parent_type = g_base_info_get_type (container);
2025 if (parent_type == GI_INFO_TYPE_OBJECT)
2026 return g_object_info_get_method ((GIObjectInfo*)container, blob->invoker);
2027 else if (parent_type == GI_INFO_TYPE_INTERFACE)
2028 return g_interface_info_get_method ((GIInterfaceInfo*)container, blob->invoker);
2030 g_assert_not_reached ();
2033 /* GIConstantInfo functions */
2035 g_constant_info_get_type (GIConstantInfo *info)
2037 GIBaseInfo *base = (GIBaseInfo *)info;
2039 return g_type_info_new (base, base->typelib, base->offset + 8);
2043 g_constant_info_get_value (GIConstantInfo *info,
2046 GIBaseInfo *base = (GIBaseInfo *)info;
2047 ConstantBlob *blob = (ConstantBlob *)&base->typelib->data[base->offset];
2049 /* FIXME non-basic types ? */
2050 if (blob->type.reserved == 0 && blob->type.reserved2 == 0)
2052 if (blob->type.pointer)
2053 value->v_pointer = g_memdup (&base->typelib->data[blob->offset], blob->size);
2056 switch (blob->type.tag)
2058 case GI_TYPE_TAG_BOOLEAN:
2059 value->v_boolean = *(gboolean*)&base->typelib->data[blob->offset];
2061 case GI_TYPE_TAG_INT8:
2062 value->v_int8 = *(gint8*)&base->typelib->data[blob->offset];
2064 case GI_TYPE_TAG_UINT8:
2065 value->v_uint8 = *(guint8*)&base->typelib->data[blob->offset];
2067 case GI_TYPE_TAG_INT16:
2068 value->v_int16 = *(gint16*)&base->typelib->data[blob->offset];
2070 case GI_TYPE_TAG_UINT16:
2071 value->v_uint16 = *(guint16*)&base->typelib->data[blob->offset];
2073 case GI_TYPE_TAG_INT32:
2074 value->v_int32 = *(gint32*)&base->typelib->data[blob->offset];
2076 case GI_TYPE_TAG_UINT32:
2077 value->v_uint32 = *(guint32*)&base->typelib->data[blob->offset];
2079 case GI_TYPE_TAG_INT64:
2080 value->v_int64 = *(gint64*)&base->typelib->data[blob->offset];
2082 case GI_TYPE_TAG_UINT64:
2083 value->v_uint64 = *(guint64*)&base->typelib->data[blob->offset];
2085 case GI_TYPE_TAG_FLOAT:
2086 value->v_float = *(gfloat*)&base->typelib->data[blob->offset];
2088 case GI_TYPE_TAG_DOUBLE:
2089 value->v_double = *(gdouble*)&base->typelib->data[blob->offset];
2091 case GI_TYPE_TAG_TIME_T:
2092 value->v_long = *(long*)&base->typelib->data[blob->offset];
2094 case GI_TYPE_TAG_SHORT:
2095 value->v_short = *(gshort*)&base->typelib->data[blob->offset];
2097 case GI_TYPE_TAG_USHORT:
2098 value->v_ushort = *(gushort*)&base->typelib->data[blob->offset];
2100 case GI_TYPE_TAG_INT:
2101 value->v_int = *(gint*)&base->typelib->data[blob->offset];
2103 case GI_TYPE_TAG_UINT:
2104 value->v_uint = *(guint*)&base->typelib->data[blob->offset];
2106 case GI_TYPE_TAG_LONG:
2107 value->v_long = *(glong*)&base->typelib->data[blob->offset];
2109 case GI_TYPE_TAG_ULONG:
2110 value->v_ulong = *(gulong*)&base->typelib->data[blob->offset];
2119 /* GIUnionInfo functions */
2121 g_union_info_get_n_fields (GIUnionInfo *info)
2123 GIBaseInfo *base = (GIBaseInfo *)info;
2124 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2126 return blob->n_fields;
2130 g_union_info_get_field (GIUnionInfo *info,
2133 GIBaseInfo *base = (GIBaseInfo *)info;
2134 Header *header = (Header *)base->typelib->data;
2136 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->typelib,
2137 base->offset + header->union_blob_size +
2138 n * header->field_blob_size);
2142 g_union_info_get_n_methods (GIUnionInfo *info)
2144 GIBaseInfo *base = (GIBaseInfo *)info;
2145 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2147 return blob->n_functions;
2151 g_union_info_get_method (GIUnionInfo *info,
2154 GIBaseInfo *base = (GIBaseInfo *)info;
2155 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2156 Header *header = (Header *)base->typelib->data;
2159 offset = base->offset + header->union_blob_size
2160 + blob->n_fields * header->field_blob_size
2161 + n * header->function_blob_size;
2162 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
2163 base->typelib, offset);
2167 g_union_info_is_discriminated (GIUnionInfo *info)
2169 GIBaseInfo *base = (GIBaseInfo *)info;
2170 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2172 return blob->discriminated;
2176 g_union_info_get_discriminator_offset (GIUnionInfo *info)
2178 GIBaseInfo *base = (GIBaseInfo *)info;
2179 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2181 return blob->discriminator_offset;
2185 g_union_info_get_discriminator_type (GIUnionInfo *info)
2187 GIBaseInfo *base = (GIBaseInfo *)info;
2189 return g_type_info_new (base, base->typelib, base->offset + 24);
2193 g_union_info_get_discriminator (GIUnionInfo *info,
2196 GIBaseInfo *base = (GIBaseInfo *)info;
2197 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2199 if (blob->discriminated)
2201 Header *header = (Header *)base->typelib->data;
2204 offset = base->offset + header->union_blob_size
2205 + blob->n_fields * header->field_blob_size
2206 + blob->n_functions * header->function_blob_size
2207 + n * header->constant_blob_size;
2209 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
2210 base->typelib, offset);
2217 g_union_info_find_method (GIUnionInfo *info,
2221 GIBaseInfo *base = (GIBaseInfo *)info;
2222 Header *header = (Header *)base->typelib->data;
2223 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2225 offset = base->offset + header->union_blob_size
2226 + blob->n_fields * header->field_blob_size;
2228 return find_method (base, offset, blob->n_functions, name);
2232 g_union_info_get_size (GIUnionInfo *info)
2234 GIBaseInfo *base = (GIBaseInfo *)info;
2235 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2241 g_union_info_get_alignment (GIUnionInfo *info)
2243 GIBaseInfo *base = (GIBaseInfo *)info;
2244 UnionBlob *blob = (UnionBlob *)&base->typelib->data[base->offset];
2246 return blob->alignment;