1 /* GObject introspection: Repository implementation
3 * Copyright (C) 2005 Matthias Clasen
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
24 #include <glib-object.h>
26 #include "girepository.h"
27 #include "gmetadata.h"
33 GIBaseInfo *container;
39 struct _GIUnresolvedInfo
43 GIBaseInfo *container;
46 const gchar *namespace;
49 struct _GICallableInfo
54 struct _GIFunctionInfo
56 GICallableInfo callable;
59 struct _GICallbackInfo
61 GICallableInfo callable;
64 struct _GIRegisteredTypeInfo
71 GIRegisteredTypeInfo registered;
76 GIRegisteredTypeInfo registered;
81 GIRegisteredTypeInfo registered;
84 struct _GIInterfaceInfo
86 GIRegisteredTypeInfo registered;
89 struct _GIConstantInfo
101 GICallableInfo callable;
106 GICallableInfo callable;
109 struct _GIPropertyInfo
131 GIRegisteredTypeInfo registered;
137 g_info_new (GIInfoType type,
138 GIBaseInfo *container,
144 info = g_new0 (GIBaseInfo, 1);
149 info->metadata = metadata;
150 info->offset = offset;
153 info->container = g_base_info_ref (container);
159 g_info_from_entry (GMetadata *metadata,
163 DirEntry *entry = g_metadata_get_dir_entry (metadata, index);
166 result = g_info_new (entry->blob_type, NULL, metadata, entry->offset);
169 const gchar *namespace = g_metadata_get_string (metadata, entry->offset);
170 const gchar *name = g_metadata_get_string (metadata, entry->name);
172 GIRepository *repository = g_irepository_get_default ();
174 result = g_irepository_find_by_name (repository, namespace, name);
177 GIUnresolvedInfo *unresolved;
179 unresolved = g_new0 (GIUnresolvedInfo, 1);
181 unresolved->type = GI_INFO_TYPE_UNRESOLVED;
182 unresolved->ref_count = 1;
183 unresolved->container = NULL;
184 unresolved->name = name;
185 unresolved->namespace = namespace;
187 result = (GIBaseInfo*)unresolved;
194 /* GIBaseInfo functions */
196 g_base_info_ref (GIBaseInfo *info)
204 g_base_info_unref (GIBaseInfo *info)
208 if (!info->ref_count)
211 g_base_info_unref (info->container);
218 g_base_info_get_type (GIBaseInfo *info)
225 g_base_info_get_name (GIBaseInfo *info)
229 case GI_INFO_TYPE_FUNCTION:
230 case GI_INFO_TYPE_CALLBACK:
231 case GI_INFO_TYPE_STRUCT:
232 case GI_INFO_TYPE_BOXED:
233 case GI_INFO_TYPE_ENUM:
234 case GI_INFO_TYPE_FLAGS:
235 case GI_INFO_TYPE_OBJECT:
236 case GI_INFO_TYPE_INTERFACE:
237 case GI_INFO_TYPE_CONSTANT:
238 case GI_INFO_TYPE_ERROR_DOMAIN:
239 case GI_INFO_TYPE_UNION:
241 CommonBlob *blob = (CommonBlob *)&info->metadata->data[info->offset];
243 return g_metadata_get_string (info->metadata, blob->name);
247 case GI_INFO_TYPE_VALUE:
249 ValueBlob *blob = (ValueBlob *)&info->metadata->data[info->offset];
251 return g_metadata_get_string (info->metadata, blob->name);
255 case GI_INFO_TYPE_SIGNAL:
257 SignalBlob *blob = (SignalBlob *)&info->metadata->data[info->offset];
259 return g_metadata_get_string (info->metadata, blob->name);
263 case GI_INFO_TYPE_PROPERTY:
265 PropertyBlob *blob = (PropertyBlob *)&info->metadata->data[info->offset];
267 return g_metadata_get_string (info->metadata, blob->name);
271 case GI_INFO_TYPE_VFUNC:
273 VFuncBlob *blob = (VFuncBlob *)&info->metadata->data[info->offset];
275 return g_metadata_get_string (info->metadata, blob->name);
279 case GI_INFO_TYPE_FIELD:
281 FieldBlob *blob = (FieldBlob *)&info->metadata->data[info->offset];
283 return g_metadata_get_string (info->metadata, blob->name);
287 case GI_INFO_TYPE_ARG:
289 ArgBlob *blob = (ArgBlob *)&info->metadata->data[info->offset];
291 return g_metadata_get_string (info->metadata, blob->name);
295 case GI_INFO_TYPE_UNRESOLVED:
297 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
299 return unresolved->name;
303 case GI_INFO_TYPE_TYPE:
312 g_base_info_get_namespace (GIBaseInfo *info)
314 Header *header = (Header *)info->metadata->data;
316 if (info->type == GI_INFO_TYPE_UNRESOLVED)
318 GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
320 return unresolved->namespace;
323 return g_metadata_get_string (info->metadata, header->namespace);
327 g_base_info_is_deprecated (GIBaseInfo *info)
331 case GI_INFO_TYPE_FUNCTION:
332 case GI_INFO_TYPE_CALLBACK:
333 case GI_INFO_TYPE_STRUCT:
334 case GI_INFO_TYPE_BOXED:
335 case GI_INFO_TYPE_ENUM:
336 case GI_INFO_TYPE_FLAGS:
337 case GI_INFO_TYPE_OBJECT:
338 case GI_INFO_TYPE_INTERFACE:
339 case GI_INFO_TYPE_CONSTANT:
340 case GI_INFO_TYPE_ERROR_DOMAIN:
342 CommonBlob *blob = (CommonBlob *)&info->metadata->data[info->offset];
344 return blob->deprecated;
348 case GI_INFO_TYPE_VALUE:
350 ValueBlob *blob = (ValueBlob *)&info->metadata->data[info->offset];
352 return blob->deprecated;
356 case GI_INFO_TYPE_SIGNAL:
358 SignalBlob *blob = (SignalBlob *)&info->metadata->data[info->offset];
360 return blob->deprecated;
364 case GI_INFO_TYPE_PROPERTY:
366 PropertyBlob *blob = (PropertyBlob *)&info->metadata->data[info->offset];
368 return blob->deprecated;
372 case GI_INFO_TYPE_VFUNC:
373 case GI_INFO_TYPE_FIELD:
374 case GI_INFO_TYPE_ARG:
375 case GI_INFO_TYPE_TYPE:
377 /* no deprecation flag for these */
384 cmp_annotation (const void *av,
387 const AnnotationBlob *a = av;
388 const AnnotationBlob *b = bv;
390 if (b->offset < a->offset)
393 if (b->offset > a->offset)
400 g_base_info_get_annotation (GIBaseInfo *info,
403 GIBaseInfo *base = (GIBaseInfo *)info;
404 Header *header = (Header *)base->metadata->data;
405 AnnotationBlob blob, *first, *after, *res, *next;
408 blob.offset = base->offset;
410 first = (AnnotationBlob *) &base->metadata->data[header->annotations];
411 after = (AnnotationBlob *) &base->metadata->data[header->annotations +
412 header->n_annotations * header->annotation_blob_size];
414 res = bsearch (&blob, first, header->n_annotations,
415 header->annotation_blob_size, cmp_annotation);
424 next = res -= header->annotation_blob_size;
426 while (next >= first && next->offset == base->offset);
433 rname = g_metadata_get_string (base->metadata, res->name);
434 if (strcmp (name, rname) == 0)
435 return g_metadata_get_string (base->metadata, res->value);
437 next = res += header->annotation_blob_size;
439 while (next < after && next->offset == base->offset);
445 g_base_info_get_container (GIBaseInfo *info)
447 return info->container;
451 g_base_info_get_metadata (GIBaseInfo *info)
453 return info->metadata;
456 /* GIFunctionInfo functions */
458 g_function_info_get_symbol (GIFunctionInfo *info)
460 GIBaseInfo *base = (GIBaseInfo *)info;
461 FunctionBlob *blob = (FunctionBlob *)&base->metadata->data[base->offset];
463 return g_metadata_get_string (base->metadata, blob->symbol);
467 g_function_info_get_flags (GIFunctionInfo *info)
469 GIFunctionInfoFlags flags;
470 GIBaseInfo *base = (GIBaseInfo *)info;
471 FunctionBlob *blob = (FunctionBlob *)&base->metadata->data[base->offset];
475 if (base->container != NULL)
476 flags = flags | GI_FUNCTION_IS_METHOD;
478 if (blob->constructor)
479 flags = flags | GI_FUNCTION_IS_CONSTRUCTOR;
482 flags = flags | GI_FUNCTION_IS_GETTER;
485 flags = flags | GI_FUNCTION_IS_SETTER;
487 if (blob->wraps_vfunc)
488 flags = flags | GI_FUNCTION_WRAPS_VFUNC;
494 g_function_info_get_property (GIFunctionInfo *info)
496 GIBaseInfo *base = (GIBaseInfo *)info;
497 FunctionBlob *blob = (FunctionBlob *)&base->metadata->data[base->offset];
498 GIInterfaceInfo *container = (GIInterfaceInfo *)base->container;
500 return g_interface_info_get_property (container, blob->index);
504 g_function_info_get_vfunc (GIFunctionInfo *info)
506 GIBaseInfo *base = (GIBaseInfo *)info;
507 FunctionBlob *blob = (FunctionBlob *)&base->metadata->data[base->offset];
508 GIInterfaceInfo *container = (GIInterfaceInfo *)base->container;
510 return g_interface_info_get_vfunc (container, blob->index);
514 /* GICallableInfo functions */
516 signature_offset (GICallableInfo *info)
518 switch (info->base.type)
520 case GI_INFO_TYPE_FUNCTION:
521 case GI_INFO_TYPE_VFUNC:
522 return *(guint32 *)&info->base.metadata->data[info->base.offset + 12];
523 case GI_INFO_TYPE_CALLBACK:
524 case GI_INFO_TYPE_SIGNAL:
525 return *(guint32 *)&info->base.metadata->data[info->base.offset + 8];
532 g_type_info_new (GIBaseInfo *container,
536 SimpleTypeBlob *type = (SimpleTypeBlob *)&metadata->data[offset];
538 return (GITypeInfo *) g_info_new (GI_INFO_TYPE_TYPE, container, metadata,
539 type->reserved == 0 ? offset : type->offset);
543 * g_callable_info_get_return_type:
544 * @info: a #GICallableInfo
546 * Get the return type of a callable item as
549 * Returns: a #GITypeInfo idexing the TypeBlob for the
550 * return type of #info
553 g_callable_info_get_return_type (GICallableInfo *info)
555 GIBaseInfo *base = (GIBaseInfo *)info;
558 offset = signature_offset (info);
560 return g_type_info_new (base, base->metadata, offset);
564 * g_callable_info_may_return_null:
565 * @info: a #GICallableInfo
567 * See if a callable could return NULL.
569 * Returns: TRUE if callable could return NULL
572 g_callable_info_may_return_null (GICallableInfo *info)
574 GIBaseInfo *base = (GIBaseInfo *)info;
575 SignatureBlob *blob = (SignatureBlob *)&base->metadata->data[signature_offset (info)];
577 return blob->may_return_null;
581 * g_callable_info_get_caller_owns:
582 * @info: a #GICallableInfo
584 * See whether the caller owns the return value
587 * Returns: TRUE if the caller owns the return value, FALSE otherwise.
590 g_callable_info_get_caller_owns (GICallableInfo *info)
592 GIBaseInfo *base = (GIBaseInfo *)info;
593 SignatureBlob *blob = (SignatureBlob *)&base->metadata->data[signature_offset (info)];
595 if (blob->caller_owns_return_value)
596 return GI_TRANSFER_EVERYTHING;
597 else if (blob->caller_owns_return_container)
598 return GI_TRANSFER_CONTAINER;
600 return GI_TRANSFER_NOTHING;
604 * g_callable_info_get_n_args:
605 * @info: a #GICallableInfo
607 * Get the number of arguments (both IN and OUT) for this callable.
609 * Returns: The number of arguments this callable expects.
612 g_callable_info_get_n_args (GICallableInfo *info)
614 GIBaseInfo *base = (GIBaseInfo *)info;
618 offset = signature_offset (info);
619 blob = (SignatureBlob *)&base->metadata->data[offset];
621 return blob->n_arguments;
625 * g_callable_info_get_arg:
626 * @info: a #GICallableInfo
628 * Get information about a particular argument of this callable.
630 * Returns: A #GIArgInfo indexing the metadata on the given argument.
633 g_callable_info_get_arg (GICallableInfo *info,
636 GIBaseInfo *base = (GIBaseInfo *)info;
637 Header *header = (Header *)base->metadata->data;
640 offset = signature_offset (info);
642 return (GIArgInfo *) g_info_new (GI_INFO_TYPE_ARG, base, base->metadata,
643 offset + header->signature_blob_size + n * header->arg_blob_size);
646 /* GIArgInfo function */
648 g_arg_info_get_direction (GIArgInfo *info)
650 GIBaseInfo *base = (GIBaseInfo *)info;
651 ArgBlob *blob = (ArgBlob *)&base->metadata->data[base->offset];
653 if (blob->in && blob->out)
654 return GI_DIRECTION_INOUT;
656 return GI_DIRECTION_OUT;
658 return GI_DIRECTION_IN;
662 g_arg_info_is_return_value (GIArgInfo *info)
664 GIBaseInfo *base = (GIBaseInfo *)info;
665 ArgBlob *blob = (ArgBlob *)&base->metadata->data[base->offset];
667 return blob->return_value;
671 g_arg_info_is_dipper (GIArgInfo *info)
673 GIBaseInfo *base = (GIBaseInfo *)info;
674 ArgBlob *blob = (ArgBlob *)&base->metadata->data[base->offset];
680 g_arg_info_is_optional (GIArgInfo *info)
682 GIBaseInfo *base = (GIBaseInfo *)info;
683 ArgBlob *blob = (ArgBlob *)&base->metadata->data[base->offset];
685 return blob->optional;
689 g_arg_info_may_be_null (GIArgInfo *info)
691 GIBaseInfo *base = (GIBaseInfo *)info;
692 ArgBlob *blob = (ArgBlob *)&base->metadata->data[base->offset];
694 return blob->null_ok;
698 g_arg_info_get_ownership_transfer (GIArgInfo *info)
700 GIBaseInfo *base = (GIBaseInfo *)info;
701 ArgBlob *blob = (ArgBlob *)&base->metadata->data[base->offset];
703 if (blob->transfer_ownership)
704 return GI_TRANSFER_EVERYTHING;
705 else if (blob->transfer_container_ownership)
706 return GI_TRANSFER_CONTAINER;
708 return GI_TRANSFER_NOTHING;
712 g_arg_info_get_type (GIArgInfo *info)
714 GIBaseInfo *base = (GIBaseInfo *)info;
716 return g_type_info_new (base, base->metadata, base->offset + 8);
719 /* GITypeInfo functions */
721 g_type_info_is_pointer (GITypeInfo *info)
723 GIBaseInfo *base = (GIBaseInfo *)info;
724 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->metadata->data[base->offset];
726 if (type->reserved == 0)
727 return type->pointer;
730 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&base->metadata->data[base->offset];
732 return iface->pointer;
737 g_type_info_get_tag (GITypeInfo *info)
739 GIBaseInfo *base = (GIBaseInfo *)info;
740 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->metadata->data[base->offset];
742 if (type->reserved == 0)
746 InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&base->metadata->data[base->offset];
753 g_type_info_get_param_type (GITypeInfo *info,
756 GIBaseInfo *base = (GIBaseInfo *)info;
757 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->metadata->data[base->offset];
759 if (type->reserved != 0)
761 ParamTypeBlob *param = (ParamTypeBlob *)&base->metadata->data[base->offset];
765 case GI_TYPE_TAG_ARRAY:
766 case GI_TYPE_TAG_GLIST:
767 case GI_TYPE_TAG_GSLIST:
768 case GI_TYPE_TAG_GHASH:
769 return g_type_info_new (base, base->metadata, base->offset + 4 + 4 * n);
780 g_type_info_get_interface (GITypeInfo *info)
782 GIBaseInfo *base = (GIBaseInfo *)info;
783 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->metadata->data[base->offset];
785 if (type->reserved != 0)
787 InterfaceTypeBlob *blob = (InterfaceTypeBlob *)&base->metadata->data[base->offset];
789 if (blob->tag == GI_TYPE_TAG_INTERFACE)
790 return g_info_from_entry (base->metadata, blob->interface);
797 g_type_info_get_array_length (GITypeInfo *info)
799 GIBaseInfo *base = (GIBaseInfo *)info;
800 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->metadata->data[base->offset];
802 if (type->reserved != 0)
804 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->metadata->data[base->offset];
806 if (blob->tag == GI_TYPE_TAG_ARRAY)
808 if (blob->has_length)
817 g_type_info_is_zero_terminated (GITypeInfo *info)
819 GIBaseInfo *base = (GIBaseInfo *)info;
820 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->metadata->data[base->offset];
822 if (type->reserved != 0)
824 ArrayTypeBlob *blob = (ArrayTypeBlob *)&base->metadata->data[base->offset];
826 if (blob->tag == GI_TYPE_TAG_ARRAY)
827 return blob->zero_terminated;
834 g_type_info_get_n_error_domains (GITypeInfo *info)
836 GIBaseInfo *base = (GIBaseInfo *)info;
837 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->metadata->data[base->offset];
839 if (type->reserved != 0)
841 ErrorTypeBlob *blob = (ErrorTypeBlob *)&base->metadata->data[base->offset];
843 if (blob->tag == GI_TYPE_TAG_ERROR)
844 return blob->n_domains;
851 g_type_info_get_error_domain (GITypeInfo *info,
854 GIBaseInfo *base = (GIBaseInfo *)info;
855 SimpleTypeBlob *type = (SimpleTypeBlob *)&base->metadata->data[base->offset];
857 if (type->reserved != 0)
859 ErrorTypeBlob *blob = (ErrorTypeBlob *)&base->metadata->data[base->offset];
861 if (blob->tag == GI_TYPE_TAG_ERROR)
862 return (GIErrorDomainInfo *) g_info_from_entry (base->metadata,
870 /* GIErrorDomainInfo functions */
872 g_error_domain_info_get_quark (GIErrorDomainInfo *info)
874 GIBaseInfo *base = (GIBaseInfo *)info;
875 ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->metadata->data[base->offset];
877 return g_metadata_get_string (base->metadata, blob->get_quark);
881 g_error_domain_info_get_codes (GIErrorDomainInfo *info)
883 GIBaseInfo *base = (GIBaseInfo *)info;
884 ErrorDomainBlob *blob = (ErrorDomainBlob *)&base->metadata->data[base->offset];
886 return (GIInterfaceInfo *) g_info_from_entry (base->metadata, blob->error_codes);
890 /* GIValueInfo functions */
892 g_value_info_get_value (GIValueInfo *info)
894 GIBaseInfo *base = (GIBaseInfo *)info;
895 ValueBlob *blob = (ValueBlob *)&base->metadata->data[base->offset];
897 return (glong)blob->value;
900 /* GIFieldInfo functions */
902 g_field_info_get_flags (GIFieldInfo *info)
904 GIFieldInfoFlags flags;
906 GIBaseInfo *base = (GIBaseInfo *)info;
907 FieldBlob *blob = (FieldBlob *)&base->metadata->data[base->offset];
912 flags = flags | GI_FIELD_IS_READABLE;
915 flags = flags | GI_FIELD_IS_WRITABLE;
921 g_field_info_get_size (GIFieldInfo *info)
923 GIBaseInfo *base = (GIBaseInfo *)info;
924 FieldBlob *blob = (FieldBlob *)&base->metadata->data[base->offset];
930 g_field_info_get_offset (GIFieldInfo *info)
932 GIBaseInfo *base = (GIBaseInfo *)info;
933 FieldBlob *blob = (FieldBlob *)&base->metadata->data[base->offset];
935 return blob->struct_offset;
939 g_field_info_get_type (GIFieldInfo *info)
941 GIBaseInfo *base = (GIBaseInfo *)info;
943 return g_type_info_new (base, base->metadata, base->offset + 8);
946 /* GIRegisteredTypeInfo functions */
948 g_registered_type_info_get_type_name (GIRegisteredTypeInfo *info)
950 GIBaseInfo *base = (GIBaseInfo *)info;
951 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&base->metadata->data[base->offset];
953 if (blob->gtype_name)
954 return g_metadata_get_string (base->metadata, blob->gtype_name);
960 g_registered_type_info_get_type_init (GIRegisteredTypeInfo *info)
962 GIBaseInfo *base = (GIBaseInfo *)info;
963 RegisteredTypeBlob *blob = (RegisteredTypeBlob *)&base->metadata->data[base->offset];
965 if (blob->gtype_init)
966 return g_metadata_get_string (base->metadata, blob->gtype_init);
972 g_registered_type_info_get_g_type (GIRegisteredTypeInfo *info)
974 const char *type_init;
975 GType (* get_type_func) (void);
977 type_init = g_registered_type_info_get_type_init (info);
979 if (type_init == NULL)
982 get_type_func = NULL;
983 if (!g_module_symbol (((GIBaseInfo*)info)->metadata->module,
985 (void**) &get_type_func))
988 return (* get_type_func) ();
991 /* GIStructInfo functions */
993 g_struct_info_get_n_fields (GIStructInfo *info)
995 GIBaseInfo *base = (GIBaseInfo *)info;
996 StructBlob *blob = (StructBlob *)&base->metadata->data[base->offset];
998 return blob->n_fields;
1002 g_struct_info_get_field (GIStructInfo *info,
1005 GIBaseInfo *base = (GIBaseInfo *)info;
1006 Header *header = (Header *)base->metadata->data;
1008 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->metadata,
1009 base->offset + header->struct_blob_size +
1010 n * header->field_blob_size);
1014 g_struct_info_get_n_methods (GIStructInfo *info)
1016 GIBaseInfo *base = (GIBaseInfo *)info;
1017 StructBlob *blob = (StructBlob *)&base->metadata->data[base->offset];
1019 return blob->n_methods;
1023 g_struct_info_get_method (GIStructInfo *info,
1026 GIBaseInfo *base = (GIBaseInfo *)info;
1027 StructBlob *blob = (StructBlob *)&base->metadata->data[base->offset];
1028 Header *header = (Header *)base->metadata->data;
1031 offset = base->offset + header->struct_blob_size
1032 + blob->n_fields * header->field_blob_size
1033 + n * header->function_blob_size;
1034 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1035 base->metadata, offset);
1038 static GIFunctionInfo *
1039 find_method (GIBaseInfo *base,
1045 Header *header = (Header *)base->metadata->data;
1048 for (i = 0; i < n_methods; i++)
1050 FunctionBlob *fblob = (FunctionBlob *)&base->metadata->data[offset];
1051 const gchar *fname = (const gchar *)&base->metadata->data[fblob->name];
1053 if (strcmp (name, fname) == 0)
1054 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1055 base->metadata, offset);
1057 offset += header->function_blob_size;
1064 g_struct_info_find_method (GIStructInfo *info,
1068 GIBaseInfo *base = (GIBaseInfo *)info;
1069 Header *header = (Header *)base->metadata->data;
1070 StructBlob *blob = (StructBlob *)&base->metadata->data[base->offset];
1072 offset = base->offset + header->struct_blob_size
1073 + blob->n_fields * header->field_blob_size;
1075 return find_method (base, offset, blob->n_methods, name);
1079 g_enum_info_get_n_values (GIEnumInfo *info)
1081 GIBaseInfo *base = (GIBaseInfo *)info;
1082 EnumBlob *blob = (EnumBlob *)&base->metadata->data[base->offset];
1084 return blob->n_values;
1088 g_enum_info_get_value (GIEnumInfo *info,
1091 GIBaseInfo *base = (GIBaseInfo *)info;
1092 Header *header = (Header *)base->metadata->data;
1095 offset = base->offset + header->enum_blob_size
1096 + n * header->value_blob_size;
1097 return (GIValueInfo *) g_info_new (GI_INFO_TYPE_VALUE, base, base->metadata, offset);
1100 /* GIObjectInfo functions */
1102 g_object_info_get_parent (GIObjectInfo *info)
1104 GIBaseInfo *base = (GIBaseInfo *)info;
1105 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1108 return (GIObjectInfo *) g_info_from_entry (base->metadata, blob->parent);
1114 g_object_info_get_type_name (GIObjectInfo *info)
1116 GIBaseInfo *base = (GIBaseInfo *)info;
1117 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1119 return g_metadata_get_string (base->metadata, blob->gtype_name);
1123 g_object_info_get_type_init (GIObjectInfo *info)
1125 GIBaseInfo *base = (GIBaseInfo *)info;
1126 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1128 return g_metadata_get_string (base->metadata, blob->gtype_init);
1132 g_object_info_get_n_interfaces (GIObjectInfo *info)
1134 GIBaseInfo *base = (GIBaseInfo *)info;
1135 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1137 return blob->n_interfaces;
1141 g_object_info_get_interface (GIObjectInfo *info,
1144 GIBaseInfo *base = (GIBaseInfo *)info;
1145 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1147 return (GIInterfaceInfo *) g_info_from_entry (base->metadata, blob->interfaces[n]);
1151 g_object_info_get_n_fields (GIObjectInfo *info)
1153 GIBaseInfo *base = (GIBaseInfo *)info;
1154 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1156 return blob->n_fields;
1160 g_object_info_get_field (GIObjectInfo *info,
1164 GIBaseInfo *base = (GIBaseInfo *)info;
1165 Header *header = (Header *)base->metadata->data;
1166 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1168 offset = base->offset + header->object_blob_size
1169 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1170 + n * header->field_blob_size;
1172 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->metadata, offset);
1176 g_object_info_get_n_properties (GIObjectInfo *info)
1178 GIBaseInfo *base = (GIBaseInfo *)info;
1179 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1181 return blob->n_properties;
1185 g_object_info_get_property (GIObjectInfo *info,
1189 GIBaseInfo *base = (GIBaseInfo *)info;
1190 Header *header = (Header *)base->metadata->data;
1191 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1193 offset = base->offset + header->object_blob_size
1194 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1195 + blob->n_fields * header->field_blob_size
1196 + n * header->property_blob_size;
1198 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base,
1199 base->metadata, offset);
1203 g_object_info_get_n_methods (GIObjectInfo *info)
1205 GIBaseInfo *base = (GIBaseInfo *)info;
1206 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1208 return blob->n_methods;
1212 g_object_info_get_method (GIObjectInfo *info,
1216 GIBaseInfo *base = (GIBaseInfo *)info;
1217 Header *header = (Header *)base->metadata->data;
1218 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1220 offset = base->offset + header->object_blob_size
1221 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1222 + blob->n_fields * header->field_blob_size
1223 + blob->n_properties * header->property_blob_size
1224 + n * header->function_blob_size;
1226 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1227 base->metadata, offset);
1231 g_object_info_find_method (GIObjectInfo *info,
1235 GIBaseInfo *base = (GIBaseInfo *)info;
1236 Header *header = (Header *)base->metadata->data;
1237 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1239 offset = base->offset + header->object_blob_size
1240 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1241 + blob->n_fields * header->field_blob_size +
1242 + blob->n_properties * header->property_blob_size;
1244 return find_method (base, offset, blob->n_methods, name);
1248 g_object_info_get_n_signals (GIObjectInfo *info)
1250 GIBaseInfo *base = (GIBaseInfo *)info;
1251 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1253 return blob->n_signals;
1257 g_object_info_get_signal (GIObjectInfo *info,
1261 GIBaseInfo *base = (GIBaseInfo *)info;
1262 Header *header = (Header *)base->metadata->data;
1263 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1265 offset = base->offset + header->object_blob_size
1266 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1267 + blob->n_fields * header->field_blob_size
1268 + blob->n_properties * header->property_blob_size
1269 + blob->n_methods * header->function_blob_size
1270 + n * header->signal_blob_size;
1272 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base,
1273 base->metadata, offset);
1277 g_object_info_get_n_vfuncs (GIObjectInfo *info)
1279 GIBaseInfo *base = (GIBaseInfo *)info;
1280 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1282 return blob->n_vfuncs;
1286 g_object_info_get_vfunc (GIObjectInfo *info,
1290 GIBaseInfo *base = (GIBaseInfo *)info;
1291 Header *header = (Header *)base->metadata->data;
1292 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1294 offset = base->offset + header->object_blob_size
1295 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1296 + blob->n_fields * header->field_blob_size
1297 + blob->n_properties * header->property_blob_size
1298 + blob->n_methods * header->function_blob_size
1299 + blob->n_signals * header->signal_blob_size
1300 + n * header->vfunc_blob_size;
1302 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1303 base->metadata, offset);
1307 g_object_info_get_n_constants (GIObjectInfo *info)
1309 GIBaseInfo *base = (GIBaseInfo *)info;
1310 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1312 return blob->n_constants;
1316 g_object_info_get_constant (GIObjectInfo *info,
1320 GIBaseInfo *base = (GIBaseInfo *)info;
1321 Header *header = (Header *)base->metadata->data;
1322 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1324 offset = base->offset + header->object_blob_size
1325 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1326 + blob->n_fields * header->field_blob_size
1327 + blob->n_properties * header->property_blob_size
1328 + blob->n_methods * header->function_blob_size
1329 + blob->n_signals * header->signal_blob_size
1330 + blob->n_vfuncs * header->vfunc_blob_size
1331 + n * header->constant_blob_size;
1333 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1334 base->metadata, offset);
1338 /* GIInterfaceInfo functions */
1340 g_interface_info_get_n_prerequisites (GIInterfaceInfo *info)
1342 GIBaseInfo *base = (GIBaseInfo *)info;
1343 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1345 return blob->n_prerequisites;
1349 g_interface_info_get_prerequisite (GIInterfaceInfo *info,
1352 GIBaseInfo *base = (GIBaseInfo *)info;
1353 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1355 return g_info_from_entry (base->metadata, blob->prerequisites[n]);
1360 g_interface_info_get_n_properties (GIInterfaceInfo *info)
1362 GIBaseInfo *base = (GIBaseInfo *)info;
1363 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1365 return blob->n_properties;
1369 g_interface_info_get_property (GIInterfaceInfo *info,
1373 GIBaseInfo *base = (GIBaseInfo *)info;
1374 Header *header = (Header *)base->metadata->data;
1375 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1377 offset = base->offset + header->interface_blob_size
1378 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1379 + n * header->property_blob_size;
1381 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base,
1382 base->metadata, offset);
1386 g_interface_info_get_n_methods (GIInterfaceInfo *info)
1388 GIBaseInfo *base = (GIBaseInfo *)info;
1389 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1391 return blob->n_methods;
1395 g_interface_info_get_method (GIInterfaceInfo *info,
1399 GIBaseInfo *base = (GIBaseInfo *)info;
1400 Header *header = (Header *)base->metadata->data;
1401 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1403 offset = base->offset + header->interface_blob_size
1404 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1405 + blob->n_properties * header->property_blob_size
1406 + n * header->function_blob_size;
1408 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1409 base->metadata, offset);
1413 g_interface_info_find_method (GIInterfaceInfo *info,
1417 GIBaseInfo *base = (GIBaseInfo *)info;
1418 Header *header = (Header *)base->metadata->data;
1419 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1421 offset = base->offset + header->interface_blob_size
1422 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1423 + blob->n_properties * header->property_blob_size;
1425 return find_method (base, offset, blob->n_methods, name);
1429 g_interface_info_get_n_signals (GIInterfaceInfo *info)
1431 GIBaseInfo *base = (GIBaseInfo *)info;
1432 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1434 return blob->n_signals;
1438 g_interface_info_get_signal (GIInterfaceInfo *info,
1442 GIBaseInfo *base = (GIBaseInfo *)info;
1443 Header *header = (Header *)base->metadata->data;
1444 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1446 offset = base->offset + header->interface_blob_size
1447 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1448 + blob->n_properties * header->property_blob_size
1449 + blob->n_methods * header->function_blob_size
1450 + n * header->signal_blob_size;
1452 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base,
1453 base->metadata, offset);
1457 g_interface_info_get_n_vfuncs (GIInterfaceInfo *info)
1459 GIBaseInfo *base = (GIBaseInfo *)info;
1460 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1462 return blob->n_vfuncs;
1466 g_interface_info_get_vfunc (GIInterfaceInfo *info,
1470 GIBaseInfo *base = (GIBaseInfo *)info;
1471 Header *header = (Header *)base->metadata->data;
1472 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1474 offset = base->offset + header->interface_blob_size
1475 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1476 + blob->n_properties * header->property_blob_size
1477 + blob->n_methods * header->function_blob_size
1478 + blob->n_signals * header->signal_blob_size
1479 + n * header->vfunc_blob_size;
1481 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1482 base->metadata, offset);
1486 g_interface_info_get_n_constants (GIInterfaceInfo *info)
1488 GIBaseInfo *base = (GIBaseInfo *)info;
1489 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1491 return blob->n_constants;
1495 g_interface_info_get_constant (GIInterfaceInfo *info,
1499 GIBaseInfo *base = (GIBaseInfo *)info;
1500 Header *header = (Header *)base->metadata->data;
1501 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1503 offset = base->offset + header->interface_blob_size
1504 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1505 + blob->n_properties * header->property_blob_size
1506 + blob->n_methods * header->function_blob_size
1507 + blob->n_signals * header->signal_blob_size
1508 + blob->n_vfuncs * header->vfunc_blob_size
1509 + n * header->constant_blob_size;
1511 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1512 base->metadata, offset);
1518 /* GIPropertyInfo functions */
1520 g_property_info_get_flags (GIPropertyInfo *info)
1523 GIBaseInfo *base = (GIBaseInfo *)info;
1524 PropertyBlob *blob = (PropertyBlob *)&base->metadata->data[base->offset];
1529 flags = flags | G_PARAM_READABLE;
1532 flags = flags | G_PARAM_WRITABLE;
1534 if (blob->construct)
1535 flags = flags | G_PARAM_CONSTRUCT;
1537 if (blob->construct_only)
1538 flags = flags | G_PARAM_CONSTRUCT_ONLY;
1544 g_property_info_get_type (GIPropertyInfo *info)
1546 GIBaseInfo *base = (GIBaseInfo *)info;
1548 return g_type_info_new (base, base->metadata, base->offset + 8);
1552 /* GISignalInfo functions */
1554 g_signal_info_get_flags (GISignalInfo *info)
1558 GIBaseInfo *base = (GIBaseInfo *)info;
1559 SignalBlob *blob = (SignalBlob *)&base->metadata->data[base->offset];
1563 if (blob->run_first)
1564 flags = flags | G_SIGNAL_RUN_FIRST;
1567 flags = flags | G_SIGNAL_RUN_LAST;
1569 if (blob->run_cleanup)
1570 flags = flags | G_SIGNAL_RUN_CLEANUP;
1572 if (blob->no_recurse)
1573 flags = flags | G_SIGNAL_NO_RECURSE;
1576 flags = flags | G_SIGNAL_DETAILED;
1579 flags = flags | G_SIGNAL_ACTION;
1582 flags = flags | G_SIGNAL_NO_HOOKS;
1588 g_signal_info_get_class_closure (GISignalInfo *info)
1590 GIBaseInfo *base = (GIBaseInfo *)info;
1591 SignalBlob *blob = (SignalBlob *)&base->metadata->data[base->offset];
1593 if (blob->has_class_closure)
1594 return g_interface_info_get_vfunc ((GIInterfaceInfo *)base->container, blob->class_closure);
1600 g_signal_info_true_stops_emit (GISignalInfo *info)
1602 GIBaseInfo *base = (GIBaseInfo *)info;
1603 SignalBlob *blob = (SignalBlob *)&base->metadata->data[base->offset];
1605 return blob->true_stops_emit;
1608 /* GIVFuncInfo functions */
1610 g_vfunc_info_get_flags (GIVFuncInfo *info)
1612 GIVFuncInfoFlags flags;
1614 GIBaseInfo *base = (GIBaseInfo *)info;
1615 VFuncBlob *blob = (VFuncBlob *)&base->metadata->data[base->offset];
1619 if (blob->must_chain_up)
1620 flags = flags | GI_VFUNC_MUST_CHAIN_UP;
1622 if (blob->must_be_implemented)
1623 flags = flags | GI_VFUNC_MUST_OVERRIDE;
1625 if (blob->must_not_be_implemented)
1626 flags = flags | GI_VFUNC_MUST_NOT_OVERRIDE;
1632 g_vfunc_info_get_offset (GIVFuncInfo *info)
1634 GIBaseInfo *base = (GIBaseInfo *)info;
1635 VFuncBlob *blob = (VFuncBlob *)&base->metadata->data[base->offset];
1637 return blob->struct_offset;
1641 g_vfunc_info_get_signal (GIVFuncInfo *info)
1643 GIBaseInfo *base = (GIBaseInfo *)info;
1644 VFuncBlob *blob = (VFuncBlob *)&base->metadata->data[base->offset];
1646 if (blob->class_closure)
1647 return g_interface_info_get_signal ((GIInterfaceInfo *)base->container, blob->signal);
1653 /* GIConstantInfo functions */
1655 g_constant_info_get_type (GIConstantInfo *info)
1657 GIBaseInfo *base = (GIBaseInfo *)info;
1659 return g_type_info_new (base, base->metadata, base->offset + 8);
1663 g_constant_info_get_value (GIConstantInfo *info,
1666 GIBaseInfo *base = (GIBaseInfo *)info;
1667 ConstantBlob *blob = (ConstantBlob *)&base->metadata->data[base->offset];
1669 /* FIXME non-basic types ? */
1670 if (blob->type.reserved == 0)
1672 if (blob->type.pointer)
1673 value->v_pointer = g_memdup (&base->metadata->data[blob->offset], blob->size);
1676 switch (blob->type.tag)
1678 case GI_TYPE_TAG_BOOLEAN:
1679 value->v_boolean = *(gboolean*)&base->metadata->data[blob->offset];
1681 case GI_TYPE_TAG_INT8:
1682 value->v_int8 = *(gint8*)&base->metadata->data[blob->offset];
1684 case GI_TYPE_TAG_UINT8:
1685 value->v_uint8 = *(guint8*)&base->metadata->data[blob->offset];
1687 case GI_TYPE_TAG_INT16:
1688 value->v_int16 = *(gint16*)&base->metadata->data[blob->offset];
1690 case GI_TYPE_TAG_UINT16:
1691 value->v_uint16 = *(guint16*)&base->metadata->data[blob->offset];
1693 case GI_TYPE_TAG_INT32:
1694 value->v_int32 = *(gint32*)&base->metadata->data[blob->offset];
1696 case GI_TYPE_TAG_UINT32:
1697 value->v_uint32 = *(guint32*)&base->metadata->data[blob->offset];
1699 case GI_TYPE_TAG_INT64:
1700 value->v_int64 = *(gint64*)&base->metadata->data[blob->offset];
1702 case GI_TYPE_TAG_UINT64:
1703 value->v_uint64 = *(guint64*)&base->metadata->data[blob->offset];
1705 case GI_TYPE_TAG_FLOAT:
1706 value->v_float = *(gfloat*)&base->metadata->data[blob->offset];
1708 case GI_TYPE_TAG_DOUBLE:
1709 value->v_double = *(gdouble*)&base->metadata->data[blob->offset];
1711 case GI_TYPE_TAG_INT:
1712 value->v_int = *(gint*)&base->metadata->data[blob->offset];
1714 case GI_TYPE_TAG_UINT:
1715 value->v_uint = *(guint*)&base->metadata->data[blob->offset];
1717 case GI_TYPE_TAG_LONG:
1718 value->v_long = *(glong*)&base->metadata->data[blob->offset];
1720 case GI_TYPE_TAG_ULONG:
1721 value->v_ulong = *(gulong*)&base->metadata->data[blob->offset];
1730 /* GIUnionInfo functions */
1732 g_union_info_get_n_fields (GIUnionInfo *info)
1734 GIBaseInfo *base = (GIBaseInfo *)info;
1735 UnionBlob *blob = (UnionBlob *)&base->metadata->data[base->offset];
1737 return blob->n_fields;
1741 g_union_info_get_field (GIUnionInfo *info,
1744 GIBaseInfo *base = (GIBaseInfo *)info;
1745 Header *header = (Header *)base->metadata->data;
1747 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->metadata,
1748 base->offset + header->union_blob_size +
1749 n * header->field_blob_size);
1753 g_union_info_get_n_methods (GIUnionInfo *info)
1755 GIBaseInfo *base = (GIBaseInfo *)info;
1756 UnionBlob *blob = (UnionBlob *)&base->metadata->data[base->offset];
1758 return blob->n_functions;
1762 g_union_info_get_method (GIUnionInfo *info,
1765 GIBaseInfo *base = (GIBaseInfo *)info;
1766 UnionBlob *blob = (UnionBlob *)&base->metadata->data[base->offset];
1767 Header *header = (Header *)base->metadata->data;
1770 offset = base->offset + header->union_blob_size
1771 + blob->n_fields * header->field_blob_size
1772 + n * header->function_blob_size;
1773 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1774 base->metadata, offset);
1778 g_union_info_is_discriminated (GIUnionInfo *info)
1780 GIBaseInfo *base = (GIBaseInfo *)info;
1781 UnionBlob *blob = (UnionBlob *)&base->metadata->data[base->offset];
1783 return blob->discriminated;
1787 g_union_info_get_discriminator_offset (GIUnionInfo *info)
1789 GIBaseInfo *base = (GIBaseInfo *)info;
1790 UnionBlob *blob = (UnionBlob *)&base->metadata->data[base->offset];
1792 return blob->discriminator_offset;
1796 g_union_info_get_discriminator_type (GIUnionInfo *info)
1798 GIBaseInfo *base = (GIBaseInfo *)info;
1800 return g_type_info_new (base, base->metadata, base->offset + 24);
1804 g_union_info_get_discriminator (GIUnionInfo *info,
1807 GIBaseInfo *base = (GIBaseInfo *)info;
1808 UnionBlob *blob = (UnionBlob *)&base->metadata->data[base->offset];
1810 if (blob->discriminated)
1812 Header *header = (Header *)base->metadata->data;
1815 offset = base->offset + header->union_blob_size
1816 + blob->n_fields * header->field_blob_size
1817 + blob->n_functions * header->function_blob_size
1818 + n * header->constant_blob_size;
1820 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1821 base->metadata, offset);