/**************************************************************
 * 
 * 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 __com_sun_star_xml_sax_XFastSerializer_idl__ 
#define __com_sun_star_xml_sax_XFastSerializer_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
 
#ifndef __com_sun_star_xml_sax_SAXException_idl__ 
#include <com/sun/star/xml/sax/SAXException.idl> 
#endif 
 
#ifndef __com_sun_star_xml_sax_XFastDocumentHanlder_idl__ 
#include <com/sun/star/xml/sax/XFastDocumentHandler.idl> 
#endif 
 
#ifndef __com_sun_star_io_XOutputStream_idl__
#include <com/sun/star/io/XOutputStream.idl>
#endif

#ifndef __com_sun_star_xml_sax_XFastTokenHandler_idl__ 
#include <com/sun/star/xml/sax/XFastTokenHandler.idl> 
#endif 

 
//============================================================================= 
 
module com {  module sun {  module star {  module xml {  module sax {  
 
//============================================================================= 
 
/** receives notification of sax document events to write into an XOutputStream.
 */
interface XFastSerializer: com::sun::star::uno::XInterface
{ 
	//------------------------------------------------------------------------- 
	 
	/** called by the parser when parsing of an xml stream is started.
	 */
	void startDocument() 
			raises( com::sun::star::xml::sax::SAXException ); 
 
	//------------------------------------------------------------------------- 
	 
	/** called by the parser after the last xml element of a stream is processed.
	 */
	void endDocument() 
			raises( com::sun::star::xml::sax::SAXException ); 

	//------------------------------------------------------------------------- 
	 
	/** receives notification of the beginning of an element .

		@param Element
			contains the integer token from the <type>XFastTokenHandler</type>
			registered at the <type>XFastParser</type>.<br>

			If the element has a namespace that was registered with the
			<type>XFastParser</type>, <param>Element</param> contains the integer
			token of the elements local name from the <type>XFastTokenHandler</type>
			and the integer token of the namespace combined with an arithmetic
			<b>or</b> operation.

		@param Attribs
			Contains a <type>XFastAttrbitueList</type> to access the attributes
			from the element.

	*/
	void startFastElement( [in] long Element, [in] XFastAttributeList Attribs ) 
			raises( com::sun::star::xml::sax::SAXException ); 

	//------------------------------------------------------------------------- 

	/** receives notification of the beginning of an unknown element .

		@param Namespace
			contains the namespace url (not the prefix!) of this element.
		@param Name
			contains the elements local name.
		@param Attribs
			Contains a <type>XFastAttrbitueList</type> to access the attributes
			from the element.
	 */
	void startUnknownElement( [in] string Namespace, [in] string Name, [in] XFastAttributeList Attribs ) 
			raises( com::sun::star::xml::sax::SAXException ); 

	//------------------------------------------------------------------------- 

	/** receives notification of the end of an known element.
		@see startFastElement
	 */
	void endFastElement( [in] long Element ) 
			raises( com::sun::star::xml::sax::SAXException ); 

	//------------------------------------------------------------------------- 

	/** receives notification of the end of an known element.
		@see startUnknownElement
	 */
	void endUnknownElement( [in] string Namespace, [in] string Name ) 
			raises( com::sun::star::xml::sax::SAXException ); 
 
	//------------------------------------------------------------------------- 
	 
	/** receives notification of the beginning of a single element .

		@param Element
			contains the integer token from the <type>XFastTokenHandler</type>
			registered at the <type>XFastParser</type>.<br>

			If the element has a namespace that was registered with the
			<type>XFastParser</type>, <param>Element</param> contains the integer
			token of the elements local name from the <type>XFastTokenHandler</type>
			and the integer token of the namespace combined with an arithmetic
			<b>or</b> operation.

		@param Attribs
			Contains a <type>XFastAttrbitueList</type> to access the attributes
			from the element.

	*/
	void singleFastElement( [in] long Element, [in] XFastAttributeList Attribs ) 
			raises( com::sun::star::xml::sax::SAXException ); 

	//------------------------------------------------------------------------- 

	/** receives notification of the beginning of a single unknown element .

		@param Namespace
			contains the namespace url (not the prefix!) of this element.
		@param Name
			contains the elements local name.
		@param Attribs
			Contains a <type>XFastAttrbitueList</type> to access the attributes
			from the element.
	 */
	void singleUnknownElement( [in] string Namespace, [in] string Name, [in] XFastAttributeList Attribs ) 
			raises( com::sun::star::xml::sax::SAXException ); 

	//------------------------------------------------------------------------- 

	/** receives notification of character data.
	 */
	void characters( [in] string aChars ) 
			raises( com::sun::star::xml::sax::SAXException ); 
 
	//------------------------------------------------------------------------- 
	 
	/**
	 */
	void setOutputStream ( [in] com::sun::star::io::XOutputStream xOutputStream ) 
			/* raises( com::sun::star::xml::sax::SAXException ) */; 
 
	//------------------------------------------------------------------------- 
	 
	/**
	 */
	void setFastTokenHandler ( [in] com::sun::star::xml::sax::XFastTokenHandler xFastTokenHandler ) 
			/* raises( com::sun::star::xml::sax::SAXException ) */; 
  }; 
 
//============================================================================= 
 
}; }; }; }; };  
 
#endif 
