/** * as_content_rating_node_parse: * @content_rating: a #AsContentRating 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.5.12 **/ gboolean as_content_rating_node_parse (AsContentRating *content_rating, GNode *node, AsNodeContext *ctx, GError **error) { AsContentRatingPrivate *priv = GET_PRIVATE (content_rating); GNode *c; const gchar *tmp; g_autoptr(GHashTable) captions = NULL; /* get ID */ tmp = as_node_get_attribute (node, "type"); if (tmp != NULL) as_content_rating_set_kind (content_rating, tmp); /* get keys */ for (c = node->children; c != NULL; c = c->next) { AsContentRatingKey *key; g_autoptr(AsImage) image = NULL; if (as_node_get_tag (c) != AS_TAG_CONTENT_ATTRIBUTE) continue; key = g_slice_new0 (AsContentRatingKey); as_ref_string_assign (&key->id, as_node_get_attribute (c, "id")); key->value = as_content_rating_value_from_string (as_node_get_data (c)); g_ptr_array_add (priv->keys, key); } return TRUE; }
static void as_node_to_xml_string (GString *xml, guint depth_offset, const AsNode *n, AsNodeToXmlFlags flags) { AsNodeData *data = n->data; AsNode *c; const gchar *tag_str; const gchar *comment; guint depth = g_node_depth ((GNode *) n); gchar *attrs; /* comment */ comment = as_node_get_comment (n); if (comment != NULL) { guint i; g_auto(GStrv) split = NULL; /* do not put additional spacing for the root node */ if (depth_offset < g_node_depth ((GNode *) n) && (flags & AS_NODE_TO_XML_FLAG_FORMAT_MULTILINE) > 0) g_string_append (xml, "\n"); if ((flags & AS_NODE_TO_XML_FLAG_FORMAT_INDENT) > 0) as_node_add_padding (xml, depth - depth_offset); /* add each comment section */ split = g_strsplit (comment, "<&>", -1); for (i = 0; split[i] != NULL; i++) { g_string_append_printf (xml, "<!--%s-->", split[i]); if ((flags & AS_NODE_TO_XML_FLAG_FORMAT_MULTILINE) > 0) g_string_append (xml, "\n"); } } /* root node */ if (data == NULL || as_node_get_tag (n) == AS_TAG_LAST) { if ((flags & AS_NODE_TO_XML_FLAG_SORT_CHILDREN) > 0) as_node_sort_children (n->children); for (c = n->children; c != NULL; c = c->next) as_node_to_xml_string (xml, depth_offset, c, flags); /* leaf node */ } else if (n->children == NULL) { if ((flags & AS_NODE_TO_XML_FLAG_FORMAT_INDENT) > 0) as_node_add_padding (xml, depth - depth_offset); attrs = as_node_get_attr_string (data); tag_str = as_tag_data_get_name (data); if (data->cdata == NULL || data->cdata[0] == '\0') { g_string_append_printf (xml, "<%s%s/>", tag_str, attrs); } else { as_node_cdata_to_escaped (data); g_string_append_printf (xml, "<%s%s>%s</%s>", tag_str, attrs, data->cdata, tag_str); } if ((flags & AS_NODE_TO_XML_FLAG_FORMAT_MULTILINE) > 0) g_string_append (xml, "\n"); g_free (attrs); /* node with children */ } else { if ((flags & AS_NODE_TO_XML_FLAG_FORMAT_INDENT) > 0) as_node_add_padding (xml, depth - depth_offset); attrs = as_node_get_attr_string (data); tag_str = as_tag_data_get_name (data); g_string_append_printf (xml, "<%s%s>", tag_str, attrs); if ((flags & AS_NODE_TO_XML_FLAG_FORMAT_MULTILINE) > 0) g_string_append (xml, "\n"); g_free (attrs); if ((flags & AS_NODE_TO_XML_FLAG_SORT_CHILDREN) > 0) as_node_sort_children (n->children); for (c = n->children; c != NULL; c = c->next) as_node_to_xml_string (xml, depth_offset, c, flags); if ((flags & AS_NODE_TO_XML_FLAG_FORMAT_INDENT) > 0) as_node_add_padding (xml, depth - depth_offset); g_string_append_printf (xml, "</%s>", tag_str); if ((flags & AS_NODE_TO_XML_FLAG_FORMAT_MULTILINE) > 0) g_string_append (xml, "\n"); } }
/** * as_screenshot_node_parse: * @screenshot: a #AsScreenshot 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.1.0 **/ gboolean as_screenshot_node_parse (AsScreenshot *screenshot, GNode *node, AsNodeContext *ctx, GError **error) { AsScreenshotPrivate *priv = GET_PRIVATE (screenshot); GList *l; GNode *c; const gchar *tmp; guint size; gint priority; g_autoptr(GHashTable) captions = NULL; tmp = as_node_get_attribute (node, "type"); if (tmp != NULL) { as_screenshot_set_kind (screenshot, as_screenshot_kind_from_string (tmp)); } priority = as_node_get_attribute_as_int (node, "priority"); if (priority != G_MAXINT) as_screenshot_set_priority (screenshot, priority); /* add captions */ captions = as_node_get_localized (node, "caption"); if (captions != NULL) { g_autoptr(GList) keys = NULL; keys = g_hash_table_get_keys (captions); for (l = keys; l != NULL; l = l->next) { tmp = l->data; as_screenshot_set_caption (screenshot, tmp, g_hash_table_lookup (captions, tmp)); } } /* AppData files does not have <image> tags */ tmp = as_node_get_data (node); if (tmp != NULL) { AsImage *image; image = as_image_new (); as_image_set_kind (image, AS_IMAGE_KIND_SOURCE); size = as_node_get_attribute_as_uint (node, "width"); if (size != G_MAXINT) as_image_set_width (image, size); size = as_node_get_attribute_as_uint (node, "height"); if (size != G_MAXINT) as_image_set_height (image, size); as_image_set_url (image, tmp); g_ptr_array_add (priv->images, image); } /* add images */ for (c = node->children; c != NULL; c = c->next) { g_autoptr(AsImage) image = NULL; if (as_node_get_tag (c) != AS_TAG_IMAGE) continue; image = as_image_new (); if (!as_image_node_parse (image, c, ctx, error)) return FALSE; g_ptr_array_add (priv->images, g_object_ref (image)); } return TRUE; }
/** * 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; }