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

#include "sal/config.h"
#include "xmloff/dllapi.h"
#include "sal/types.h"

#include <limits.h>
#include <tools/solar.h>
#include <tools/color.hxx>
#include <tools/mapunit.hxx>
#include <xmloff/xmlement.hxx>
#include <xmloff/xmltoken.hxx>
#include <com/sun/star/util/Date.hpp>
#include <com/sun/star/frame/XModel.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/drawing/Position3D.hpp>

// #110680#
#include <com/sun/star/lang/XMultiServiceFactory.hpp>

//////////////////////////////////////////////////////////////////////////////
// predeclarations

class Time;
namespace rtl
{
class OUString;
class OUStringBuffer;
}

namespace com { namespace sun { namespace star {
	namespace util { struct DateTime; }
	namespace text { class XNumberingTypeInfo; }
	namespace i18n { class XCharacterClassification; }
}}}

namespace basegfx
{
	class B3DVector;
} // end of namespace basegfx

class XMLOFF_DLLPUBLIC SvXMLTokenEnumerator
{
private:
	const ::rtl::OUString&	maTokenString;
	sal_Int32				mnNextTokenPos;
	sal_Unicode				mcSeperator;

public:
	SvXMLTokenEnumerator( const ::rtl::OUString& rString, sal_Unicode cSeperator = sal_Unicode(' ') );

	sal_Bool getNextToken( ::rtl::OUString& rToken );
};

/** the SvXMLTypeConverter converts values of various types from
	their internal represantation to the textual form used in xml
	and back.
	Most of the methods are static but the SvXMLTypeConverter can
	also store default units for both numerical and textual measures.
*/

class XMLOFF_DLLPUBLIC SvXMLUnitConverter
{
private:
	MapUnit	meCoreMeasureUnit;
	MapUnit	meXMLMeasureUnit;
	com::sun::star::util::Date aNullDate;
	::com::sun::star::uno::Reference<
		::com::sun::star::text::XNumberingTypeInfo > xNumTypeInfo;
	::com::sun::star::uno::Reference< 
		::com::sun::star::i18n::XCharacterClassification > xCharClass;
	// #110680#
	::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxServiceFactory;

	SAL_DLLPRIVATE static ::rtl::OUString msXML_false;
	SAL_DLLPRIVATE static ::rtl::OUString msXML_true;

	SAL_DLLPRIVATE static void initXMLStrings();

	SAL_DLLPRIVATE void createNumTypeInfo() const;

public:
	/** constructs a SvXMLUnitConverter. The core measure unit is the
		default unit for numerical measures, the XML measure unit is
		the default unit for textual measures */
	// #110680#
	// SvXMLUnitConverter( MapUnit eCoreMeasureUnit, MapUnit eXMLMeasureUnit );
	SvXMLUnitConverter( 
		MapUnit eCoreMeasureUnit, 
		MapUnit eXMLMeasureUnit,
		const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceFactory );

	virtual ~SvXMLUnitConverter();

	static MapUnit GetMapUnit(sal_Int16 nFieldUnit);

	/** sets the default unit for numerical measures */
	inline void setCoreMeasureUnit( MapUnit eCoreMeasureUnit );

	/** gets the default unit for numerical measures */
	inline MapUnit getCoreMeasureUnit() const;

	/** sets the default unit for textual measures */
	void setXMLMeasureUnit( MapUnit eXMLMeasureUnit );

	/** gets the default unit for textual measures */
	MapUnit getXMLMeasureUnit() const;

	/** gets XNumberingTypeInfo */
	const ::com::sun::star::uno::Reference<
		::com::sun::star::text::XNumberingTypeInfo >& getNumTypeInfo() const
	{
		if( !xNumTypeInfo.is() )
			createNumTypeInfo();
		return xNumTypeInfo;
	}

	/** convert string to measure using optional min and max values*/
	sal_Bool convertMeasure( sal_Int32& rValue,
						 const ::rtl::OUString& rString,
						 sal_Int32 nMin = SAL_MIN_INT32,
						 sal_Int32 nMax = SAL_MAX_INT32) const;

	/** convert measure to string */
	void convertMeasure( ::rtl::OUStringBuffer& rBuffer,
						 sal_Int32 nMeasure ) const;

