/**************************************************************
 * 
 * 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_script_XInvocation_idl__ 
#define __com_sun_star_script_XInvocation_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
 
#ifndef __com_sun_star_beans_XIntrospectionAccess_idl__ 
#include <com/sun/star/beans/XIntrospectionAccess.idl> 
#endif 
 
#ifndef __com_sun_star_lang_IllegalArgumentException_idl__ 
#include <com/sun/star/lang/IllegalArgumentException.idl> 
#endif 
 
#ifndef __com_sun_star_script_CannotConvertException_idl__ 
#include <com/sun/star/script/CannotConvertException.idl> 
#endif 
 
#ifndef __com_sun_star_reflection_InvocationTargetException_idl__ 
#include <com/sun/star/reflection/InvocationTargetException.idl> 
#endif 
 
#ifndef __com_sun_star_beans_UnknownPropertyException_idl__ 
#include <com/sun/star/beans/UnknownPropertyException.idl> 
#endif 
 
 
//============================================================================= 
 
 module com {  module sun {  module star {  module script {  
 
//============================================================================= 
/** gives access to an object's methods and properties.
	Container access is available through 
	<type scope="com::sun::star::container">XIndexContainer</type>, 
	<type scope="com::sun::star::container">XNameContainer</type> and 
	<type scope="com::sun::star::container">XEnumerationAccess</type>.
	</p>
 */
published interface XInvocation: com::sun::star::uno::XInterface
{ 
	//------------------------------------------------------------------------- 
	/** returns the introspection from this object or <NULL/> 
		if the object does not provide this information.
	 */
	com::sun::star::beans::XIntrospectionAccess getIntrospection(); 
 
	//------------------------------------------------------------------------- 
	/** provides access to methods exposed by an object.
		
		@param aParams all parameters; pure out params are undefined in sequence,
					   the value has to be ignored by the callee
		@param aOutParamIndex This sequence contains the indices of all parameters
						that are specified as out or inout.
		@param aOutParam This sequence contains the values of all parameters that 
						are specified as out or inout and corresponds with the 
						indices provided by the aOutParamIndex sequence.

						Example: aOutParamIndex == { 1, 4 } means that 
						aOutParam[0] contains the out value of the aParams[1] 
						parameter and aOutParam[1] contains the out value of 
						the aParams[4] parameter.
	 */
	any invoke( [in] string aFunctionName, 
			 [in] sequence<any> aParams, 
			 [out] sequence<short> aOutParamIndex, 
			 [out] sequence<any> aOutParam ) 
			raises( com::sun::star::lang::IllegalArgumentException, 
					com::sun::star::script::CannotConvertException, 
					com::sun::star::reflection::InvocationTargetException ); 
 
	//------------------------------------------------------------------------- 
	/** sets a value to the property with the specified name.
		
		<p> If the underlying object implements an
		<type scope="com::sun::star::container">XNameContainer</type>, 
		then this method will insert the value if there is no such 
		<var>aPropertyName</var>.
		
		</p>
	 */
	void setValue( [in] string aPropertyName, 
			 [in] any aValue ) 
			raises( com::sun::star::beans::UnknownPropertyException, 
					com::sun::star::script::CannotConvertException, 
					com::sun::star::reflection::InvocationTargetException ); 
 
	//------------------------------------------------------------------------- 
	/** returns the value of the property with the specified name. 
				 
		@param aPropertyName	 
			specifies the name of the property.
	 */
	any getValue( [in] string aPropertyName ) 
			raises( com::sun::star::beans::UnknownPropertyException ); 
 
	//------------------------------------------------------------------------- 
	/** returns <TRUE/> if the method with the specified name exists, else <FALSE/>.
				 
		<p>This optimizes the calling sequence 
		( <member>XInvocation::hasMethod</member>, 
		<member>XInvocation::invoke</member> )!</p>
				 
				@param aName			 
					specifies the name of the method.
	 */
	boolean hasMethod( [in] string aName ); 
 
	//------------------------------------------------------------------------- 
	/** returns <TRUE/> if the property with the specified name exists, else <FALSE/>. 
				 
				<p>This optimizes the calling sequence 
				( <member>XInvocation::hasProperty</member>, 
				<member>XInvocation::getValue</member> ) or 
				 
				( <member>XInvocation::hasProperty</member>,  
				<member>XInvocation::setValue</member> )! 
				 
					@param aName	 
				specifies the name of the property.
	 */
	boolean hasProperty( [in] string aName ); 
 
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 
