1 /* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3  * gsf-libxml.h: Utility wrappers for using gsf with libxml
4  *
5  * Copyright (C) 2002-2006 Jody Goldberg (jody@gnome.org)
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of version 2.1 of the GNU Lesser General Public
9  * License as published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
19  * USA
20  */
21 
22 #ifndef GSF_LIBXML_H
23 #define GSF_LIBXML_H
24 
25 #include <gsf/gsf-fwd.h>
26 #include <libxml/tree.h>
27 
28 G_BEGIN_DECLS
29 
30 /****************************************************************************/
31 /* GSF wrappers for libxml2 */
32 xmlParserCtxt *gsf_xml_parser_context (GsfInput   *input);
33 #if 0
34 					/* this is cleaner, tack it on for 2.0 */
35 					xmlSAXHandlerPtr sax, gpointer user);
36 #endif
37 int	       gsf_xmlDocFormatDump   (GsfOutput  *output,
38 				       xmlDoc	  *cur,
39 				       char const *encoding,
40 				       gboolean    format);
41 
42 typedef gboolean (*GsfXMLProbeFunc) (const xmlChar *name,
43 				     const xmlChar *prefix,
44 				     const xmlChar *URI,
45 				     int nb_namespaces,
46 				     const xmlChar **namespaces,
47 				     int nb_attributes,
48 				     int nb_defaulted,
49 				     const xmlChar **attributes);
50 gboolean gsf_xml_probe (GsfInput *input,
51 			GsfXMLProbeFunc func);
52 
53 /****************************************************************************/
54 /* Simplified wrapper to SAX based xml import */
55 
56 /**
57  * GsfXMLContent:
58  * @GSF_XML_NO_CONTENT: node has no cstr contents
59  * @GSF_XML_CONTENT: node has cstr contents
60  * @GSF_XML_SHARED_CONTENT: node has contents that is shared with children
61  * @GSF_XML_2ND: node is second or later occurrence
62  *
63  * Controls the handling of character data within a parser node.
64  */
65 
66 typedef enum {
67 	GSF_XML_NO_CONTENT = FALSE,
68 	GSF_XML_CONTENT,
69 	GSF_XML_SHARED_CONTENT,
70 	GSF_XML_2ND                 /* Second definition */
71 } GsfXMLContent;
72 typedef gboolean (*GsfXMLInUnknownFunc) (GsfXMLIn *xin,
73 					 xmlChar const *elem, xmlChar const **attrs);
74 typedef void     (*GsfXMLInExtDtor)     (GsfXMLIn *xin, gpointer old_state);
75 
76 struct _GsfXMLIn {
77 	/* public state : read only */
78 	gpointer	    user_state;
79 	GString		   *content;
80 	GsfXMLInDoc  const *doc;
81 	GsfXMLInNode const *node;	/* current node (not on the stack) */
82 	/*< private >*/
83 	GSList	 	   *node_stack;	/* stack of GsfXMLInNode */
84 };
85 
86 struct _GsfXMLInNode {
87 	char const *id;		/* unique in the entire tree */
88 	int	    ns_id;
89 	char const *name;
90 	char const *parent_id;
91 	void (*start) (GsfXMLIn *xin, xmlChar const **attrs);
92 	void (*end)   (GsfXMLIn *xin, GsfXMLBlob *unknown);
93 
94 	union {
95 		int	    v_int;
96 		gboolean    v_bool;
97 		gpointer    v_blob;
98 		char const *v_str;
99 	} user_data;
100 	GsfXMLContent has_content;
101 
102 	unsigned int check_children_for_ns : 1;
103 	unsigned int share_children_with_parent : 1;
104 };
105 
106 struct _GsfXMLInNS {
107 	char const *uri;
108 	unsigned    ns_id;
109 };
110 
111 #define GSF_XML_IN_NS(id, uri) \
112 { uri, id }
113 #define GSF_XML_IN_NS_END \
114 { NULL, 0 }
115 
116 #define GSF_XML_IN_NODE_FULL(parent_id, id, ns, name, has_content, 	\
117 			     share_children_with_parent, check_ns, start, end, user)	\
118 {									\
119 	#id, ns, name, #parent_id, start, end, { user }, has_content,	\
120 	check_ns, share_children_with_parent,				\
121 }
122 
123 #define GSF_XML_IN_NODE(parent_id, id, ns, name, has_content, start, end) \
124 	GSF_XML_IN_NODE_FULL(parent_id, id, ns, name, has_content,	  \
125 			     FALSE, FALSE, start, end, 0)
126 #define GSF_XML_IN_NODE_END	\
127 	{ NULL, 0, NULL, NULL, NULL, NULL, { 0 }, GSF_XML_NO_CONTENT, FALSE, FALSE }
128 
129 GType	     gsf_xml_in_doc_get_type (void);
130 GsfXMLInDoc *gsf_xml_in_doc_new	   (GsfXMLInNode const *nodes, GsfXMLInNS const *ns);
131 void	     gsf_xml_in_doc_free   (GsfXMLInDoc *doc);
132 gboolean     gsf_xml_in_doc_parse  (GsfXMLInDoc *doc, GsfInput *input,
133 				    gpointer user_state);
134 void	     gsf_xml_in_doc_add_nodes	(GsfXMLInDoc *doc,
135 					 GsfXMLInNode const *nodes);
136 void	     gsf_xml_in_doc_set_unknown_handler (GsfXMLInDoc *doc,
137 						 GsfXMLInUnknownFunc handler);
138 
139 void	     gsf_xml_in_push_state (GsfXMLIn *xin, GsfXMLInDoc const *doc,
140 				    gpointer new_state, GsfXMLInExtDtor dtor,
141 				    xmlChar const **attrs);
142 
143 GsfInput    *gsf_xml_in_get_input  (GsfXMLIn const *xin);
144 char const  *gsf_xml_in_check_ns   (GsfXMLIn const *xin, char const *str,
145 				    unsigned int ns_id);
146 gboolean     gsf_xml_in_namecmp	   (GsfXMLIn const *xin, char const *str,
147 				    unsigned int ns_id, char const *name);
148 void         gsf_xml_in_set_silent_unknowns (GsfXMLIn *xin, gboolean silent);
149 
150 GType	     gsf_xml_in_ns_get_type (void);
151 
152 /****************************************************************************/
153 /* Simplified GSF based xml export (does not use libxml) */
154 
155 struct _GsfXMLOutClass {
156 	GObjectClass  base;
157 
158 	/*< private >*/
159 	/* Padding for future expansion */
160 	void (*_gsf_reserved1) (void);
161 	void (*_gsf_reserved2) (void);
162 	void (*_gsf_reserved3) (void);
163 	void (*_gsf_reserved4) (void);
164 };
165 
166 struct _GsfXMLOut {
167 	GObject	   base;
168 	GsfOutput *output;
169 
170 	/*< private >*/
171 	struct _GsfXMLOutPrivate *priv;
172 };
173 
174 #define GSF_XML_OUT_TYPE	(gsf_xml_out_get_type ())
175 #define GSF_XML_OUT(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), GSF_XML_OUT_TYPE, GsfXMLOut))
176 #define GSF_IS_XML_OUT(o)	(G_TYPE_CHECK_INSTANCE_TYPE ((o), GSF_XML_OUT_TYPE))
177 
178 GType gsf_xml_out_get_type      (void);
179 /* void  gsf_xml_out_register_type (GTypeModule *module); glib dynamic types are not thread safe */
180 
181 GsfXMLOut *gsf_xml_out_new (GsfOutput *output);
182 
183 void	    gsf_xml_out_set_doc_type	(GsfXMLOut *xout, char const *type);
184 void	    gsf_xml_out_start_element	(GsfXMLOut *xout, char const *id);
185 char const *gsf_xml_out_end_element	(GsfXMLOut *xout);
186 
187 gboolean    gsf_xml_out_get_pretty_print (GsfXMLOut *xout);
188 gboolean    gsf_xml_out_set_pretty_print (GsfXMLOut *xout, gboolean pp);
189 
190 void gsf_xml_out_simple_element		(GsfXMLOut *xout, char const *id,
191 					 char const *content);
192 void gsf_xml_out_simple_int_element	(GsfXMLOut *xout, char const *id,
193 					 int val);
194 void gsf_xml_out_simple_float_element	(GsfXMLOut *xout, char const *id,
195 					 double val, int precision);
196 
197 void gsf_xml_out_add_cstr_unchecked	(GsfXMLOut *xout, char const *id,
198 					 char const *val_utf8);
199 void gsf_xml_out_add_cstr		(GsfXMLOut *xout, char const *id,
200 					 char const *val_utf8);
201 void gsf_xml_out_add_bool		(GsfXMLOut *xout, char const *id,
202 					 gboolean val);
203 void gsf_xml_out_add_int		(GsfXMLOut *xout, char const *id,
204 					 int val);
205 void gsf_xml_out_add_uint		(GsfXMLOut *xout, char const *id,
206 					 unsigned int val);
207 void gsf_xml_out_add_float		(GsfXMLOut *xout, char const *id,
208 					 double val, int precision);
209 void gsf_xml_out_add_color		(GsfXMLOut *xout, char const *id,
210 					 unsigned int r, unsigned int g, unsigned int b);
211 void gsf_xml_out_add_base64		(GsfXMLOut *xout, char const *id,
212 					 guint8 const *data, unsigned int len);
213 void gsf_xml_out_add_enum               (GsfXMLOut *xout, char const *id,
214 					 GType etype, gint val);
215 void gsf_xml_out_add_gvalue             (GsfXMLOut *xout, char const *id,
216 					 GValue const *val);
217 
218 /****************************************************************************/
219 /* Some general utilities */
220 gboolean gsf_xml_gvalue_from_str (GValue *res, GType t, char const *str);
221 GsfOutput *gsf_xml_out_get_output (GsfXMLOut const *xout);
222 
223 G_END_DECLS
224 
225 #endif /* GSF_LIBXML_H */
226