	/** convert measure with given unit to string */
	void convertMeasure( ::rtl::OUStringBuffer&,
						 sal_Int32 nMeasure,
						 MapUnit eSrcUnit ) const;

	/** convert string to measure in given unit
		using optional min and max values */
	static sal_Bool convertMeasure( sal_Int32& rVal,
								const ::rtl::OUString& rString,
								MapUnit eDstUnit,
								sal_Int32 nMin = SAL_MIN_INT32,
								sal_Int32 nMax = SAL_MAX_INT32);

	/** convert measure in given unit to string with given unit */
	static void convertMeasure( ::rtl::OUStringBuffer& rBuffer,
								sal_Int32 nMeasure,
								MapUnit eSrcUnit,
								MapUnit eDstUnit );

	/** convert string to boolean */
	static sal_Bool convertBool( sal_Bool& rBool,
							 const ::rtl::OUString& rString );

	/** convert boolean to string */
	static void convertBool( ::rtl::OUStringBuffer& rBuffer,
							 sal_Bool bValue );

	/** convert string to percent */
	static sal_Bool convertPercent( sal_Int32& rValue,
								const ::rtl::OUString& rString );

	/** convert percent to string */
	static void convertPercent( ::rtl::OUStringBuffer& rBuffer,
								sal_Int32 nValue );

	/** convert string to pixel measure unite */
	static sal_Bool convertMeasurePx( sal_Int32& rValue,
								const ::rtl::OUString& rString );

	/** convert pixel measure unit to string */
	static void convertMeasurePx( ::rtl::OUStringBuffer& rBuffer,
								sal_Int32 nValue );

	/** convert string to enum using given enum map, if the enum is
	    not found in the map, this method will return false */
	static sal_Bool convertEnum( sal_uInt16& rEnum,
							 const ::rtl::OUString& rValue,
							 const SvXMLEnumMapEntry *pMap );

	/** convert string to enum using given token map, if the enum is
	    not found in the map, this method will return false */
	static sal_Bool convertEnum( sal_uInt16& rEnum,
							 const ::rtl::OUString& rValue,
							 const SvXMLEnumStringMapEntry *pMap );

	/** convert enum to string using given enum map with an optional
		default token. If the enum is not found in the map,
	    this method will either use the given default or return
		false if not default is set */
	static sal_Bool convertEnum( ::rtl::OUStringBuffer& rBuffer,
                                 unsigned int nValue,
                                 const SvXMLEnumMapEntry *pMap,
                                 enum ::xmloff::token::XMLTokenEnum eDefault =
                                         ::xmloff::token::XML_TOKEN_INVALID );

	/** convert enum to string using given token map with an optional
		default token. If the enum is not found in the map,
	    this method will either use the given default or return
		false if not default is set */
	static sal_Bool convertEnum( ::rtl::OUStringBuffer& rBuffer,
                                 sal_uInt16 nValue,
                                 const SvXMLEnumStringMapEntry *pMap,
                                 sal_Char* pDefault = NULL );

	/** convert string to color */
	static sal_Bool convertColor( Color& rColor,
							  const ::rtl::OUString&rValue );

	/** convert color to string */
	static void convertColor( ::rtl::OUStringBuffer &rBuffer,
							  const Color& rCol );

	/** convert number to string */
	static void convertNumber( ::rtl::OUStringBuffer& rBuffer,
							   sal_Int32 nNumber );

	/** convert string to number with optional min and max values */
	static sal_Bool convertNumber( sal_Int32& rValue,
							   const ::rtl::OUString& rString,
							   sal_Int32 nMin = SAL_MIN_INT32,
							   sal_Int32 nMax = SAL_MAX_INT32);

	/** convert number to string */
	static void convertNumber64( ::rtl::OUStringBuffer& rBuffer,
							   sal_Int64 nNumber );

	/** convert string to number with optional min and max values */
	static sal_Bool convertNumber64( sal_Int64& rValue,
							   const ::rtl::OUString& rString,
							   sal_Int64 nMin = SAL_MIN_INT64,
							   sal_Int64 nMax = SAL_MAX_INT64);

	/** convert double number to string (using ::rtl::math) and DO
		convert to export MapUnit */
	void convertDoubleAndUnit(::rtl::OUStringBuffer& rBuffer, double fNumber) const;

