diff options
author | Richard Hughes <richard@hughsie.com> | 2015-09-10 17:04:50 +0100 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2015-09-11 12:15:27 +0100 |
commit | ab8fb24ccb6a5b6a36b7f80fc3b9192cb58b52a6 (patch) | |
tree | 23f1c6746fdf9c8f9ee4733637280f0a6c3d8f5e | |
parent | b1bc5776bb3bbac508b793d00c80cd78d82cc8b3 (diff) | |
download | appstream-glib-ab8fb24ccb6a5b6a36b7f80fc3b9192cb58b52a6.tar.gz |
Add support for release urgency
-rw-r--r-- | libappstream-glib/as-app-validate.c | 18 | ||||
-rw-r--r-- | libappstream-glib/as-enums.c | 48 | ||||
-rw-r--r-- | libappstream-glib/as-enums.h | 23 | ||||
-rw-r--r-- | libappstream-glib/as-release.c | 42 | ||||
-rw-r--r-- | libappstream-glib/as-release.h | 3 | ||||
-rw-r--r-- | libappstream-glib/as-self-test.c | 3 |
6 files changed, 133 insertions, 4 deletions
diff --git a/libappstream-glib/as-app-validate.c b/libappstream-glib/as-app-validate.c index efa0678..7f9ffd2 100644 --- a/libappstream-glib/as-app-validate.c +++ b/libappstream-glib/as-app-validate.c @@ -824,7 +824,10 @@ as_app_validate_screenshots (AsApp *app, AsAppValidateHelper *helper) * as_app_validate_release: **/ static gboolean -as_app_validate_release (AsRelease *release, AsAppValidateHelper *helper, GError **error) +as_app_validate_release (AsApp *app, + AsRelease *release, + AsAppValidateHelper *helper, + GError **error) { const gchar *tmp; guint64 timestamp; @@ -857,6 +860,14 @@ as_app_validate_release (AsRelease *release, AsAppValidateHelper *helper, GError "<release> timestamp should be a UNIX time"); } + /* for firmware, check urgency */ + if (as_app_get_id_kind (app) == AS_ID_KIND_FIRMWARE && + as_release_get_urgency (release) == AS_URGENCY_KIND_UNKNOWN) { + ai_app_validate_add (helper, + AS_PROBLEM_KIND_ATTRIBUTE_INVALID, + "<release> urgency is required for firmware"); + } + /* check description */ tmp = as_release_get_description (release, "C"); if (tmp != NULL) { @@ -889,7 +900,8 @@ as_app_validate_releases (AsApp *app, AsAppValidateHelper *helper, GError **erro guint i; /* only for AppData */ - if (as_app_get_source_kind (app) != AS_APP_SOURCE_KIND_APPDATA) + if (as_app_get_source_kind (app) != AS_APP_SOURCE_KIND_APPDATA && + as_app_get_source_kind (app) != AS_APP_SOURCE_KIND_METAINFO) return TRUE; releases = as_app_get_releases (app); @@ -900,7 +912,7 @@ as_app_validate_releases (AsApp *app, AsAppValidateHelper *helper, GError **erro } for (i = 0; i < releases->len; i++) { release = g_ptr_array_index (releases, i); - if (!as_app_validate_release (release, helper, error)) + if (!as_app_validate_release (app, release, helper, error)) return FALSE; } return TRUE; diff --git a/libappstream-glib/as-enums.c b/libappstream-glib/as-enums.c index e0bb128..d028ccb 100644 --- a/libappstream-glib/as-enums.c +++ b/libappstream-glib/as-enums.c @@ -211,3 +211,51 @@ as_kudo_kind_from_string (const gchar *kudo_kind) return AS_KUDO_KIND_HI_DPI_ICON; return AS_KUDO_KIND_UNKNOWN; } + +/** + * as_urgency_kind_to_string: + * @urgency_kind: the #AsUrgencyKind. + * + * Converts the enumerated value to an text representation. + * + * Returns: string version of @urgency_kind + * + * Since: 0.5.1 + **/ +const gchar * +as_urgency_kind_to_string (AsUrgencyKind urgency_kind) +{ + if (urgency_kind == AS_URGENCY_KIND_LOW) + return "low"; + if (urgency_kind == AS_URGENCY_KIND_MEDIUM) + return "medium"; + if (urgency_kind == AS_URGENCY_KIND_HIGH) + return "high"; + if (urgency_kind == AS_URGENCY_KIND_CRITICAL) + return "critical"; + return "unknown"; +} + +/** + * as_urgency_kind_from_string: + * @urgency_kind: the string. + * + * Converts the text representation to an enumerated value. + * + * Returns: a #AsUrgencyKind or %AS_URGENCY_KIND_UNKNOWN for unknown + * + * Since: 0.5.1 + **/ +AsUrgencyKind +as_urgency_kind_from_string (const gchar *urgency_kind) +{ + if (g_strcmp0 (urgency_kind, "low") == 0) + return AS_URGENCY_KIND_LOW; + if (g_strcmp0 (urgency_kind, "medium") == 0) + return AS_URGENCY_KIND_MEDIUM; + if (g_strcmp0 (urgency_kind, "high") == 0) + return AS_URGENCY_KIND_HIGH; + if (g_strcmp0 (urgency_kind, "critical") == 0) + return AS_URGENCY_KIND_CRITICAL; + return AS_URGENCY_KIND_UNKNOWN; +} diff --git a/libappstream-glib/as-enums.h b/libappstream-glib/as-enums.h index e5cbe51..ae3be23 100644 --- a/libappstream-glib/as-enums.h +++ b/libappstream-glib/as-enums.h @@ -108,6 +108,29 @@ typedef enum { AS_KUDO_KIND_LAST } AsKudoKind; +/** + * AsUrgencyKind: + * @AS_URGENCY_KIND_UNKNOWN: Urgency invalid or not known + * @AS_URGENCY_KIND_LOW: Low urgency release + * @AS_URGENCY_KIND_MEDIUM: Medium urgency release + * @AS_URGENCY_KIND_HIGH: High urgency release + * @AS_URGENCY_KIND_CRITICAL: Critically urgent release + * + * The urgency of a release. + **/ +typedef enum { + AS_URGENCY_KIND_UNKNOWN, /* Since: 0.5.1 */ + AS_URGENCY_KIND_LOW, /* Since: 0.5.1 */ + AS_URGENCY_KIND_MEDIUM, /* Since: 0.5.1 */ + AS_URGENCY_KIND_HIGH, /* Since: 0.5.1 */ + AS_URGENCY_KIND_CRITICAL, /* Since: 0.5.1 */ + /*< private >*/ + AS_URGENCY_KIND_LAST +} AsUrgencyKind; + +const gchar *as_urgency_kind_to_string (AsUrgencyKind urgency_kind); +AsUrgencyKind as_urgency_kind_from_string (const gchar *urgency_kind); + const gchar *as_id_kind_to_string (AsIdKind id_kind); AsIdKind as_id_kind_from_string (const gchar *id_kind); diff --git a/libappstream-glib/as-release.c b/libappstream-glib/as-release.c index d7c01e7..ccf78fb 100644 --- a/libappstream-glib/as-release.c +++ b/libappstream-glib/as-release.c @@ -47,6 +47,7 @@ typedef struct { + AsUrgencyKind urgency; gchar *version; GHashTable *descriptions; guint64 timestamp; @@ -83,6 +84,7 @@ static void as_release_init (AsRelease *release) { AsReleasePrivate *priv = GET_PRIVATE (release); + priv->urgency = AS_URGENCY_KIND_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); } @@ -129,6 +131,23 @@ as_release_vercmp (AsRelease *rel1, AsRelease *rel2) } /** + * as_release_get_urgency: + * @release: a #AsRelease instance. + * + * Gets the release urgency. + * + * Returns: enumberated value, or %AS_URGENCY_KIND_UNKNOWN for not set or invalid + * + * Since: 0.5.1 + **/ +AsUrgencyKind +as_release_get_urgency (AsRelease *release) +{ + AsReleasePrivate *priv = GET_PRIVATE (release); + return priv->urgency; +} + +/** * as_release_get_version: * @release: a #AsRelease instance. * @@ -305,6 +324,22 @@ as_release_set_version (AsRelease *release, const gchar *version) } /** + * as_release_set_urgency: + * @release: a #AsRelease instance. + * @urgency: the release urgency, e.g. %AS_URGENCY_KIND_CRITICAL + * + * Sets the release urgency. + * + * Since: 0.5.1 + **/ +void +as_release_set_urgency (AsRelease *release, AsUrgencyKind urgency) +{ + AsReleasePrivate *priv = GET_PRIVATE (release); + priv->urgency = urgency; +} + +/** * as_release_add_location: * @release: a #AsRelease instance. * @location: the location string. @@ -414,6 +449,10 @@ as_release_node_insert (AsRelease *release, GNode *parent, AsNodeContext *ctx) priv->timestamp); as_node_add_attribute (n, "timestamp", timestamp_str); } + if (priv->urgency != AS_URGENCY_KIND_UNKNOWN) { + as_node_add_attribute (n, "urgency", + as_urgency_kind_to_string (priv->urgency)); + } if (priv->version != NULL) as_node_add_attribute (n, "version", priv->version); if (as_node_context_get_version (ctx) >= 0.9) { @@ -462,6 +501,9 @@ as_release_node_parse (AsRelease *release, GNode *node, tmp = as_node_get_attribute (node, "timestamp"); if (tmp != NULL) as_release_set_timestamp (release, atol (tmp)); + tmp = as_node_get_attribute (node, "urgency"); + if (tmp != NULL) + as_release_set_urgency (release, as_urgency_kind_from_string (tmp)); taken = as_node_take_attribute (node, "version"); if (taken != NULL) { g_free (priv->version); diff --git a/libappstream-glib/as-release.h b/libappstream-glib/as-release.h index 8515ce1..3f40aeb 100644 --- a/libappstream-glib/as-release.h +++ b/libappstream-glib/as-release.h @@ -65,6 +65,7 @@ AsChecksum *as_release_get_checksum_by_fn (AsRelease *release, 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); /* setters */ void as_release_set_version (AsRelease *release, @@ -80,6 +81,8 @@ void as_release_add_location (AsRelease *release, const gchar *location); void as_release_add_checksum (AsRelease *release, AsChecksum *checksum); +void as_release_set_urgency (AsRelease *release, + AsUrgencyKind urgency); G_END_DECLS diff --git a/libappstream-glib/as-self-test.c b/libappstream-glib/as-self-test.c index c10bdea..eef4776 100644 --- a/libappstream-glib/as-self-test.c +++ b/libappstream-glib/as-self-test.c @@ -347,7 +347,7 @@ as_test_release_func (void) GNode *n; GNode *root; GString *xml; - const gchar *src = "<release version=\"0.1.2\" timestamp=\"123\"/>"; + const gchar *src = "<release version=\"0.1.2\" urgency=\"critical\" timestamp=\"123\"/>"; gboolean ret; g_autofree AsNodeContext *ctx = NULL; g_autoptr(AsRelease) release = NULL; @@ -368,6 +368,7 @@ 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_cmpstr (as_release_get_version (release), ==, "0.1.2"); /* back to node */ |