#ifndef __GSK_XML_CONTEXT_H_
#define __GSK_XML_CONTEXT_H_

typedef struct _GskXmlContext GskXmlContext;

/* parse an XML node into a typed GValue */
typedef gboolean (*GskXmlContextParserFunc)(GskXmlContext *context,
                                            GskXmlNode    *node,
                                            GValue        *value_out,
					    gpointer       data,
					    GError       **error);

/* convert a GValue into an XML node */
typedef GskXmlNode *(*GskXmlContextToXmlFunc)(GskXmlContext *context,
                                              const GValue  *value,
					      gpointer       data,
					      GError       **error);

/* ensure that an object is in a valid state */
typedef gboolean    (*GskXmlValidateFunc)    (GskXmlContext *context,
                                              GObject       *object,
					      gpointer       data,
					      GError       **error);

/* handle a miscellaneous xml node for this object */
typedef gboolean    (*GskXmlObjectHandler)   (GskXmlContext *context,
                                              GObject       *object,
                                              GskXmlNode    *node,
                                              gpointer       data,
                                              GError       **error);

/* produce miscellaneous xml nodes for this object */
typedef gboolean    (*GskXmlObjectWriter)    (GskXmlContext *context,
                                              GObject       *object,
                                              GskXmlBuilder *builder,
                                              gpointer       data,
                                              GError       **error);

/* --- public api --- */
GskXmlNode    *gsk_xml_context_serialize_object  (GskXmlContext         *context,
                                                  gpointer               object,
                                                  GError               **error);
GskXmlNode    *gsk_xml_context_serialize_value   (GskXmlContext         *context,
                                                  GValue                *value,
                                                  GError               **error);
gboolean       gsk_xml_context_deserialize_value (GskXmlContext         *context,
                                                  GskXmlNode            *node,
                                                  GValue                *out,
						  GError               **error);
gpointer       gsk_xml_context_deserialize_object(GskXmlContext         *context,
                                                  GType                  base_type,
                                                  GskXmlNode            *node,
						  GError               **error);

/* constructing contexts and assigning nicknames */
GskXmlContext *gsk_xml_context_new               (void);
GskXmlContext *gsk_xml_context_global            (void);
void           gsk_xml_context_register_nickname (GskXmlContext *context,
                                                  GType          base_type,
						  const char    *nickname,
                                                  GType          type);

/* protected: for type implementations only */
void           gsk_xml_context_register_parser   (GskXmlContext         *context,
                                                  GType                  type,
						  GskXmlContextParserFunc func,
						  GskXmlContextToXmlFunc  to_xml,
						  gpointer               data,
						  GDestroyNotify         destroy);

/* protected: for object implementations only */
void           gsk_xml_context_register_validator(GskXmlContext         *context,
                                                  GType                  object_type,
                                                  GskXmlValidateFunc     func,
                                                  gpointer               data,
                                                  GDestroyNotify         destroy);
void           gsk_xml_context_add_misc_parser   (GskXmlContext         *context,
                                                  GType                  object_type,
                                                  GskXmlString          *node_name,     /* may be NULL */
                                                  GskXmlObjectHandler    handler,
                                                  gpointer               data,
                                                  GDestroyNotify         destroy);
void           gsk_xml_context_add_misc_writer   (GskXmlContext         *context,
                                                  GType                  object_type,
                                                  GskXmlObjectWriter     handler,
                                                  gpointer               data,
                                                  GDestroyNotify         destroy);


#endif


syntax highlighted by Code2HTML, v. 0.9.1