diff options
author | Richard Hughes <richard@hughsie.com> | 2015-01-20 21:03:19 +0000 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2015-01-21 09:06:53 +0000 |
commit | 37db70de4f4044da80c874252cf31b80c5e15871 (patch) | |
tree | 1281efd760714ffa095c4a7bc64a57b017876dee | |
parent | 9b96be71a85b9e12a43fee3642fd71957d6b0bdf (diff) | |
download | appstream-glib-37db70de4f4044da80c874252cf31b80c5e15871.tar.gz |
Correctly load descriptions from <releases> in AppData files
-rw-r--r-- | libappstream-glib/as-release.c | 32 | ||||
-rw-r--r-- | libappstream-glib/as-self-test.c | 47 |
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); |