/**************************************************************
 *
 * 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 following 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
