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