1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- 2 * 3 * Copyright (C) 2014 Richard Hughes <richard@hughsie.com> 4 * 5 * SPDX-License-Identifier: LGPL-2.1+ 6 */ 7 8 #pragma once 9 10 #if !defined (__APPSTREAM_GLIB_H_INSIDE__) && !defined (AS_COMPILATION) 11 #error "Only <appstream-glib.h> can be included directly." 12 #endif 13 14 #include <gio/gio.h> 15 #include <glib-object.h> 16 #include <stdarg.h> 17 18 #include "as-tag.h" 19 20 G_BEGIN_DECLS 21 22 /** 23 * AsNodeToXmlFlags: 24 * @AS_NODE_TO_XML_FLAG_NONE: No extra flags to use 25 * @AS_NODE_TO_XML_FLAG_ADD_HEADER: Add an XML header to the data 26 * @AS_NODE_TO_XML_FLAG_FORMAT_MULTILINE: Split up children with a newline 27 * @AS_NODE_TO_XML_FLAG_FORMAT_INDENT: Indent the XML by child depth 28 * @AS_NODE_TO_XML_FLAG_INCLUDE_SIBLINGS: Include the siblings when converting 29 * @AS_NODE_TO_XML_FLAG_SORT_CHILDREN: Sort the tags by alphabetical order 30 * 31 * The flags for converting to XML. 32 **/ 33 typedef enum { 34 AS_NODE_TO_XML_FLAG_NONE = 0, /* Since: 0.1.0 */ 35 AS_NODE_TO_XML_FLAG_ADD_HEADER = 1, /* Since: 0.1.0 */ 36 AS_NODE_TO_XML_FLAG_FORMAT_MULTILINE = 2, /* Since: 0.1.0 */ 37 AS_NODE_TO_XML_FLAG_FORMAT_INDENT = 4, /* Since: 0.1.0 */ 38 AS_NODE_TO_XML_FLAG_INCLUDE_SIBLINGS = 8, /* Since: 0.1.4 */ 39 AS_NODE_TO_XML_FLAG_SORT_CHILDREN = 16, /* Since: 0.2.1 */ 40 /*< private >*/ 41 AS_NODE_TO_XML_FLAG_LAST 42 } AsNodeToXmlFlags; 43 44 /** 45 * AsNodeFromXmlFlags: 46 * @AS_NODE_FROM_XML_FLAG_NONE: No extra flags to use 47 * @AS_NODE_FROM_XML_FLAG_LITERAL_TEXT: Treat the text as an exact string 48 * @AS_NODE_FROM_XML_FLAG_KEEP_COMMENTS: Retain comments in the XML file 49 * @AS_NODE_FROM_XML_FLAG_ONLY_NATIVE_LANGS: Only load native languages 50 * 51 * The flags for converting from XML. 52 **/ 53 typedef enum { 54 AS_NODE_FROM_XML_FLAG_NONE = 0, /* Since: 0.1.0 */ 55 AS_NODE_FROM_XML_FLAG_LITERAL_TEXT = 1 << 0, /* Since: 0.1.3 */ 56 AS_NODE_FROM_XML_FLAG_KEEP_COMMENTS = 1 << 1, /* Since: 0.1.6 */ 57 AS_NODE_FROM_XML_FLAG_ONLY_NATIVE_LANGS = 1 << 2, /* Since: 0.6.5 */ 58 /*< private >*/ 59 AS_NODE_FROM_XML_FLAG_LAST 60 } AsNodeFromXmlFlags; 61 62 /** 63 * AsNodeInsertFlags: 64 * @AS_NODE_INSERT_FLAG_NONE: No extra flags to use 65 * @AS_NODE_INSERT_FLAG_PRE_ESCAPED: The data is already XML escaped 66 * @AS_NODE_INSERT_FLAG_SWAPPED: The name and key should be swapped 67 * @AS_NODE_INSERT_FLAG_NO_MARKUP: Preformat the 'description' markup 68 * @AS_NODE_INSERT_FLAG_DEDUPE_LANG: No xml:lang keys where text matches 'C' 69 * @AS_NODE_INSERT_FLAG_MARK_TRANSLATABLE: Mark the tag name as translatable 70 * @AS_NODE_INSERT_FLAG_BASE64_ENCODED: The data is Base64 enoded 71 * 72 * The flags to use when inserting a node. 73 **/ 74 typedef enum { 75 AS_NODE_INSERT_FLAG_NONE = 0, /* Since: 0.1.0 */ 76 AS_NODE_INSERT_FLAG_PRE_ESCAPED = 1, /* Since: 0.1.0 */ 77 AS_NODE_INSERT_FLAG_SWAPPED = 2, /* Since: 0.1.0 */ 78 AS_NODE_INSERT_FLAG_NO_MARKUP = 4, /* Since: 0.1.1 */ 79 AS_NODE_INSERT_FLAG_DEDUPE_LANG = 8, /* Since: 0.1.4 */ 80 AS_NODE_INSERT_FLAG_MARK_TRANSLATABLE = 16, /* Since: 0.2.1 */ 81 AS_NODE_INSERT_FLAG_BASE64_ENCODED = 32, /* Since: 0.3.1 */ 82 /*< private >*/ 83 AS_NODE_INSERT_FLAG_LAST 84 } AsNodeInsertFlags; 85 86 /** 87 * AsNodeError: 88 * @AS_NODE_ERROR_FAILED: Generic failure 89 * @AS_NODE_ERROR_INVALID_MARKUP: XML markup was invalid 90 * @AS_NODE_ERROR_NO_SUPPORT: No support for parsing 91 * 92 * The error type. 93 **/ 94 typedef enum { 95 AS_NODE_ERROR_FAILED, 96 AS_NODE_ERROR_INVALID_MARKUP, /* Since: 0.2.4 */ 97 AS_NODE_ERROR_NO_SUPPORT, /* Since: 0.3.0 */ 98 /*< private >*/ 99 AS_NODE_ERROR_LAST 100 } AsNodeError; 101 102 #define AS_NODE_ERROR as_node_error_quark () 103 104 typedef GNode AsNode; 105 106 GNode *as_node_new (void); 107 GQuark as_node_error_quark (void); 108 void as_node_unref (GNode *node); 109 110 const gchar *as_node_get_name (const GNode *node); 111 const gchar *as_node_get_data (const GNode *node); 112 const gchar *as_node_get_comment (const GNode *node); 113 AsTag as_node_get_tag (const GNode *node); 114 const gchar *as_node_get_attribute (const GNode *node, 115 const gchar *key); 116 gint as_node_get_attribute_as_int (const GNode *node, 117 const gchar *key); 118 guint as_node_get_attribute_as_uint (const GNode *node, 119 const gchar *key); 120 GHashTable *as_node_get_localized (const GNode *node, 121 const gchar *key); 122 const gchar *as_node_get_localized_best (const GNode *node, 123 const gchar *key); 124 GHashTable *as_node_get_localized_unwrap (const GNode *node, 125 GError **error); 126 127 void as_node_set_name (GNode *node, 128 const gchar *name); 129 void as_node_set_data (GNode *node, 130 const gchar *cdata, 131 AsNodeInsertFlags insert_flags); 132 void as_node_set_comment (GNode *node, 133 const gchar *comment); 134 void as_node_add_attribute (GNode *node, 135 const gchar *key, 136 const gchar *value); 137 void as_node_add_attribute_as_int (GNode *node, 138 const gchar *key, 139 gint value); 140 void as_node_add_attribute_as_uint (GNode *node, 141 const gchar *key, 142 guint value); 143 void as_node_remove_attribute (GNode *node, 144 const gchar *key); 145 146 GString *as_node_to_xml (const GNode *node, 147 AsNodeToXmlFlags flags); 148 GNode *as_node_from_xml (const gchar *data, 149 AsNodeFromXmlFlags flags, 150 GError **error) 151 G_GNUC_WARN_UNUSED_RESULT; 152 GNode *as_node_from_bytes (GBytes *bytes, 153 AsNodeFromXmlFlags flags, 154 GError **error) 155 G_GNUC_WARN_UNUSED_RESULT; 156 GNode *as_node_from_file (GFile *file, 157 AsNodeFromXmlFlags flags, 158 GCancellable *cancellable, 159 GError **error) 160 G_GNUC_WARN_UNUSED_RESULT; 161 gboolean as_node_to_file (const GNode *root, 162 GFile *file, 163 AsNodeToXmlFlags flags, 164 GCancellable *cancellable, 165 GError **error) 166 G_GNUC_WARN_UNUSED_RESULT; 167 168 GNode *as_node_find (GNode *root, 169 const gchar *path) 170 G_GNUC_WARN_UNUSED_RESULT; 171 GNode *as_node_find_with_attribute (GNode *root, 172 const gchar *path, 173 const gchar *attr_key, 174 const gchar *attr_value) 175 G_GNUC_WARN_UNUSED_RESULT; 176 177 GNode *as_node_insert (GNode *parent, 178 const gchar *name, 179 const gchar *cdata, 180 AsNodeInsertFlags insert_flags, 181 ...) 182 G_GNUC_NULL_TERMINATED; 183 void as_node_insert_localized (GNode *parent, 184 const gchar *name, 185 GHashTable *localized, 186 AsNodeInsertFlags insert_flags); 187 void as_node_insert_hash (GNode *parent, 188 const gchar *name, 189 const gchar *attr_key, 190 GHashTable *hash, 191 AsNodeInsertFlags insert_flags); 192 193 G_DEFINE_AUTOPTR_CLEANUP_FUNC(AsNode, as_node_unref) 194 195 G_END_DECLS 196