/**************************************************************
 * 
 * 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 interessted 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 

