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

#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 

#ifndef __com_sun_star_beans_GetDirectPropertyTolerantResult_idl__ 
#include <com/sun/star/beans/GetDirectPropertyTolerantResult.idl> 
#endif 

#ifndef __com_sun_star_beans_GetPropertyTolerantResult_idl__ 
#include <com/sun/star/beans/GetPropertyTolerantResult.idl> 
#endif 

#ifndef __com_sun_star_beans_SetPropertyTolerantFailed_idl__ 
#include <com/sun/star/beans/SetPropertyTolerantFailed.idl> 
#endif 

#ifndef __com_sun_star_lang_IllegalArgumentException_idl__ 
#include <com/sun/star/lang/IllegalArgumentException.idl> 
#endif 
 
 
//============================================================================= 
 
module com {  module sun {  module star {  module beans {  
 
//============================================================================= 
 
/** provides access to multiple iformation of
    a set of properties with a single call.

    <p>The speciality of this interface is that none of the functions
    will throw the usual exceptions associated with setting and retrieving
    of property values. Instead the data for the failures is collected and
    returned.</p>

    <p>Note: There is no support for property change listeners in this
    interface.</p>

    @see com::sun::star::beans::XPropertySet
    @see com::sun::star::beans::XMultiPropertySet
 */
published interface XTolerantMultiPropertySet : com::sun::star::uno::XInterface
{ 
	//------------------------------------------------------------------------- 
	 
	/** sets the values to the properties with the specified names.
		
		@param aPropertyNames
            specifies the names of the properties. 
            The property names must be sorted ascending.

            <p>If the names are not sorted the behaviour of the method
            is undefined!</p>

        @param aPropertyValues
            specifies the values of the properties. 
            The order of the values has to be the same as in the
            <var>aPropertyNames</var> parameter int order to match
            the property name with its value.

        @returns
            An empty sequence if all properties are successfull set.

            Otherwise for every property value that could not successfully 
            be set an entry of the 
            <type scope="com::sun::star::beans">SetPropertyTolerantFailed</type>
            will be present in this sequence.
            The order of the properties is also alphabetically ascending.
        
        @throws IllegalArgumentException
            if the number of property names and values do not match.

	 */
    sequence< com::sun::star::beans::SetPropertyTolerantFailed > setPropertyValuesTolerant( 
                [in] sequence< string > aPropertyNames, 
                [in] sequence< any >    aValues )
        raises( com::sun::star::lang::IllegalArgumentException );
 
	//------------------------------------------------------------------------- 
	 
    /** retrieve the values of the specified properties
		 
        <p>The count and order of the values in the returned sequence 
            will be the same as the order of the names in the argument.</p>

		@param aPropertyNames
			specifies the names of the properties. 
            The property names must be sorted ascending.

            <p>If the names are not sorted the behaviour of the method
            is undefined!</p>

        @returns
            a sequence of type
            <type scope="com::sun::star::beans">GetPropertyTolerantResult</type> 
            for each of the properties listed in <var>aPropertyNames</var>.
	 */
    sequence< com::sun::star::beans::GetPropertyTolerantResult > getPropertyValuesTolerant( 
                [in] sequence< string > aPropertyNames );
 

    //------------------------------------------------------------------------- 

    /** retrieve only those values of the specified properties which
        are direct values.

        <p>Since the count of returned elements may be different from
        the number of supplied property names the returned elements
        will also state the name of the property.</p>

        @param aPropertyNames
            specifies the names of the properties. 
            The property names must be sorted ascending.

            <p>If the names are not sorted the behaviour of the method
            is undefined!</p>

        @returns
            a sequence of type
            <type scope="com::sun::star::beans">GetDirectPropertyTolerantResult</type> 
            but only for those properties supplied whoms state is
            <member scope="com::sun::star::beans::PropertyState">DIRECT_VALUE</member>.
     */
    sequence< com::sun::star::beans::GetDirectPropertyTolerantResult > getDirectPropertyValuesTolerant( 
                [in] sequence< string > aPropertyNames );

}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 