	/** convert double number to string (using ::rtl::math) and
		DO convert from eSrcUnit to export MapUnit */
	static void convertDoubleAndUnit( ::rtl::OUStringBuffer& rBuffer, double fNumber, sal_Bool bWriteUnits, MapUnit eCoreUnit, MapUnit eDstUnit);

	/** convert string to double number (using ::rtl::math) and DO convert. */
	sal_Bool convertDoubleAndUnit(double& rValue, const ::rtl::OUString& rString) const;

	/** convert string to double number (using ::rtl::math) and DO convert from
		SrcUnit to DstUnit. */
	static sal_Bool convertDoubleAndUnit(double& rValue, const ::rtl::OUString& rString, MapUnit eSrcUnit, MapUnit eCoreUnit);

	/** convert double number to string (using ::rtl::math) without unit conversion */
	static void convertDouble( ::rtl::OUStringBuffer& rBuffer, double fNumber);

	/** convert string to double number (using ::rtl::math) without unit conversion */
	static sal_Bool convertDouble(double& rValue, const ::rtl::OUString& rString);

	/** get the Null Date of the XModel and set it to the UnitConverter */
	sal_Bool setNullDate (
		const com::sun::star::uno::Reference <com::sun::star::frame::XModel>& xModel);

	/** Set the Null Date of the UnitConverter */
	void setNullDate ( const com::sun::star::util::Date& aTempNullDate ) { aNullDate = aTempNullDate; }

	/** convert double to ISO Time String */
	static void convertTime( ::rtl::OUStringBuffer& rBuffer,
								const double& fTime);

	/** convert util::DateTime to ISO Time String */
	static void convertTime( ::rtl::OUStringBuffer& rBuffer,
								const ::com::sun::star::util::DateTime& rDateTime );

	/** convert ISO Time String to double */
	static sal_Bool convertTime( double& fTime,
								const ::rtl::OUString& rString);

	/** convert ISO Time String to util::DateTime */
	static sal_Bool convertTime( ::com::sun::star::util::DateTime& rDateTime,
								 const ::rtl::OUString& rString );

	/** convert double to ISO Date Time String */
	void convertDateTime( ::rtl::OUStringBuffer& rBuffer,
								const double& fDateTime,
		   						sal_Bool bAddTimeIf0AM=sal_False) { convertDateTime(rBuffer, fDateTime, aNullDate, bAddTimeIf0AM); }

	/** convert ISO Date Time String to double */
	sal_Bool convertDateTime( double& fDateTime,
								const ::rtl::OUString& rString) { return convertDateTime(fDateTime, rString, aNullDate); }

	/** convert double to ISO Date Time String */
	static void convertDateTime( ::rtl::OUStringBuffer& rBuffer,
								const double& fDateTime,
								const com::sun::star::util::Date& aNullDate,
		   						sal_Bool bAddTimeIf0AM=sal_False);
	/** convert ISO Date Time String to double */
	static sal_Bool convertDateTime( double& fDateTime,
								const ::rtl::OUString& rString,
								const com::sun::star::util::Date& aNullDate);

    /** converts the given time value into an ISO-conform duration string

        @param rTime
            the time value to convert. This parameter is evaluated only down to the seconds - in particular,
            "100th seconds" are ignored.
        @param nSecondsFraction
            Additional milleseconds to add to the time. Must be smaller than 1000.
            This parameter is necessary since neither <type>Time</type> nor <type scope="com::sun::star::util">Time</type>
            have a sufficient resolution to transport milliseconds.
        @see http://www.w3.org/TR/xmlschema-2/#duration
    */
    static ::rtl::OUString convertTimeDuration( const ::Time& rTime, sal_Int32 nSecondsFraction = 0 );

    /** converts the given ISO-conform duration string into a time value

        @param rTime
            the converted time value. Fractions of seconds of this object are not filled, even if present in
            the string. See <arg>nSecondsFraction</arg>

        @param pSecondsFraction
            receives fractions of whole seconds, in milliseconds. May be <NULL/>
            This parameter is necessary since neither <type>Time</type> nor <type scope="com::sun::star::util">Time</type>
            have a sufficient resolution to transport milliseconds.
        @see http://www.w3.org/TR/xmlschema-2/#duration
    */
    static bool convertTimeDuration( const rtl::OUString& rString, ::Time& rTime, sal_Int32* pSecondsFraction = NULL );

