2008-08-20 Colin Walters <walters@verbum.org>
+ * girepository/girepository.c: Remove
+ g_irepository_register_file in favor of
+ g_irepository_require. There are two
+ possible deployment scenarios for typelibs:
+ First, separate in $DATADIR/gitypelibs/. Second,
+ they may be embedded in shlibs. However since
+ the first is now the normal case, the API is
+ optimized around it.
+
+ Refactor internals to look up typelibs for
+ namespaces just-in-time, but we expect
+ consumers to call g_irepository_require.
+
+ Also, add some docs. No one has died from that
+ before.
+ * gir/Makefile.am: Need --library for glib.
+ * giscanner/girwriter.py: Write out shared-library.
+ * tools/g-ir-writer: Take the first --library
+ argument as the target of shared-library. In
+ the future we should make this nicer with pkg-config
+ probably.
+
+2008-08-20 Colin Walters <walters@verbum.org>
+
* girepository/girparser.py: And parse them.
2008-08-20 Johan Dahlin <johan@gnome.org>
#include "girepository.h"
#include "gtypelib.h"
+static GStaticMutex globals_lock = G_STATIC_MUTEX_INIT;
static GIRepository *default_repository = NULL;
static GHashTable *default_typelib = NULL;
static GSList *search_path = NULL;
g_type_class_add_private (class, sizeof (GIRepositoryPrivate));
}
+static void
+init_globals ()
+{
+ g_static_mutex_lock (&globals_lock);
+
+ if (default_repository == NULL)
+ {
+ default_repository = g_object_new (G_TYPE_IREPOSITORY, NULL);
+ if (default_typelib == NULL)
+ default_typelib = g_hash_table_new_full (g_str_hash, g_str_equal,
+ (GDestroyNotify) NULL,
+ (GDestroyNotify) g_typelib_free);
+ default_repository->priv->typelib = default_typelib;
+ }
+
+ if (search_path == NULL)
+ {
+ const gchar *const *datadirs;
+ const gchar *const *dir;
+
+ datadirs = g_get_system_data_dirs ();
+
+ search_path = NULL;
+ for (dir = datadirs; *dir; dir++) {
+ char *path = g_build_filename (*dir, "gitypelibs", NULL);
+ search_path = g_slist_prepend (search_path, path);
+ }
+ search_path = g_slist_reverse (search_path);
+ }
+
+ g_static_mutex_unlock (&globals_lock);
+}
+
const gchar *
g_irepository_register (GIRepository *repository,
GTypelib *typelib)
}
else
{
- if (default_typelib == NULL)
- default_typelib = g_hash_table_new_full (g_str_hash, g_str_equal,
- (GDestroyNotify) NULL,
- (GDestroyNotify) g_typelib_free);
+ init_globals ();
table = default_typelib;
}
if (repository != NULL)
table = repository->priv->typelib;
- else
- table = default_typelib;
+ else
+ {
+ init_globals ();
+ table = default_typelib;
+ }
if (!g_hash_table_remove (table, namespace))
{
if (repository != NULL)
table = repository->priv->typelib;
else
- table = default_typelib;
+ {
+ init_globals ();
+ table = default_typelib;
+ }
return g_hash_table_lookup (table, namespace) != NULL;
}
GIRepository *
g_irepository_get_default (void)
{
- if (default_repository == NULL)
- {
- default_repository = g_object_new (G_TYPE_IREPOSITORY, NULL);
- if (default_typelib == NULL)
- default_typelib = g_hash_table_new_full (g_str_hash, g_str_equal,
- (GDestroyNotify) NULL,
- (GDestroyNotify) g_typelib_free);
- default_repository->priv->typelib = default_typelib;
- }
-
+ init_globals ();
return default_repository;
}
return data.iface;
}
+/**
+ * g_irepository_find_by_name
+ * @repository: A #GIRepository, may be %NULL for the default
+ * @namespace: Namespace to search in, may be %NULL for all
+ * @name: Name to find
+ *
+ * Searches for a particular name in one or all namespaces.
+ * See #g_irepository_require to load metadata for namespaces.
+
+ * Returns: #GIBaseInfo representing metadata about @name, or %NULL
+ */
GIBaseInfo *
g_irepository_find_by_name (GIRepository *repository,
const gchar *namespace,
*list = g_list_append (*list, key);
}
+/**
+ * g_irepository_get_namespaces
+ * @repository: A #GIRepository, may be %NULL for the default
+ *
+ * Return the list of currently known namespaces. Normally
+ * if you want a particular namespace, you should call
+ * #g_irepository_require to load it in.
+
+ * Returns: List of namespaces
+ */
gchar **
g_irepository_get_namespaces (GIRepository *repository)
{
static inline void
g_irepository_build_search_path (void)
{
- const gchar *const *datadirs;
- const gchar *const *dir;
-
- datadirs = g_get_system_data_dirs ();
-
- search_path = NULL;
- for (dir = datadirs; *dir; dir++) {
- char *path = g_build_filename (*dir, "gitypelibs", NULL);
- search_path = g_slist_prepend (search_path, path);
- }
- search_path = g_slist_reverse (search_path);
}
+/**
+ * g_irepository_require
+ * @repository: Repository, may be null for the default
+ * @namespace: GI namespace to use, e.g. "Gtk"
+ * @error: a #GError.
+ *
+ * Force the namespace @namespace to be loaded if it isn't
+ * already. If @namespace is not loaded, this function will
+ * search for a ".typelib" file using the repository search
+ * path.
+ *
+ * Returns: Namespace if successful, NULL otherwise
+ */
const gchar *
-g_irepository_register_file (GIRepository *repository,
- const gchar *namespace,
- GError **error)
+g_irepository_require (GIRepository *repository,
+ const gchar *namespace,
+ GError **error)
{
GSList *ldir;
const char *dir;
if (repository != NULL)
table = repository->priv->typelib;
else
- table = default_typelib;
+ {
+ init_globals ();
+ table = default_typelib;
+ }
/* don't bother loading a namespace if already registered */
if (g_hash_table_lookup (table, namespace))
- return NULL;
-
- if (search_path == NULL)
- g_irepository_build_search_path ();
+ return namespace;
fname = g_strconcat (namespace, ".typelib", NULL);
full_path = g_build_filename (dir, fname, NULL);
mfile = g_mapped_file_new (full_path, FALSE, &error1);
if (error1) {
- g_debug ("Failed to mmap \"%s\": %s", full_path, error1->message);
g_clear_error (&error1);
g_free (full_path);
continue;
from __future__ import with_statement
+import os
+
from .ast import (Callback, Class, Enum, Function, Interface, Member,
Sequence, Struct, Alias, Union)
from .glibast import (GLibBoxed, GLibEnum, GLibEnumMember,
class GIRWriter(XMLWriter):
- def __init__(self, namespace):
+ def __init__(self, namespace, shlib):
super(GIRWriter, self).__init__()
- self._write_repository(namespace)
+ self._write_repository(namespace, shlib)
- def _write_repository(self, namespace):
+ def _write_repository(self, namespace, shlib):
attrs = [
('version', '1.0'),
('xmlns', 'http://www.gtk.org/introspection/core/1.0'),
('xmlns:glib', 'http://www.gtk.org/introspection/glib/1.0'),
]
with self.tagcontext('repository', attrs):
- self._write_namespace(namespace)
+ self._write_namespace(namespace, shlib)
- def _write_namespace(self, namespace):
- attrs = [('name', namespace.name)]
+ def _write_namespace(self, namespace, shlib):
+ attrs = [('name', namespace.name),('shared-library', os.path.basename(shlib))]
with self.tagcontext('namespace', attrs):
for node in namespace.nodes:
self._write_node(node)