From b9c582bc753936eceaa7542b6064b84c0b3f5bda Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Thu, 17 Dec 2015 19:50:40 +0100 Subject: [PATCH] lib: Change how listing installed refs work Now we return a GPtrArray, and the main call returns both apps and runtimes, and a new _by_kind version lets you get only a specific one. --- lib/test-lib.c | 99 +++++++++++++++++++++++++------------- lib/xdg-app-installation.c | 56 ++++++++++++++++++--- lib/xdg-app-installation.h | 5 +- 3 files changed, 119 insertions(+), 41 deletions(-) diff --git a/lib/test-lib.c b/lib/test-lib.c index 40f8fe54f..699dde6a8 100644 --- a/lib/test-lib.c +++ b/lib/test-lib.c @@ -18,11 +18,9 @@ int main (int argc, char *argv[]) { XdgAppInstallation *installation; - XdgAppInstalledRef **apps; XdgAppRemoteRef **refs; XdgAppInstalledRef *app1; XdgAppInstalledRef *app2; - XdgAppInstalledRef **runtimes; XdgAppRemoteRef *remote_ref; XdgAppRemote **remotes; GError *error = NULL; @@ -65,42 +63,75 @@ main (int argc, char *argv[]) return 0; } - g_print ("**** Listing all installed apps\n"); - apps = xdg_app_installation_list_installed_refs (installation, - XDG_APP_REF_KIND_APP, - NULL, NULL); + g_print ("\n**** Listing all installed refs\n"); + { + g_autoptr(GPtrArray) refs = NULL; - for (i = 0; apps[i] != NULL; i++) - { - g_print ("%d %s %s %s %s %s %s %d\n", - xdg_app_ref_get_kind (XDG_APP_REF(apps[i])), - xdg_app_ref_get_name (XDG_APP_REF(apps[i])), - xdg_app_ref_get_arch (XDG_APP_REF(apps[i])), - xdg_app_ref_get_version (XDG_APP_REF(apps[i])), - xdg_app_ref_get_commit (XDG_APP_REF(apps[i])), - xdg_app_installed_ref_get_origin (apps[i]), - xdg_app_installed_ref_get_deploy_dir (apps[i]), - xdg_app_installed_ref_get_current (apps[i])); - g_print ("metadata:\n%s\n", xdg_app_installed_ref_load_metadata (apps[i], NULL, NULL)); - } + refs = xdg_app_installation_list_installed_refs (installation, + NULL, NULL); + + for (i = 0; i < refs->len; i++) + { + XdgAppInstalledRef *ref = g_ptr_array_index(refs,i); + g_print ("%d %s %s %s %s %s %s %d\n", + xdg_app_ref_get_kind (XDG_APP_REF(ref)), + xdg_app_ref_get_name (XDG_APP_REF(ref)), + xdg_app_ref_get_arch (XDG_APP_REF(ref)), + xdg_app_ref_get_version (XDG_APP_REF(ref)), + xdg_app_ref_get_commit (XDG_APP_REF(ref)), + xdg_app_installed_ref_get_origin (ref), + xdg_app_installed_ref_get_deploy_dir (ref), + xdg_app_installed_ref_get_current (ref)); + } + } + + g_print ("**** Listing all installed apps\n"); + { + g_autoptr(GPtrArray) apps = NULL; + + apps = xdg_app_installation_list_installed_refs_by_kind (installation, + XDG_APP_REF_KIND_APP, + NULL, NULL); + + for (i = 0; i < apps->len; i++) + { + XdgAppInstalledRef *app = g_ptr_array_index(apps,i); + + g_print ("%d %s %s %s %s %s %s %d\n", + xdg_app_ref_get_kind (XDG_APP_REF(app)), + xdg_app_ref_get_name (XDG_APP_REF(app)), + xdg_app_ref_get_arch (XDG_APP_REF(app)), + xdg_app_ref_get_version (XDG_APP_REF(app)), + xdg_app_ref_get_commit (XDG_APP_REF(app)), + xdg_app_installed_ref_get_origin (app), + xdg_app_installed_ref_get_deploy_dir (app), + xdg_app_installed_ref_get_current (app)); + g_print ("metadata:\n%s\n", xdg_app_installed_ref_load_metadata (app, NULL, NULL)); + } + } g_print ("\n**** Listing all installed runtimes\n"); - runtimes = xdg_app_installation_list_installed_refs (installation, - XDG_APP_REF_KIND_RUNTIME, - NULL, NULL); + { + g_autoptr(GPtrArray) runtimes = NULL; - for (i = 0; runtimes[i] != NULL; i++) - { - g_print ("%d %s %s %s %s %s %s %d\n", - xdg_app_ref_get_kind (XDG_APP_REF(runtimes[i])), - xdg_app_ref_get_name (XDG_APP_REF(runtimes[i])), - xdg_app_ref_get_arch (XDG_APP_REF(runtimes[i])), - xdg_app_ref_get_version (XDG_APP_REF(runtimes[i])), - xdg_app_ref_get_commit (XDG_APP_REF(runtimes[i])), - xdg_app_installed_ref_get_origin (runtimes[i]), - xdg_app_installed_ref_get_deploy_dir (runtimes[i]), - xdg_app_installed_ref_get_current (runtimes[i])); - } + runtimes = xdg_app_installation_list_installed_refs_by_kind (installation, + XDG_APP_REF_KIND_RUNTIME, + NULL, NULL); + + for (i = 0; i < runtimes->len; i++) + { + XdgAppInstalledRef *runtime = g_ptr_array_index(runtimes,i); + g_print ("%d %s %s %s %s %s %s %d\n", + xdg_app_ref_get_kind (XDG_APP_REF(runtime)), + xdg_app_ref_get_name (XDG_APP_REF(runtime)), + xdg_app_ref_get_arch (XDG_APP_REF(runtime)), + xdg_app_ref_get_version (XDG_APP_REF(runtime)), + xdg_app_ref_get_commit (XDG_APP_REF(runtime)), + xdg_app_installed_ref_get_origin (runtime), + xdg_app_installed_ref_get_deploy_dir (runtime), + xdg_app_installed_ref_get_current (runtime)); + } + } g_print ("\n**** Getting installed gedit master\n"); app1 = xdg_app_installation_get_installed_ref (installation, diff --git a/lib/xdg-app-installation.c b/lib/xdg-app-installation.c index 3513d86c4..ee0b29ffa 100644 --- a/lib/xdg-app-installation.c +++ b/lib/xdg-app-installation.c @@ -263,20 +263,65 @@ xdg_app_installation_get_current_installed_app (XdgAppInstallation *self, /** * xdg_app_installation_list_installed_refs: * @self: a #XdgAppInstallation - * @kind: the kind of installation * @cancellable: (nullable): a #GCancellable * @error: return location for a #GError * * Lists the installed references. * - * Returns: (transfer full) (array zero-terminated=1): an array of + * Returns: (transfer container) (element-type XdgAppInstalledRef): an GPtrArray of * #XdgAppInstalledRef instances */ -XdgAppInstalledRef ** +GPtrArray * xdg_app_installation_list_installed_refs (XdgAppInstallation *self, - XdgAppRefKind kind, GCancellable *cancellable, GError **error) +{ + XdgAppInstallationPrivate *priv = xdg_app_installation_get_instance_private (self); + g_auto(GStrv) raw_refs_app = NULL; + g_auto(GStrv) raw_refs_runtime = NULL; + g_autoptr(GPtrArray) refs = g_ptr_array_new_with_free_func (g_object_unref); + int i; + + if (!xdg_app_dir_list_refs (priv->dir, + "app", + &raw_refs_app, + cancellable, error)) + return NULL; + + for (i = 0; raw_refs_app[i] != NULL; i++) + g_ptr_array_add (refs, + get_ref (self, raw_refs_app[i], cancellable)); + + if (!xdg_app_dir_list_refs (priv->dir, + "runtime", + &raw_refs_runtime, + cancellable, error)) + return NULL; + + for (i = 0; raw_refs_runtime[i] != NULL; i++) + g_ptr_array_add (refs, + get_ref (self, raw_refs_runtime[i], cancellable)); + + return g_steal_pointer (&refs); +} + +/** + * xdg_app_installation_list_installed_refs_by_kind: + * @self: a #XdgAppInstallation + * @kind: the kind of installation + * @cancellable: (nullable): a #GCancellable + * @error: return location for a #GError + * + * Lists the installed references of a specific kind. + * + * Returns: (transfer container) (element-type XdgAppInstalledRef): an GPtrArray of + * #XdgAppInstalledRef instances + */ +GPtrArray * +xdg_app_installation_list_installed_refs_by_kind (XdgAppInstallation *self, + XdgAppRefKind kind, + GCancellable *cancellable, + GError **error) { XdgAppInstallationPrivate *priv = xdg_app_installation_get_instance_private (self); g_auto(GStrv) raw_refs = NULL; @@ -293,8 +338,7 @@ xdg_app_installation_list_installed_refs (XdgAppInstallation *self, g_ptr_array_add (refs, get_ref (self, raw_refs[i], cancellable)); - g_ptr_array_add (refs, NULL); - return (XdgAppInstalledRef **)g_ptr_array_free (g_steal_pointer (&refs), FALSE); + return g_steal_pointer (&refs); } /** diff --git a/lib/xdg-app-installation.h b/lib/xdg-app-installation.h index e03a488e9..249234b97 100644 --- a/lib/xdg-app-installation.h +++ b/lib/xdg-app-installation.h @@ -61,7 +61,10 @@ typedef void (*XdgAppProgressCallback)(const char *status, gpointer user_data); XDG_APP_EXTERN gboolean xdg_app_installation_get_is_user (XdgAppInstallation *self); -XDG_APP_EXTERN XdgAppInstalledRef **xdg_app_installation_list_installed_refs (XdgAppInstallation *self, +XDG_APP_EXTERN GPtrArray *xdg_app_installation_list_installed_refs (XdgAppInstallation *self, + GCancellable *cancellable, + GError **error); +XDG_APP_EXTERN GPtrArray *xdg_app_installation_list_installed_refs_by_kind (XdgAppInstallation *self, XdgAppRefKind kind, GCancellable *cancellable, GError **error);