summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2016-07-20 16:16:01 +0100
committerRichard Hughes <richard@hughsie.com>2016-07-28 15:39:06 +0100
commit33c7c64515288cd7dd72c703a78f8d52b31e9da7 (patch)
tree74b2b0438915d317e7c5d7392b8d92f1906f2982
parentda2992e541fd85790e3012763ca58e19fa0cd79e (diff)
downloadappstream-glib-wip/hughsie/AsSuggest.tar.gz
-rw-r--r--libappstream-glib/as-app.c10
-rw-r--r--libappstream-glib/as-app.h1
-rw-r--r--libappstream-glib/as-self-test.c54
-rw-r--r--libappstream-glib/as-suggest-private.h4
-rw-r--r--libappstream-glib/as-suggest.c70
-rw-r--r--libappstream-glib/as-suggest.h7
-rw-r--r--libappstream-glib/as-tag.c1
-rw-r--r--libappstream-glib/as-tag.gperf1
-rw-r--r--libappstream-glib/as-tag.h2
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);
}
- /* <suggests> */
+ /* <suggest> */
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);
}
/* <name> */
@@ -3762,8 +3762,8 @@ as_app_node_parse_child (AsApp *app, GNode *n, AsAppParseFlags flags,
break;
}
- /* <suggests> */
- case AS_TAG_SUGGESTS:
+ /* <suggest> */
+ 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)
{
@@ -1236,6 +1238,53 @@ as_test_review_func (void)
}
static void
+as_test_suggest_func (void)
+{
+ GError *error = NULL;
+ AsNode *n;
+ AsNode *root;
+ GString *xml;
+ const gchar *src =
+ "<suggest type=\"upstream\">"
+ "<id>gimp.desktop</id>"
+ "<id>mypaint.desktop</id>"
+ "</suggest>";
+ 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)
{
GError *error = NULL;
@@ -1452,6 +1501,10 @@ as_test_app_func (void)
"<source_pkgname>gnome-software-src</source_pkgname>\n"
"<bundle type=\"limba\">gnome-software-gnome-3-16</bundle>\n"
"<translation type=\"gettext\">gnome-software</translation>\n"
+ "<suggest type=\"upstream\">\n"
+ "<id>gimp.desktop</id>\n"
+ "<id>mypaint.desktop</id>\n"
+ "</suggest>\n"
"<name>Software</name>\n"
"<name xml:lang=\"pl\">Oprogramowanie</name>\n"
"<summary>Application manager</summary>\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;
}
@@ -126,9 +128,26 @@ as_suggest_get_ids (AsSuggest *suggest)
}
/**
+ * 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 <glib-object.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
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;