diff options
-rw-r--r-- | docs/reference/gi-sections.txt | 1 | ||||
-rw-r--r-- | girepository/girepository.c | 117 | ||||
-rw-r--r-- | girepository/girepository.h | 4 | ||||
-rw-r--r-- | girepository/girwriter.c | 4 | ||||
-rw-r--r-- | girepository/giversionmacros.h | 16 |
5 files changed, 132 insertions, 10 deletions
diff --git a/docs/reference/gi-sections.txt b/docs/reference/gi-sections.txt index 59f0d50a..548a5f48 100644 --- a/docs/reference/gi-sections.txt +++ b/docs/reference/gi-sections.txt @@ -5,6 +5,7 @@ GIRepository GIRepositoryLoadFlags g_irepository_get_default g_irepository_get_dependencies +g_irepository_get_immediate_dependencies g_irepository_get_loaded_namespaces g_irepository_get_n_infos g_irepository_get_info diff --git a/girepository/girepository.c b/girepository/girepository.c index fb91afaa..efc3bded 100644 --- a/girepository/girepository.c +++ b/girepository/girepository.c @@ -432,6 +432,89 @@ register_internal (GIRepository *repository, } /** + * g_irepository_get_immediate_dependencies: + * @repository: (nullable): A #GIRepository or %NULL for the singleton + * process-global default #GIRepository + * @namespace_: Namespace of interest + * + * Return an array of the immediate versioned dependencies for @namespace_. + * Returned strings are of the form <code>namespace-version</code>. + * + * Note: @namespace_ must have already been loaded using a function + * such as g_irepository_require() before calling this function. + * + * To get the transitive closure of dependencies for @namespace_, use + * g_irepository_get_dependencies(). + * + * Returns: (transfer full): Zero-terminated string array of immediate versioned + * dependencies + * + * Since: 1.44 + */ +char ** +g_irepository_get_immediate_dependencies (GIRepository *repository, + const char *namespace) +{ + GITypelib *typelib; + gchar **deps; + + g_return_val_if_fail (namespace != NULL, NULL); + + repository = get_repository (repository); + + typelib = get_registered (repository, namespace, NULL); + g_return_val_if_fail (typelib != NULL, NULL); + + /* Ensure we always return a non-%NULL vector. */ + deps = get_typelib_dependencies (typelib); + if (deps == NULL) + deps = g_strsplit ("", "|", 0); + + return deps; +} + +/* Load the transitive closure of dependency namespace-version strings for the + * given @typelib. @repository must be non-%NULL. @transitive_dependencies must + * be a pre-existing GHashTable<owned utf8, owned utf8> set for storing the + * dependencies. */ +static void +get_typelib_dependencies_transitive (GIRepository *repository, + GITypelib *typelib, + GHashTable *transitive_dependencies) +{ + gchar **immediate_dependencies; + guint i; + + immediate_dependencies = get_typelib_dependencies (typelib); + + for (i = 0; immediate_dependencies != NULL && immediate_dependencies[i]; i++) + { + gchar *dependency; + const gchar *last_dash; + gchar *dependency_namespace; + + dependency = immediate_dependencies[i]; + + /* Steal from the strv. */ + g_hash_table_add (transitive_dependencies, dependency); + immediate_dependencies[i] = NULL; + + /* Recurse for this namespace. */ + last_dash = strrchr (dependency, '-'); + dependency_namespace = g_strndup (dependency, last_dash - dependency); + + typelib = get_registered (repository, dependency_namespace, NULL); + g_return_if_fail (typelib != NULL); + get_typelib_dependencies_transitive (repository, typelib, + transitive_dependencies); + + g_free (dependency_namespace); + } + + g_free (immediate_dependencies); +} + +/** * g_irepository_get_dependencies: * @repository: (allow-none): A #GIRepository or %NULL for the singleton * process-global default #GIRepository @@ -444,7 +527,10 @@ register_internal (GIRepository *repository, * Note: @namespace_ must have already been loaded using a function * such as g_irepository_require() before calling this function. * - * Returns: (transfer full): Zero-terminated string array of versioned + * To get only the immediate dependencies for @namespace_, use + * g_irepository_get_immediate_dependencies(). + * + * Returns: (transfer full): Zero-terminated string array of all versioned * dependencies */ char ** @@ -452,21 +538,38 @@ g_irepository_get_dependencies (GIRepository *repository, const char *namespace) { GITypelib *typelib; - gchar **deps; + GHashTable *transitive_dependencies; /* set of owned utf8 */ + GHashTableIter iter; + gchar *dependency; + GPtrArray *out; /* owned utf8 elements */ g_return_val_if_fail (namespace != NULL, NULL); repository = get_repository (repository); + transitive_dependencies = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, NULL); + /* Load the dependencies. */ typelib = get_registered (repository, namespace, NULL); g_return_val_if_fail (typelib != NULL, NULL); + get_typelib_dependencies_transitive (repository, typelib, + transitive_dependencies); - /* Ensure we always return a non-%NULL vector. */ - deps = get_typelib_dependencies (typelib); - if (deps == NULL) - deps = g_strsplit ("", "|", 0); + /* Convert to a string array. */ + out = g_ptr_array_new_full (g_hash_table_size (transitive_dependencies), + g_free); + g_hash_table_iter_init (&iter, transitive_dependencies); - return deps; + while (g_hash_table_iter_next (&iter, (gpointer) &dependency, NULL)) + { + g_ptr_array_add (out, dependency); + g_hash_table_iter_steal (&iter); + } + + /* Add a NULL terminator. */ + g_ptr_array_add (out, NULL); + + return (gchar **) g_ptr_array_free (out, FALSE); } /** diff --git a/girepository/girepository.h b/girepository/girepository.h index dcc34ce2..e3ed8372 100644 --- a/girepository/girepository.h +++ b/girepository/girepository.h @@ -143,6 +143,10 @@ GITypelib * g_irepository_require_private (GIRepository *repository, GIRepositoryLoadFlags flags, GError **error); +GI_AVAILABLE_IN_1_44 +gchar ** g_irepository_get_immediate_dependencies (GIRepository *repository, + const gchar *namespace_); + GI_AVAILABLE_IN_ALL gchar ** g_irepository_get_dependencies (GIRepository *repository, const gchar *namespace_); diff --git a/girepository/girwriter.c b/girepository/girwriter.c index 5b39e2de..01f5f506 100644 --- a/girepository/girwriter.c +++ b/girepository/girwriter.c @@ -1307,8 +1307,8 @@ gir_writer_write (const char *filename, " xmlns:c=\"http://www.gtk.org/introspection/c/1.0\"\n" " xmlns:glib=\"http://www.gtk.org/introspection/glib/1.0\""); - dependencies = g_irepository_get_dependencies (repository, - namespace); + dependencies = g_irepository_get_immediate_dependencies (repository, + namespace); if (dependencies != NULL) { for (i = 0; dependencies[i]; i++) diff --git a/girepository/giversionmacros.h b/girepository/giversionmacros.h index 15c88476..3c2faf47 100644 --- a/girepository/giversionmacros.h +++ b/girepository/giversionmacros.h @@ -125,4 +125,18 @@ # define GI_AVAILABLE_IN_1_42 _GI_EXTERN #endif -#endif /* __GIVERSIONMACROS_H__ */
\ No newline at end of file +#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_44 +# define GI_DEPRECATED_IN_1_44 GLIB_DEPRECATED +# define GI_DEPRECATED_IN_1_44_FOR(f) GLIB_DEPRECATED_FOR(f) +#else +# define GI_DEPRECATED_IN_1_44 _GI_EXTERN +# define GI_DEPRECATED_IN_1_44_FOR(f) _GI_EXTERN +#endif + +#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_44 +# define GI_AVAILABLE_IN_1_44 GLIB_UNAVAILABLE(2, 44) +#else +# define GI_AVAILABLE_IN_1_44 _GI_EXTERN +#endif + +#endif /* __GIVERSIONMACROS_H__ */ |