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

#ifndef __com_sun_star_script_MemberType_idl__
#include <com/sun/star/script/MemberType.idl>
#endif

#ifndef __com_sun_star_reflection_ParamMode_idl__
#include <com/sun/star/reflection/ParamMode.idl>
#endif

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

 module com {  module sun {  module star {  module script {

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

/**
	This struct is used to specify information about object members
	(methods or properties) accessed via XInvocation, such as names,
	types, or parameters.
	</p>
 */
published struct InvocationInfo
{

	/** Name of the method or property.
	 */
	string aName;

	/** Kind of the member (method or property).
	 */
	MemberType eMemberType;

	/** Only for property members:
		This field may contain zero or more constants of the
		<type scope="com::sun::star::beans">PropertyAttribute</type>
		constants group. It is not guaranteed that all necessary
		constants are set to describe the property completely,
		but a flag will only be set, if the corresponding charac-
		teristic really exists. Example: If the READONLY flag
		is set, the property is readonly. If it isn't set, the
		property nevertheless can be readonly.

		For methods this field is irrelevant and is set to 0.
	 */
 	short PropertyAttribute;

	/** Type of the member, for methods the return type
	 */
	type aType;

	/** Types method parameters, for properties this sequence is empty
	 */
	sequence< type > aParamTypes;

	/** Mode of method parameters (IN, OUT, INOUT),
		for properties this sequence is empty.
	 */
	sequence< com::sun::star::reflection::ParamMode > aParamModes;
};

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

}; }; }; };

#endif
