summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2017-02-27 10:19:35 +0000
committerRichard Hughes <richard@hughsie.com>2017-02-27 11:36:28 +0000
commitcbf6498b64a62ef7a7d1c1472f312630ad93d4d3 (patch)
treea93d9e6576dd1bbd5b0a26db28e4febe212c4d4e
parent5767d3c3c4e9be253a4268c5c0795ab0928c0644 (diff)
downloadappstream-glib-cbf6498b64a62ef7a7d1c1472f312630ad93d4d3.tar.gz
Recalculate the state when formats are added or removed from a AsApp
-rw-r--r--libappstream-glib/as-app.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/libappstream-glib/as-app.c b/libappstream-glib/as-app.c
index 4cf00d0..eedc0ee 100644
--- a/libappstream-glib/as-app.c
+++ b/libappstream-glib/as-app.c
@@ -2844,6 +2844,38 @@ as_app_add_permission (AsApp *app, const gchar *permission)
g_ptr_array_add (priv->permissions, as_ref_string_new (permission));
}
+static void
+as_app_recalculate_state (AsApp *app)
+{
+ AsAppPrivate *priv = GET_PRIVATE (app);
+ gboolean is_installed = FALSE;
+ gboolean is_available = FALSE;
+ for (guint i = 0; i < priv->formats->len; i++) {
+ AsFormat *format = g_ptr_array_index (priv->formats, i);
+ switch (as_format_get_kind (format)) {
+ case AS_FORMAT_KIND_APPDATA:
+ case AS_FORMAT_KIND_DESKTOP:
+ case AS_FORMAT_KIND_METAINFO:
+ is_installed = TRUE;
+ break;
+ case AS_FORMAT_KIND_APPSTREAM:
+ is_available = TRUE;
+ break;
+ default:
+ break;
+ }
+ }
+ if (is_installed) {
+ as_app_set_state (app, AS_APP_STATE_INSTALLED);
+ return;
+ }
+ if (is_available) {
+ as_app_set_state (app, AS_APP_STATE_AVAILABLE);
+ return;
+ }
+ as_app_set_state (app, AS_APP_STATE_UNKNOWN);
+}
+
/**
* as_app_add_format:
* @app: a #AsApp instance.
@@ -2869,6 +2901,7 @@ as_app_add_format (AsApp *app, AsFormat *format)
/* add */
g_ptr_array_add (priv->formats, g_object_ref (format));
+ as_app_recalculate_state (app);
}
/**
@@ -2887,6 +2920,7 @@ as_app_remove_format (AsApp *app, AsFormat *format)
g_return_if_fail (AS_IS_APP (app));
g_return_if_fail (AS_IS_FORMAT (format));
g_ptr_array_remove (priv->formats, format);
+ as_app_recalculate_state (app);
}
/**