[gnome-software] Add an object for an user-submitted application review



commit 1c2ec898217d2a83940775a53f942ff84bfbb44d
Author: Robert Ancell <robert ancell canonical com>
Date:   Tue Feb 9 09:49:13 2016 +0000

    Add an object for an user-submitted application review
    
    Signed-off-by: Richard Hughes <richard hughsie com>

 src/Makefile.am |    4 +
 src/gs-app.c    |   25 ++++
 src/gs-app.h    |    5 +
 src/gs-review.c |  375 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/gs-review.h |   67 ++++++++++
 5 files changed, 476 insertions(+), 0 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index a7df5b5..fb54fba 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -77,6 +77,7 @@ noinst_PROGRAMS =                                     \
 
 gnome_software_cmd_SOURCES =                           \
        gs-app.c                                        \
+       gs-review.c                                     \
        gs-cmd.c                                        \
        gs-utils.c                                      \
        gs-os-release.c                                 \
@@ -139,6 +140,8 @@ gnome_software_SOURCES =                            \
        gs-plugin.h                                     \
        gs-progress-button.c                            \
        gs-progress-button.h                            \
+       gs-review.c                                     \
+       gs-review.h                                     \
        gs-screenshot-image.c                           \
        gs-screenshot-image.h                           \
        gs-shell.c                                      \
@@ -265,6 +268,7 @@ gs_self_test_SOURCES =                                              \
        gs-plugin-loader-sync.c                                 \
        gs-plugin-loader.c                                      \
        gs-plugin.c                                             \
+       gs-review.c                                             \
        gs-utils.c                                              \
        gs-self-test.c
 
diff --git a/src/gs-app.c b/src/gs-app.c
index 21839c3..4e6652a 100644
--- a/src/gs-app.c
+++ b/src/gs-app.c
@@ -83,6 +83,7 @@ struct _GsApp
        AsUrgencyKind            update_urgency;
        gchar                   *management_plugin;
        gint                     rating;
+       GPtrArray               *reviews; /* of GsReview */
        guint64                  size;
        GsAppKind                kind;
        AsIdKind                 id_kind;
@@ -289,6 +290,8 @@ gs_app_to_string (GsApp *app)
                g_string_append_printf (str, "\torigin-ui:\t%s\n", app->origin_ui);
        if (app->rating != -1)
                g_string_append_printf (str, "\trating:\t%i\n", app->rating);
+       if (app->reviews != NULL)
+               g_string_append_printf (str, "\treviews:\t%i\n", app->reviews->len);
        if (app->pixbuf != NULL)
                g_string_append_printf (str, "\tpixbuf:\t%p\n", app->pixbuf);
        if (app->install_date != 0) {
@@ -1637,6 +1640,26 @@ gs_app_set_rating (GsApp *app, gint rating)
 }
 
 /**
+ * gs_app_get_reviews:
+ */
+GPtrArray *
+gs_app_get_reviews (GsApp *app)
+{
+       g_return_val_if_fail (GS_IS_APP (app), NULL);
+       return app->reviews;
+}
+
+/**
+ * gs_app_add_review:
+ */
+void
+gs_app_add_review (GsApp *app, GsReview *review)
+{
+       g_return_if_fail (GS_IS_APP (app));
+       g_ptr_array_add (app->reviews, g_object_ref (review));
+}
+
+/**
  * gs_app_get_size:
  */
 guint64
@@ -2199,6 +2222,7 @@ gs_app_dispose (GObject *object)
        g_clear_pointer (&app->history, g_ptr_array_unref);
        g_clear_pointer (&app->related, g_ptr_array_unref);
        g_clear_pointer (&app->screenshots, g_ptr_array_unref);
+       g_clear_pointer (&app->reviews, g_ptr_array_unref);
 
        G_OBJECT_CLASS (gs_app_parent_class)->dispose (object);
 }
@@ -2349,6 +2373,7 @@ gs_app_init (GsApp *app)
        app->related = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
        app->history = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
        app->screenshots = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
