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

#include <com/sun/star/xml/sax/SAXParseException.hpp>
#include <com/sun/star/xml/sax/SAXException.hpp>
#include <com/sun/star/xml/sax/XAttributeList.hpp>
#include <com/sun/star/xml/sax/XLocator.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/frame/XModel.hpp>
#include <xmloff/xmltoken.hxx>

#ifndef _XMLOFF_TRANSFORMER_HXX_
#include "Transformer.hxx"
#endif

namespace rtl { class OUString; }
namespace com { namespace sun { namespace star {
	namespace i18n { class XCharacterClassification; }
}}}

class SvXMLNamespaceMap;
class XMLTransformerContext;
class XMLTransformerContextVector;
class XMLTransformerActions;
struct XMLTransformerActionInit;
struct TransformerAction_Impl;
class XMLMutableAttributeList;
class XMLTransformerTokenMap;

const sal_uInt16 INVALID_ACTIONS = 0xffff;

class XMLTransformerBase : public XMLTransformer
{
	friend class XMLTransformerContext;

	::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XLocator >
		m_xLocator;

	::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XDocumentHandler > 			m_xHandler;		// the handlers
	::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XExtendedDocumentHandler > 	m_xExtHandler;
	::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > m_xPropSet;
	::com::sun::star::uno::Reference<
		::com::sun::star::i18n::XCharacterClassification > xCharClass;

	::rtl::OUString m_aExtPathPrefix;
	::rtl::OUString m_aClass;

	SvXMLNamespaceMap 			*m_pNamespaceMap;
	SvXMLNamespaceMap 			*m_pReplaceNamespaceMap;
	XMLTransformerContextVector *m_pContexts;
	XMLTransformerActions		*m_pElemActions;
	XMLTransformerTokenMap		*m_pTokenMap;

protected:
	::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >		mxModel;

	// This method is called after the namespace map has been updated, but
	// before a context for the current element has been pushed.
	XMLTransformerContext *CreateContext( sal_uInt16 nPrefix,
									  const ::rtl::OUString& rLocalName,
									  const ::rtl::OUString& rQName );

	// this method may return an empty reference when the transformer service
	// was created outside the xmloff environment.
	// It is strictly forbidden to use this as a write access to the model!
	const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& getModel() const { return mxModel; }

public:
	XMLTransformerBase( XMLTransformerActionInit *pInit=0,
		   				::xmloff::token::XMLTokenEnum *pTKMapInit=0 ) throw();
	virtual ~XMLTransformerBase() throw();

	// ::com::sun::star::xml::sax::XDocumentHandler
	virtual void SAL_CALL startDocument(void)
		throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException );
	virtual void SAL_CALL endDocument(void)
		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::sax::XExtendedDocumentHandler
	virtual void SAL_CALL startCDATA(void) throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException );
	virtual void SAL_CALL endCDATA(void) throw( ::com::sun::star::uno::RuntimeException );
	virtual void SAL_CALL comment(const ::rtl::OUString& sComment)
		throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException );
	virtual void SAL_CALL allowLineBreak(void)
		throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException );
	virtual void SAL_CALL unknown(const ::rtl::OUString& sString)
		throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException );

	// XInitialization
    virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments ) throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);

	// C++
	const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XDocumentHandler > & GetDocHandler() { return m_xHandler; }

	const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & GetPropertySet() { return m_xPropSet; }


	SvXMLNamespaceMap& GetNamespaceMap() { return *m_pNamespaceMap; }
	const SvXMLNamespaceMap& GetNamespaceMap() const { return *m_pNamespaceMap; }
	SvXMLNamespaceMap& GetReplaceNamespaceMap() { return *m_pReplaceNamespaceMap; }

	XMLTransformerActions& GetElemActions() { return *m_pElemActions; }
	virtual XMLTransformerActions *GetUserDefinedActions( sal_uInt16 n );
	virtual XMLTransformerContext *CreateUserDefinedContext(
									  const TransformerAction_Impl& rAction,
									  const ::rtl::OUString& rQName,
		   							  sal_Bool bPersistent=sal_False ) = 0;
	virtual ::rtl::OUString GetEventName( const ::rtl::OUString& rName,
		   								  sal_Bool bForm = sal_False ) = 0;


	XMLMutableAttributeList *ProcessAttrList( ::com::sun::star::uno::Reference<
				::com::sun::star::xml::sax::XAttributeList >& rAttrList,
						 sal_uInt16 nActionMap, sal_Bool bClone );

	static sal_Bool ReplaceSingleInchWithIn( ::rtl::OUString& rValue );
	static sal_Bool ReplaceSingleInWithInch( ::rtl::OUString& rValue );
	static sal_Bool ReplaceInchWithIn( ::rtl::OUString& rValue );
	static sal_Bool ReplaceInWithInch( ::rtl::OUString& rValue );

	sal_Bool EncodeStyleName( ::rtl::OUString& rName ) const;
	static sal_Bool DecodeStyleName( ::rtl::OUString& rName );
	static sal_Bool NegPercent( ::rtl::OUString& rValue );

	sal_Bool AddNamespacePrefix( ::rtl::OUString& rName,
								 sal_uInt16 nPrefix ) const;
	sal_Bool RemoveNamespacePrefix( ::rtl::OUString& rName,
									sal_uInt16 nPrefixOnly=0xffffU ) const;

	sal_Bool ConvertURIToOASIS( ::rtl::OUString& rURI,
								sal_Bool bSupportPackage=sal_False ) const;
	sal_Bool ConvertURIToOOo( ::rtl::OUString& rURI,
								sal_Bool bSupportPackage=sal_False ) const;

    /** renames the given rOutAttributeValue if one of the parameters contains a
        matching token in its lower 16 bits.  The value is converted to the
        token that is given in the upper 16 bits of the matching parameter.
     */
    sal_Bool RenameAttributeValue( ::rtl::OUString& rOutAttributeValue,
                                   sal_Int32 nParam1,
                                   sal_Int32 nParam2,
                                   sal_Int32 nParam3 );

    /** converts the '.' that separates fractions of seconds in a dateTime
        string into a ',' that was used in the OOo format

        @param rDateTime
            A dateTime string that will be parsed and changed in case a match
            was found.
        @return <TRUE/> if the given string was changed
     */
    static bool ConvertRNGDateTimeToISO( ::rtl::OUString& rDateTime );

    ::xmloff::token::XMLTokenEnum GetToken( const ::rtl::OUString& rStr ) const;

	const XMLTransformerContext *GetCurrentContext() const;
	const XMLTransformerContext *GetAncestorContext( sal_uInt32 i ) const;

	// C++
	inline void SetClass( const ::rtl::OUString& r ) { m_aClass = r; }
	inline const ::rtl::OUString& GetClass() const { return m_aClass; }

	bool isWriter() const;

};

#endif	//  _XMLOFF_TRANSFORMER_BASE_HXX
