/** * gs_plugin_add_unvoted_reviews: */ gboolean gs_plugin_add_unvoted_reviews (GsPlugin *plugin, GList **list, GCancellable *cancellable, GError **error) { const gchar *app_id_last = NULL; guint status_code; guint i; g_autofree gchar *uri = NULL; g_autoptr(GFile) cachefn_file = NULL; g_autoptr(GPtrArray) reviews = NULL; g_autoptr(GsApp) app_current = NULL; g_autoptr(SoupMessage) msg = NULL; /* create the GET data *with* the machine hash so we can later * review the application ourselves */ uri = g_strdup_printf ("%s/moderate/%s", plugin->priv->review_server, plugin->priv->user_hash); msg = soup_message_new (SOUP_METHOD_GET, uri); status_code = soup_session_send_message (plugin->soup_session, msg); if (status_code != SOUP_STATUS_OK) { if (!xdg_app_review_parse_success (msg->response_body->data, msg->response_body->length, error)) return FALSE; /* not sure what to do here */ g_set_error_literal (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_FAILED, "status code invalid"); return FALSE; } g_debug ("xdg-app-review returned: %s", msg->response_body->data); reviews = xdg_app_review_parse_reviews (msg->response_body->data, msg->response_body->length, error); if (reviews == NULL) return FALSE; /* look at all the reviews; faking application objects */ for (i = 0; i < reviews->len; i++) { GsReview *review; const gchar *app_id; /* same app? */ review = g_ptr_array_index (reviews, i); app_id = gs_review_get_metadata_item (review, "app_id"); if (g_strcmp0 (app_id, app_id_last) != 0) { g_clear_object (&app_current); app_current = gs_app_new (app_id); gs_plugin_add_app (list, app_current); app_id_last = app_id; } gs_app_add_review (app_current, review); } return TRUE; }
static gboolean parse_reviews (GsPlugin *plugin, JsonParser *parser, GsApp *app, GCancellable *cancellable, GError **error) { GsAuth *auth; JsonArray *array; const gchar *consumer_key = NULL; guint i; auth = gs_plugin_get_auth_by_id (plugin, "ubuntuone"); if (auth != NULL) consumer_key = gs_auth_get_metadata_item (auth, "consumer-key"); if (!JSON_NODE_HOLDS_ARRAY (json_parser_get_root (parser))) return FALSE; array = json_node_get_array (json_parser_get_root (parser)); for (i = 0; i < json_array_get_length (array); i++) { g_autoptr(AsReview) review = NULL; /* Read in from JSON... (skip bad entries) */ review = as_review_new (); if (parse_review (review, consumer_key, json_array_get_element (array, i))) gs_app_add_review (app, review); } return TRUE; }
static gboolean gs_plugin_odrs_refine_reviews (GsPlugin *plugin, GsApp *app, GCancellable *cancellable, GError **error) { GsPluginData *priv = gs_plugin_get_data (plugin); AsReview *review; guint i; g_autoptr(AsProfileTask) ptask = NULL; g_autoptr(GPtrArray) reviews = NULL; /* profile */ ptask = as_profile_start_literal (gs_plugin_get_profile (plugin), "odrs::refine-reviews"); g_assert (ptask != NULL); /* get from server */ reviews = gs_plugin_odrs_fetch_for_app (plugin, app, error); if (reviews == NULL) return FALSE; for (i = 0; i < reviews->len; i++) { review = g_ptr_array_index (reviews, i); /* save this on the application object so we can use it for * submitting a new review */ if (i == 0) { gs_app_set_metadata (app, "ODRS::user_skey", as_review_get_metadata_item (review, "user_skey")); } /* ignore invalid reviews */ if (as_review_get_rating (review) == 0) continue; /* the user_hash matches, so mark this as our own review */ if (g_strcmp0 (as_review_get_reviewer_id (review), priv->user_hash) == 0) { as_review_set_flags (review, AS_REVIEW_FLAG_SELF); } gs_app_add_review (app, review); } return TRUE; }
/** * gs_plugin_refine_reviews: */ static gboolean gs_plugin_refine_reviews (GsPlugin *plugin, GsApp *app, GCancellable *cancellable, GError **error) { GsReview *review; guint i; g_autoptr(GPtrArray) reviews = NULL; /* get from server */ reviews = xdg_app_review_fetch_for_app (plugin, app, error); if (reviews == NULL) return FALSE; for (i = 0; i < reviews->len; i++) { review = g_ptr_array_index (reviews, i); /* save this on the application object so we can use it for * submitting a new review */ if (i == 0) { gs_app_set_metadata (app, "XdgAppReviews::user_skey", gs_review_get_metadata_item (review, "user_skey")); } /* ignore invalid reviews */ if (gs_review_get_rating (review) == 0) continue; if (gs_review_get_reviewer (review) == NULL) continue; /* the user_hash matches, so mark this as our own review */ if (g_strcmp0 (gs_review_get_metadata_item (review, "user_hash"), plugin->priv->user_hash) == 0) { gs_review_set_flags (review, GS_REVIEW_FLAG_SELF); } gs_app_add_review (app, review); } return TRUE; }
gboolean gs_plugin_add_unvoted_reviews (GsPlugin *plugin, GsAppList *list, GCancellable *cancellable, GError **error) { GsPluginData *priv = gs_plugin_get_data (plugin); guint status_code; guint i; g_autofree gchar *uri = NULL; g_autoptr(GHashTable) hash = NULL; g_autoptr(GPtrArray) reviews = NULL; g_autoptr(SoupMessage) msg = NULL; /* create the GET data *with* the machine hash so we can later * review the application ourselves */ uri = g_strdup_printf ("%s/moderate/%s/%s", priv->review_server, priv->user_hash, gs_plugin_get_locale (plugin)); msg = soup_message_new (SOUP_METHOD_GET, uri); status_code = soup_session_send_message (gs_plugin_get_soup_session (plugin), msg); if (status_code != SOUP_STATUS_OK) { if (!gs_plugin_odrs_parse_success (msg->response_body->data, msg->response_body->length, error)) return FALSE; /* not sure what to do here */ g_set_error_literal (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_DOWNLOAD_FAILED, "status code invalid"); gs_utils_error_add_unique_id (error, priv->cached_origin); return FALSE; } g_debug ("odrs returned: %s", msg->response_body->data); reviews = gs_plugin_odrs_parse_reviews (plugin, msg->response_body->data, msg->response_body->length, error); if (reviews == NULL) return FALSE; /* look at all the reviews; faking application objects */ hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_object_unref); for (i = 0; i < reviews->len; i++) { GsApp *app; AsReview *review; const gchar *app_id; /* same app? */ review = g_ptr_array_index (reviews, i); app_id = as_review_get_metadata_item (review, "app_id"); app = g_hash_table_lookup (hash, app_id); if (app == NULL) { app = gs_plugin_create_app_dummy (app_id); gs_app_list_add (list, app); g_hash_table_insert (hash, g_strdup (app_id), app); } gs_app_add_review (app, review); } return TRUE; }