summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohan Dahlin <johan@gnome.org>2010-05-31 17:41:45 -0300
committerJohan Dahlin <johan@gnome.org>2010-05-31 17:47:45 -0300
commit39d0023ebcdbc72a6e7b48de657b594e9de97358 (patch)
tree095b14026ec01653bcbdc55431e545bf2b56aca6
parent7e7a4e0b213e609a2112b226cb75465ef3712171 (diff)
downloadgobject-introspection-39d0023ebcdbc72a6e7b48de657b594e9de97358.tar.gz
[girepository] Split out GIBaseInfo
Split out GIBaseInfo to a separate source file. Move out definitions to gibaseinfo.h/gitypelib.h/gitypes.h and girepository-private.h Install gibaseinfo.h/gitypelib.h and gitypes.h as well, but require users to include girepository.h
-rw-r--r--gir/Makefile.am8
-rw-r--r--girepository/Makefile.am9
-rw-r--r--girepository/gibaseinfo.c591
-rw-r--r--girepository/gibaseinfo.h88
-rw-r--r--girepository/ginfo.c642
-rw-r--r--girepository/girepository-private.h84
-rw-r--r--girepository/girepository.h259
-rw-r--r--girepository/gitypelib.h53
-rw-r--r--girepository/gitypes.h225
9 files changed, 1082 insertions, 877 deletions
diff --git a/gir/Makefile.am b/gir/Makefile.am
index e779ec79..99788510 100644
--- a/gir/Makefile.am
+++ b/gir/Makefile.am
@@ -144,8 +144,14 @@ GIRepository_2_0_gir_SCANNERFLAGS = \
--add-include-path=.
GIRepository_2_0_gir_PACKAGES = gobject-2.0
GIRepository_2_0_gir_INCLUDES = GObject-2.0
-GIRepository_2_0_gir_CFLAGS = -I$(srcdir)/girepository
+GIRepository_2_0_gir_CFLAGS = \
+ -I$(srcdir)/girepository -I$(top_srcdir) \
+ -DGI_COMPILATION
GIRepository_2_0_gir_FILES = \
+ $(top_srcdir)/girepository/gibaseinfo.c \
+ $(top_srcdir)/girepository/gibaseinfo.h \
+ $(top_srcdir)/girepository/gitypelib.h \
+ $(top_srcdir)/girepository/gitypes.h \
$(top_srcdir)/girepository/girepository.c \
$(top_srcdir)/girepository/girepository.h
diff --git a/girepository/Makefile.am b/girepository/Makefile.am
index b7b1a975..ac95ed66 100644
--- a/girepository/Makefile.am
+++ b/girepository/Makefile.am
@@ -1,5 +1,10 @@
girepodir = $(includedir)/gobject-introspection-1.0/
-girepo_HEADERS = girepository.h girffi.h
+girepo_HEADERS = \
+ gibaseinfo.h \
+ girepository.h \
+ girffi.h \
+ gitypelib.h \
+ gitypes.h
lib_LTLIBRARIES = libgirepository-1.0.la
noinst_LTLIBRARIES = libgirepository-parser.la
@@ -7,10 +12,12 @@ noinst_LTLIBRARIES = libgirepository-parser.la
libgirepository_1_0_la_SOURCES = \
gdump.c \
gfield.c \
+ gibaseinfo.c \
ginfo.c \
ginfo.h \
ginvoke.c \
girepository.c \
+ girepository-private.h \
girffi.c \
girffi.h \
girffi-private.h \
diff --git a/girepository/gibaseinfo.c b/girepository/gibaseinfo.c
new file mode 100644
index 00000000..006dd8f5
--- /dev/null
+++ b/girepository/gibaseinfo.c
@@ -0,0 +1,591 @@
+/* GObject introspection: Repository implementation
+ *
+ * Copyright (C) 2005 Matthias Clasen
+ * Copyright (C) 2008,2009 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include "gtypelib.h"
+#include "ginfo.h"
+#include "girepository-private.h"
+
+#define INVALID_REFCOUNT 0x7FFFFFFF
+
+/* info creation */
+GIBaseInfo *
+g_info_new_full (GIInfoType type,
+ GIRepository *repository,
+ GIBaseInfo *container,
+ GTypelib *typelib,
+ guint32 offset)
+{
+ GIRealInfo *info;
+
+ g_return_val_if_fail (container != NULL || repository != NULL, NULL);
+
+ info = g_slice_new (GIRealInfo);
+
+ _g_info_init (info, type, repository, container, typelib, offset);
+ info->ref_count = 1;
+
+ if (container && ((GIRealInfo *) container)->ref_count != INVALID_REFCOUNT)
+ g_base_info_ref (info->container);
+
+ g_object_ref (info->repository);
+
+ return (GIBaseInfo*)info;
+}
+
+GIBaseInfo *
+g_info_new (GIInfoType type,
+ GIBaseInfo *container,
+ GTypelib *typelib,
+ guint32 offset)
+{
+ return g_info_new_full (type, ((GIRealInfo*)container)->repository, container, typelib, offset);
+}
+
+void
+_g_info_init (GIRealInfo *info,
+ GIInfoType type,
+ GIRepository *repository,
+ GIBaseInfo *container,
+ GTypelib *typelib,
+ guint32 offset)
+{
+ memset (info, 0, sizeof (GIRealInfo));
+
+ /* Invalid refcount used to flag stack-allocated infos */
+ info->ref_count = INVALID_REFCOUNT;
+ info->type = type;
+
+ info->typelib = typelib;
+ info->offset = offset;
+
+ if (container)
+ info->container = container;
+
+ g_assert (G_IS_IREPOSITORY (repository));
+ info->repository = repository;
+}
+
+GIBaseInfo *
+_g_info_from_entry (GIRepository *repository,
+ GTypelib *typelib,
+ guint16 index)
+{
+ GIBaseInfo *result;
+ DirEntry *entry = g_typelib_get_dir_entry (typelib, index);
+
+ if (entry->local)
+ result = g_info_new_full (entry->blob_type, repository, NULL, typelib, entry->offset);
+ else
+ {
+ const gchar *namespace = g_typelib_get_string (typelib, entry->offset);
+ const gchar *name = g_typelib_get_string (typelib, entry->name);
+
+ result = g_irepository_find_by_name (repository, namespace, name);
+ if (result == NULL)
+ {
+ GIUnresolvedInfo *unresolved;
+
+ unresolved = g_slice_new0 (GIUnresolvedInfo);
+
+ unresolved->type = GI_INFO_TYPE_UNRESOLVED;
+ unresolved->ref_count = 1;
+ unresolved->repository = g_object_ref (repository);
+ unresolved->container = NULL;
+ unresolved->name = name;
+ unresolved->namespace = namespace;
+
+ return (GIBaseInfo *)unresolved;
+ }
+ return (GIBaseInfo *)result;
+ }
+
+ return (GIBaseInfo *)result;
+}
+
+/* GIBaseInfo functions */
+
+/**
+ * SECTION:gibaseinfo
+ * @Short_description: Base struct for all GTypelib structs
+ * @Title: GIBaseInfo
+ *
+ * GIBaseInfo is the common base struct of all other *Info structs
+ * accessible through the #GIRepository API.
+ * All other structs can be casted to a #GIBaseInfo, for instance:
+ * <example>
+ * <title>Casting a #GIFunctionInfo to #GIBaseInfo</title>
+ * <programlisting>
+ * GIFunctionInfo *function_info = ...;
+ * GIBaseInfo *info = (GIBaseInfo*)function_info;
+ * </programlisting>
+ * </example>
+ * Most #GIRepository APIs returning a #GIBaseInfo is actually creating a new struct, in other
+ * words, g_base_info_unref() has to be called when done accessing the data.
+ * GIBaseInfos are normally accessed by calling either
+ * g_irepository_find_by_name(), g_irepository_find_by_gtype() or g_irepository_get_info().
+ *
+ * <example>
+ * <title>Getting the Button of the Gtk typelib</title>
+ * <programlisting>
+ * GIBaseInfo *button_info = g_irepository_find_by_name(NULL, "Gtk", "Button");
+ * ... use button_info ...
+ * g_base_info_unref(button_info);
+ * </programlisting>
+ * </example>
+ *
+ */
+
+/**
+ * g_base_info_ref:
+ * @info: a #GIBaseInfo
+ *
+ * Increases the reference count of @info.
+ *
+ * Returns: the same @info.
+ */
+GIBaseInfo *
+g_base_info_ref (GIBaseInfo *info)
+{
+ GIRealInfo *rinfo = (GIRealInfo*)info;
+
+ g_assert (rinfo->ref_count != INVALID_REFCOUNT);
+ ((GIRealInfo*)info)->ref_count++;
+
+ return info;
+}
+
+/**
+ * g_base_info_unref:
+ * @info: a #GIBaseInfo
+ *
+ * Decreases the reference count of @info. When its reference count
+ * drops to 0, the info is freed.
+ */
+void
+g_base_info_unref (GIBaseInfo *info)
+{
+ GIRealInfo *rinfo = (GIRealInfo*)info;
+
+ g_assert (rinfo->ref_count > 0 && rinfo->ref_count != INVALID_REFCOUNT);
+ rinfo->ref_count--;
+
+ if (!rinfo->ref_count)
+ {
+ if (rinfo->container && ((GIRealInfo *) rinfo->container)->ref_count != INVALID_REFCOUNT)
+ g_base_info_unref (rinfo->container);
+
+ if (rinfo->repository)
+ g_object_unref (rinfo->repository);
+
+ g_slice_free (GIRealInfo, rinfo);
+ }
+}
+
+/**
+ * g_base_info_get_type:
+ * @info: a #GIBaseInfo
+ *
+ * Obtain the info type of the GIBaseInfo.
+ *
+ * Returns: the info type of @info
+ */
+GIInfoType
+g_base_info_get_type (GIBaseInfo *info)
+{
+
+ return ((GIRealInfo*)info)->type;
+}
+
+/**
+ * g_base_info_get_name:
+ * @info: a #GIBaseInfo
+ *
+ * Obtain the name of the @info. What the name represents depends on
+ * the #GIInfoType of the @info. For instance for #GIFunctionInfo it is
+ * the name of the function.
+ *
+ * Returns: the name of @info or %NULL if it lacks a name.
+ */
+const gchar *
+g_base_info_get_name (GIBaseInfo *info)
+{
+ GIRealInfo *rinfo = (GIRealInfo*)info;
+ g_assert (rinfo->ref_count > 0);
+ switch (rinfo->type)
+ {
+ case GI_INFO_TYPE_FUNCTION:
+ case GI_INFO_TYPE_CALLBACK:
+ case GI_INFO_TYPE_STRUCT:
+ case GI_INFO_TYPE_BOXED:
+ case GI_INFO_TYPE_ENUM:
+ case GI_INFO_TYPE_FLAGS:
+ case GI_INFO_TYPE_OBJECT:
+ case GI_INFO_TYPE_INTERFACE:
+ case GI_INFO_TYPE_CONSTANT:
+ case GI_INFO_TYPE_ERROR_DOMAIN:
+ case GI_INFO_TYPE_UNION:
+ {
+ CommonBlob *blob = (CommonBlob *)&rinfo->typelib->data[rinfo->offset];
+
+ return g_typelib_get_string (rinfo->typelib, blob->name);
+ }
+ break;
+
+ case GI_INFO_TYPE_VALUE:
+ {
+ ValueBlob *blob = (ValueBlob *)&rinfo->typelib->data[rinfo->offset];
+
+ return g_typelib_get_string (rinfo->typelib, blob->name);
+ }
+ break;
+
+ case GI_INFO_TYPE_SIGNAL:
+ {
+ SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset];
+
+ return g_typelib_get_string (rinfo->typelib, blob->name);
+ }
+ break;
+
+ case GI_INFO_TYPE_PROPERTY:
+ {
+ PropertyBlob *blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset];
+
+ return g_typelib_get_string (rinfo->typelib, blob->name);
+ }
+ break;
+
+ case GI_INFO_TYPE_VFUNC:
+ {
+ VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset];
+
+ return g_typelib_get_string (rinfo->typelib, blob->name);
+ }
+ break;
+
+ case GI_INFO_TYPE_FIELD:
+ {
+ FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset];
+
+ return g_typelib_get_string (rinfo->typelib, blob->name);
+ }
+ break;
+
+ case GI_INFO_TYPE_ARG:
+ {
+ ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
+
+ return g_typelib_get_string (rinfo->typelib, blob->name);
+ }
+ break;
+ case GI_INFO_TYPE_UNRESOLVED:
+ {
+ GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
+
+ return unresolved->name;
+ }
+ break;
+ case GI_INFO_TYPE_TYPE:
+ default: ;
+ g_assert_not_reached ();
+ /* unnamed */
+ }
+
+ return NULL;
+}
+
+/**
+ * g_base_info_get_namespace:
+ * @info: a #GIBaseInfo
+ *
+ * Obtain the namespace of @info.
+ *
+ * Returns: the namespace
+ */
+const gchar *
+g_base_info_get_namespace (GIBaseInfo *info)
+{
+ GIRealInfo *rinfo = (GIRealInfo*) info;
+ Header *header = (Header *)rinfo->typelib->data;
+
+ g_assert (rinfo->ref_count > 0);
+
+ if (rinfo->type == GI_INFO_TYPE_UNRESOLVED)
+ {
+ GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
+
+ return unresolved->namespace;
+ }
+
+ return g_typelib_get_string (rinfo->typelib, header->namespace);
+}
+
+/**
+ * g_base_info_is_deprecated:
+ * @info: a #GIBaseInfo
+ *
+ * Obtain whether the @info is represents a metadata which is
+ * deprecated or not.
+ *
+ * Returns: %TRUE if deprecated
+ */
+gboolean
+g_base_info_is_deprecated (GIBaseInfo *info)
+{
+ GIRealInfo *rinfo = (GIRealInfo*) info;
+ switch (rinfo->type)
+ {
+ case GI_INFO_TYPE_FUNCTION:
+ case GI_INFO_TYPE_CALLBACK:
+ case GI_INFO_TYPE_STRUCT:
+ case GI_INFO_TYPE_BOXED:
+ case GI_INFO_TYPE_ENUM:
+ case GI_INFO_TYPE_FLAGS:
+ case GI_INFO_TYPE_OBJECT:
+ case GI_INFO_TYPE_INTERFACE:
+ case GI_INFO_TYPE_CONSTANT:
+ case GI_INFO_TYPE_ERROR_DOMAIN:
+ {
+ CommonBlob *blob = (CommonBlob *)&rinfo->typelib->data[rinfo->offset];
+
+ return blob->deprecated;
+ }
+ break;
+
+ case GI_INFO_TYPE_VALUE:
+ {
+ ValueBlob *blob = (ValueBlob *)&rinfo->typelib->data[rinfo->offset];
+
+ return blob->deprecated;
+ }
+ break;
+
+ case GI_INFO_TYPE_SIGNAL:
+ {
+ SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset];
+
+ return blob->deprecated;
+ }
+ break;
+
+ case GI_INFO_TYPE_PROPERTY:
+ {
+ PropertyBlob *blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset];
+
+ return blob->deprecated;
+ }
+ break;
+
+ case GI_INFO_TYPE_VFUNC:
+ case GI_INFO_TYPE_FIELD:
+ case GI_INFO_TYPE_ARG:
+ case GI_INFO_TYPE_TYPE:
+ default: ;
+ /* no deprecation flag for these */
+ }
+
+ return FALSE;
+}
+
+/**
+ * g_base_info_get_attribute:
+ * @info: a #GIBaseInfo
+ * @name: a freeform string naming an attribute
+ *
+ * Retrieve an arbitrary attribute associated with this node.
+ *
+ * Returns: The value of the attribute, or %NULL if no such attribute exists
+ */
+const gchar *
+g_base_info_get_attribute (GIBaseInfo *info,
+ const gchar *name)
+{
+ GIAttributeIter iter = { 0, };
+ gchar *curname, *curvalue;
+ while (g_base_info_iterate_attributes (info, &iter, &curname, &curvalue))
+ {
+ if (strcmp (name, curname) == 0)
+ return (const gchar*) curvalue;
+ }
+
+ return NULL;
+}
+
+static int
+cmp_attribute (const void *av,
+ const void *bv)
+{
+ const AttributeBlob *a = av;
+ const AttributeBlob *b = bv;
+
+ if (a->offset < b->offset)
+ return -1;
+ else if (a->offset == b->offset)
+ return 0;
+ else
+ return 1;
+}
+
+static AttributeBlob *
+find_first_attribute (GIRealInfo *rinfo)
+{
+ Header *header = (Header *)rinfo->typelib->data;
+ AttributeBlob blob, *first, *res, *previous;
+
+ blob.offset = rinfo->offset;
+
+ first = (AttributeBlob *) &rinfo->typelib->data[header->attributes];
+
+ res = bsearch (&blob, first, header->n_attributes,
+ header->attribute_blob_size, cmp_attribute);
+
+ if (res == NULL)
+ return NULL;
+
+ previous = res - 1;
+ while (previous >= first && previous->offset == rinfo->offset)
+ {
+ res = previous;
+ previous = res - 1;
+ }
+
+ return res;
+}
+
+/**
+ * g_base_info_iterate_attributes:
+ * @info: a #GIBaseInfo
+ * @iterator: a #GIAttributeIter structure, must be initialized; see below
+ * @name: (out) (transfer none): Returned name, must not be freed
+ * @value: (out) (transfer none): Returned name, must not be freed
+ *
+ * Iterate over all attributes associated with this node. The iterator
+ * structure is typically stack allocated, and must have its first
+ * member initialized to %NULL.
+ *
+ * Both the @name and @value should be treated as constants
+ * and must not be freed.
+ *
+ * <example>
+ * <title>Iterating over attributes</title>
+ * <programlisting>
+ * void
+ * print_attributes (GIBaseInfo *info)
+ * {
+ * GIAttributeIter iter = { 0, };
+ * char *name;
+ * char *value;
+ * while (g_base_info_iterate_attributes (info, &iter, &name, &value))
+ * {
+ * g_print ("attribute name: %s value: %s", name, value);
+ * }
+ * }
+ * </programlisting>
+ * </example>
+ *
+ * Returns: %TRUE if there are more attributes
+ */
+gboolean
+g_base_info_iterate_attributes (GIBaseInfo *info,
+ GIAttributeIter *iterator,
+ gchar **name,
+ gchar **value)
+{
+ GIRealInfo *rinfo = (GIRealInfo *)info;
+ Header *header = (Header *)rinfo->typelib->data;
+ AttributeBlob *next, *after;
+
+ after = (AttributeBlob *) &rinfo->typelib->data[header->attributes +
+ header->n_attributes * header->attribute_blob_size];
+
+ if (iterator->data != NULL)
+ next = (AttributeBlob *) iterator->data;
+ else
+ next = find_first_attribute (rinfo);
+
+ if (next == NULL || next->offset != rinfo->offset || next >= after)
+ return FALSE;
+
+ *name = (gchar*) g_typelib_get_string (rinfo->typelib, next->name);
+ *value = (gchar*) g_typelib_get_string (rinfo->typelib, next->value);
+ iterator->data = next + 1;
+
+ return TRUE;
+}
+
+/**
+ * g_base_info_get_container:
+ * @info: a #GIBaseInfo
+ *
+ * Obtain the container of the @info. The container is the parent
+ * GIBaseInfo. For instance, the parent of a #GIFunctionInfo is an
+ * #GIObjectInfo or #GIInterfaceInfo.
+ *
+ * Returns: (transfer none): the container
+ */
+GIBaseInfo *
+g_base_info_get_container (GIBaseInfo *info)
+{
+ return ((GIRealInfo*)info)->container;
+}
+
+/**
+ * g_base_info_get_typelib:
+ * @info: a #GIBaseInfo
+ *
+ * Obtain the typelib this @info belongs to
+ *
+ * Returns: (transfer none): the typelib.
+ */
+GTypelib *
+g_base_info_get_typelib (GIBaseInfo *info)
+{
+ return ((GIRealInfo*)info)->typelib;
+}
+
+/**
+ * g_base_info_equal:
+ * @info1: a #GIBaseInfo
+ * @info2: a #GIBaseInfo
+ *
+ * Compare two #GIBaseInfo.
+ *
+ * Using pointer comparison is not practical since many functions return
+ * different instances of #GIBaseInfo that refers to the same part of the
+ * TypeLib; use this function instead to do #GIBaseInfo comparisons.
+ *
+ * Returns: %TRUE if and only if @info1 equals @info2.
+ */
+gboolean
+g_base_info_equal (GIBaseInfo *info1, GIBaseInfo *info2)
+{
+ /* Compare the TypeLib pointers, which are mmapped. */
+ GIRealInfo *rinfo1 = (GIRealInfo*)info1;
+ GIRealInfo *rinfo2 = (GIRealInfo*)info2;
+ return rinfo1->typelib->data + rinfo1->offset == rinfo2->typelib->data + rinfo2->offset;
+}
+
diff --git a/girepository/gibaseinfo.h b/girepository/gibaseinfo.h
new file mode 100644
index 00000000..f4bd731c
--- /dev/null
+++ b/girepository/gibaseinfo.h
@@ -0,0 +1,88 @@
+/* GObject introspection: GIBaseInfo
+ *
+ * Copyright (C) 2005 Matthias Clasen
+ * Copyright (C) 2008,2009 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GIBASEINFO_H__
+#define __GIBASEINFO_H__
+
+#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION)
+#error "Only <girepository/girepository.h> can be included directly."
+#endif
+
+#include <glib-object.h>
+#include <girepository/gitypelib.h>
+#include <girepository/gitypes.h>
+
+G_BEGIN_DECLS
+
+struct _GIBaseInfoStub {
+ /* <private> */
+ gint32 dummy1;
+ gint32 dummy2;
+ gpointer dummy3;
+ gpointer dummy4;
+ gpointer dummy5;
+ guint32 dummy6;
+ guint32 dummy7;
+ gpointer padding[4];
+};
+
+/* GIBaseInfo */
+
+/**
+ * GIAttributeIter:
+ *
+ * An opaque structure used to iterate over attributes
+ * in a #GIBaseInfo struct.
+ */
+typedef struct {
+ /* <private> */
+ gpointer data;
+ gpointer data2;
+ gpointer data3;
+ gpointer data4;
+} GIAttributeIter;
+
+GIBaseInfo * g_base_info_ref (GIBaseInfo *info);
+void g_base_info_unref (GIBaseInfo *info);
+GIInfoType g_base_info_get_type (GIBaseInfo *info);
+const gchar * g_base_info_get_name (GIBaseInfo *info);
+const gchar * g_base_info_get_namespace (GIBaseInfo *info);
+gboolean g_base_info_is_deprecated (GIBaseInfo *info);
+const gchar * g_base_info_get_attribute (GIBaseInfo *info,
+ const gchar *name);
+gboolean g_base_info_iterate_attributes (GIBaseInfo *info,
+ GIAttributeIter *iterator,
+ char **name,
+ char **value);
+GIBaseInfo * g_base_info_get_container (GIBaseInfo *info);
+GTypelib * g_base_info_get_typelib (GIBaseInfo *info);
+gboolean g_base_info_equal (GIBaseInfo *info1,
+ GIBaseInfo *info2);
+GIBaseInfo * g_info_new (GIInfoType type,
+ GIBaseInfo *container,
+ GTypelib *typelib,
+ guint32 offset);
+
+
+G_END_DECLS
+
+#endif /* __GIBASEINFO_H__ */
+
diff --git a/girepository/ginfo.c b/girepository/ginfo.c
index 198bf6e0..70482a5a 100644
--- a/girepository/ginfo.c
+++ b/girepository/ginfo.c
@@ -27,607 +27,7 @@
#include "gtypelib.h"
#include "ginfo.h"
-
-typedef struct _GIRealInfo GIRealInfo;
-
-/*
- * We just use one structure for all of the info object
- * types; in general, we should be reading data directly
- * from the typelib, and not having computed data in
- * per-type structures.
- */
-struct _GIRealInfo
-{
- /* Keep this part in sync with GIUnresolvedInfo below */
- gint32 type;
- gint32 ref_count;
- GIRepository *repository;
- GIBaseInfo *container;
-
- /* Resolved specific */
-
- GTypelib *typelib;
- guint32 offset;
-
- guint32 type_is_embedded : 1; /* Used by GITypeInfo */
- guint32 reserved : 31;
-
- gpointer reserved2[4];
-};
-
-struct _GIUnresolvedInfo
-{
- /* Keep this part in sync with GIBaseInfo above */
- gint32 type;
- gint32 ref_count;
- GIRepository *repository;
- GIBaseInfo *container;
-
- /* Unresolved specific */
-
- const gchar *name;
- const gchar *namespace;
-};
-
-#define INVALID_REFCOUNT 0x7FFFFFFF
-
-static void
-g_info_init (GIRealInfo *info,
- GIInfoType type,
- GIRepository *repository,
- GIBaseInfo *container,
- GTypelib *typelib,
- guint32 offset)
-{
- memset (info, 0, sizeof (GIRealInfo));
-
- /* Invalid refcount used to flag stack-allocated infos */
- info->ref_count = INVALID_REFCOUNT;
- info->type = type;
-
- info->typelib = typelib;
- info->offset = offset;
-
- if (container)
- info->container = container;
-
- g_assert (G_IS_IREPOSITORY (repository));
- info->repository = repository;
-}
-
-/* info creation */
-GIBaseInfo *
-g_info_new_full (GIInfoType type,
- GIRepository *repository,
- GIBaseInfo *container,
- GTypelib *typelib,
- guint32 offset)
-{
- GIRealInfo *info;
-
- g_return_val_if_fail (container != NULL || repository != NULL, NULL);
-
- info = g_slice_new (GIRealInfo);
-
- g_info_init (info, type, repository, container, typelib, offset);
- info->ref_count = 1;
-
- if (container && ((GIRealInfo *) container)->ref_count != INVALID_REFCOUNT)
- g_base_info_ref (info->container);
-
- g_object_ref (info->repository);
-
- return (GIBaseInfo*)info;
-}
-
-GIBaseInfo *
-g_info_new (GIInfoType type,
- GIBaseInfo *container,
- GTypelib *typelib,
- guint32 offset)
-{
- return g_info_new_full (type, ((GIRealInfo*)container)->repository, container, typelib, offset);
-}
-
-static GIBaseInfo *
-g_info_from_entry (GIRepository *repository,
- GTypelib *typelib,
- guint16 index)
-{
- GIBaseInfo *result;
- DirEntry *entry = g_typelib_get_dir_entry (typelib, index);
-
- if (entry->local)
- result = g_info_new_full (entry->blob_type, repository, NULL, typelib, entry->offset);
- else
- {
- const gchar *namespace = g_typelib_get_string (typelib, entry->offset);
- const gchar *name = g_typelib_get_string (typelib, entry->name);
-
- result = g_irepository_find_by_name (repository, namespace, name);
- if (result == NULL)
- {
- GIUnresolvedInfo *unresolved;
-
- unresolved = g_slice_new0 (GIUnresolvedInfo);
-
- unresolved->type = GI_INFO_TYPE_UNRESOLVED;
- unresolved->ref_count = 1;
- unresolved->repository = g_object_ref (repository);
- unresolved->container = NULL;
- unresolved->name = name;
- unresolved->namespace = namespace;
-
- return (GIBaseInfo *)unresolved;
- }
- return (GIBaseInfo *)result;
- }
-
- return (GIBaseInfo *)result;
-}
-
-/* GIBaseInfo functions */
-
-/**
- * SECTION:gibaseinfo
- * @Short_description: Base struct for all GTypelib structs
- * @Title: GIBaseInfo
- *
- * GIBaseInfo is the common base struct of all other *Info structs
- * accessible through the #GIRepository API.
- * All other structs can be casted to a #GIBaseInfo, for instance:
- * <example>
- * <title>Casting a #GIFunctionInfo to #GIBaseInfo</title>
- * <programlisting>
- * GIFunctionInfo *function_info = ...;
- * GIBaseInfo *info = (GIBaseInfo*)function_info;
- * </programlisting>
- * </example>
- * Most #GIRepository APIs returning a #GIBaseInfo is actually creating a new struct, in other
- * words, g_base_info_unref() has to be called when done accessing the data.
- * GIBaseInfos are normally accessed by calling either
- * g_irepository_find_by_name(), g_irepository_find_by_gtype() or g_irepository_get_info().
- *
- * <example>
- * <title>Getting the Button of the Gtk typelib</title>
- * <programlisting>
- * GIBaseInfo *button_info = g_irepository_find_by_name(NULL, "Gtk", "Button");
- * ... use button_info ...
- * g_base_info_unref(button_info);
- * </programlisting>
- * </example>
- *
- */
-
-/**
- * g_base_info_ref:
- * @info: a #GIBaseInfo
- *
- * Increases the reference count of @info.
- *
- * Returns: the same @info.
- */
-GIBaseInfo *
-g_base_info_ref (GIBaseInfo *info)
-{
- GIRealInfo *rinfo = (GIRealInfo*)info;
-
- g_assert (rinfo->ref_count != INVALID_REFCOUNT);
- ((GIRealInfo*)info)->ref_count++;
-
- return info;
-}
-
-/**
- * g_base_info_unref:
- * @info: a #GIBaseInfo
- *
- * Decreases the reference count of @info. When its reference count
- * drops to 0, the info is freed.
- */
-void
-g_base_info_unref (GIBaseInfo *info)
-{
- GIRealInfo *rinfo = (GIRealInfo*)info;
-
- g_assert (rinfo->ref_count > 0 && rinfo->ref_count != INVALID_REFCOUNT);
- rinfo->ref_count--;
-
- if (!rinfo->ref_count)
- {
- if (rinfo->container && ((GIRealInfo *) rinfo->container)->ref_count != INVALID_REFCOUNT)
- g_base_info_unref (rinfo->container);
-
- if (rinfo->repository)
- g_object_unref (rinfo->repository);
-
- g_slice_free (GIRealInfo, rinfo);
- }
-}
-
-/**
- * g_base_info_get_type:
- * @info: a #GIBaseInfo
- *
- * Obtain the info type of the GIBaseInfo.
- *
- * Returns: the info type of @info
- */
-GIInfoType
-g_base_info_get_type (GIBaseInfo *info)
-{
-
- return ((GIRealInfo*)info)->type;
-}
-
-/**
- * g_base_info_get_name:
- * @info: a #GIBaseInfo
- *
- * Obtain the name of the @info. What the name represents depends on
- * the #GIInfoType of the @info. For instance for #GIFunctionInfo it is
- * the name of the function.
- *
- * Returns: the name of @info or %NULL if it lacks a name.
- */
-const gchar *
-g_base_info_get_name (GIBaseInfo *info)
-{
- GIRealInfo *rinfo = (GIRealInfo*)info;
- g_assert (rinfo->ref_count > 0);
- switch (rinfo->type)
- {
- case GI_INFO_TYPE_FUNCTION:
- case GI_INFO_TYPE_CALLBACK:
- case GI_INFO_TYPE_STRUCT:
- case GI_INFO_TYPE_BOXED:
- case GI_INFO_TYPE_ENUM:
- case GI_INFO_TYPE_FLAGS:
- case GI_INFO_TYPE_OBJECT:
- case GI_INFO_TYPE_INTERFACE:
- case GI_INFO_TYPE_CONSTANT:
- case GI_INFO_TYPE_ERROR_DOMAIN:
- case GI_INFO_TYPE_UNION:
- {
- CommonBlob *blob = (CommonBlob *)&rinfo->typelib->data[rinfo->offset];
-
- return g_typelib_get_string (rinfo->typelib, blob->name);
- }
- break;
-
- case GI_INFO_TYPE_VALUE:
- {
- ValueBlob *blob = (ValueBlob *)&rinfo->typelib->data[rinfo->offset];
-
- return g_typelib_get_string (rinfo->typelib, blob->name);
- }
- break;
-
- case GI_INFO_TYPE_SIGNAL:
- {
- SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset];
-
- return g_typelib_get_string (rinfo->typelib, blob->name);
- }
- break;
-
- case GI_INFO_TYPE_PROPERTY:
- {
- PropertyBlob *blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset];
-
- return g_typelib_get_string (rinfo->typelib, blob->name);
- }
- break;
-
- case GI_INFO_TYPE_VFUNC:
- {
- VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset];
-
- return g_typelib_get_string (rinfo->typelib, blob->name);
- }
- break;
-
- case GI_INFO_TYPE_FIELD:
- {
- FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset];
-
- return g_typelib_get_string (rinfo->typelib, blob->name);
- }
- break;
-
- case GI_INFO_TYPE_ARG:
- {
- ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset];
-
- return g_typelib_get_string (rinfo->typelib, blob->name);
- }
- break;
- case GI_INFO_TYPE_UNRESOLVED:
- {
- GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
-
- return unresolved->name;
- }
- break;
- case GI_INFO_TYPE_TYPE:
- default: ;
- g_assert_not_reached ();
- /* unnamed */
- }
-
- return NULL;
-}
-
-/**
- * g_base_info_get_namespace:
- * @info: a #GIBaseInfo
- *
- * Obtain the namespace of @info.
- *
- * Returns: the namespace
- */
-const gchar *
-g_base_info_get_namespace (GIBaseInfo *info)
-{
- GIRealInfo *rinfo = (GIRealInfo*) info;
- Header *header = (Header *)rinfo->typelib->data;
-
- g_assert (rinfo->ref_count > 0);
-
- if (rinfo->type == GI_INFO_TYPE_UNRESOLVED)
- {
- GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info;
-
- return unresolved->namespace;
- }
-
- return g_typelib_get_string (rinfo->typelib, header->namespace);
-}
-
-/**
- * g_base_info_is_deprecated:
- * @info: a #GIBaseInfo
- *
- * Obtain whether the @info is represents a metadata which is
- * deprecated or not.
- *
- * Returns: %TRUE if deprecated
- */
-gboolean
-g_base_info_is_deprecated (GIBaseInfo *info)
-{
- GIRealInfo *rinfo = (GIRealInfo*) info;
- switch (rinfo->type)
- {
- case GI_INFO_TYPE_FUNCTION:
- case GI_INFO_TYPE_CALLBACK:
- case GI_INFO_TYPE_STRUCT:
- case GI_INFO_TYPE_BOXED:
- case GI_INFO_TYPE_ENUM:
- case GI_INFO_TYPE_FLAGS:
- case GI_INFO_TYPE_OBJECT:
- case GI_INFO_TYPE_INTERFACE:
- case GI_INFO_TYPE_CONSTANT:
- case GI_INFO_TYPE_ERROR_DOMAIN:
- {
- CommonBlob *blob = (CommonBlob *)&rinfo->typelib->data[rinfo->offset];
-
- return blob->deprecated;
- }
- break;
-
- case GI_INFO_TYPE_VALUE:
- {
- ValueBlob *blob = (ValueBlob *)&rinfo->typelib->data[rinfo->offset];
-
- return blob->deprecated;
- }
- break;
-
- case GI_INFO_TYPE_SIGNAL:
- {
- SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset];
-
- return blob->deprecated;
- }
- break;
-
- case GI_INFO_TYPE_PROPERTY:
- {
- PropertyBlob *blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset];
-
- return blob->deprecated;
- }
- break;
-
- case GI_INFO_TYPE_VFUNC:
- case GI_INFO_TYPE_FIELD:
- case GI_INFO_TYPE_ARG:
- case GI_INFO_TYPE_TYPE:
- default: ;
- /* no deprecation flag for these */
- }
-
- return FALSE;
-}
-
-/**
- * g_base_info_get_attribute:
- * @info: a #GIBaseInfo
- * @name: a freeform string naming an attribute
- *
- * Retrieve an arbitrary attribute associated with this node.
- *
- * Returns: The value of the attribute, or %NULL if no such attribute exists
- */
-const gchar *
-g_base_info_get_attribute (GIBaseInfo *info,
- const gchar *name)
-{
- GIAttributeIter iter = { 0, };
- gchar *curname, *curvalue;
- while (g_base_info_iterate_attributes (info, &iter, &curname, &curvalue))
- {
- if (strcmp (name, curname) == 0)
- return (const gchar*) curvalue;
- }
-
- return NULL;
-}
-
-static int
-cmp_attribute (const void *av,
- const void *bv)
-{
- const AttributeBlob *a = av;
- const AttributeBlob *b = bv;
-
- if (a->offset < b->offset)
- return -1;
- else if (a->offset == b->offset)
- return 0;
- else
- return 1;
-}
-
-static AttributeBlob *
-find_first_attribute (GIRealInfo *rinfo)
-{
- Header *header = (Header *)rinfo->typelib->data;
- AttributeBlob blob, *first, *res, *previous;
-
- blob.offset = rinfo->offset;
-
- first = (AttributeBlob *) &rinfo->typelib->data[header->attributes];
-
- res = bsearch (&blob, first, header->n_attributes,
- header->attribute_blob_size, cmp_attribute);
-
- if (res == NULL)
- return NULL;
-
- previous = res - 1;
- while (previous >= first && previous->offset == rinfo->offset)
- {
- res = previous;
- previous = res - 1;
- }
-
- return res;
-}
-
-/**
- * g_base_info_iterate_attributes:
- * @info: a #GIBaseInfo
- * @iterator: a #GIAttributeIter structure, must be initialized; see below
- * @name: (out) (transfer none): Returned name, must not be freed
- * @value: (out) (transfer none): Returned name, must not be freed
- *
- * Iterate over all attributes associated with this node. The iterator
- * structure is typically stack allocated, and must have its first
- * member initialized to %NULL.
- *
- * Both the @name and @value should be treated as constants
- * and must not be freed.
- *
- * <example>
- * <title>Iterating over attributes</title>
- * <programlisting>
- * void
- * print_attributes (GIBaseInfo *info)
- * {
- * GIAttributeIter iter = { 0, };
- * char *name;
- * char *value;
- * while (g_base_info_iterate_attributes (info, &iter, &name, &value))
- * {
- * g_print ("attribute name: %s value: %s", name, value);
- * }
- * }
- * </programlisting>
- * </example>
- *
- * Returns: %TRUE if there are more attributes
- */
-gboolean
-g_base_info_iterate_attributes (GIBaseInfo *info,
- GIAttributeIter *iterator,
- gchar **name,
- gchar **value)
-{
- GIRealInfo *rinfo = (GIRealInfo *)info;
- Header *header = (Header *)rinfo->typelib->data;
- AttributeBlob *next, *after;
-
- after = (AttributeBlob *) &rinfo->typelib->data[header->attributes +
- header->n_attributes * header->attribute_blob_size];
-
- if (iterator->data != NULL)
- next = (AttributeBlob *) iterator->data;
- else
- next = find_first_attribute (rinfo);
-
- if (next == NULL || next->offset != rinfo->offset || next >= after)
- return FALSE;
-
- *name = (gchar*) g_typelib_get_string (rinfo->typelib, next->name);
- *value = (gchar*) g_typelib_get_string (rinfo->typelib, next->value);
- iterator->data = next + 1;
-
- return TRUE;
-}
-
-/**
- * g_base_info_get_container:
- * @info: a #GIBaseInfo
- *
- * Obtain the container of the @info. The container is the parent
- * GIBaseInfo. For instance, the parent of a #GIFunctionInfo is an
- * #GIObjectInfo or #GIInterfaceInfo.
- *
- * Returns: (transfer none): the container
- */
-GIBaseInfo *
-g_base_info_get_container (GIBaseInfo *info)
-{
- return ((GIRealInfo*)info)->container;
-}
-
-/**
- * g_base_info_get_typelib:
- * @info: a #GIBaseInfo
- *
- * Obtain the typelib this @info belongs to
- *
- * Returns: (transfer none): the typelib.
- */
-GTypelib *
-g_base_info_get_typelib (GIBaseInfo *info)
-{
- return ((GIRealInfo*)info)->typelib;
-}
-
-/**
- * g_base_info_equal:
- * @info1: a #GIBaseInfo
- * @info2: a #GIBaseInfo
- *
- * Compare two #GIBaseInfo.
- *
- * Using pointer comparison is not practical since many functions return
- * different instances of #GIBaseInfo that refers to the same part of the
- * TypeLib; use this function instead to do #GIBaseInfo comparisons.
- *
- * Returns: %TRUE if and only if @info1 equals @info2.
- */
-gboolean
-g_base_info_equal (GIBaseInfo *info1, GIBaseInfo *info2)
-{
- /* Compare the TypeLib pointers, which are mmapped. */
- GIRealInfo *rinfo1 = (GIRealInfo*)info1;
- GIRealInfo *rinfo2 = (GIRealInfo*)info2;
- return rinfo1->typelib->data + rinfo1->offset == rinfo2->typelib->data + rinfo2->offset;
-}
+#include "girepository-private.h"
/* GIFunctionInfo functions */
@@ -832,8 +232,8 @@ g_type_info_init (GIBaseInfo *info,
GIRealInfo *rinfo = (GIRealInfo*)container;
SimpleTypeBlob *type = (SimpleTypeBlob *)&typelib->data[offset];
- g_info_init ((GIRealInfo*)info, GI_INFO_TYPE_TYPE, rinfo->repository, container, typelib,
- (type->flags.reserved == 0 && type->flags.reserved2 == 0) ? offset : type->offset);
+ _g_info_init ((GIRealInfo*)info, GI_INFO_TYPE_TYPE, rinfo->repository, container, typelib,
+ (type->flags.reserved == 0 && type->flags.reserved2 == 0) ? offset : type->offset);
}
/**
@@ -1015,8 +415,8 @@ g_callable_info_load_arg (GICallableInfo *info,
offset = signature_offset (info);
header = (Header *)rinfo->typelib->data;
- g_info_init ((GIRealInfo*)arg, GI_INFO_TYPE_ARG, rinfo->repository, (GIBaseInfo*)info, rinfo->typelib,
- offset + header->signature_blob_size + n * header->arg_blob_size);
+ _g_info_init ((GIRealInfo*)arg, GI_INFO_TYPE_ARG, rinfo->repository, (GIBaseInfo*)info, rinfo->typelib,
+ offset + header->signature_blob_size + n * header->arg_blob_size);
}
/* GIArgInfo function */
@@ -1466,7 +866,7 @@ g_type_info_get_interface (GITypeInfo *info)
InterfaceTypeBlob *blob = (InterfaceTypeBlob *)&rinfo->typelib->data[rinfo->offset];
if (blob->tag == GI_TYPE_TAG_INTERFACE)
- return g_info_from_entry (rinfo->repository, rinfo->typelib, blob->interface);
+ return _g_info_from_entry (rinfo->repository, rinfo->typelib, blob->interface);
}
}
@@ -1663,9 +1063,9 @@ g_type_info_get_error_domain (GITypeInfo *info,
ErrorTypeBlob *blob = (ErrorTypeBlob *)&rinfo->typelib->data[rinfo->offset];
if (blob->tag == GI_TYPE_TAG_ERROR)
- return (GIErrorDomainInfo *) g_info_from_entry (rinfo->repository,
- rinfo->typelib,
- blob->domains[n]);
+ return (GIErrorDomainInfo *) _g_info_from_entry (rinfo->repository,
+ rinfo->typelib,
+ blob->domains[n]);
}
return NULL;
@@ -1729,8 +1129,8 @@ g_error_domain_info_get_codes (GIErrorDomainInfo *info)
blob = (ErrorDomainBlob *)&rinfo->typelib->data[rinfo->offset];
- return (GIInterfaceInfo *) g_info_from_entry (rinfo->repository,
- rinfo->typelib, blob->error_codes);
+ return (GIInterfaceInfo *) _g_info_from_entry (rinfo->repository,
+ rinfo->typelib, blob->error_codes);
}
@@ -2125,8 +1525,8 @@ g_object_info_get_parent (GIObjectInfo *info)
ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
if (blob->parent)
- return (GIObjectInfo *) g_info_from_entry (rinfo->repository,
- rinfo->typelib, blob->parent);
+ return (GIObjectInfo *) _g_info_from_entry (rinfo->repository,
+ rinfo->typelib, blob->parent);
else
return NULL;
}
@@ -2173,8 +1573,8 @@ g_object_info_get_interface (GIObjectInfo *info,
GIRealInfo *rinfo = (GIRealInfo *)info;
ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
- return (GIInterfaceInfo *) g_info_from_entry (rinfo->repository,
- rinfo->typelib, blob->interfaces[n]);
+ return (GIInterfaceInfo *) _g_info_from_entry (rinfo->repository,
+ rinfo->typelib, blob->interfaces[n]);
}
gint
@@ -2441,8 +1841,8 @@ g_object_info_get_class_struct (GIObjectInfo *info)
ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset];
if (blob->gtype_struct)
- return (GIStructInfo *) g_info_from_entry (rinfo->repository,
- rinfo->typelib, blob->gtype_struct);
+ return (GIStructInfo *) _g_info_from_entry (rinfo->repository,
+ rinfo->typelib, blob->gtype_struct);
else
return NULL;
}
@@ -2464,8 +1864,8 @@ g_interface_info_get_prerequisite (GIInterfaceInfo *info,
GIRealInfo *rinfo = (GIRealInfo *)info;
InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
- return g_info_from_entry (rinfo->repository,
- rinfo->typelib, blob->prerequisites[n]);
+ return _g_info_from_entry (rinfo->repository,
+ rinfo->typelib, blob->prerequisites[n]);
}
@@ -2670,8 +2070,8 @@ g_interface_info_get_iface_struct (GIInterfaceInfo *info)
InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset];
if (blob->gtype_struct)
- return (GIStructInfo *) g_info_from_entry (rinfo->repository,
- rinfo->typelib, blob->gtype_struct);
+ return (GIStructInfo *) _g_info_from_entry (rinfo->repository,
+ rinfo->typelib, blob->gtype_struct);
else
return NULL;
}
diff --git a/girepository/girepository-private.h b/girepository/girepository-private.h
new file mode 100644
index 00000000..cb82dc6e
--- /dev/null
+++ b/girepository/girepository-private.h
@@ -0,0 +1,84 @@
+/* -*- Mode: C; c-file-style: "gnu"; -*- */
+/* GObject introspection: Private headers
+ *
+ * Copyright (C) 2010 Johan Dahlin
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GIREPOSITORY_PRIVATE_H__
+#define __GIREPOSITORY_PRIVATE_H__
+
+#include <glib.h>
+
+#include <girepository/gibaseinfo.h>
+#include <girepository/girepository.h>
+#include <girepository/gitypelib.h>
+
+typedef struct _GIRealInfo GIRealInfo;
+
+/*
+ * We just use one structure for all of the info object
+ * types; in general, we should be reading data directly
+ * from the typelib, and not having computed data in
+ * per-type structures.
+ */
+struct _GIRealInfo
+{
+ /* Keep this part in sync with GIUnresolvedInfo below */
+ gint32 type;
+ gint32 ref_count;
+ GIRepository *repository;
+ GIBaseInfo *container;
+
+ /* Resolved specific */
+
+ GTypelib *typelib;
+ guint32 offset;
+
+ guint32 type_is_embedded : 1; /* Used by GITypeInfo */
+ guint32 reserved : 31;
+
+ gpointer reserved2[4];
+};
+
+struct _GIUnresolvedInfo
+{
+ /* Keep this part in sync with GIBaseInfo above */
+ gint32 type;
+ gint32 ref_count;
+ GIRepository *repository;
+ GIBaseInfo *container;
+
+ /* Unresolved specific */
+
+ const gchar *name;
+ const gchar *namespace;
+};
+
+void _g_info_init (GIRealInfo *info,
+ GIInfoType type,
+ GIRepository *repository,
+ GIBaseInfo *container,
+ GTypelib *typelib,
+ guint32 offset);
+
+GIBaseInfo * _g_info_from_entry (GIRepository *repository,
+ GTypelib *typelib,
+ guint16 index);
+
+
+#endif /* __GIREPOSITORY_PRIVATE_H__ */
diff --git a/girepository/girepository.h b/girepository/girepository.h
index 30e9b83d..e006b5e0 100644
--- a/girepository/girepository.h
+++ b/girepository/girepository.h
@@ -22,8 +22,12 @@
#ifndef __G_IREPOSITORY_H__
#define __G_IREPOSITORY_H__
+#define __GIREPOSITORY_H_INSIDE__
+
#include <glib-object.h>
#include <gmodule.h>
+#include <girepository/gibaseinfo.h>
+#include <girepository/gitypelib.h>
G_BEGIN_DECLS
@@ -38,156 +42,6 @@ typedef struct _GIRepository GIRepository;
typedef struct _GIRepositoryClass GIRepositoryClass;
typedef struct _GIRepositoryPrivate GIRepositoryPrivate;
-typedef struct _GIBaseInfoStub GIBaseInfo;
-
-struct _GIBaseInfoStub {
- /* <private> */
- gint32 dummy1;
- gint32 dummy2;
- gpointer dummy3;
- gpointer dummy4;
- gpointer dummy5;
- guint32 dummy6;
- guint32 dummy7;
- gpointer padding[4];
-};
-
-/**
- * GICallableInfo:
- *
- * Represents a callable, either #GIFunctionInfo, #GICallbackInfo or
- * #GIVFuncInfo.
- */
-typedef GIBaseInfo GICallableInfo;
-
-/**
- * GIFunctionInfo:
- *
- * Represents a function, eg arguments and return value.
- */
-typedef GIBaseInfo GIFunctionInfo;
-
-/**
- * GICallbackInfo:
- *
- * Represents a callback, eg arguments and return value.
- */
-typedef GIBaseInfo GICallbackInfo;
-
-/**
- * GIRegisteredTypeInfo:
- *
- * Represent a registered type.
- */
-typedef GIBaseInfo GIRegisteredTypeInfo;
-
-/**
- * GIStructInfo:
- *
- * Represents a struct.
- */
-typedef GIBaseInfo GIStructInfo;
-
-/**
- * GIUnionInfo:
- *
- * Represents a union.
- */
-typedef GIBaseInfo GIUnionInfo;
-
-/**
- * GIEnumInfo:
- *
- * Represents an enum or a flag.
- */
-typedef GIBaseInfo GIEnumInfo;
-
-/**
- * GIObjectInfo:
- *
- * Represents an object.
- */
-typedef GIBaseInfo GIObjectInfo;
-
-/**
- * GIInterfaceInfo:
- *
- * Represents an interface.
- */
-typedef GIBaseInfo GIInterfaceInfo;
-
-/**
- * GIConstantInfo:
- *
- * Represents a constant.
- */
-typedef GIBaseInfo GIConstantInfo;
-
-/**
- * GIValueInfo:
- *
- * Represents a enum value of a #GIEnumInfo.
- */
-typedef GIBaseInfo GIValueInfo;
-
-/**
- * GISignalInfo:
- *
- * Represents a signal.
- */
-typedef GIBaseInfo GISignalInfo;
-
-/**
- * GIVFuncInfo
- *
- * Represents a virtual function.
- */
-typedef GIBaseInfo GIVFuncInfo;
-
-/**
- * GIPropertyInfo:
- *
- * Represents a property of a #GIObjectInfo or a #GIInterfaceInfo.
- */
-typedef GIBaseInfo GIPropertyInfo;
-
-/**
- * GIFieldInfo:
- *
- * Represents a field of a #GIStructInfo or a #GIUnionInfo.
- */
-typedef GIBaseInfo GIFieldInfo;
-
-/**
- * GIArgInfo:
- *
- * Represents an argument.
- */
-typedef GIBaseInfo GIArgInfo;
-
-/**
- * GITypeInfo:
- *
- * Represents type information, direction, transfer etc.
- */
-typedef GIBaseInfo GITypeInfo;
-
-/**
- * GIErrorDomainInfo:
- *
- * Represents a #GError error domain.
- */
-typedef GIBaseInfo GIErrorDomainInfo;
-
-/**
- * GIUnresolvedInfo:
- *
- * Represents a unresolved type in a typelib.
- */
-typedef struct _GIUnresolvedInfo GIUnresolvedInfo;
-
-typedef struct _GTypelib GTypelib;
-
struct _GIRepository
{
GObject parent;
@@ -257,20 +111,6 @@ GOptionGroup * g_irepository_get_option_group (void);
gboolean g_irepository_dump (const char *arg, GError **error);
-/* Typelib */
-
-GTypelib * g_typelib_new_from_memory (guchar *memory,
- gsize len);
-GTypelib * g_typelib_new_from_const_memory (const guchar *memory,
- gsize len);
-GTypelib * g_typelib_new_from_mapped_file (GMappedFile *mfile);
-void g_typelib_free (GTypelib *typelib);
-
-gboolean g_typelib_symbol (GTypelib *typelib,
- const gchar *symbol_name,
- gpointer *symbol);
-const gchar * g_typelib_get_namespace (GTypelib *typelib);
-
/**
* GIRepositoryError:
* @G_IREPOSITORY_ERROR_TYPELIB_NOT_FOUND: the typelib could not be found.
@@ -303,96 +143,6 @@ void gi_cclosure_marshal_generic (GClosure *closure,
gpointer invocation_hint,
gpointer marshal_data);
-/* Types of objects registered in the repository */
-
-/**
- * GIInfoType:
- * @GI_INFO_TYPE_INVALID: invalid type
- * @GI_INFO_TYPE_FUNCTION: function, see #GIFunctionInfo
- * @GI_INFO_TYPE_CALLBACK: callback, see #GIFunctionInfo
- * @GI_INFO_TYPE_STRUCT: struct, see #GIStructInfo
- * @GI_INFO_TYPE_BOXED: boxed, see #GIStructInfo or #GIUnionInfo
- * @GI_INFO_TYPE_ENUM: enum, see #GIEnumInfo
- * @GI_INFO_TYPE_FLAGS: flags, see #GIEnumInfo
- * @GI_INFO_TYPE_OBJECT: object, see #GIObjectInfo
- * @GI_INFO_TYPE_INTERFACE: interface, see #GIInterfaceInfo
- * @GI_INFO_TYPE_CONSTANT: contant, see #GIConstantInfo
- * @GI_INFO_TYPE_ERROR_DOMAIN: error domain for a #GError, see #GIErrorDomainInfo
- * @GI_INFO_TYPE_UNION: union, see #GIUnionInfo
- * @GI_INFO_TYPE_VALUE: enum value, see #GIValueInfo
- * @GI_INFO_TYPE_SIGNAL: signal, see #GISignalInfo
- * @GI_INFO_TYPE_VFUNC: virtual function, see #GIVFuncInfo
- * @GI_INFO_TYPE_PROPERTY: GObject property, see #GIPropertyInfo
- * @GI_INFO_TYPE_FIELD: struct or union field, see #GIFieldInfo
- * @GI_INFO_TYPE_ARG: argument of a function or callback, see #GIArgInfo
- * @GI_INFO_TYPE_TYPE: type information, see #GITypeInfo
- * @GI_INFO_TYPE_UNRESOLVED: unresolved type, a type which is not present in
- * the typelib, or any of its dependencies.
- *
- * The type of a GIBaseInfo struct.
- */
-typedef enum
-{
- GI_INFO_TYPE_INVALID,
- GI_INFO_TYPE_FUNCTION,
- GI_INFO_TYPE_CALLBACK,
- GI_INFO_TYPE_STRUCT,
- GI_INFO_TYPE_BOXED,
- GI_INFO_TYPE_ENUM, /* 5 */
- GI_INFO_TYPE_FLAGS,
- GI_INFO_TYPE_OBJECT,
- GI_INFO_TYPE_INTERFACE,
- GI_INFO_TYPE_CONSTANT,
- GI_INFO_TYPE_ERROR_DOMAIN, /* 10 */
- GI_INFO_TYPE_UNION,
- GI_INFO_TYPE_VALUE,
- GI_INFO_TYPE_SIGNAL,
- GI_INFO_TYPE_VFUNC,
- GI_INFO_TYPE_PROPERTY, /* 15 */
- GI_INFO_TYPE_FIELD,
- GI_INFO_TYPE_ARG,
- GI_INFO_TYPE_TYPE,
- GI_INFO_TYPE_UNRESOLVED
-} GIInfoType;
-
-
-/* GIBaseInfo */
-
-/**
- * GIAttributeIter:
- *
- * An opaque structure used to iterate over attributes
- * in a #GIBaseInfo struct.
- */
-typedef struct {
- /* <private> */
- gpointer data;
- gpointer data2;
- gpointer data3;
- gpointer data4;
-} GIAttributeIter;
-
-GIBaseInfo * g_base_info_ref (GIBaseInfo *info);
-void g_base_info_unref (GIBaseInfo *info);
-GIInfoType g_base_info_get_type (GIBaseInfo *info);
-const gchar * g_base_info_get_name (GIBaseInfo *info);
-const gchar * g_base_info_get_namespace (GIBaseInfo *info);
-gboolean g_base_info_is_deprecated (GIBaseInfo *info);
-const gchar * g_base_info_get_attribute (GIBaseInfo *info,
- const gchar *name);
-gboolean g_base_info_iterate_attributes (GIBaseInfo *info,
- GIAttributeIter *iterator,
- char **name,
- char **value);
-GIBaseInfo * g_base_info_get_container (GIBaseInfo *info);
-GTypelib * g_base_info_get_typelib (GIBaseInfo *info);
-gboolean g_base_info_equal (GIBaseInfo *info1,
- GIBaseInfo *info2);
-GIBaseInfo * g_info_new (GIInfoType type,
- GIBaseInfo *container,
- GTypelib *typelib,
- guint32 offset);
-
/* GIFunctionInfo */
#define GI_IS_FUNCTION_INFO(info) \
@@ -919,5 +669,6 @@ gint g_constant_info_get_value (GIConstantInfo
G_END_DECLS
+
#endif /* __G_IREPOSITORY_H__ */
diff --git a/girepository/gitypelib.h b/girepository/gitypelib.h
new file mode 100644
index 00000000..2f74bf6a
--- /dev/null
+++ b/girepository/gitypelib.h
@@ -0,0 +1,53 @@
+/* GObject introspection: Public typelib API
+ *
+ * Copyright (C) 2005 Matthias Clasen
+ * Copyright (C) 2008,2009 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+..skipping...
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GITYPELIB_H__
+#define __GITYPELIB_H__
+
+#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION)
+#error "Only <girepository/girepository.h> can be included directly."
+#endif
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GTypelib GTypelib;
+
+GTypelib * g_typelib_new_from_memory (guchar *memory,
+ gsize len);
+GTypelib * g_typelib_new_from_const_memory (const guchar *memory,
+ gsize len);
+GTypelib * g_typelib_new_from_mapped_file (GMappedFile *mfile);
+void g_typelib_free (GTypelib *typelib);
+
+gboolean g_typelib_symbol (GTypelib *typelib,
+ const gchar *symbol_name,
+ gpointer *symbol);
+const gchar * g_typelib_get_namespace (GTypelib *typelib);
+
+
+G_END_DECLS
+
+#endif /* __GITYPELIB_H__ */
+
diff --git a/girepository/gitypes.h b/girepository/gitypes.h
new file mode 100644
index 00000000..8951d917
--- /dev/null
+++ b/girepository/gitypes.h
@@ -0,0 +1,225 @@
+/* GObject introspection: types
+ *
+ * Copyright (C) 2005 Matthias Clasen
+ * Copyright (C) 2008,2009 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GITYPES_H__
+#define __GITYPES_H__
+
+#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION)
+#error "Only <girepository/girepository.h> can be included directly."
+#endif
+
+#include <girepository/gibaseinfo.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GIBaseInfoStub GIBaseInfo;
+
+/**
+ * GICallableInfo:
+ *
+ * Represents a callable, either #GIFunctionInfo, #GICallbackInfo or
+ * #GIVFuncInfo.
+ */
+typedef GIBaseInfo GICallableInfo;
+
+/**
+ * GIFunctionInfo:
+ *
+ * Represents a function, eg arguments and return value.
+ */
+typedef GIBaseInfo GIFunctionInfo;
+
+/**
+ * GICallbackInfo:
+ *
+ * Represents a callback, eg arguments and return value.
+ */
+typedef GIBaseInfo GICallbackInfo;
+
+/**
+ * GIRegisteredTypeInfo:
+ *
+ * Represent a registered type.
+ */
+typedef GIBaseInfo GIRegisteredTypeInfo;
+
+/**
+ * GIStructInfo:
+ *
+ * Represents a struct.
+ */
+typedef GIBaseInfo GIStructInfo;
+
+/**
+ * GIUnionInfo:
+ *
+ * Represents a union.
+ */
+typedef GIBaseInfo GIUnionInfo;
+
+/**
+ * GIEnumInfo:
+ *
+ * Represents an enum or a flag.
+ */
+typedef GIBaseInfo GIEnumInfo;
+
+/**
+ * GIObjectInfo:
+ *
+ * Represents an object.
+ */
+typedef GIBaseInfo GIObjectInfo;
+
+/**
+ * GIInterfaceInfo:
+ *
+ * Represents an interface.
+ */
+typedef GIBaseInfo GIInterfaceInfo;
+
+/**
+ * GIConstantInfo:
+ *
+ * Represents a constant.
+ */
+typedef GIBaseInfo GIConstantInfo;
+
+/**
+ * GIValueInfo:
+ *
+ * Represents a enum value of a #GIEnumInfo.
+ */
+typedef GIBaseInfo GIValueInfo;
+
+/**
+ * GISignalInfo:
+ *
+ * Represents a signal.
+ */
+typedef GIBaseInfo GISignalInfo;
+
+/**
+ * GIVFuncInfo
+ *
+ * Represents a virtual function.
+ */
+typedef GIBaseInfo GIVFuncInfo;
+
+/**
+ * GIPropertyInfo:
+ *
+ * Represents a property of a #GIObjectInfo or a #GIInterfaceInfo.
+ */
+typedef GIBaseInfo GIPropertyInfo;
+
+/**
+ * GIFieldInfo:
+ *
+ * Represents a field of a #GIStructInfo or a #GIUnionInfo.
+ */
+typedef GIBaseInfo GIFieldInfo;
+
+/**
+ * GIArgInfo:
+ *
+ * Represents an argument.
+ */
+typedef GIBaseInfo GIArgInfo;
+
+/**
+ * GITypeInfo:
+ *
+ * Represents type information, direction, transfer etc.
+ */
+typedef GIBaseInfo GITypeInfo;
+
+/**
+ * GIErrorDomainInfo:
+ *
+ * Represents a #GError error domain.
+ */
+typedef GIBaseInfo GIErrorDomainInfo;
+
+/**
+ * GIUnresolvedInfo:
+ *
+ * Represents a unresolved type in a typelib.
+ */
+typedef struct _GIUnresolvedInfo GIUnresolvedInfo;
+
+/* Types of objects registered in the repository */
+
+/**
+ * GIInfoType:
+ * @GI_INFO_TYPE_INVALID: invalid type
+ * @GI_INFO_TYPE_FUNCTION: function, see #GIFunctionInfo
+ * @GI_INFO_TYPE_CALLBACK: callback, see #GIFunctionInfo
+ * @GI_INFO_TYPE_STRUCT: struct, see #GIStructInfo
+ * @GI_INFO_TYPE_BOXED: boxed, see #GIStructInfo or #GIUnionInfo
+ * @GI_INFO_TYPE_ENUM: enum, see #GIEnumInfo
+ * @GI_INFO_TYPE_FLAGS: flags, see #GIEnumInfo
+ * @GI_INFO_TYPE_OBJECT: object, see #GIObjectInfo
+ * @GI_INFO_TYPE_INTERFACE: interface, see #GIInterfaceInfo
+ * @GI_INFO_TYPE_CONSTANT: contant, see #GIConstantInfo
+ * @GI_INFO_TYPE_ERROR_DOMAIN: error domain for a #GError, see #GIErrorDomainInfo
+ * @GI_INFO_TYPE_UNION: union, see #GIUnionInfo
+ * @GI_INFO_TYPE_VALUE: enum value, see #GIValueInfo
+ * @GI_INFO_TYPE_SIGNAL: signal, see #GISignalInfo
+ * @GI_INFO_TYPE_VFUNC: virtual function, see #GIVFuncInfo
+ * @GI_INFO_TYPE_PROPERTY: GObject property, see #GIPropertyInfo
+ * @GI_INFO_TYPE_FIELD: struct or union field, see #GIFieldInfo
+ * @GI_INFO_TYPE_ARG: argument of a function or callback, see #GIArgInfo
+ * @GI_INFO_TYPE_TYPE: type information, see #GITypeInfo
+ * @GI_INFO_TYPE_UNRESOLVED: unresolved type, a type which is not present in
+ * the typelib, or any of its dependencies.
+ *
+ * The type of a GIBaseInfo struct.
+ */
+typedef enum
+{
+ GI_INFO_TYPE_INVALID,
+ GI_INFO_TYPE_FUNCTION,
+ GI_INFO_TYPE_CALLBACK,
+ GI_INFO_TYPE_STRUCT,
+ GI_INFO_TYPE_BOXED,
+ GI_INFO_TYPE_ENUM, /* 5 */
+ GI_INFO_TYPE_FLAGS,
+ GI_INFO_TYPE_OBJECT,
+ GI_INFO_TYPE_INTERFACE,
+ GI_INFO_TYPE_CONSTANT,
+ GI_INFO_TYPE_ERROR_DOMAIN, /* 10 */
+ GI_INFO_TYPE_UNION,
+ GI_INFO_TYPE_VALUE,
+ GI_INFO_TYPE_SIGNAL,
+ GI_INFO_TYPE_VFUNC,
+ GI_INFO_TYPE_PROPERTY, /* 15 */
+ GI_INFO_TYPE_FIELD,
+ GI_INFO_TYPE_ARG,
+ GI_INFO_TYPE_TYPE,
+ GI_INFO_TYPE_UNRESOLVED
+} GIInfoType;
+
+
+G_END_DECLS
+
+#endif /* __GITYPES_H__ */
+