// // aegis - project change supervisor // Copyright (C) 2005, 2006, 2008 Peter Miller // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // 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 General Public License // along with this program. If not, see // . // #ifndef LIBAEGIS_XMLTEXTREAD_H #define LIBAEGIS_XMLTEXTREAD_H #include #include #if LIBXML_VERSION < 20510 enum xmlReaderTypes { XML_READER_TYPE_NONE = 0, XML_READER_TYPE_ELEMENT = 1, XML_READER_TYPE_ATTRIBUTE = 2, XML_READER_TYPE_TEXT = 3, XML_READER_TYPE_CDATA = 4, XML_READER_TYPE_ENTITY_REFERENCE = 5, XML_READER_TYPE_ENTITY = 6, XML_READER_TYPE_PROCESSING_INSTRUCTION = 7, XML_READER_TYPE_COMMENT = 8, XML_READER_TYPE_DOCUMENT = 9, XML_READER_TYPE_DOCUMENT_TYPE = 10, XML_READER_TYPE_DOCUMENT_FRAGMENT = 11, XML_READER_TYPE_NOTATION = 12, XML_READER_TYPE_WHITESPACE = 13, XML_READER_TYPE_SIGNIFICANT_WHITESPACE = 14, XML_READER_TYPE_END_ELEMENT = 15, XML_READER_TYPE_END_ENTITY = 16, XML_READER_TYPE_XML_DECLARATION = 17 }; #endif #include /** * The xml_text_reader class is used to represent an XML stream reader. * It uses the xmlTextReader* functions from the GNOME libxml2 library. */ class xml_text_reader { public: /** * The destructor. */ virtual ~xml_text_reader(); /** * The constructor. */ xml_text_reader(input &deeper, bool validate = false); /** * The parse method is used to parse the given file. Each element * will cause the process_node() method to be called. */ void parse(); protected: /** * The process_node method is used to process each node as it is * read from the input. Each derived class must supply its own * process_node method. */ virtual void process_node() = 0; /** * The process_node_end method is only ever called for ELEMENT * nodes, and only after all of the attributes have been given to * the process_node method. * * The default implimentation does nothing. * * @param empty * Whether or not the original ELEMENT node was empty. */ virtual void process_node_end(bool empty); /** * The depth method is used to obtain the depth of the current node * in the tree. * * \returns * the depth or -1 in case of error */ int depth() { return xmlTextReaderDepth(reader); } /** * The node_type method is used to get the node type of the current * node. * * \returns * the xmlNodeType of the current node or -1 in case of error * * \sa * http://dotgnu.org/pnetlib-doc/System/Xml/XmlNodeType.html */ xmlReaderTypes node_type() { return (xmlReaderTypes)xmlTextReaderNodeType(reader); } /** * The xmlReaderType_ename class method is used to obtain the text * equivalent of a node type. */ static const char *xmlReaderType_ename(xmlReaderTypes); /** * The name method is used to determine the qualified name of the * current node, equal to Prefix:LocalName. * * \returns * the node name or NULL if not available */ const xmlChar *name() { return xmlTextReaderName(reader); } /** * The is_empty_element method is used to check if the current node * is empty. * * \returns * 1 if empty, 0 if not and -1 in case of error */ int is_empty_element() { return xmlTextReaderIsEmptyElement(reader); } /** * The has_value method is used to determine whether or not the * current node has a text value. * * \returns * 1 if true, 0 if false, and -1 in case or error */ int has_value() { return xmlTextReaderHasValue(reader); } /** * The value method is used to provide the text value of the * current node if present. * * \returns * the string or NULL if not available. The result must be * deallocated with xmlFree() */ const xmlChar *value() { return xmlTextReaderValue(reader); } /** * The move_back_to_element method is used after parsing the * element attributes to move the reader pointer back to the * element node once again so that the name is again available. */ void move_back_to_element() { xmlTextReaderMoveToElement(reader); } private: /** * The deeper instance variable is used to remember the deeper * input stream which the XML parser will use to obtain its input. */ input deeper; /** * The reader instance variable is used to remember the location of * the opaque xml_text_reader data store. */ xmlTextReaderPtr reader; /** * The number_of_errors instance variable is used to remember how * many errors have been detected to date in the parsing of the * input stream. */ int number_of_errors; /** * The number_of_parsers class variable is used to remember how * many instances are currently active. This lets us initialise * and clean up after the xml2 library. */ static int number_of_parsers; /** * The validate instance variable is used to remember whether or * not we are validating the data against the DTD. */ bool validate; /** * The read_callback class method is used to handle callbacks by * the parser. It calls the read_deeper method. */ static int read_callback(void *context, char *buffer, int len); /** * The read_deeper method is used by the read_callback class method * is used to obtain the next block of input. */ int read_deeper(char *buffer, int len); /** * The close_callback class method is used to handle callbacks by * the parser when end of inpout is reached. */ static int close_callback(void *context); /** * The close method is called by the parser when it gets to the end * of the input. */ void close(); /** * The error_callback class method is used to handle callbacks by * the parser when an error is seen. */ static void error_callback(void *context, const char *msg, xmlParserSeverities severity, xmlTextReaderLocatorPtr locator); /** * the error method is used to report errors and warnings detected * during the parse. */ void error(const char *msg, xmlParserSeverities severity, xmlTextReaderLocatorPtr locator); /** * The read method is used to read one node from the input, and * process it via the veirtual process_node method. If there is * an error, it is reported in a fatal error message, and this * function does not return. * * \returns * If end of file is reached, false is returned. * If there is not error, true is returned. */ bool read(); /** * The default constructor. Do not use. */ xml_text_reader(); /** * The copy constructor. Do not use. */ xml_text_reader(const xml_text_reader &); /** * The assignment operator. Do not use. */ xml_text_reader &operator=(const xml_text_reader &); }; #endif // LIBAEGIS_XMLTEXTREAD_H