diff options
author | Alexander Larsson <alexl@redhat.com> | 2016-05-06 18:03:47 +0200 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2016-05-09 09:00:20 +0200 |
commit | c24528d3697c62cad8ff746a56992a59f31d333d (patch) | |
tree | 2dbb32e15c57cc4061f7b37d6db29a7b97228c15 /lib/flatpak-installed-ref.c | |
parent | 6a613d1fabce5e93656cfbcb6815cc9bc98f437b (diff) | |
download | xdg-app-c24528d3697c62cad8ff746a56992a59f31d333d.tar.gz |
Rename source files to flatpak
Diffstat (limited to 'lib/flatpak-installed-ref.c')
-rw-r--r-- | lib/flatpak-installed-ref.c | 391 |
1 files changed, 391 insertions, 0 deletions
diff --git a/lib/flatpak-installed-ref.c b/lib/flatpak-installed-ref.c new file mode 100644 index 0000000..4915064 --- /dev/null +++ b/lib/flatpak-installed-ref.c @@ -0,0 +1,391 @@ +/* + * Copyright © 2015 Red Hat, Inc + * + * This program 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, see <http://www.gnu.org/licenses/>. + * + * Authors: + * Alexander Larsson <alexl@redhat.com> + */ + +#include "config.h" + +#include <string.h> + +#include "flatpak-utils.h" +#include "flatpak-installed-ref.h" +#include "flatpak-enum-types.h" + +/** + * SECTION:xdg-app-installed-ref + * @Title: FlatpakInstalledRef + * @Short_description: Installed application reference + * + * A FlatpakInstalledRef provides information about an installed + * application or runtime (in short: ref), such as the available + * builds, its size, location, etc. + */ + +typedef struct _FlatpakInstalledRefPrivate FlatpakInstalledRefPrivate; + +struct _FlatpakInstalledRefPrivate +{ + gboolean is_current; + char *origin; + char *latest_commit; + char *deploy_dir; + char **subpaths; + guint64 installed_size; +}; + +G_DEFINE_TYPE_WITH_PRIVATE (FlatpakInstalledRef, flatpak_installed_ref, FLATPAK_TYPE_REF) + +enum { + PROP_0, + + PROP_IS_CURRENT, + PROP_ORIGIN, + PROP_LATEST_COMMIT, + PROP_DEPLOY_DIR, + PROP_INSTALLED_SIZE, + PROP_SUBPATHS +}; + +static void +flatpak_installed_ref_finalize (GObject *object) +{ + FlatpakInstalledRef *self = FLATPAK_INSTALLED_REF (object); + FlatpakInstalledRefPrivate *priv = flatpak_installed_ref_get_instance_private (self); + + g_free (priv->origin); + g_free (priv->deploy_dir); + g_strfreev (priv->subpaths); + + G_OBJECT_CLASS (flatpak_installed_ref_parent_class)->finalize (object); +} + +static void +flatpak_installed_ref_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + FlatpakInstalledRef *self = FLATPAK_INSTALLED_REF (object); + FlatpakInstalledRefPrivate *priv = flatpak_installed_ref_get_instance_private (self); + + switch (prop_id) + { + case PROP_IS_CURRENT: + priv->is_current = g_value_get_boolean (value); + break; + + case PROP_INSTALLED_SIZE: + priv->installed_size = g_value_get_uint64 (value); + break; + + case PROP_ORIGIN: + g_clear_pointer (&priv->origin, g_free); + priv->origin = g_value_dup_string (value); + break; + + case PROP_LATEST_COMMIT: + g_clear_pointer (&priv->latest_commit, g_free); + priv->latest_commit = g_value_dup_string (value); + break; + + case PROP_DEPLOY_DIR: + g_clear_pointer (&priv->deploy_dir, g_free); + priv->deploy_dir = g_value_dup_string (value); + break; + + case PROP_SUBPATHS: + g_clear_pointer (&priv->subpaths, g_strfreev); + priv->subpaths = g_strdupv (g_value_get_boxed (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +flatpak_installed_ref_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + FlatpakInstalledRef *self = FLATPAK_INSTALLED_REF (object); + FlatpakInstalledRefPrivate *priv = flatpak_installed_ref_get_instance_private (self); + + switch (prop_id) + { + case PROP_IS_CURRENT: + g_value_set_boolean (value, priv->is_current); + break; + + case PROP_INSTALLED_SIZE: + g_value_set_uint64 (value, priv->installed_size); + break; + + case PROP_ORIGIN: + g_value_set_string (value, priv->origin); + break; + + case PROP_LATEST_COMMIT: + g_value_set_string (value, priv->latest_commit); + break; + + case PROP_DEPLOY_DIR: + g_value_set_string (value, priv->deploy_dir); + break; + + case PROP_SUBPATHS: + g_value_set_boxed (value, priv->subpaths); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +flatpak_installed_ref_class_init (FlatpakInstalledRefClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = flatpak_installed_ref_get_property; + object_class->set_property = flatpak_installed_ref_set_property; + object_class->finalize = flatpak_installed_ref_finalize; + + g_object_class_install_property (object_class, + PROP_IS_CURRENT, + g_param_spec_boolean ("is-current", + "Is Current", + "Whether the application is current", + FALSE, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_INSTALLED_SIZE, + g_param_spec_uint64 ("installed-size", + "Installed Size", + "The installed size of the application", + 0, G_MAXUINT64, 0, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_ORIGIN, + g_param_spec_string ("origin", + "Origin", + "The origin", + NULL, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_LATEST_COMMIT, + g_param_spec_string ("latest-commit", + "Latest Commit", + "The latest commit", + NULL, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_DEPLOY_DIR, + g_param_spec_string ("deploy-dir", + "Deploy Dir", + "Where the application is installed", + NULL, + G_PARAM_READWRITE)); + g_object_class_install_property (object_class, + PROP_SUBPATHS, + g_param_spec_boxed ("subpaths", + "", + "", + G_TYPE_STRV, + G_PARAM_READWRITE)); +} + +static void +flatpak_installed_ref_init (FlatpakInstalledRef *self) +{ +} + +/** + * flatpak_installed_ref_get_origin: + * @self: a #FlatpakInstalledRef + * + * Gets the origin of the ref. + * + * Returns: (transfer none): the origin + */ +const char * +flatpak_installed_ref_get_origin (FlatpakInstalledRef *self) +{ + FlatpakInstalledRefPrivate *priv = flatpak_installed_ref_get_instance_private (self); + + return priv->origin; +} + +/** + * flatpak_installed_ref_get_latest_commit: + * @self: a #FlatpakInstalledRef + * + * Gets the latest commit of the ref. + * + * Returns: (transfer none): the latest commit + */ +const char * +flatpak_installed_ref_get_latest_commit (FlatpakInstalledRef *self) +{ + FlatpakInstalledRefPrivate *priv = flatpak_installed_ref_get_instance_private (self); + + return priv->latest_commit; +} + +/** + * flatpak_installed_ref_get_deploy_dir: + * @self: a #FlatpakInstalledRef + * + * Gets the deploy dir of the ref. + * + * Returns: (transfer none): the deploy dir + */ +const char * +flatpak_installed_ref_get_deploy_dir (FlatpakInstalledRef *self) +{ + FlatpakInstalledRefPrivate *priv = flatpak_installed_ref_get_instance_private (self); + + return priv->deploy_dir; +} + +/** + * flatpak_installed_ref_get_is_current: + * @self: a #FlatpakInstalledRef + * + * Returns whether the ref is current. + * + * Returns: %TRUE if the ref is current + */ +gboolean +flatpak_installed_ref_get_is_current (FlatpakInstalledRef *self) +{ + FlatpakInstalledRefPrivate *priv = flatpak_installed_ref_get_instance_private (self); + + return priv->is_current; +} + +/** + * flatpak_installed_ref_get_subpaths: + * @self: a #FlatpakInstalledRef + * + * Returns the subpaths that are installed, or %NULL if all files installed. + * + * Returns: (transfer none): A strv, or %NULL + */ +const char * const * +flatpak_installed_ref_get_subpaths (FlatpakInstalledRef *self) +{ + FlatpakInstalledRefPrivate *priv = flatpak_installed_ref_get_instance_private (self); + + return (const char * const *) priv->subpaths; +} + +/** + * flatpak_installed_ref_get_installed_size: + * @self: a #FlatpakInstalledRef + * + * Returns the installed size of the ref. + * + * Returns: the installed size + */ +guint64 +flatpak_installed_ref_get_installed_size (FlatpakInstalledRef *self) +{ + FlatpakInstalledRefPrivate *priv = flatpak_installed_ref_get_instance_private (self); + + return priv->installed_size; +} + +/** + * flatpak_installed_ref_load_metadata: + * @self: a #FlatpakInstalledRef + * @cancellable: (nullable): a #GCancellable + * @error: a return location for a #GError + * + * Loads the metadata file for this ref. + * + * Returns: (transfer full): a #GBytes containing the metadata file, + * or %NULL if an error occurred + */ +GBytes * +flatpak_installed_ref_load_metadata (FlatpakInstalledRef *self, + GCancellable *cancellable, + GError **error) +{ + FlatpakInstalledRefPrivate *priv = flatpak_installed_ref_get_instance_private (self); + g_autofree char *path = NULL; + char *metadata; + gsize length; + + if (priv->deploy_dir == NULL) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, + "Unknown deploy directory"); + return NULL; + } + + path = g_build_filename (priv->deploy_dir, "metadata", NULL); + if (!g_file_get_contents (path, &metadata, &length, error)) + return NULL; + + return g_bytes_new_take (metadata, length); +} + +FlatpakInstalledRef * +flatpak_installed_ref_new (const char *full_ref, + const char *commit, + const char *latest_commit, + const char *origin, + const char **subpaths, + const char *deploy_dir, + guint64 installed_size, + gboolean is_current) +{ + FlatpakRefKind kind = FLATPAK_REF_KIND_APP; + FlatpakInstalledRef *ref; + + g_auto(GStrv) parts = NULL; + + parts = g_strsplit (full_ref, "/", -1); + + if (strcmp (parts[0], "app") != 0) + kind = FLATPAK_REF_KIND_RUNTIME; + + /* Canonicalize the "no subpaths" case */ + if (subpaths && *subpaths == NULL) + subpaths = NULL; + + ref = g_object_new (FLATPAK_TYPE_INSTALLED_REF, + "kind", kind, + "name", parts[1], + "arch", parts[2], + "branch", parts[3], + "commit", commit, + "latest-commit", latest_commit, + "origin", origin, + "subpaths", subpaths, + "is-current", is_current, + "installed-size", installed_size, + "deploy-dir", deploy_dir, + NULL); + + return ref; +} |