/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/



#ifndef _XML_PARSER_HXX_
#define _XML_PARSER_HXX_

#include <expat.h>
#include <stdexcept>

//-----------------------------------------------------
class xml_parser_exception : public std::runtime_error
{
public:

	xml_parser_exception(
		const std::string& error_msg,
		int error_code,
		int line_number,
		int column_number,
		long byte_index) :
		std::runtime_error(error_msg),
		error_code_(error_code),
		line_number_(line_number),
		column_number_(column_number),
		byte_index_(byte_index)
	{}

	int  error_code_;
	int  line_number_;
	int  column_number_;
	long byte_index_;
};


//-----------------------------------------------------
//	Simple wrapper around expat, the xml parser library
//	created by James Clark
//-----------------------------------------------------
class i_xml_parser_event_handler;

class xml_parser
{
public:
	//########################################################
	xml_parser(const XML_Char* EncodingName = 0);

	//########################################################
	~xml_parser();

	//########################################################
	/** Parse a XML data stream

		@param		pXmlData
					Pointer to a buffer containing the xml data

		@param		Length
					Length of the buffer containing the xml data

		@param		IsFinal
					Indicates whether these are the last xml data
					of an xml document to parse. For very large
					xml documents it may be useful to read and
					parse the document partially.

		@precond	XmlData must not be null

		@throws		SaxException
					If the used Sax parser returns an error. The SaxException
					contains detailed information about the error.	*/
	void parse(const char* XmlData, size_t Length, bool IsFinal = true);

	//########################################################
	/**	Set a document handler

		@descr		A document handler implements the interface i_xml_parser_event_handler.
					The document handler receive notifications of various events
					from the sax parser for instance "start_document".

					The client is responsible for the life time management of
					the given document handler, that means the document handler
					instance must exist until a new one was set or until the parser
					no longer exist.

		@param		SaxDocumentHandler
					The new document handler, may be null if not interested in
					sax parser events.

		@postcond	currently used document handler == pSaxDocumentHandler	*/
	void set_document_handler(i_xml_parser_event_handler* event_handler);

	//########################################################
	/**	Returns the currently used document handler or null if
		no document handler was set before.	*/
	i_xml_parser_event_handler* get_document_handler() const;
private:

	void init();

private:
	i_xml_parser_event_handler*	document_handler_;
	XML_Parser xml_parser_;

// prevent copy and assignment
private:
	xml_parser(const xml_parser&);
	xml_parser& operator=(const xml_parser&);
};

#endif

/* vim: set noet sw=4 ts=4: */
