static gboolean parse_review (AsReview *review, const gchar *our_username, JsonNode *node) { JsonObject *object; gint64 star_rating; g_autofree gchar *id_string = NULL; if (!JSON_NODE_HOLDS_OBJECT (node)) return FALSE; object = json_node_get_object (node); if (g_strcmp0 (our_username, json_object_get_string_member (object, "reviewer_username")) == 0) as_review_add_flags (review, AS_REVIEW_FLAG_SELF); as_review_set_reviewer_name (review, json_object_get_string_member (object, "reviewer_displayname")); as_review_set_summary (review, json_object_get_string_member (object, "summary")); as_review_set_description (review, json_object_get_string_member (object, "review_text")); as_review_set_version (review, json_object_get_string_member (object, "version")); star_rating = json_object_get_int_member (object, "rating"); if (star_rating > 0) as_review_set_rating (review, (gint) (star_rating * 20 - 10)); as_review_set_date (review, parse_date_time (json_object_get_string_member (object, "date_created"))); id_string = g_strdup_printf ("%" G_GINT64_FORMAT, json_object_get_int_member (object, "id")); as_review_add_metadata (review, "ubuntu-id", id_string); return TRUE; }
static void as_review_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { AsReview *review = AS_REVIEW (object); switch (prop_id) { case PROP_ID: as_review_set_id (review, g_value_get_string (value)); break; case PROP_SUMMARY: as_review_set_summary (review, g_value_get_string (value)); break; case PROP_DESCRIPTION: as_review_set_description (review, g_value_get_string (value)); break; case PROP_LOCALE: as_review_set_locale (review, g_value_get_string (value)); break; case PROP_RATING: as_review_set_rating (review, g_value_get_int (value)); break; case PROP_FLAGS: as_review_set_flags (review, g_value_get_uint64 (value)); break; case PROP_VERSION: as_review_set_version (review, g_value_get_string (value)); break; case PROP_REVIEWER_ID: as_review_set_reviewer_id (review, g_value_get_string (value)); break; case PROP_REVIEWER_NAME: as_review_set_reviewer_name (review, g_value_get_string (value)); break; case PROP_DATE: as_review_set_date (review, g_value_get_object (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static AsReview * gs_plugin_odrs_parse_review_object (GsPlugin *plugin, JsonObject *item) { AsReview *rev = as_review_new (); /* date */ if (json_object_has_member (item, "date_created")) { gint64 timestamp; g_autoptr(GDateTime) dt = NULL; timestamp = json_object_get_int_member (item, "date_created"); dt = g_date_time_new_from_unix_utc (timestamp); as_review_set_date (rev, dt); } /* assemble review */ if (json_object_has_member (item, "rating")) as_review_set_rating (rev, (gint) json_object_get_int_member (item, "rating")); if (json_object_has_member (item, "score")) { as_review_set_priority (rev, (gint) json_object_get_int_member (item, "score")); } else if (json_object_has_member (item, "karma_up") && json_object_has_member (item, "karma_down")) { gdouble ku = (gdouble) json_object_get_int_member (item, "karma_up"); gdouble kd = (gdouble) json_object_get_int_member (item, "karma_down"); gdouble wilson = 0.f; /* from http://www.evanmiller.org/how-not-to-sort-by-average-rating.html */ if (ku > 0 || kd > 0) { wilson = ((ku + 1.9208) / (ku + kd) - 1.96 * sqrt ((ku * kd) / (ku + kd) + 0.9604) / (ku + kd)) / (1 + 3.8416 / (ku + kd)); wilson *= 100.f; } as_review_set_priority (rev, (gint) wilson); } if (json_object_has_member (item, "user_hash")) as_review_set_reviewer_id (rev, json_object_get_string_member (item, "user_hash")); if (json_object_has_member (item, "user_display")) as_review_set_reviewer_name (rev, json_object_get_string_member (item, "user_display")); if (json_object_has_member (item, "summary")) as_review_set_summary (rev, json_object_get_string_member (item, "summary")); if (json_object_has_member (item, "description")) as_review_set_description (rev, json_object_get_string_member (item, "description")); if (json_object_has_member (item, "version")) as_review_set_version (rev, json_object_get_string_member (item, "version")); /* add extra metadata for the plugin */ if (json_object_has_member (item, "user_skey")) { as_review_add_metadata (rev, "user_skey", json_object_get_string_member (item, "user_skey")); } if (json_object_has_member (item, "app_id")) { as_review_add_metadata (rev, "app_id", json_object_get_string_member (item, "app_id")); } if (json_object_has_member (item, "review_id")) { g_autofree gchar *review_id = NULL; review_id = g_strdup_printf ("%" G_GINT64_FORMAT, json_object_get_int_member (item, "review_id")); as_review_set_id (rev, review_id); } /* don't allow multiple votes */ if (json_object_has_member (item, "vote_id")) as_review_add_flags (rev, AS_REVIEW_FLAG_VOTED); return rev; }
/** * as_review_node_parse: * @review: a #AsReview instance. * @node: a #GNode. * @ctx: a #AsNodeContext. * @error: A #GError or %NULL. * * Populates the object from a DOM node. * * Returns: %TRUE for success * * Since: 0.6.1 **/ gboolean as_review_node_parse (AsReview *review, GNode *node, AsNodeContext *ctx, GError **error) { AsReviewPrivate *priv = GET_PRIVATE (review); AsNode *c; const gchar *tmp; gint itmp; itmp = as_node_get_attribute_as_int (node, "rating"); if (itmp != G_MAXINT) as_review_set_rating (review, itmp); tmp = as_node_get_attribute (node, "date"); if (tmp != NULL) { g_autoptr(GDateTime) dt = as_utils_iso8601_to_datetime (tmp); if (dt != NULL) as_review_set_date (review, dt); } tmp = as_node_get_attribute (node, "id"); if (tmp != NULL) as_review_set_id (review, tmp); for (c = node->children; c != NULL; c = c->next) { if (as_node_get_tag (c) == AS_TAG_SUMMARY) { as_review_set_summary (review, as_node_get_data (c)); continue; } if (as_node_get_tag (c) == AS_TAG_PRIORITY) { gint64 prio = g_ascii_strtoll (as_node_get_data (c), NULL, 10); as_review_set_priority (review, (gint) prio); continue; } if (as_node_get_tag (c) == AS_TAG_DESCRIPTION) { g_autoptr(GString) xml = NULL; xml = as_node_to_xml (c->children, AS_NODE_TO_XML_FLAG_INCLUDE_SIBLINGS); as_review_set_description (review, xml->str); continue; } if (as_node_get_tag (c) == AS_TAG_VERSION) { as_review_set_version (review, as_node_get_data (c)); continue; } if (as_node_get_tag (c) == AS_TAG_REVIEWER_ID) { as_review_set_reviewer_id (review, as_node_get_data (c)); continue; } if (as_node_get_tag (c) == AS_TAG_REVIEWER_NAME) { as_review_set_reviewer_name (review, as_node_get_data (c)); continue; } if (as_node_get_tag (c) == AS_TAG_LANG) { as_review_set_locale (review, as_node_get_data (c)); continue; } if (as_node_get_tag (c) == AS_TAG_METADATA) { AsNode *c2; for (c2 = c->children; c2 != NULL; c2 = c2->next) { AsRefString *key; AsRefString *value; if (as_node_get_tag (c2) != AS_TAG_VALUE) continue; key = as_node_get_attribute (c2, "key"); value = as_node_get_data (c2); if (value == NULL) { g_hash_table_insert (priv->metadata, as_ref_string_ref (key), as_ref_string_new_static ("")); } else { g_hash_table_insert (priv->metadata, as_ref_string_ref (key), as_ref_string_ref (value)); } } continue; } } return TRUE; }