From 9a6e901dba5577cec76fde8c72b332c5198272c8 Mon Sep 17 00:00:00 2001 From: Jonas Suhr Christensen Date: Fri, 23 Mar 2012 15:26:51 +0100 Subject: Added files. --- src/saxparser.h | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 src/saxparser.h (limited to 'src/saxparser.h') diff --git a/src/saxparser.h b/src/saxparser.h new file mode 100644 index 0000000..c303d41 --- /dev/null +++ b/src/saxparser.h @@ -0,0 +1,152 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * saxparser.h + * + * Mon Mar 24 14:40:15 CET 2008 + * Copyright 2008 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of Pracro. + * + * Pracro 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 2 of the License, or + * (at your option) any later version. + * + * Pracro 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 Pracro; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#ifndef __PRACRO_SAXPARSER_H__ +#define __PRACRO_SAXPARSER_H__ + +#include +#include +#include + +typedef std::map< std::string, std::string> attributes_t; + +/** + * This class implements a SAX Parser, utilising the eXpat XML parser library. + * It uses virtual methods for the callbacks, and transforms tagnames and + * attributes into C++ values (std::string and std::vector). + */ +class SAXParser { +public: + /** + * Constructor. + * It initialises the eXpat library. + */ + SAXParser(); + + /** + * Destructor. + * It frees the eXpat library resources. + */ + virtual ~SAXParser(); + + /** + * Call this method to use the reimplemented readData method for input. + * The entire document is parsed through this single call. + * @return An integer wityh value 0 on success, or 1 on failure. + * @see int readData(char *data, size_t size) + */ + int parse(); + + /** + * Character data callback method. + * Reimplement this to get character callbacks. + * This callback might be called several times, if a character block is big. + * In that cae it might be nessecary to buffer to received bytes. + * @param data A std::string containing the character data. + */ + virtual void characterData(std::string &data); + + /** + * Start tag callback mehtod. + * Reimplement this to get start tag callbacks. + * It is called each time a new start tag is seen. + * @param name A std::string containing the tag name. + * @param attributes A std::map of std::string to std::string containing all + * attributes for the tag. + */ + virtual void startTag(std::string name, attributes_t &attr); + + /** + * End tag callback mehtod. + * Reimplement this to get end tag callbacks. + * It is called each time an end tag is seen. + * @param name A std::string containing the tag name. + */ + virtual void endTag(std::string name); + + /** + * Error callback method. + * Reimplement this to handle error messages. + * A default implementation prints out the current buffer, linenumber and + * error message to the screen. + * @param buf A char* containing the current buffer being parsed. + * @param len A size_t containing the length of the current buffer being + * parsed. + * @param error A std::string containing the error message. + * @param lineno An integer containing the line number on which the error + * occurred. + */ + virtual void parseError(const char *buf, size_t len, std::string error, + int lineno); + + /** + * Buffer parse method. + * Use this method to parse an external buffer with xml data. + * This method can be called several times (ie. in a read loop). + * @param buf A char* containing the buffer to parse. + * @param size A size_t comntaining the size of the buffer to parse. + * @return A boolean with the value true if a complete document has been seen. + * false otherwise. + * @see bool parse(char *buf, size_t size) + */ + bool parse(const char *buf, size_t size); + + /** + * Get the number of bytes used from the last buffer. + * If the buffer parse method is used, and the buffer comes from a stream of + * xml doxuments, this method can be used to figure out how many bytes from + * the stream should be replayed, to another parser. + * @return an integer containing the number of bytes used from the last + * buffer. + * @see bool parse(char *buf, size_t size) + */ + unsigned int usedBytes(); + + // private stuff that needs to be public! + std::string outertag; + bool done; + +protected: + /** + * Read data callback method. + * This method is used when the parse() method is used. + * It can be used to connect the parser with eg. a file. + * @param data A char* containing the buffer to be filled. + * @param size A size_t containing the maximum number of bytes to be filled + * (ie. the size of data) + * @return An integer contaning the actual number of bytes filled. 0 if no + * more bytes are available. + * @see int parse() + */ + virtual int readData(char *data, size_t size); + + XML_Parser p; + + unsigned int bufferbytes; + unsigned int totalbytes; +}; + +#endif/*__PRACRO_SAXPARSER_H__*/ -- cgit v1.2.3