#ifndef ARABICA_SAXPARSEEXCEPTION_H #define ARABICA_SAXPARSEEXCEPTION_H // SAXParseException.h // $Id$ #include #include #include namespace Arabica { namespace SAX { /** * Encapsulate an XML parse error or warning. * *

This exception will include information for locating the error * in the original XML document. Note that although the application * will receive a SAXParseException as the argument to the handlers * in the {@link ErrorHandler ErrorHandler} interface, * the application is not actually required to throw the exception; * instead, it can simply read the information in it and take a * different action.

* *

Since this exception is a subclass of {@link SAXException * SAXException}, it inherits the ability to wrap another exception.

* * @since SAX 1.0 * @author Jez Higgins, * jez@jezuk.co.uk * @version 2.0 * @see SAXException * @see Locator * @see ErrorHandler */ template > class SAXParseException : public SAXException { public: typedef Locator LocatorT; SAXParseException(const std::string& message) : SAXException(message), publicId_(), systemId_(), lineNumber_(-1), columnNumber_(-1) { setMsg(); } // SAXParseException SAXParseException(const std::string& message, const LocatorT& locator) : SAXException(message), publicId_(locator.getPublicId()), systemId_(locator.getSystemId()), lineNumber_(locator.getLineNumber()), columnNumber_(locator.getColumnNumber()) { setMsg(); } // SAXParseException SAXParseException(const std::string& message, const string_type& publicId, const string_type& systemId, size_t lineNumber, size_t columnNumber) : SAXException(message), publicId_(publicId), systemId_(systemId), lineNumber_(lineNumber), columnNumber_(columnNumber) { setMsg(); } // SAXParseException SAXParseException(const SAXParseException& rhs) : SAXException(rhs), msg_(rhs.msg_), publicId_(rhs.publicId_), systemId_(rhs.systemId_), lineNumber_(rhs.lineNumber_), columnNumber_(rhs.columnNumber_) { } // SAXParseException SAXParseException& operator=(const SAXParseException& rhs) { SAXException::operator=(rhs); msg_ = rhs.msg_; publicId_ = rhs.publicId_; systemId_ = rhs.systemId_; lineNumber_ = rhs.lineNumber_; columnNumber_ = rhs.columnNumber_; return *this; } // operator= virtual ~SAXParseException() throw() { } /** * Get the public identifier of the entity where the exception occurred. * * @return A string containing the public identifier, or an empty string * if none is available. * @see Locator#getPublicId */ const string_type& getPublicId() const { return publicId_; } /** * Get the system identifier of the entity where the exception occurred. * *

If the system identifier is a URL, it will be resolved * fully.

* * @return A string containing the system identifier, or an empty string * if none is available. * @see Locator#getSystemId */ const string_type& getSystemId() const { return systemId_; } /** * The line number of the end of the text where the exception occurred. * * @return An integer representing the line number, or -1 * if none is available. * @see Locator#getLineNumber */ size_t getLineNumber() const { return lineNumber_; } /** * The column number of the end of the text where the exception occurred. * *

The first column in a line is position 1.

* * @return An integer representing the column number, or -1 * if none is available. * @see Locator#getColumnNumber */ size_t getColumnNumber() const { return columnNumber_; } virtual const char* what() const throw() { return msg_.c_str(); } // what private: void setMsg() { std::ostringstream str; str << "Parse exception at " << lineNumber_ << "," << columnNumber_ << std::endl; str << SAXException::what(); msg_ = str.str(); } // setMsg std::string msg_; string_type publicId_; string_type systemId_; size_t lineNumber_; size_t columnNumber_; SAXParseException(); }; // class SAXParseException } // namespace SAX } // namespace Arabica #endif // end of file