+       app->reviews = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
        app->metadata = g_hash_table_new_full (g_str_hash,
                                                g_str_equal,
                                                g_free,
diff --git a/src/gs-app.h b/src/gs-app.h
index 4be59d8..a32f093 100644
--- a/src/gs-app.h
+++ b/src/gs-app.h
@@ -26,6 +26,8 @@
 #include <gdk-pixbuf/gdk-pixbuf.h>
 #include <appstream-glib.h>
 
+#include "gs-review.h"
+
 G_BEGIN_DECLS
 
 #define GS_TYPE_APP (gs_app_get_type ())
@@ -196,6 +198,9 @@ void                 gs_app_set_metadata            (GsApp          *app,
 gint            gs_app_get_rating              (GsApp          *app);
 void            gs_app_set_rating              (GsApp          *app,
                                                 gint            rating);
+GPtrArray      *gs_app_get_reviews             (GsApp          *app);
+void            gs_app_add_review              (GsApp          *app,
+                                                GsReview       *review);
 guint64                 gs_app_get_size                (GsApp          *app);
 void            gs_app_set_size                (GsApp          *app,
                                                 guint64         size);
diff --git a/src/gs-review.c b/src/gs-review.c
new file mode 100644
index 0000000..46d729e
--- /dev/null
+++ b/src/gs-review.c
@@ -0,0 +1,375 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2016 Canonical Ltd.
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "config.h"
+
+#include "gs-review.h"
+
+struct _GsReview
+{
+       GObject                  parent_instance;
+
+       gchar                   *summary;
+       gchar                   *text;
+       gint                     karma;
+       gint                     rating;
+       gchar                   *version;
+       gchar                   *reviewer;
+       GDateTime               *date;
+};
+
+enum {
+       PROP_0,
+       PROP_KARMA,
+       PROP_SUMMARY,
+       PROP_TEXT,
+       PROP_RATING,
+       PROP_VERSION,
+       PROP_REVIEWER,
+       PROP_DATE,
+       PROP_LAST
+};
+
+G_DEFINE_TYPE (GsReview, gs_review, G_TYPE_OBJECT)
+
+/**
+ * gs_review_get_karma:
+ */
+gint
+gs_review_get_karma (GsReview *review)
+{
+       g_return_val_if_fail (GS_IS_REVIEW (review), 0);
+       return review->karma;
+}
+
+/**
+ * gs_review_set_karma:
+ */
+void
+gs_review_set_karma (GsReview *review, gint karma)
+{
+       g_return_if_fail (GS_IS_REVIEW (review));
+       review->karma = karma;
+}
+
+/**
+ * gs_review_get_summary:
+ */
+const gchar *
+gs_review_get_summary (GsReview *review)
+{
+       g_return_val_if_fail (GS_IS_REVIEW (review), NULL);
+       return review->summary;
+}
+
+/**
+ * gs_review_set_summary:
+ */
+void
+gs_review_set_summary (GsReview *review, const gchar *summary)
+{
+       g_return_if_fail (GS_IS_REVIEW (review));
+       g_free (review->summary);
+       review->summary = g_strdup (summary);
+}
+
+/**
+ * gs_review_get_text:
+ **/
+const gchar *
+gs_review_get_text (GsReview *review)
+{
+       g_return_val_if_fail (GS_IS_REVIEW (review), NULL);
+       return review->text;
+}
+
+/**
+ * gs_review_set_text:
+ */
+void
+gs_review_set_text (GsReview *review, const gchar *text)
+{
+       g_return_if_fail (GS_IS_REVIEW (review));
+       g_free (review->text);
+       review->text = g_strdup (text);
+}
+
+/**
+ * gs_review_get_rating:
+ */
+gint
+gs_review_get_rating (GsReview *review)
+{
+       g_return_val_if_fail (GS_IS_REVIEW (review), 0);
+       return review->rating;
+}
+
+/**
+ * gs_review_set_rating:
+ */
+void
+gs_review_set_rating (GsReview *review, gint rating)
+{
+       g_return_if_fail (GS_IS_REVIEW (review));
+       review->rating = rating;
+}
+
+/**
+ * gs_review_get_reviewer:
+ **/
+const gchar *
+gs_review_get_reviewer (GsReview *review)
+{
+       g_return_val_if_fail (GS_IS_REVIEW (review), NULL);
+       return review->reviewer;
+}
+
+/**
+ * gs_review_set_version:
+ */
+void
+gs_review_set_version (GsReview *review, const gchar *version)
+{
+       g_return_if_fail (GS_IS_REVIEW (review));
+       g_free (review->version);
+       review->version = g_strdup (version);
+}
+
+/**
+ * gs_review_get_version:
+ **/
+const gchar *
+gs_review_get_version (GsReview *review)
+{
+       g_return_val_if_fail (GS_IS_REVIEW (review), NULL);
+       return review->version;
+}
+
+/**
+ * gs_review_set_reviewer:
+ */
+void
+gs_review_set_reviewer (GsReview *review, const gchar *reviewer)
+{
+       g_return_if_fail (GS_IS_REVIEW (review));
+       g_free (review->reviewer);
+       review->reviewer = g_strdup (reviewer);
+}
+
+/**
+ * gs_review_get_date:
+ **/
+GDateTime *
+gs_review_get_date (GsReview *review)
+{
+       g_return_val_if_fail (GS_IS_REVIEW (review), NULL);
+       return review->date;
+}
+
+/**
+ * gs_review_set_date:
+ */
+void
+gs_review_set_date (GsReview *review, GDateTime *date)
+{
+       g_return_if_fail (GS_IS_REVIEW (review));
+       g_clear_pointer (&review->date, g_date_time_unref);
+       if (date != NULL)
+               review->date = g_date_time_ref (date);
+}
+
+static void
+gs_review_get_property (GObject *object, guint prop_id,
+                       GValue *value, GParamSpec *pspec)
+{
+       GsReview *review = GS_REVIEW (object);
+
+       switch (prop_id) {
+       case PROP_KARMA:
+               g_value_set_int (value, review->karma);
+               break;
+       case PROP_SUMMARY:
+               g_value_set_string (value, review->summary);
+               break;
+       case PROP_TEXT:
+               g_value_set_string (value, review->text);
+               break;
+       case PROP_RATING:
+               g_value_set_int (value, review->rating);
+               break;
+       case PROP_VERSION:
+               g_value_set_string (value, review->version);
+               break;
+       case PROP_REVIEWER:
+               g_value_set_string (value, review->reviewer);
+               break;
+       case PROP_DATE:
+               g_value_set_object (value, review->date);
+               break;
+       default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+               break;
+       }
+}
+
+static void
+gs_review_set_property (GObject *object, guint prop_id,
+                       const GValue *value, GParamSpec *pspec)
+{
+       GsReview *review = GS_REVIEW (object);
+
+       switch (prop_id) {
+       case PROP_KARMA:
+               gs_review_set_karma (review, g_value_get_int (value));
+               break;
+       case PROP_SUMMARY:
+               gs_review_set_summary (review, g_value_get_string (value));
+               break;
+       case PROP_TEXT:
+               gs_review_set_text (review, g_value_get_string (value));
+               break;
+       case PROP_RATING:
+               gs_review_set_rating (review, g_value_get_int (value));
+               break;
+       case PROP_VERSION:
+               gs_review_set_version (review, g_value_get_string (value));
+               break;
+       case PROP_REVIEWER:
+               gs_review_set_reviewer (review, g_value_get_string (value));
+               break;
+       case PROP_DATE:
+               gs_review_set_date (review, g_value_get_object (value));
+               break;
+       default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+               break;
+       }
+}
+
+static void
+gs_review_dispose (GObject *object)
+{
+       GsReview *review = GS_REVIEW (object);
+
+       g_clear_pointer (&review->date, g_date_time_unref);
+
+       G_OBJECT_CLASS (gs_review_parent_class)->dispose (object);
+}
+
+static void
+gs_review_finalize (GObject *object)
+{
+       GsReview *review = GS_REVIEW (object);
+
+       g_free (review->summary);
+       g_free (review->text);
+       g_free (review->reviewer);
+
+       G_OBJECT_CLASS (gs_review_parent_class)->finalize (object);
+}
+
+static void
+gs_review_class_init (GsReviewClass *klass)
+{
+       GParamSpec *pspec;
+       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+       object_class->dispose = gs_review_dispose;
+       object_class->finalize = gs_review_finalize;
+       object_class->get_property = gs_review_get_property;
+       object_class->set_property = gs_review_set_property;
+
+       /**
+        * GsApp:karma:
+        */
+       pspec = g_param_spec_int ("karma", NULL, NULL,
+                                 0, G_MAXINT, G_MININT,
+                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
+       g_object_class_install_property (object_class, PROP_KARMA, pspec);
+
+       /**
+        * GsApp:summary:
+        */
+       pspec = g_param_spec_string ("summary", NULL, NULL,
+                                    NULL,
+                                    G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
+       g_object_class_install_property (object_class, PROP_SUMMARY, pspec);
+
+       /**
+        * GsApp:text:
+        */
+       pspec = g_param_spec_string ("text", NULL, NULL,
+                                    NULL,
+                                    G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
+       g_object_class_install_property (object_class, PROP_TEXT, pspec);
+
+       /**
+        * GsApp:rating:
+        */
+       pspec = g_param_spec_int ("rating", NULL, NULL,
+                                 -1, 100, -1,
+                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
+       g_object_class_install_property (object_class, PROP_RATING, pspec);
+
+       /**
+        * GsApp:version:
+        */
+       pspec = g_param_spec_string ("version", NULL, NULL,
+                                    NULL,
+                                    G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
+       g_object_class_install_property (object_class, PROP_VERSION, pspec);
+
+       /**
+        * GsApp:reviewer:
+        */
+       pspec = g_param_spec_string ("reviewer", NULL, NULL,
+                                    NULL,
+                                    G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
+       g_object_class_install_property (object_class, PROP_REVIEWER, pspec);
+
+       /**
+        * GsApp:date:
+        */
+       pspec = g_param_spec_object ("date", NULL, NULL,
+                                    GS_TYPE_REVIEW,
+                                    G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
+       g_object_class_install_property (object_class, PROP_DATE, pspec);
+}
+
+static void
+gs_review_init (GsReview *review)
+{
+       review->rating = -1;
+}
+
+/**
+ * gs_review_new:
+ *
+ * Return value: a new #GsReview object.
+ **/
+GsReview *
+gs_review_new (void)
+{
+       GsReview *review;
+       review = g_object_new (GS_TYPE_REVIEW, NULL);
+       return GS_REVIEW (review);
+}
+
+/* vim: set noexpandtab: */
diff --git a/src/gs-review.h b/src/gs-review.h
new file mode 100644
index 0000000..0a4204f
--- /dev/null
+++ b/src/gs-review.h
@@ -0,0 +1,67 @@
+ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2016 Canonical Ltd.
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef __GS_REVIEW_H
+#define __GS_REVIEW_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GS_TYPE_REVIEW (gs_review_get_type ())
+
+G_DECLARE_FINAL_TYPE (GsReview, gs_review, GS, REVIEW, GObject)
+
+GsReview       *gs_review_new                          (void);
+
+gint            gs_review_get_karma                    (GsReview       *review);
+void            gs_review_set_karma                    (GsReview       *review,
+                                                        gint            karma);
+
+const gchar    *gs_review_get_summary                  (GsReview       *review);
+void            gs_review_set_summary                  (GsReview       *review,
+                                                        const gchar    *summary);
+
+const gchar    *gs_review_get_text                     (GsReview       *review);
+void            gs_review_set_text                     (GsReview       *review,
+                                                        const gchar    *text);
+
+gint            gs_review_get_rating                   (GsReview       *review);
+void            gs_review_set_rating                   (GsReview       *review,
+                                                        gint            rating);
+
+const gchar    *gs_review_get_version                  (GsReview       *review);
+void            gs_review_set_version                  (GsReview       *review,
+                                                        const gchar    *version);
+
+const gchar    *gs_review_get_reviewer                 (GsReview       *review);
+void            gs_review_set_reviewer                 (GsReview       *review,
+                                                        const gchar    *reviewer);
+
+GDateTime      *gs_review_get_date                     (GsReview       *review);
+void            gs_review_set_date                     (GsReview       *review,
+                                                        GDateTime      *date);
+
+G_END_DECLS
+
+#endif /* __GS_REVIEW_H */
+
+/* vim: set noexpandtab: */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]