summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2016-01-26 11:27:19 +0000
committerRichard Hughes <richard@hughsie.com>2016-01-26 11:27:19 +0000
commit50d31f68ffe161195f6aff606f824bdca7805ea9 (patch)
treea1654d60764c6d7101ad73238ea150e88ba1f5d7
parent69bc75c5de948797d12e7534f12a9a83ba8d005d (diff)
downloadappstream-glib-50d31f68ffe161195f6aff606f824bdca7805ea9.tar.gz
Allow setting state on AsRelease objects
-rw-r--r--libappstream-glib/as-app.c6
-rw-r--r--libappstream-glib/as-release.c37
-rw-r--r--libappstream-glib/as-release.h23
-rw-r--r--libappstream-glib/as-self-test.c5
-rw-r--r--libappstream-glib/as-store.c26
5 files changed, 92 insertions, 5 deletions
diff --git a/libappstream-glib/as-app.c b/libappstream-glib/as-app.c
index 0c03797..333e5af 100644
--- a/libappstream-glib/as-app.c
+++ b/libappstream-glib/as-app.c
@@ -1,6 +1,6 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
*
- * Copyright (C) 2014-2015 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2014-2016 Richard Hughes <richard@hughsie.com>
*
* Licensed under the GNU Lesser General Public License Version 2.1
*
@@ -2129,6 +2129,10 @@ as_app_subsume_release (AsRelease *release, AsRelease *donor)
if (tmp != NULL)
as_release_set_description (release, NULL, tmp);
+ /* only installed is useful */
+ if (as_release_get_state (donor) == AS_RELEASE_STATE_INSTALLED);
+ as_release_set_state (release, AS_RELEASE_STATE_INSTALLED);
+
/* overwrite the timestamp if the metadata is high quality,
* or if no timestamp has already been set */
if (tmp != NULL || as_release_get_timestamp (release) == 0)
diff --git a/libappstream-glib/as-release.c b/libappstream-glib/as-release.c
index d5f0737..cce0eb7 100644
--- a/libappstream-glib/as-release.c
+++ b/libappstream-glib/as-release.c
@@ -1,6 +1,6 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
*
- * Copyright (C) 2014-2015 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2014-2016 Richard Hughes <richard@hughsie.com>
*
* Licensed under the GNU Lesser General Public License Version 2.1
*
@@ -48,6 +48,7 @@
typedef struct
{
AsUrgencyKind urgency;
+ AsReleaseState state;
guint64 size[AS_SIZE_KIND_LAST];
gchar *version;
GHashTable *blobs; /* of gchar*:GBytes */
@@ -90,6 +91,7 @@ as_release_init (AsRelease *release)
guint i;
priv->urgency = AS_URGENCY_KIND_UNKNOWN;
+ priv->state = AS_RELEASE_STATE_UNKNOWN;
priv->locations = g_ptr_array_new_with_free_func (g_free);
priv->checksums = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
priv->blobs = g_hash_table_new_full (g_str_hash, g_str_equal,
@@ -196,6 +198,23 @@ as_release_get_urgency (AsRelease *release)
}
/**
+ * as_release_get_state:
+ * @release: a #AsRelease instance.
+ *
+ * Gets the release state.
+ *
+ * Returns: enumberated value, or %AS_RELEASE_STATE_UNKNOWN for not set or invalid
+ *
+ * Since: 0.5.8
+ **/
+AsReleaseState
+as_release_get_state (AsRelease *release)
+{
+ AsReleasePrivate *priv = GET_PRIVATE (release);
+ return priv->state;
+}
+
+/**
* as_release_get_version:
* @release: a #AsRelease instance.
*
@@ -428,6 +447,22 @@ as_release_set_urgency (AsRelease *release, AsUrgencyKind urgency)
}
/**
+ * as_release_set_state:
+ * @release: a #AsRelease instance.
+ * @state: the release state, e.g. %AS_RELEASE_STATE_INSTALLED
+ *
+ * Sets the release state.
+ *
+ * Since: 0.5.8
+ **/
+void
+as_release_set_state (AsRelease *release, AsReleaseState state)
+{
+ AsReleasePrivate *priv = GET_PRIVATE (release);
+ priv->state = state;
+}
+
+/**
* as_release_add_location:
* @release: a #AsRelease instance.
* @location: the location string.
diff --git a/libappstream-glib/as-release.h b/libappstream-glib/as-release.h
index 171339d..402fbc7 100644
--- a/libappstream-glib/as-release.h
+++ b/libappstream-glib/as-release.h
@@ -1,6 +1,6 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
*
- * Copyright (C) 2014-2015 Richard Hughes <richard@hughsie.com>
+ * Copyright (C) 2014-2016 Richard Hughes <richard@hughsie.com>
*
* Licensed under the GNU Lesser General Public License Version 2.1
*
@@ -49,6 +49,22 @@ struct _AsReleaseClass
void (*_as_reserved8) (void);
};
+/**
+ * AsReleaseState:
+ * @AS_RELEASE_STATE_UNKNOWN: Unknown state
+ * @AS_RELEASE_STATE_INSTALLED: Release is installed
+ * @AS_RELEASE_STATE_AVAILABLE: Release is available
+ *
+ * The release state.
+ **/
+typedef enum {
+ AS_RELEASE_STATE_UNKNOWN, /* Since: 0.5.8 */
+ AS_RELEASE_STATE_INSTALLED, /* Since: 0.5.8 */
+ AS_RELEASE_STATE_AVAILABLE, /* Since: 0.5.8 */
+ /*< private >*/
+ AS_RELEASE_STATE_LAST
+} AsReleaseState;
+
AsRelease *as_release_new (void);
gint as_release_vercmp (AsRelease *rel1,
AsRelease *rel2);
@@ -68,6 +84,7 @@ AsChecksum *as_release_get_checksum_by_target (AsRelease *release,
AsChecksumTarget target);
GPtrArray *as_release_get_checksums (AsRelease *release);
AsUrgencyKind as_release_get_urgency (AsRelease *release);
+AsReleaseState as_release_get_state (AsRelease *release);
guint64 as_release_get_size (AsRelease *release,
AsSizeKind kind);
@@ -87,7 +104,9 @@ void as_release_add_location (AsRelease *release,
void as_release_add_checksum (AsRelease *release,
AsChecksum *checksum);
void as_release_set_urgency (AsRelease *release,
- AsUrgencyKind urgency);
+ AsUrgencyKind urgency);
+void as_release_set_state (AsRelease *release,
+ AsReleaseState state);
void as_release_set_size (AsRelease *release,
AsSizeKind kind,
guint64 size);
diff --git a/libappstream-glib/as-self-test.c b/libappstream-glib/as-self-test.c
index 9af9135..b79e219 100644
--- a/libappstream-glib/as-self-test.c
+++ b/libappstream-glib/as-self-test.c
@@ -441,8 +441,13 @@ as_test_release_func (void)
/* verify */
g_assert_cmpint (as_release_get_timestamp (release), ==, 123);
g_assert_cmpint (as_release_get_urgency (release), ==, AS_URGENCY_KIND_CRITICAL);
+ g_assert_cmpint (as_release_get_state (release), ==, AS_RELEASE_STATE_UNKNOWN);
g_assert_cmpstr (as_release_get_version (release), ==, "0.1.2");
+ /* state is not stored in the XML */
+ as_release_set_state (release, AS_RELEASE_STATE_INSTALLED);
+ g_assert_cmpint (as_release_get_state (release), ==, AS_RELEASE_STATE_INSTALLED);
+
/* back to node */
root = as_node_new ();
as_node_context_set_version (ctx, 0.4);
diff --git a/libappstream-glib/as-store.c b/libappstream-glib/as-store.c
index e80fa58..5b23c68 100644
--- a/libappstream-glib/as-store.c
+++ b/libappstream-glib/as-store.c
@@ -1974,6 +1974,27 @@ as_store_load_app_install (AsStore *store,
}
/**
+ * as_store_set_app_installed:
+ **/
+static void
+as_store_set_app_installed (AsApp *app)
+{
+ AsRelease *rel;
+ GPtrArray *releases;
+ guint i;
+
+ /* releases */
+ releases = as_app_get_releases (app);
+ for (i = 0; i < releases->len; i++) {
+ rel = g_ptr_array_index (releases, i);
+ as_release_set_state (rel, AS_RELEASE_STATE_INSTALLED);
+ }
+
+ /* app itself */
+ as_app_set_state (app, AS_APP_STATE_INSTALLED);
+}
+
+/**
* as_store_load_installed:
**/
static gboolean
@@ -2048,9 +2069,12 @@ as_store_load_installed (AsStore *store,
as_app_get_vetos(app)->len > 0)
continue;
+ /* as these are added from installed AppData files then all the
+ * releases can also be marked as installed */
+ as_store_set_app_installed (app);
+
/* set lower priority than AppStream entries */
as_app_set_priority (app, -1);
- as_app_set_state (app, AS_APP_STATE_INSTALLED);
as_store_add_app (store, app);
}