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