summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2015-01-20 21:03:19 +0000
committerRichard Hughes <richard@hughsie.com>2015-01-21 09:06:53 +0000
commit37db70de4f4044da80c874252cf31b80c5e15871 (patch)
tree1281efd760714ffa095c4a7bc64a57b017876dee
parent9b96be71a85b9e12a43fee3642fd71957d6b0bdf (diff)
downloadappstream-glib-37db70de4f4044da80c874252cf31b80c5e15871.tar.gz
Correctly load descriptions from <releases> in AppData files
-rw-r--r--libappstream-glib/as-release.c32
-rw-r--r--libappstream-glib/as-self-test.c47
2 files changed, 68 insertions, 11 deletions
diff --git a/libappstream-glib/as-release.c b/libappstream-glib/as-release.c
index 6b16c61..f4f40c9 100644
--- a/libappstream-glib/as-release.c
+++ b/libappstream-glib/as-release.c
@@ -276,16 +276,30 @@ as_release_node_parse (AsRelease *release, GNode *node,
priv->version = taken;
}
- /* descriptions are translated and optional */
- for (n = node->children; n != NULL; n = n->next) {
- _cleanup_string_free_ GString *xml = NULL;
- if (as_node_get_tag (n) != AS_TAG_DESCRIPTION)
- continue;
- xml = as_node_to_xml (n->children, AS_NODE_TO_XML_FLAG_NONE);
- as_release_set_description (release,
- as_node_get_attribute (n, "xml:lang"),
- xml->str, xml->len);
+ /* AppStream: multiple <description> tags */
+ if (as_node_context_get_source_kind (ctx) == AS_APP_SOURCE_KIND_APPSTREAM) {
+ for (n = node->children; n != NULL; n = n->next) {
+ _cleanup_string_free_ GString *xml = NULL;
+ if (as_node_get_tag (n) != AS_TAG_DESCRIPTION)
+ continue;
+ xml = as_node_to_xml (n->children, AS_NODE_TO_XML_FLAG_NONE);
+ as_release_set_description (release,
+ as_node_get_attribute (n, "xml:lang"),
+ xml->str, xml->len);
+ }
+
+ /* AppData: mutliple languages encoded in one <description> tag */
+ } else {
+ n = as_node_find (node, "description");
+ if (n != NULL) {
+ if (priv->descriptions != NULL)
+ g_hash_table_unref (priv->descriptions);
+ priv->descriptions = as_node_get_localized_unwrap (n, error);
+ if (priv->descriptions == NULL)
+ return FALSE;
+ }
}
+
return TRUE;
}
diff --git a/libappstream-glib/as-self-test.c b/libappstream-glib/as-self-test.c
index 8a56581..d1307db 100644
--- a/libappstream-glib/as-self-test.c
+++ b/libappstream-glib/as-self-test.c
@@ -190,7 +190,7 @@ as_test_provide_func (void)
}
static void
-as_test_release_desc_func (void)
+as_test_release_appstream_func (void)
{
GError *error = NULL;
GNode *n;
@@ -228,6 +228,7 @@ as_test_release_desc_func (void)
/* back to node */
root = as_node_new ();
as_node_context_set_version (ctx, 1.0);
+ as_node_context_set_source_kind (ctx, AS_APP_SOURCE_KIND_APPSTREAM);
n = as_release_node_insert (release, root, ctx);
xml = as_node_to_xml (n, AS_NODE_TO_XML_FLAG_FORMAT_MULTILINE);
ret = as_test_compare_lines (xml->str, src, &error);
@@ -238,6 +239,47 @@ as_test_release_desc_func (void)
as_node_unref (root);
}
+static void
+as_test_release_appdata_func (void)
+{
+ GError *error = NULL;
+ GNode *n;
+ GNode *root;
+ gboolean ret;
+ const gchar *src =
+ "<release version=\"0.1.2\" timestamp=\"123\">\n"
+ "<description>\n"
+ "<p>This is a new release</p>\n"
+ "<p xml:lang=\"pl\">Oprogramowanie</p>\n"
+ "</description>\n"
+ "</release>\n";
+ _cleanup_free_ AsNodeContext *ctx = NULL;
+ _cleanup_object_unref_ AsRelease *release = NULL;
+
+ release = as_release_new ();
+
+ /* to object */
+ root = as_node_from_xml (src, -1, 0, &error);
+ g_assert_no_error (error);
+ g_assert (root != NULL);
+ n = as_node_find (root, "release");
+ g_assert (n != NULL);
+ ctx = as_node_context_new ();
+ as_node_context_set_source_kind (ctx, AS_APP_SOURCE_KIND_APPDATA);
+ ret = as_release_node_parse (release, n, ctx, &error);
+ g_assert_no_error (error);
+ g_assert (ret);
+ as_node_unref (root);
+
+ /* verify */
+ g_assert_cmpint (as_release_get_timestamp (release), ==, 123);
+ g_assert_cmpstr (as_release_get_version (release), ==, "0.1.2");
+ g_assert_cmpstr (as_release_get_description (release, NULL), ==,
+ "<p>This is a new release</p>");
+ g_assert_cmpstr (as_release_get_description (release, "pl"), ==,
+ "<p>Oprogramowanie</p>");
+}
+
typedef enum {
AS_TEST_RESIZE_NEAREST,
AS_TEST_RESIZE_TILES,
@@ -3293,7 +3335,8 @@ main (int argc, char **argv)
g_test_add_func ("/AppStream/tag", as_test_tag_func);
g_test_add_func ("/AppStream/provide", as_test_provide_func);
g_test_add_func ("/AppStream/release", as_test_release_func);
- g_test_add_func ("/AppStream/release{description}", as_test_release_desc_func);
+ g_test_add_func ("/AppStream/release{appdata}", as_test_release_appdata_func);
+ g_test_add_func ("/AppStream/release{appstream}", as_test_release_appstream_func);
g_test_add_func ("/AppStream/icon", as_test_icon_func);
g_test_add_func ("/AppStream/icon{embedded}", as_test_icon_embedded_func);
g_test_add_func ("/AppStream/bundle", as_test_bundle_func);