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 /* GIStructInfo functions */
974 g_struct_info_get_n_fields (GIStructInfo *info)
976 GIBaseInfo *base = (GIBaseInfo *)info;
977 StructBlob *blob = (StructBlob *)&base->metadata->data[base->offset];
979 return blob->n_fields;
983 g_struct_info_get_field (GIStructInfo *info,
986 GIBaseInfo *base = (GIBaseInfo *)info;
987 Header *header = (Header *)base->metadata->data;
989 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->metadata,
990 base->offset + header->struct_blob_size +
991 n * header->field_blob_size);
995 g_struct_info_get_n_methods (GIStructInfo *info)
997 GIBaseInfo *base = (GIBaseInfo *)info;
998 StructBlob *blob = (StructBlob *)&base->metadata->data[base->offset];
1000 return blob->n_methods;
1004 g_struct_info_get_method (GIStructInfo *info,
1007 GIBaseInfo *base = (GIBaseInfo *)info;
1008 StructBlob *blob = (StructBlob *)&base->metadata->data[base->offset];
1009 Header *header = (Header *)base->metadata->data;
1012 offset = base->offset + header->struct_blob_size
1013 + blob->n_fields * header->field_blob_size
1014 + n * header->function_blob_size;
1015 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1016 base->metadata, offset);
1019 static GIFunctionInfo *
1020 find_method (GIBaseInfo *base,
1026 Header *header = (Header *)base->metadata->data;
1029 for (i = 0; i < n_methods; i++)
1031 FunctionBlob *fblob = (FunctionBlob *)&base->metadata->data[offset];
1032 const gchar *fname = (const gchar *)&base->metadata->data[fblob->name];
1034 if (strcmp (name, fname) == 0)
1035 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1036 base->metadata, offset);
1038 offset += header->function_blob_size;
1045 g_struct_info_find_method (GIStructInfo *info,
1049 GIBaseInfo *base = (GIBaseInfo *)info;
1050 Header *header = (Header *)base->metadata->data;
1051 StructBlob *blob = (StructBlob *)&base->metadata->data[base->offset];
1053 offset = base->offset + header->struct_blob_size
1054 + blob->n_fields * header->field_blob_size;
1056 return find_method (base, offset, blob->n_methods, name);
1060 g_enum_info_get_n_values (GIEnumInfo *info)
1062 GIBaseInfo *base = (GIBaseInfo *)info;
1063 EnumBlob *blob = (EnumBlob *)&base->metadata->data[base->offset];
1065 return blob->n_values;
1069 g_enum_info_get_value (GIEnumInfo *info,
1072 GIBaseInfo *base = (GIBaseInfo *)info;
1073 Header *header = (Header *)base->metadata->data;
1076 offset = base->offset + header->enum_blob_size
1077 + n * header->value_blob_size;
1078 return (GIValueInfo *) g_info_new (GI_INFO_TYPE_VALUE, base, base->metadata, offset);
1081 /* GIObjectInfo functions */
1083 g_object_info_get_parent (GIObjectInfo *info)
1085 GIBaseInfo *base = (GIBaseInfo *)info;
1086 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1089 return (GIObjectInfo *) g_info_from_entry (base->metadata, blob->parent);
1095 g_object_info_get_type_name (GIObjectInfo *info)
1097 GIBaseInfo *base = (GIBaseInfo *)info;
1098 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1100 return g_metadata_get_string (base->metadata, blob->gtype_name);
1104 g_object_info_get_type_init (GIObjectInfo *info)
1106 GIBaseInfo *base = (GIBaseInfo *)info;
1107 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1109 return g_metadata_get_string (base->metadata, blob->gtype_init);
1113 g_object_info_get_n_interfaces (GIObjectInfo *info)
1115 GIBaseInfo *base = (GIBaseInfo *)info;
1116 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1118 return blob->n_interfaces;
1122 g_object_info_get_interface (GIObjectInfo *info,
1125 GIBaseInfo *base = (GIBaseInfo *)info;
1126 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1128 return (GIInterfaceInfo *) g_info_from_entry (base->metadata, blob->interfaces[n]);
1132 g_object_info_get_n_fields (GIObjectInfo *info)
1134 GIBaseInfo *base = (GIBaseInfo *)info;
1135 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1137 return blob->n_fields;
1141 g_object_info_get_field (GIObjectInfo *info,
1145 GIBaseInfo *base = (GIBaseInfo *)info;
1146 Header *header = (Header *)base->metadata->data;
1147 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1149 offset = base->offset + header->object_blob_size
1150 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1151 + n * header->field_blob_size;
1153 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->metadata, offset);
1157 g_object_info_get_n_properties (GIObjectInfo *info)
1159 GIBaseInfo *base = (GIBaseInfo *)info;
1160 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1162 return blob->n_properties;
1166 g_object_info_get_property (GIObjectInfo *info,
1170 GIBaseInfo *base = (GIBaseInfo *)info;
1171 Header *header = (Header *)base->metadata->data;
1172 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1174 offset = base->offset + header->object_blob_size
1175 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1176 + blob->n_fields * header->field_blob_size
1177 + n * header->property_blob_size;
1179 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base,
1180 base->metadata, offset);
1184 g_object_info_get_n_methods (GIObjectInfo *info)
1186 GIBaseInfo *base = (GIBaseInfo *)info;
1187 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1189 return blob->n_methods;
1193 g_object_info_get_method (GIObjectInfo *info,
1197 GIBaseInfo *base = (GIBaseInfo *)info;
1198 Header *header = (Header *)base->metadata->data;
1199 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1201 offset = base->offset + header->object_blob_size
1202 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1203 + blob->n_fields * header->field_blob_size
1204 + blob->n_properties * header->property_blob_size
1205 + n * header->function_blob_size;
1207 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1208 base->metadata, offset);
1212 g_object_info_find_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;
1225 return find_method (base, offset, blob->n_methods, name);
1229 g_object_info_get_n_signals (GIObjectInfo *info)
1231 GIBaseInfo *base = (GIBaseInfo *)info;
1232 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1234 return blob->n_signals;
1238 g_object_info_get_signal (GIObjectInfo *info,
1242 GIBaseInfo *base = (GIBaseInfo *)info;
1243 Header *header = (Header *)base->metadata->data;
1244 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1246 offset = base->offset + header->object_blob_size
1247 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1248 + blob->n_fields * header->field_blob_size
1249 + blob->n_properties * header->property_blob_size
1250 + blob->n_methods * header->function_blob_size
1251 + n * header->signal_blob_size;
1253 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base,
1254 base->metadata, offset);
1258 g_object_info_get_n_vfuncs (GIObjectInfo *info)
1260 GIBaseInfo *base = (GIBaseInfo *)info;
1261 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1263 return blob->n_vfuncs;
1267 g_object_info_get_vfunc (GIObjectInfo *info,
1271 GIBaseInfo *base = (GIBaseInfo *)info;
1272 Header *header = (Header *)base->metadata->data;
1273 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1275 offset = base->offset + header->object_blob_size
1276 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1277 + blob->n_fields * header->field_blob_size
1278 + blob->n_properties * header->property_blob_size
1279 + blob->n_methods * header->function_blob_size
1280 + blob->n_signals * header->signal_blob_size
1281 + n * header->vfunc_blob_size;
1283 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1284 base->metadata, offset);
1288 g_object_info_get_n_constants (GIObjectInfo *info)
1290 GIBaseInfo *base = (GIBaseInfo *)info;
1291 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1293 return blob->n_constants;
1297 g_object_info_get_constant (GIObjectInfo *info,
1301 GIBaseInfo *base = (GIBaseInfo *)info;
1302 Header *header = (Header *)base->metadata->data;
1303 ObjectBlob *blob = (ObjectBlob *)&base->metadata->data[base->offset];
1305 offset = base->offset + header->object_blob_size
1306 + (blob->n_interfaces + blob->n_interfaces % 2) * 2
1307 + blob->n_fields * header->field_blob_size
1308 + blob->n_properties * header->property_blob_size
1309 + blob->n_methods * header->function_blob_size
1310 + blob->n_signals * header->signal_blob_size
1311 + blob->n_vfuncs * header->vfunc_blob_size
1312 + n * header->constant_blob_size;
1314 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1315 base->metadata, offset);
1319 /* GIInterfaceInfo functions */
1321 g_interface_info_get_n_prerequisites (GIInterfaceInfo *info)
1323 GIBaseInfo *base = (GIBaseInfo *)info;
1324 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1326 return blob->n_prerequisites;
1330 g_interface_info_get_prerequisite (GIInterfaceInfo *info,
1333 GIBaseInfo *base = (GIBaseInfo *)info;
1334 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1336 return g_info_from_entry (base->metadata, blob->prerequisites[n]);
1341 g_interface_info_get_n_properties (GIInterfaceInfo *info)
1343 GIBaseInfo *base = (GIBaseInfo *)info;
1344 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1346 return blob->n_properties;
1350 g_interface_info_get_property (GIInterfaceInfo *info,
1354 GIBaseInfo *base = (GIBaseInfo *)info;
1355 Header *header = (Header *)base->metadata->data;
1356 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1358 offset = base->offset + header->interface_blob_size
1359 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1360 + n * header->property_blob_size;
1362 return (GIPropertyInfo *) g_info_new (GI_INFO_TYPE_PROPERTY, base,
1363 base->metadata, offset);
1367 g_interface_info_get_n_methods (GIInterfaceInfo *info)
1369 GIBaseInfo *base = (GIBaseInfo *)info;
1370 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1372 return blob->n_methods;
1376 g_interface_info_get_method (GIInterfaceInfo *info,
1380 GIBaseInfo *base = (GIBaseInfo *)info;
1381 Header *header = (Header *)base->metadata->data;
1382 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1384 offset = base->offset + header->interface_blob_size
1385 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1386 + blob->n_properties * header->property_blob_size
1387 + n * header->function_blob_size;
1389 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1390 base->metadata, offset);
1394 g_interface_info_find_method (GIInterfaceInfo *info,
1398 GIBaseInfo *base = (GIBaseInfo *)info;
1399 Header *header = (Header *)base->metadata->data;
1400 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1402 offset = base->offset + header->object_blob_size
1403 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1404 + blob->n_properties * header->property_blob_size;
1406 return find_method (base, offset, blob->n_methods, name);
1410 g_interface_info_get_n_signals (GIInterfaceInfo *info)
1412 GIBaseInfo *base = (GIBaseInfo *)info;
1413 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1415 return blob->n_signals;
1419 g_interface_info_get_signal (GIInterfaceInfo *info,
1423 GIBaseInfo *base = (GIBaseInfo *)info;
1424 Header *header = (Header *)base->metadata->data;
1425 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1427 offset = base->offset + header->interface_blob_size
1428 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1429 + blob->n_properties * header->property_blob_size
1430 + blob->n_methods * header->function_blob_size
1431 + n * header->signal_blob_size;
1433 return (GISignalInfo *) g_info_new (GI_INFO_TYPE_SIGNAL, base,
1434 base->metadata, offset);
1438 g_interface_info_get_n_vfuncs (GIInterfaceInfo *info)
1440 GIBaseInfo *base = (GIBaseInfo *)info;
1441 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1443 return blob->n_vfuncs;
1447 g_interface_info_get_vfunc (GIInterfaceInfo *info,
1451 GIBaseInfo *base = (GIBaseInfo *)info;
1452 Header *header = (Header *)base->metadata->data;
1453 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1455 offset = base->offset + header->interface_blob_size
1456 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1457 + blob->n_properties * header->property_blob_size
1458 + blob->n_methods * header->function_blob_size
1459 + blob->n_signals * header->signal_blob_size
1460 + n * header->vfunc_blob_size;
1462 return (GIVFuncInfo *) g_info_new (GI_INFO_TYPE_VFUNC, base,
1463 base->metadata, offset);
1467 g_interface_info_get_n_constants (GIInterfaceInfo *info)
1469 GIBaseInfo *base = (GIBaseInfo *)info;
1470 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1472 return blob->n_constants;
1476 g_interface_info_get_constant (GIInterfaceInfo *info,
1480 GIBaseInfo *base = (GIBaseInfo *)info;
1481 Header *header = (Header *)base->metadata->data;
1482 InterfaceBlob *blob = (InterfaceBlob *)&base->metadata->data[base->offset];
1484 offset = base->offset + header->interface_blob_size
1485 + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2
1486 + blob->n_properties * header->property_blob_size
1487 + blob->n_methods * header->function_blob_size
1488 + blob->n_signals * header->signal_blob_size
1489 + blob->n_vfuncs * header->vfunc_blob_size
1490 + n * header->constant_blob_size;
1492 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1493 base->metadata, offset);
1499 /* GIPropertyInfo functions */
1501 g_property_info_get_flags (GIPropertyInfo *info)
1504 GIBaseInfo *base = (GIBaseInfo *)info;
1505 PropertyBlob *blob = (PropertyBlob *)&base->metadata->data[base->offset];
1510 flags = flags | G_PARAM_READABLE;
1513 flags = flags | G_PARAM_WRITABLE;
1515 if (blob->construct)
1516 flags = flags | G_PARAM_CONSTRUCT;
1518 if (blob->construct_only)
1519 flags = flags | G_PARAM_CONSTRUCT_ONLY;
1525 g_property_info_get_type (GIPropertyInfo *info)
1527 GIBaseInfo *base = (GIBaseInfo *)info;
1529 return g_type_info_new (base, base->metadata, base->offset + 8);
1533 /* GISignalInfo functions */
1535 g_signal_info_get_flags (GISignalInfo *info)
1539 GIBaseInfo *base = (GIBaseInfo *)info;
1540 SignalBlob *blob = (SignalBlob *)&base->metadata->data[base->offset];
1544 if (blob->run_first)
1545 flags = flags | G_SIGNAL_RUN_FIRST;
1548 flags = flags | G_SIGNAL_RUN_LAST;
1550 if (blob->run_cleanup)
1551 flags = flags | G_SIGNAL_RUN_CLEANUP;
1553 if (blob->no_recurse)
1554 flags = flags | G_SIGNAL_NO_RECURSE;
1557 flags = flags | G_SIGNAL_DETAILED;
1560 flags = flags | G_SIGNAL_ACTION;
1563 flags = flags | G_SIGNAL_NO_HOOKS;
1569 g_signal_info_get_class_closure (GISignalInfo *info)
1571 GIBaseInfo *base = (GIBaseInfo *)info;
1572 SignalBlob *blob = (SignalBlob *)&base->metadata->data[base->offset];
1574 if (blob->has_class_closure)
1575 return g_interface_info_get_vfunc ((GIInterfaceInfo *)base->container, blob->class_closure);
1581 g_signal_info_true_stops_emit (GISignalInfo *info)
1583 GIBaseInfo *base = (GIBaseInfo *)info;
1584 SignalBlob *blob = (SignalBlob *)&base->metadata->data[base->offset];
1586 return blob->true_stops_emit;
1589 /* GIVFuncInfo functions */
1591 g_vfunc_info_get_flags (GIVFuncInfo *info)
1593 GIVFuncInfoFlags flags;
1595 GIBaseInfo *base = (GIBaseInfo *)info;
1596 VFuncBlob *blob = (VFuncBlob *)&base->metadata->data[base->offset];
1600 if (blob->must_chain_up)
1601 flags = flags | GI_VFUNC_MUST_CHAIN_UP;
1603 if (blob->must_be_implemented)
1604 flags = flags | GI_VFUNC_MUST_OVERRIDE;
1606 if (blob->must_not_be_implemented)
1607 flags = flags | GI_VFUNC_MUST_NOT_OVERRIDE;
1613 g_vfunc_info_get_offset (GIVFuncInfo *info)
1615 GIBaseInfo *base = (GIBaseInfo *)info;
1616 VFuncBlob *blob = (VFuncBlob *)&base->metadata->data[base->offset];
1618 return blob->struct_offset;
1622 g_vfunc_info_get_signal (GIVFuncInfo *info)
1624 GIBaseInfo *base = (GIBaseInfo *)info;
1625 VFuncBlob *blob = (VFuncBlob *)&base->metadata->data[base->offset];
1627 if (blob->class_closure)
1628 return g_interface_info_get_signal ((GIInterfaceInfo *)base->container, blob->signal);
1634 /* GIConstantInfo functions */
1636 g_constant_info_get_type (GIConstantInfo *info)
1638 GIBaseInfo *base = (GIBaseInfo *)info;
1640 return g_type_info_new (base, base->metadata, base->offset + 8);
1644 g_constant_info_get_value (GIConstantInfo *info,
1647 GIBaseInfo *base = (GIBaseInfo *)info;
1648 ConstantBlob *blob = (ConstantBlob *)&base->metadata->data[base->offset];
1650 /* FIXME non-basic types ? */
1651 if (blob->type.reserved == 0)
1653 if (blob->type.pointer)
1654 value->v_pointer = g_memdup (&base->metadata->data[blob->offset], blob->size);
1657 switch (blob->type.tag)
1659 case GI_TYPE_TAG_BOOLEAN:
1660 value->v_boolean = *(gboolean*)&base->metadata->data[blob->offset];
1662 case GI_TYPE_TAG_INT8:
1663 value->v_int8 = *(gint8*)&base->metadata->data[blob->offset];
1665 case GI_TYPE_TAG_UINT8:
1666 value->v_uint8 = *(guint8*)&base->metadata->data[blob->offset];
1668 case GI_TYPE_TAG_INT16:
1669 value->v_int16 = *(gint16*)&base->metadata->data[blob->offset];
1671 case GI_TYPE_TAG_UINT16:
1672 value->v_uint16 = *(guint16*)&base->metadata->data[blob->offset];
1674 case GI_TYPE_TAG_INT32:
1675 value->v_int32 = *(gint32*)&base->metadata->data[blob->offset];
1677 case GI_TYPE_TAG_UINT32:
1678 value->v_uint32 = *(guint32*)&base->metadata->data[blob->offset];
1680 case GI_TYPE_TAG_INT64:
1681 value->v_int64 = *(gint64*)&base->metadata->data[blob->offset];
1683 case GI_TYPE_TAG_UINT64:
1684 value->v_uint64 = *(guint64*)&base->metadata->data[blob->offset];
1686 case GI_TYPE_TAG_FLOAT:
1687 value->v_float = *(gfloat*)&base->metadata->data[blob->offset];
1689 case GI_TYPE_TAG_DOUBLE:
1690 value->v_double = *(gdouble*)&base->metadata->data[blob->offset];
1692 case GI_TYPE_TAG_INT:
1693 value->v_int = *(gint*)&base->metadata->data[blob->offset];
1695 case GI_TYPE_TAG_UINT:
1696 value->v_uint = *(guint*)&base->metadata->data[blob->offset];
1698 case GI_TYPE_TAG_LONG:
1699 value->v_long = *(glong*)&base->metadata->data[blob->offset];
1701 case GI_TYPE_TAG_ULONG:
1702 value->v_ulong = *(gulong*)&base->metadata->data[blob->offset];
1711 /* GIUnionInfo functions */
1713 g_union_info_get_n_fields (GIUnionInfo *info)
1715 GIBaseInfo *base = (GIBaseInfo *)info;
1716 UnionBlob *blob = (UnionBlob *)&base->metadata->data[base->offset];
1718 return blob->n_fields;
1722 g_union_info_get_field (GIUnionInfo *info,
1725 GIBaseInfo *base = (GIBaseInfo *)info;
1726 Header *header = (Header *)base->metadata->data;
1728 return (GIFieldInfo *) g_info_new (GI_INFO_TYPE_FIELD, base, base->metadata,
1729 base->offset + header->union_blob_size +
1730 n * header->field_blob_size);
1734 g_union_info_get_n_methods (GIUnionInfo *info)
1736 GIBaseInfo *base = (GIBaseInfo *)info;
1737 UnionBlob *blob = (UnionBlob *)&base->metadata->data[base->offset];
1739 return blob->n_functions;
1743 g_union_info_get_method (GIUnionInfo *info,
1746 GIBaseInfo *base = (GIBaseInfo *)info;
1747 UnionBlob *blob = (UnionBlob *)&base->metadata->data[base->offset];
1748 Header *header = (Header *)base->metadata->data;
1751 offset = base->offset + header->union_blob_size
1752 + blob->n_fields * header->field_blob_size
1753 + n * header->function_blob_size;
1754 return (GIFunctionInfo *) g_info_new (GI_INFO_TYPE_FUNCTION, base,
1755 base->metadata, offset);
1759 g_union_info_is_discriminated (GIUnionInfo *info)
1761 GIBaseInfo *base = (GIBaseInfo *)info;
1762 UnionBlob *blob = (UnionBlob *)&base->metadata->data[base->offset];
1764 return blob->discriminated;
1768 g_union_info_get_discriminator_offset (GIUnionInfo *info)
1770 GIBaseInfo *base = (GIBaseInfo *)info;
1771 UnionBlob *blob = (UnionBlob *)&base->metadata->data[base->offset];
1773 return blob->discriminator_offset;
1777 g_union_info_get_discriminator_type (GIUnionInfo *info)
1779 GIBaseInfo *base = (GIBaseInfo *)info;
1781 return g_type_info_new (base, base->metadata, base->offset + 24);
1785 g_union_info_get_discriminator (GIUnionInfo *info,
1788 GIBaseInfo *base = (GIBaseInfo *)info;
1789 UnionBlob *blob = (UnionBlob *)&base->metadata->data[base->offset];
1791 if (blob->discriminated)
1793 Header *header = (Header *)base->metadata->data;
1796 offset = base->offset + header->union_blob_size
1797 + blob->n_fields * header->field_blob_size
1798 + blob->n_functions * header->function_blob_size
1799 + n * header->constant_blob_size;
1801 return (GIConstantInfo *) g_info_new (GI_INFO_TYPE_CONSTANT, base,
1802 base->metadata, offset);