/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * gsf-libxml.h: Utility wrappers for using gsf with libxml * * Copyright (C) 2002-2006 Jody Goldberg (jody@gnome.org) * * This program is free software; you can redistribute it and/or * modify it under the terms of version 2.1 of the GNU Lesser General Public * License as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 * USA */ #ifndef GSF_LIBXML_H #define GSF_LIBXML_H #include #include G_BEGIN_DECLS /****************************************************************************/ /* GSF wrappers for libxml2 */ xmlParserCtxt *gsf_xml_parser_context (GsfInput *input); #if 0 /* this is cleaner, tack it on for 2.0 */ xmlSAXHandlerPtr sax, gpointer user); #endif int gsf_xmlDocFormatDump (GsfOutput *output, xmlDoc *cur, char const *encoding, gboolean format); typedef gboolean (*GsfXMLProbeFunc) (const xmlChar *name, const xmlChar *prefix, const xmlChar *URI, int nb_namespaces, const xmlChar **namespaces, int nb_attributes, int nb_defaulted, const xmlChar **attributes); gboolean gsf_xml_probe (GsfInput *input, GsfXMLProbeFunc func); /****************************************************************************/ /* Simplified wrapper to SAX based xml import */ /** * GsfXMLContent: * @GSF_XML_NO_CONTENT: node has no cstr contents * @GSF_XML_CONTENT: node has cstr contents * @GSF_XML_SHARED_CONTENT: node has contents that is shared with children * @GSF_XML_2ND: node is second or later occurrence * * Controls the handling of character data within a parser node. */ typedef enum { GSF_XML_NO_CONTENT = FALSE, GSF_XML_CONTENT, GSF_XML_SHARED_CONTENT, GSF_XML_2ND /* Second definition */ } GsfXMLContent; typedef gboolean (*GsfXMLInUnknownFunc) (GsfXMLIn *xin, xmlChar const *elem, xmlChar const **attrs); typedef void (*GsfXMLInExtDtor) (GsfXMLIn *xin, gpointer old_state); struct _GsfXMLIn { /* public state : read only */ gpointer user_state; GString *content; GsfXMLInDoc const *doc; GsfXMLInNode const *node; /* current node (not on the stack) */ /*< private >*/ GSList *node_stack; /* stack of GsfXMLInNode */ }; struct _GsfXMLInNode { char const *id; /* unique in the entire tree */ int ns_id; char const *name; char const *parent_id; void (*start) (GsfXMLIn *xin, xmlChar const **attrs); void (*end) (GsfXMLIn *xin, GsfXMLBlob *unknown); union { int v_int; gboolean v_bool; gpointer v_blob; char const *v_str; } user_data; GsfXMLContent has_content; unsigned int check_children_for_ns : 1; unsigned int share_children_with_parent : 1; }; struct _GsfXMLInNS { char const *uri; unsigned ns_id; }; #define GSF_XML_IN_NS(id, uri) \ { uri, id } #define GSF_XML_IN_NS_END \ { NULL, 0 } #define GSF_XML_IN_NODE_FULL(parent_id, id, ns, name, has_content, \ share_children_with_parent, check_ns, start, end, user) \ { \ #id, ns, name, #parent_id, start, end, { user }, has_content, \ check_ns, share_children_with_parent, \ } #define GSF_XML_IN_NODE(parent_id, id, ns, name, has_content, start, end) \ GSF_XML_IN_NODE_FULL(parent_id, id, ns, name, has_content, \ FALSE, FALSE, start, end, 0) #define GSF_XML_IN_NODE_END \ { NULL, 0, NULL, NULL, NULL, NULL, { 0 }, GSF_XML_NO_CONTENT, FALSE, FALSE } GType gsf_xml_in_doc_get_type (void); GsfXMLInDoc *gsf_xml_in_doc_new (GsfXMLInNode const *nodes, GsfXMLInNS const *ns); void gsf_xml_in_doc_free (GsfXMLInDoc *doc); gboolean gsf_xml_in_doc_parse (GsfXMLInDoc *doc, GsfInput *input, gpointer user_state); void gsf_xml_in_doc_add_nodes (GsfXMLInDoc *doc, GsfXMLInNode const *nodes); void gsf_xml_in_doc_set_unknown_handler (GsfXMLInDoc *doc, GsfXMLInUnknownFunc handler); void gsf_xml_in_push_state (GsfXMLIn *xin, GsfXMLInDoc const *doc, gpointer new_state, GsfXMLInExtDtor dtor, xmlChar const **attrs); GsfInput *gsf_xml_in_get_input (GsfXMLIn const *xin); char const *gsf_xml_in_check_ns (GsfXMLIn const *xin, char const *str, unsigned int ns_id); gboolean gsf_xml_in_namecmp (GsfXMLIn const *xin, char const *str, unsigned int ns_id, char const *name); void gsf_xml_in_set_silent_unknowns (GsfXMLIn *xin, gboolean silent); GType gsf_xml_in_ns_get_type (void); /****************************************************************************/ /* Simplified GSF based xml export (does not use libxml) */ struct GsfXMLOutClass_ { GObjectClass base; /*< private >*/ /* Padding for future expansion */ void (*_gsf_reserved1) (void); void (*_gsf_reserved2) (void); void (*_gsf_reserved3) (void); void (*_gsf_reserved4) (void); }; struct _GsfXMLOut { GObject base; GsfOutput *output; /*< private >*/ struct _GsfXMLOutPrivate *priv; }; #define GSF_XML_OUT_TYPE (gsf_xml_out_get_type ()) #define GSF_XML_OUT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSF_XML_OUT_TYPE, GsfXMLOut)) #define GSF_IS_XML_OUT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSF_XML_OUT_TYPE)) GType gsf_xml_out_get_type (void) G_GNUC_CONST; /* void gsf_xml_out_register_type (GTypeModule *module); glib dynamic types are not thread safe */ GsfXMLOut *gsf_xml_out_new (GsfOutput *output); void gsf_xml_out_set_doc_type (GsfXMLOut *xout, char const *type); void gsf_xml_out_start_element (GsfXMLOut *xout, char const *id); char const *gsf_xml_out_end_element (GsfXMLOut *xout); gboolean gsf_xml_out_get_pretty_print (GsfXMLOut *xout); gboolean gsf_xml_out_set_pretty_print (GsfXMLOut *xout, gboolean pp); void gsf_xml_out_simple_element (GsfXMLOut *xout, char const *id, char const *content); void gsf_xml_out_simple_int_element (GsfXMLOut *xout, char const *id, int val); void gsf_xml_out_simple_float_element (GsfXMLOut *xout, char const *id, double val, int precision); void gsf_xml_out_add_cstr_unchecked (GsfXMLOut *xout, char const *id, char const *val_utf8); void gsf_xml_out_add_cstr (GsfXMLOut *xout, char const *id, char const *val_utf8); void gsf_xml_out_add_bool (GsfXMLOut *xout, char const *id, gboolean val); void gsf_xml_out_add_int (GsfXMLOut *xout, char const *id, int val); void gsf_xml_out_add_uint (GsfXMLOut *xout, char const *id, unsigned int val); void gsf_xml_out_add_float (GsfXMLOut *xout, char const *id, double val, int precision); void gsf_xml_out_add_color (GsfXMLOut *xout, char const *id, unsigned int r, unsigned int g, unsigned int b); void gsf_xml_out_add_base64 (GsfXMLOut *xout, char const *id, guint8 const *data, unsigned int len); void gsf_xml_out_add_enum (GsfXMLOut *xout, char const *id, GType etype, gint val); void gsf_xml_out_add_gvalue (GsfXMLOut *xout, char const *id, GValue const *val); /****************************************************************************/ /* Some general utilities */ gboolean gsf_xml_gvalue_from_str (GValue *res, GType t, char const *str); GsfOutput *gsf_xml_out_get_output (GsfXMLOut const *xout); G_END_DECLS #endif /* GSF_LIBXML_H */