From 33c7c64515288cd7dd72c703a78f8d52b31e9da7 Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Wed, 20 Jul 2016 16:16:01 +0100 Subject: f --- libappstream-glib/as-app.c | 10 ++--- libappstream-glib/as-app.h | 1 + libappstream-glib/as-self-test.c | 54 ++++++++++++++++++++++++++ libappstream-glib/as-suggest-private.h | 4 ++ libappstream-glib/as-suggest.c | 70 ++++++++++++++++++---------------- libappstream-glib/as-suggest.h | 7 ++-- libappstream-glib/as-tag.c | 1 + libappstream-glib/as-tag.gperf | 1 + libappstream-glib/as-tag.h | 2 + 9 files changed, 108 insertions(+), 42 deletions(-) diff --git a/libappstream-glib/as-app.c b/libappstream-glib/as-app.c index caf9ac5..f6587d6 100644 --- a/libappstream-glib/as-app.c +++ b/libappstream-glib/as-app.c @@ -3488,10 +3488,10 @@ as_app_node_insert (AsApp *app, GNode *parent, AsNodeContext *ctx) as_translation_node_insert (bu, node_app, ctx); } - /* */ + /* */ for (i = 0; i < priv->suggests->len; i++) { - AsSuggest *bu = g_ptr_array_index (priv->suggests, i); - as_suggest_node_insert (bu, node_app, ctx); + AsSuggest *suggest = g_ptr_array_index (priv->suggests, i); + as_suggest_node_insert (suggest, node_app, ctx); } /* */ @@ -3762,8 +3762,8 @@ as_app_node_parse_child (AsApp *app, GNode *n, AsAppParseFlags flags, break; } - /* */ - case AS_TAG_SUGGESTS: + /* */ + case AS_TAG_SUGGEST: { g_autoptr(AsSuggest) ic = NULL; ic = as_suggest_new (); diff --git a/libappstream-glib/as-app.h b/libappstream-glib/as-app.h index c2a1167..fdb5473 100644 --- a/libappstream-glib/as-app.h +++ b/libappstream-glib/as-app.h @@ -35,6 +35,7 @@ #include "as-release.h" #include "as-screenshot.h" #include "as-review.h" +#include "as-suggest.h" #include "as-content-rating.h" #include "as-translation.h" diff --git a/libappstream-glib/as-self-test.c b/libappstream-glib/as-self-test.c index 7ab1b33..5fc75e0 100644 --- a/libappstream-glib/as-self-test.c +++ b/libappstream-glib/as-self-test.c @@ -43,6 +43,7 @@ #include "as-problem.h" #include "as-provide-private.h" #include "as-release-private.h" +#include "as-suggest-private.h" #include "as-screenshot-private.h" #include "as-store.h" #include "as-tag.h" @@ -1173,6 +1174,7 @@ as_test_image_func (void) g_assert (ret); } + static void as_test_review_func (void) { @@ -1235,6 +1237,53 @@ as_test_review_func (void) as_node_unref (root); } +static void +as_test_suggest_func (void) +{ + GError *error = NULL; + AsNode *n; + AsNode *root; + GString *xml; + const gchar *src = + "" + "gimp.desktop" + "mypaint.desktop" + ""; + gboolean ret; + g_autofree AsNodeContext *ctx = NULL; + g_autoptr(AsSuggest) suggest = NULL; + g_autoptr(GdkPixbuf) pixbuf = NULL; + + suggest = as_suggest_new (); + + /* to object */ + root = as_node_from_xml (src, 0, &error); + g_assert_no_error (error); + g_assert (root != NULL); + n = as_node_find (root, "suggest"); + g_assert (n != NULL); + ctx = as_node_context_new (); + ret = as_suggest_node_parse (suggest, n, ctx, &error); + g_assert_no_error (error); + g_assert (ret); + as_node_unref (root); + + /* verify */ + g_assert_cmpint (as_suggest_get_kind (suggest), ==, AS_SUGGEST_KIND_UPSTREAM); + g_assert_cmpint (as_suggest_get_ids(suggest)->len, ==, 2); + + /* back to node */ + root = as_node_new (); + as_node_context_set_version (ctx, 0.4); + n = as_suggest_node_insert (suggest, root, ctx); + xml = as_node_to_xml (n, AS_NODE_TO_XML_FLAG_NONE); + ret = as_test_compare_lines (xml->str, src, &error); + g_assert_no_error (error); + g_assert (ret); + g_string_free (xml, TRUE); + as_node_unref (root); +} + static void as_test_bundle_func (void) { @@ -1452,6 +1501,10 @@ as_test_app_func (void) "gnome-software-src\n" "gnome-software-gnome-3-16\n" "gnome-software\n" + "\n" + "gimp.desktop\n" + "mypaint.desktop\n" + "\n" "Software\n" "Oprogramowanie\n" "Application manager\n" @@ -4928,6 +4981,7 @@ main (int argc, char **argv) g_test_add_func ("/AppStream/bundle", as_test_bundle_func); g_test_add_func ("/AppStream/review", as_test_review_func); g_test_add_func ("/AppStream/translation", as_test_translation_func); + g_test_add_func ("/AppStream/suggest", as_test_suggest_func); g_test_add_func ("/AppStream/image", as_test_image_func); g_test_add_func ("/AppStream/image{resize}", as_test_image_resize_func); g_test_add_func ("/AppStream/image{alpha}", as_test_image_alpha_func); diff --git a/libappstream-glib/as-suggest-private.h b/libappstream-glib/as-suggest-private.h index 18e630a..ed2aa76 100644 --- a/libappstream-glib/as-suggest-private.h +++ b/libappstream-glib/as-suggest-private.h @@ -38,6 +38,10 @@ gboolean as_suggest_node_parse (AsSuggest *suggest, GNode *node, AsNodeContext *ctx, GError **error); +gboolean as_suggest_node_parse_dep11 (AsSuggest *suggest, + GNode *node, + AsNodeContext *ctx, + GError **error); G_END_DECLS diff --git a/libappstream-glib/as-suggest.c b/libappstream-glib/as-suggest.c index 55dab3b..a40bd35 100644 --- a/libappstream-glib/as-suggest.c +++ b/libappstream-glib/as-suggest.c @@ -62,6 +62,8 @@ as_suggest_finalize (GObject *object) static void as_suggest_init (AsSuggest *suggest) { + AsSuggestPrivate *priv = GET_PRIVATE (suggest); + priv->ids = g_ptr_array_new_with_free_func (g_free); } static void @@ -85,8 +87,8 @@ as_suggest_class_init (AsSuggestClass *klass) AsSuggestKind as_suggest_kind_from_string (const gchar *kind) { - if (g_strcmp0 (kind, "source") == 0) - return AS_SUGGEST_KIND_SOURCE; + if (g_strcmp0 (kind, "upstream") == 0) + return AS_SUGGEST_KIND_UPSTREAM; return AS_SUGGEST_KIND_UNKNOWN; } @@ -103,8 +105,8 @@ as_suggest_kind_from_string (const gchar *kind) const gchar * as_suggest_kind_to_string (AsSuggestKind kind) { - if (kind == AS_SUGGEST_KIND_SOURCE) - return "source"; + if (kind == AS_SUGGEST_KIND_UPSTREAM) + return "upstream"; return NULL; } @@ -125,10 +127,27 @@ as_suggest_get_ids (AsSuggest *suggest) return priv->ids; } +/** + * as_suggest_get_kind: + * @suggest: a #AsSuggest instance. + * + * Gets the suggest kind. + * + * Returns: the #AsSuggestKind + * + * Since: 0.5.18 + **/ +AsSuggestKind +as_suggest_get_kind (AsSuggest *suggest) +{ + AsSuggestPrivate *priv = GET_PRIVATE (suggest); + return priv->kind; +} + /** * as_suggest_set_kind: * @suggest: a #AsSuggest instance. - * @kind: the #AsSuggestKind, e.g. %AS_SUGGEST_KIND_THUMBNAIL. + * @kind: the #AsSuggestKind, e.g. %AS_SUGGEST_KIND_UPSTREAM. * * Sets the suggest kind. * @@ -174,11 +193,18 @@ as_suggest_node_insert (AsSuggest *suggest, GNode *parent, AsNodeContext *ctx) { AsSuggestPrivate *priv = GET_PRIVATE (suggest); GNode *n; + guint i; - n = as_node_insert (parent, "suggest", priv->url, + n = as_node_insert (parent, "suggest", NULL, AS_NODE_INSERT_FLAG_NONE, "type", as_suggest_kind_to_string (priv->kind), NULL); + for (i = 0; i < priv->ids->len; i++) { + const gchar *id = g_ptr_array_index (priv->ids, i); + as_node_insert (n, "id", id, + AS_NODE_INSERT_FLAG_NONE, + NULL); + } return n; } @@ -199,19 +225,17 @@ gboolean as_suggest_node_parse (AsSuggest *suggest, GNode *node, AsNodeContext *ctx, GError **error) { - AsSuggestPrivate *priv = GET_PRIVATE (suggest); + AsNode *c; const gchar *tmp; - gchar *taken; tmp = as_node_get_attribute (node, "type"); if (tmp == NULL) - as_suggest_set_kind (suggest, AS_SUGGEST_KIND_SOURCE); + as_suggest_set_kind (suggest, AS_SUGGEST_KIND_UPSTREAM); else as_suggest_set_kind (suggest, as_suggest_kind_from_string (tmp)); - taken = as_node_take_data (node); - if (taken != NULL) { - g_free (priv->url); - priv->url = taken; + for (c = node->children; c != NULL; c = c->next) { + if (as_node_get_tag (c) == AS_TAG_ID) + as_suggest_add_id (suggest, as_node_get_data (c)); } return TRUE; } @@ -233,26 +257,6 @@ gboolean as_suggest_node_parse_dep11 (AsSuggest *im, GNode *node, AsNodeContext *ctx, GError **error) { - GNode *n; - const gchar *tmp; - - for (n = node->children; n != NULL; n = n->next) { - tmp = as_yaml_node_get_key (n); - if (g_strcmp0 (tmp, "height") == 0) - as_suggest_set_height (im, as_yaml_node_get_value_as_int (n)); - else if (g_strcmp0 (tmp, "width") == 0) - as_suggest_set_width (im, as_yaml_node_get_value_as_int (n)); - else if (g_strcmp0 (tmp, "url") == 0) { - const gchar *media_base_url = as_node_context_get_media_base_url (ctx); - if (media_base_url != NULL) { - g_autofree gchar *url = NULL; - url = g_build_path ("/", media_base_url, as_yaml_node_get_value (n), NULL); - as_suggest_set_url (im, url); - } else { - as_suggest_set_url (im, as_yaml_node_get_value (n)); - } - } - } return TRUE; } diff --git a/libappstream-glib/as-suggest.h b/libappstream-glib/as-suggest.h index fdeb172..81efdcb 100644 --- a/libappstream-glib/as-suggest.h +++ b/libappstream-glib/as-suggest.h @@ -27,7 +27,6 @@ #define __AS_SUGGEST_H #include -#include G_BEGIN_DECLS @@ -51,13 +50,13 @@ struct _AsSuggestClass /** * AsSuggestKind: * @AS_SUGGEST_KIND_UNKNOWN: Type invalid or not known - * @AS_SUGGEST_KIND_SOURCE: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + * @AS_SUGGEST_KIND_UPSTREAM: Upstream-specified suggestion * * The suggest type. **/ typedef enum { AS_SUGGEST_KIND_UNKNOWN, - AS_SUGGEST_KIND_SOURCE, + AS_SUGGEST_KIND_UPSTREAM, /*< private >*/ AS_SUGGEST_KIND_LAST } AsSuggestKind; @@ -76,7 +75,7 @@ GPtrArray *as_suggest_get_ids (AsSuggest *suggest); void as_suggest_set_kind (AsSuggest *suggest, AsSuggestKind kind); void as_suggest_add_id (AsSuggest *suggest, - GPtrArray *pixbuf); + const gchar *id); G_END_DECLS diff --git a/libappstream-glib/as-tag.c b/libappstream-glib/as-tag.c index 7d83d83..98b52cb 100644 --- a/libappstream-glib/as-tag.c +++ b/libappstream-glib/as-tag.c @@ -200,6 +200,7 @@ as_tag_to_string (AsTag tag) "reviewer_name", "reviewer_id", "suggests", + "suggest", NULL }; if (tag > AS_TAG_LAST) tag = AS_TAG_LAST; diff --git a/libappstream-glib/as-tag.gperf b/libappstream-glib/as-tag.gperf index 9004b5e..eda8638 100644 --- a/libappstream-glib/as-tag.gperf +++ b/libappstream-glib/as-tag.gperf @@ -64,3 +64,4 @@ review, AS_TAG_REVIEW reviewer_name, AS_TAG_REVIEWER_NAME reviewer_id, AS_TAG_REVIEWER_ID suggests, AS_TAG_SUGGESTS +suggest, AS_TAG_SUGGEST diff --git a/libappstream-glib/as-tag.h b/libappstream-glib/as-tag.h index ad7e68e..0b42f84 100644 --- a/libappstream-glib/as-tag.h +++ b/libappstream-glib/as-tag.h @@ -89,6 +89,7 @@ G_BEGIN_DECLS * @AS_TAG_REVIEWER_NAME: `reviewer_name` * @AS_TAG_REVIEWER_ID: `reviewer_id` * @AS_TAG_SUGGESTS: `suggests` + * @AS_TAG_SUGGEST: `suggest` * * The tag type. **/ @@ -150,6 +151,7 @@ typedef enum { AS_TAG_REVIEWER_NAME, /* Since: 0.5.18 */ AS_TAG_REVIEWER_ID, /* Since: 0.5.18 */ AS_TAG_SUGGESTS, /* Since: 0.5.18 */ + AS_TAG_SUGGEST, /* Since: 0.5.18 */ /*< private >*/ AS_TAG_LAST } AsTag; -- cgit v1.2.1