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

#include <framework/fwedllapi.h>

//_________________________________________________________________________________________________________________
//	interface includes
//_________________________________________________________________________________________________________________

#include <com/sun/star/xml/sax/XDocumentHandler.hpp>

//_________________________________________________________________________________________________________________
//	other includes
//_________________________________________________________________________________________________________________
#include <xml/imagesconfiguration.hxx>
#include <threadhelp/threadhelpbase.hxx>
#include <rtl/ustring.hxx>
#include <cppuhelper/implbase1.hxx>

#include <hash_map>
#include <stdtypes.h>


//_________________________________________________________________________________________________________________
//	namespace
//_________________________________________________________________________________________________________________

namespace framework{

//*****************************************************************************************************************
// Hash code function for using in all hash maps of follow implementation.

class OReadImagesDocumentHandler : private ThreadHelpBase,	// Struct for right initalization of lock member! Must be first of baseclasses.
								   public ::cppu::WeakImplHelper1< ::com::sun::star::xml::sax::XDocumentHandler >
{
	public:
		enum Image_XML_Entry
		{
			IMG_ELEMENT_IMAGECONTAINER,
			IMG_ELEMENT_IMAGES,
			IMG_ELEMENT_ENTRY,
			IMG_ELEMENT_EXTERNALIMAGES,
			IMG_ELEMENT_EXTERNALENTRY,
			IMG_ATTRIBUTE_HREF,
			IMG_ATTRIBUTE_MASKCOLOR,
			IMG_ATTRIBUTE_COMMAND,
			IMG_ATTRIBUTE_BITMAPINDEX,
			IMG_ATTRIBUTE_MASKURL,
			IMG_ATTRIBUTE_MASKMODE,
			IMG_ATTRIBUTE_HIGHCONTRASTURL,
			IMG_ATTRIBUTE_HIGHCONTRASTMASKURL,
			IMG_XML_ENTRY_COUNT
		};

		enum Image_XML_Namespace
		{
			IMG_NS_IMAGE,
			IMG_NS_XLINK,
			TBL_XML_NAMESPACES_COUNT
		};

		OReadImagesDocumentHandler( ImageListsDescriptor& aItems );
		virtual ~OReadImagesDocumentHandler();

		// 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 );

	private:
		::rtl::OUString getErrorLineString();

		class ImageHashMap : public ::std::hash_map< ::rtl::OUString		,
													 Image_XML_Entry		,
													 rtl::OUStringHash,
													 ::std::equal_to< ::rtl::OUString >	>
		{
			public:
				inline void free()
				{
					ImageHashMap().swap( *this );
				}
		};

		sal_Bool																	m_bImageContainerStartFound;
		sal_Bool																	m_bImageContainerEndFound;
		sal_Bool																	m_bImagesStartFound;
		sal_Bool																	m_bImagesEndFound;
		sal_Bool																	m_bImageStartFound;
		sal_Bool																	m_bExternalImagesStartFound;
		sal_Bool																	m_bExternalImagesEndFound;
		sal_Bool																	m_bExternalImageStartFound;
		sal_Int32																	m_nHashMaskModeBitmap;
		sal_Int32																	m_nHashMaskModeColor;
		ImageHashMap																m_aImageMap;
		ImageListsDescriptor&														m_aImageList;
		ImageListItemDescriptor*													m_pImages;
		ExternalImageItemListDescriptor*											m_pExternalImages;
		::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XLocator >	m_xLocator;
};

class OWriteImagesDocumentHandler : private ThreadHelpBase // Struct for right initalization of lock member! Must be first of baseclasses.
{
	public:
		OWriteImagesDocumentHandler(
			const ImageListsDescriptor& aItems,
			::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XDocumentHandler > );
		virtual ~OWriteImagesDocumentHandler();

		void WriteImagesDocument() throw
			( ::com::sun::star::xml::sax::SAXException,
			  ::com::sun::star::uno::RuntimeException );

	protected:
		virtual void WriteImageList( const ImageListItemDescriptor* ) throw
			( ::com::sun::star::xml::sax::SAXException,
			  ::com::sun::star::uno::RuntimeException );

		virtual void WriteExternalImageList( const ExternalImageItemListDescriptor* ) throw
			( ::com::sun::star::xml::sax::SAXException,
			  ::com::sun::star::uno::RuntimeException );

		virtual void WriteImage( const ImageItemDescriptor* ) throw
			( ::com::sun::star::xml::sax::SAXException,
			  ::com::sun::star::uno::RuntimeException );

		virtual void WriteExternalImage( const ExternalImageItemDescriptor* ) throw
			( ::com::sun::star::xml::sax::SAXException,
			  ::com::sun::star::uno::RuntimeException );

		const ImageListsDescriptor&															m_aImageListsItems;
		::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XDocumentHandler >	m_xWriteDocumentHandler;
		::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >		m_xEmptyList;
		::rtl::OUString																		m_aXMLXlinkNS;
		::rtl::OUString																		m_aXMLImageNS;
		::rtl::OUString																		m_aAttributeType;
		::rtl::OUString																		m_aAttributeXlinkType;
		::rtl::OUString																		m_aAttributeValueSimple;
};

} // namespace framework

#endif
