226 lines
7.6 KiB
C
226 lines
7.6 KiB
C
/* 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 <gsf/gsf-fwd.h>
|
|
#include <libxml/tree.h>
|
|
|
|
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);
|
|
/* 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 */
|