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

#include <rtl/ustring.hxx>
#include <com/sun/star/uno/Sequence.hxx>
#include <tools/debug.hxx>


namespace com { namespace sun { namespace star {
	namespace beans { class XMultiPropertySet; }
	namespace beans { class XPropertySet; }
	namespace beans { class XPropertySetInfo; }
} } }


/**
 * The MultiPropertySetHelper performs the follwing functions:
 *
 * Given a list of property names (as sal_Char** or OUString*), it can
 * query an XMultiPropertySet (or XPropertySet) which of these properties
 * it supports (method hasProperties(...)). The properties *MUST* be
 * sorted alphabetically.
 *
 * Then, the X(Multi)PropertySet can be queried for values, and only
 * the supported properties are queried. (method getValues(...)) The
 * values are stored in the helper itself.
 *
 * Finally, each property can be queried for existence 
 * (method hasProperty(...)) or its value (method (getValue(...))).
 *
 * After some initial preparation (hasProperties, getValues) the
 * MultiPropertySetHelper can be used similarly to an 
 * XPropertySet in that you can query the values in the places where you
 * need them. However, if an XMultiPropertySet is supplied, the queries
 * are more efficient, often significantly so.
 */
class MultiPropertySetHelper
{
	/// names of all properties
	::rtl::OUString* pPropertyNames;

	/// length of pPropertyNames array
	sal_Int16 nLength;

	/// the sequence of property names that the current (multi)
	/// property set implementation supports
	::com::sun::star::uno::Sequence< ::rtl::OUString > aPropertySequence;

	/// an array of indices that maps from pPropertyNames indices to
	/// aPropertySequence indices
	sal_Int16* pSequenceIndex;

	/// the last set of values retrieved by getValues
	::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > aValues;

	/// result of aValues.getConstArray()
	const ::com::sun::star::uno::Any* pValues;

	/// an empty Any
	::com::sun::star::uno::Any aEmptyAny;

public:

	MultiPropertySetHelper( const sal_Char** pNames );

	MultiPropertySetHelper( const ::rtl::OUString* pNames );

	~MultiPropertySetHelper();


	/**
	 * Call hasPropertiesByName for the provided XPropertySetInfo and build
	 * list of allowed properties.
	 */
	void hasProperties( const ::com::sun::star::uno::Reference<
							::com::sun::star::beans::XPropertySetInfo> & );


    /**
     * Return whether hasProperties was called
     * (i.e. if we are ready to call getValues)
     */
    sal_Bool checkedProperties();

	/**
	 * Get values from the XMultiPropertySet.
	 *
	 * May only be called after hasProperties() was called for the
	 * appropriate XPropertySetInfo.
	 */
    void getValues( const ::com::sun::star::uno::Reference<
							::com::sun::star::beans::XMultiPropertySet> & );

	/** 
	 * Get values from the XPropertySet. This can be much slower than
	 * getValues( const Reference<XMultiPropertySet& ) and hence
	 * should be avoided. 
	 *
	 * May only be called after hasProperties() was called for the
	 * appropriate XPropertySetInfo. 
	 */
	void getValues( const ::com::sun::star::uno::Reference<
							::com::sun::star::beans::XPropertySet> & );



	/**
	 * Get a value from the values array.
	 *
	 * May only be called after getValues() was called.
	 */
	inline const ::com::sun::star::uno::Any& getValue( sal_Int16 nIndex );

	/**
	 * Find out if this property is supported.
	 *
	 * May only be called after hasProperties() was called.
	 */
	inline sal_Bool hasProperty( sal_Int16 nIndex );

	/**
	 * Get a value from the XPropertySet on demand. 
	 *
	 * If neither getValues nor getValueOnDemand has been called already
	 * after the last call to resetValues, the values are retrieved
	 * using getValues. Otherwise the value already retrieved is returned.
	 * In case XMultiPropertySet is supported by the XPropertySet and
	 * bTryMult is set, the XMultiPropertySet is used to get the values.
	 * 
	 */
	const ::com::sun::star::uno::Any& getValue( sal_Int16 nIndex,
						const ::com::sun::star::uno::Reference<
							::com::sun::star::beans::XPropertySet> &,
						sal_Bool bTryMulti = sal_False );

	/**
	 * Get a value from the XMultiPropertySet on demand. 
	 *
	 * If neither getValues nor getValueOnDemand has been called already
	 * after the last call to resetValues, the values are retrieved
	 * using getValues. Otherwise the value already retrieved is returned.
	 * In case XMultiPropertySet is supported by the XPropertySet,
	 * XMultiPropertySet is used to get the values.
	 * 
	 */
	const ::com::sun::star::uno::Any& getValue( sal_Int16 nIndex,
						const ::com::sun::star::uno::Reference<
							::com::sun::star::beans::XMultiPropertySet> & );

	inline void resetValues() { pValues = 0; }
};


// inline implementations of the often-called methods getValue and hasProperty:

const ::com::sun::star::uno::Any& MultiPropertySetHelper::getValue(
	sal_Int16 nValueNo )
{
	DBG_ASSERT( pValues != NULL, 
				"called getValue() without calling getValues() before");
	DBG_ASSERT( pSequenceIndex != NULL,
				"called getValue() without calling hasProperties() before" );
	DBG_ASSERT( nValueNo < nLength, "index out of range" );

	sal_Int16 nIndex = pSequenceIndex[ nValueNo ];
	return ( nIndex != -1 ) ? pValues[ nIndex ] : aEmptyAny;
}

sal_Bool MultiPropertySetHelper::hasProperty( sal_Int16 nValueNo )
{
	DBG_ASSERT( pSequenceIndex != NULL,
				"called getValue() without calling hasProperties() before" );
	DBG_ASSERT( nValueNo < nLength, "index out of range" );

	return pSequenceIndex[ nValueNo ] != -1;
}

#endif
