summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2015-09-10 17:04:50 +0100
committerRichard Hughes <richard@hughsie.com>2015-09-11 12:15:27 +0100
commitab8fb24ccb6a5b6a36b7f80fc3b9192cb58b52a6 (patch)
tree23f1c6746fdf9c8f9ee4733637280f0a6c3d8f5e
parentb1bc5776bb3bbac508b793d00c80cd78d82cc8b3 (diff)
downloadappstream-glib-ab8fb24ccb6a5b6a36b7f80fc3b9192cb58b52a6.tar.gz
Add support for release urgency
-rw-r--r--libappstream-glib/as-app-validate.c18
-rw-r--r--libappstream-glib/as-enums.c48
-rw-r--r--libappstream-glib/as-enums.h23
-rw-r--r--libappstream-glib/as-release.c42
-rw-r--r--libappstream-glib/as-release.h3
-rw-r--r--libappstream-glib/as-self-test.c3
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 */