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

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

//=============================================================================

module com { module sun { module star { module uno {

//=============================================================================
/** Objects which implement this interface can become aggregates of
	a delegator.

	<p>That means if an object "A" aggregates "B", "A" can provide all
	or some of the interfaces of "B". Whenever the method
	<member>XInterface::queryInterface()</member>
	is called on either of the objects, the call will be forwarded
	to object "A". Object "A" now can determine whether to use the
	interfaces of "A" or "B" or neither. Actually, any number of
	aggregates can be used, even nested ones (aggregated objects which are
	delegators by themselves).

	<p>The following rules are to be observed:
	<ol>
	<li>All calls to <member>XInterface::acquire()</member>
	which are made before the delegator was set (using the method
	<member>XAggregation::setDelegator()</member>) must not be taken back
	(using the method <member>XInterface::release()</member>)
	before the delegation is removed by calling
	<code>xAggregation-&gt;setDelegator(NULL)</code>.

	<li>The constructor of a delegator has to increment its
	own reference count by calling its method
	<member>XInterface::acquire()</member>
	before it sets itself to any aggregate using the method
	<member>XAggregation::setDelegator()</member>. After that
	call it has to reset its own reference count without the
	destructor getting called.

	<li>The destructor of a delegator has to reset the delegator in
	its aggregated objects by calling their method
	<member>XAggregation::setDelegator()</member> with
	<const>NULL</const> before it releases its reference to
	its aggregated objects.
	</ol>

	@deprecated
    Aggregation will no longer be supported as a high-level concept of UNO.
    You may still have the option to implement an UNO object consisting of
    several single objects in your specific programming language, though this
    depends on your programming language.
*/
published interface XAggregation: com::sun::star::uno::XInterface
{
	//-------------------------------------------------------------------------
	/** sets the object to which all calls to the method
		<member>XInterface::queryInterface()</member>
		have to be forwarded. @

		@param xDelegator
		specifies the object which handles the calls to
		<member>XInterface::queryInterface()</member>.
		If <var>xDelegator</var> is <const>NULL</const>, the delegator is
		removed and thus the object becomes its own delegator and has
		to handle calls to the method
		<member>XInterface::queryInterface()</member>
		itself.

		@see XAggregation::queryAggregation
	*/
	void setDelegator( [in] com::sun::star::uno::XInterface pDelegator );

	//-------------------------------------------------------------------------
	/** is similar to <member>XInterface::queryInterface()</member>,
		but it is to be processed directly without being forwarded to the
		delegator. @

		<p>This method is only called from within an implementation of
		<member>XInterface::queryInterface()</member>
		or <member>XAggregation::queryAggregation()</member>. This method
		is to be called by the delegator if it does not implement the
		interface itself. An object which got aggregated cannot depend
		on getting its own interface when it calls the method
		<member>XInterface::queryInterface()</member>.

		@see XAggregation::setDelegator
	*/
	any queryAggregation( [in] type aType );

};

//=============================================================================

}; }; }; };

#endif
