/**************************************************************
 * 
 * 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 _XMLDOCUMENTWRAPPER_XMLSECIMPL_HXX
#define _XMLDOCUMENTWRAPPER_XMLSECIMPL_HXX

#include <com/sun/star/xml/wrapper/XXMLDocumentWrapper.hpp>
#include <com/sun/star/xml/csax/XCompressedDocumentHandler.hpp>
#include <com/sun/star/xml/crypto/sax/XSAXEventKeeper.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <cppuhelper/implbase4.hxx>

#include "saxhelper.hxx"
//#include "libxml/parserInternals.h"
//#include "libxslt/xslt.h"

#define NODEPOSITION_NORMAL        1
#define NODEPOSITION_STARTELEMENT  2
#define NODEPOSITION_ENDELEMENT    3

#include <libxml/tree.h>

class XMLDocumentWrapper_XmlSecImpl : public cppu::WeakImplHelper4 
< 
	com::sun::star::xml::wrapper::XXMLDocumentWrapper,
	com::sun::star::xml::sax::XDocumentHandler,
	com::sun::star::xml::csax::XCompressedDocumentHandler,
	com::sun::star::lang::XServiceInfo
>
/****** XMLDocumentWrapper_XmlSecImpl.hxx/CLASS XMLDocumentWrapper_XmlSecImpl *
 *
 *   NAME
 *	XMLDocumentWrapper_XmlSecImpl -- Class to manipulate a libxml2
 *	document
 *
 *   FUNCTION
 *	Converts SAX events into a libxml2 document, converts the document back
 *	into SAX event stream, and manipulate nodes in the document.
 *
 *   HISTORY
 *	05.01.2004 -	Interface supported: XXMLDocumentWrapper,
 * 			XDocumentHandler, XCompressedDocumentHandler,
 *			XServiceInfo
 *
 *   AUTHOR
 *	Michael Mi
 *	Email: michael.mi@sun.com
 ******************************************************************************/
{
private:
	/* the sax helper */
	SAXHelper saxHelper;

	/* the document used to convert SAX events to */
	xmlDocPtr m_pDocument;
	
	/* the root element */
	xmlNodePtr m_pRootElement;
	
	/*
	 * the current active element. The next incoming SAX event will be
	 * appended to this element
	 */
	xmlNodePtr m_pCurrentElement;
	
	/* 
	 * This variable is used when converting the document or part of it into
	 * SAX events. See getNextSAXEvent method.
	 */ 
	sal_Int32 m_nCurrentPosition;
	
	/*
	 * used for recursive deletion. See recursiveDelete method
	 */
	xmlNodePtr m_pStopAtNode;
	xmlNodePtr m_pCurrentReservedNode;
	com::sun::star::uno::Sequence< com::sun::star::uno::Reference<
		com::sun::star::xml::wrapper::XXMLElementWrapper > > m_aReservedNodes;
	sal_Int32 m_nReservedNodeIndex;
	
private:
	void getNextSAXEvent();
	
	void sendStartElement(
		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XDocumentHandler >& xHandler, 
		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XDocumentHandler >& xHandler2, 
		const xmlNodePtr pNode) const
		throw (com::sun::star::xml::sax::SAXException);
		
	void sendEndElement(
		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XDocumentHandler >& xHandler, 
		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XDocumentHandler >& xHandler2, 
		const xmlNodePtr pNode) const
		throw (com::sun::star::xml::sax::SAXException);
		
	void sendNode(
		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XDocumentHandler >& xHandler, 
		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XDocumentHandler >& xHandler2, 
		const xmlNodePtr pNode) const
		throw (com::sun::star::xml::sax::SAXException);
		
	rtl::OString getNodeQName(const xmlNodePtr pNode) const;
	
	sal_Int32 recursiveDelete( const xmlNodePtr pNode);
	
	void getNextReservedNode();
	
	void removeNode( const xmlNodePtr pNode) const;
	
	xmlNodePtr checkElement(
		const com::sun::star::uno::Reference< 
			com::sun::star::xml::wrapper::XXMLElementWrapper >& xXMLElement) const;
			
	void buildIDAttr( xmlNodePtr pNode ) const;
	void rebuildIDLink( xmlNodePtr pNode ) const;
	
public:
	XMLDocumentWrapper_XmlSecImpl();
	virtual ~XMLDocumentWrapper_XmlSecImpl();
	
	/* com::sun::star::xml::wrapper::XXMLDocumentWrapper */
	virtual com::sun::star::uno::Reference<
		com::sun::star::xml::wrapper::XXMLElementWrapper > SAL_CALL getCurrentElement(  )
		throw (com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL setCurrentElement( const com::sun::star::uno::Reference<
		com::sun::star::xml::wrapper::XXMLElementWrapper >& element )
		throw (com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL removeCurrentElement(  )
		throw (com::sun::star::uno::RuntimeException);
		
	virtual sal_Bool SAL_CALL isCurrent( const com::sun::star::uno::Reference<
		com::sun::star::xml::wrapper::XXMLElementWrapper >& node )
		throw (com::sun::star::uno::RuntimeException);
		
	virtual sal_Bool SAL_CALL isCurrentElementEmpty(  )
		throw (com::sun::star::uno::RuntimeException);
		
	virtual rtl::OUString SAL_CALL getNodeName( const com::sun::star::uno::Reference<
		com::sun::star::xml::wrapper::XXMLElementWrapper >& node )
		throw (com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL clearUselessData( 
		const com::sun::star::uno::Reference<
			com::sun::star::xml::wrapper::XXMLElementWrapper >& node, 
		const com::sun::star::uno::Sequence< com::sun::star::uno::Reference<
			com::sun::star::xml::wrapper::XXMLElementWrapper > >& reservedDescendants, 
		const com::sun::star::uno::Reference<
			com::sun::star::xml::wrapper::XXMLElementWrapper >& stopAtNode )
		throw (com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL collapse( const com::sun::star::uno::Reference<
		com::sun::star::xml::wrapper::XXMLElementWrapper >& node )
		throw (com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL generateSAXEvents(
		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XDocumentHandler >& handler,
		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XDocumentHandler >& xEventKeeperHandler,
		const com::sun::star::uno::Reference<
			com::sun::star::xml::wrapper::XXMLElementWrapper >& startNode, 
		const com::sun::star::uno::Reference<
			com::sun::star::xml::wrapper::XXMLElementWrapper >& endNode )
		throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL getTree(
		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XDocumentHandler >& handler )
		throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL rebuildIDLink(
		const com::sun::star::uno::Reference< com::sun::star::xml::wrapper::XXMLElementWrapper >& node )
		throw (com::sun::star::uno::RuntimeException);

	/* com::sun::star::xml::sax::XDocumentHandler */ 
	virtual void SAL_CALL startDocument(  )
		throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL endDocument(  )
		throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL startElement(
		const rtl::OUString& aName,
		const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList >& xAttribs )
		throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL endElement( const rtl::OUString& aName ) 
		throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL characters( const rtl::OUString& aChars )
		throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL ignorableWhitespace( const rtl::OUString& aWhitespaces )
		throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL processingInstruction( const rtl::OUString& aTarget, const rtl::OUString& aData )
		throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL setDocumentLocator( const com::sun::star::uno::Reference< com::sun::star::xml::sax::XLocator >& xLocator )
		throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException);
		
	/* com::sun::star::xml::csax::XCompressedDocumentHandler */
	virtual void SAL_CALL _startDocument(  )
		throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL _endDocument(  )
		throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL _startElement(
		const rtl::OUString& aName,
		const com::sun::star::uno::Sequence< 
			com::sun::star::xml::csax::XMLAttribute >& aAttributes )
		throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL _endElement( const rtl::OUString& aName )
		throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL _characters( const rtl::OUString& aChars )
		throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL _ignorableWhitespace( const rtl::OUString& aWhitespaces )
		throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL _processingInstruction( const rtl::OUString& aTarget, const rtl::OUString& aData )
		throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException);
		
	virtual void SAL_CALL _setDocumentLocator( 
		sal_Int32 columnNumber,
		sal_Int32 lineNumber,
		const rtl::OUString& publicId,
		const rtl::OUString& systemId )
		throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException);
	
	/* com::sun::star::lang::XServiceInfo */
	virtual rtl::OUString SAL_CALL getImplementationName(  ) 
		throw (com::sun::star::uno::RuntimeException);
		
	virtual sal_Bool SAL_CALL supportsService( const rtl::OUString& ServiceName ) 
		throw (com::sun::star::uno::RuntimeException);
		
	virtual com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames(  ) 
		throw (com::sun::star::uno::RuntimeException);
};

rtl::OUString XMLDocumentWrapper_XmlSecImpl_getImplementationName()
	throw ( com::sun::star::uno::RuntimeException );

sal_Bool SAL_CALL XMLDocumentWrapper_XmlSecImpl_supportsService( const rtl::OUString& ServiceName ) 
	throw ( com::sun::star::uno::RuntimeException );

com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL 
	XMLDocumentWrapper_XmlSecImpl_getSupportedServiceNames(  ) 
	throw ( com::sun::star::uno::RuntimeException );

com::sun::star::uno::Reference< com::sun::star::uno::XInterface >
SAL_CALL XMLDocumentWrapper_XmlSecImpl_createInstance( 
	const com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory > & rSMgr)
	throw ( com::sun::star::uno::Exception );

#endif