	/** convert string to ::basegfx::B3DVector */
	static sal_Bool convertB3DVector( ::basegfx::B3DVector& rVector,
							  const ::rtl::OUString& rValue );

	/** convert B3DVector to string */
	static void convertB3DVector( ::rtl::OUStringBuffer &rBuffer,
		const ::basegfx::B3DVector& rVector );

	/** convert string to Position3D */
	sal_Bool convertPosition3D( com::sun::star::drawing::Position3D& rPosition,
							  const ::rtl::OUString& rValue );

	/** convert Position3D to string */
	void convertPosition3D( ::rtl::OUStringBuffer &rBuffer,
							  const com::sun::star::drawing::Position3D& rVector );

	/** convert util::DateTime to ISO Date String */
	static void convertDateTime( ::rtl::OUStringBuffer& rBuffer,
								const com::sun::star::util::DateTime& rDateTime,
		   						sal_Bool bAddTimeIf0AM=sal_False );

	/** convert ISO Date String to util::DateTime */
	static sal_Bool convertDateTime( com::sun::star::util::DateTime& rDateTime,
									 const ::rtl::OUString& rString );

	/** gets the position of the first comma after npos in the string
		rStr. Commas inside '"' pairs are not matched */
	static sal_Int32 indexOfComma( const ::rtl::OUString& rStr,
								   sal_Int32 nPos );

	static void encodeBase64(rtl::OUStringBuffer& aStrBuffer, const com::sun::star::uno::Sequence<sal_Int8>& aPass);

	// Decode a base 64 encoded string into a sequence of bytes. The first
	// version can be used for attribute values only, bacause it does not
	// return any chars left from conversion.
	// For text submitted throgh the SAX characters call, the later method
	// must be used!
	static void decodeBase64(com::sun::star::uno::Sequence<sal_Int8>& aPass, const rtl::OUString& sBuffer);

	static sal_Int32 decodeBase64SomeChars(com::sun::star::uno::Sequence<sal_Int8>& aPass, const rtl::OUString& sBuffer);

	/** convert num-forat and num-letter-sync values to NumberingType */
	sal_Bool convertNumFormat( sal_Int16& rType,
						 	   const ::rtl::OUString& rNumFormat,
							   const ::rtl::OUString& rNumLetterSync,
							   sal_Bool bNumberNone = sal_False ) const;

	/** convert NumberingType to num-forat and num-letter-sync values */
	void convertNumFormat( ::rtl::OUStringBuffer& rBuffer,
						   sal_Int16 nType ) const;
	void convertNumLetterSync( ::rtl::OUStringBuffer& rBuffer,
						   	   sal_Int16 nType ) const;

	static void convertPropertySet(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>& rProps,
						const com::sun::star::uno::Reference<com::sun::star::beans::XPropertySet>& aProperties);
	static void convertPropertySet(com::sun::star::uno::Reference<com::sun::star::beans::XPropertySet>& rProperties,
						const com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>& aProps);

	static void clearUndefinedChars(rtl::OUString& rTarget, const rtl::OUString& rSource);

	::rtl::OUString encodeStyleName( const ::rtl::OUString& rName, 
									 sal_Bool *pEncoded=0 ) const;

    /** convert an Any to string (typesafe) */                                     
    static sal_Bool convertAny(      ::rtl::OUStringBuffer&    sValue,
                                     ::rtl::OUStringBuffer&    sType ,
                               const com::sun::star::uno::Any& aValue);

    /** convert a string to Any (typesafe) */                                     
    static sal_Bool convertAny(      com::sun::star::uno::Any& aValue,
                               const ::rtl::OUString&          sType ,
                               const ::rtl::OUString&          sValue);
};

inline void SvXMLUnitConverter::setCoreMeasureUnit( MapUnit eCoreMeasureUnit )
{
	meCoreMeasureUnit = eCoreMeasureUnit;
}

inline MapUnit SvXMLUnitConverter::getCoreMeasureUnit() const
{
	return meCoreMeasureUnit;
}

inline void SvXMLUnitConverter::setXMLMeasureUnit( MapUnit eXMLMeasureUnit )
{
	meXMLMeasureUnit = eXMLMeasureUnit;
}

inline MapUnit SvXMLUnitConverter::getXMLMeasureUnit() const
{
	return meXMLMeasureUnit;
}

#endif	//  _XMLOFF_XMLUCONV_HXX
