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


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

module ModuleA
{
	exception ExceptionA
	{
		boolean aBoolean;
	};

	struct StructA
	{
		long aLong;
		short aShort;
	};

	struct StructB : StructA								
	{
		double aDouble;
		float 	aFloat;
	};

	struct StructC : StructB
	{
		string 			   					aString;
		sequence<com::sun::star::uno::XInterface> 	aInterfaceSeq; 
	};

	exception ExceptionB : ExceptionA
	{
		StructC aStructC;
	};

	interface XInterface1 : com::sun::star::uno::XInterface
	{
	};
	
	exception ExceptionC : ExceptionB
	{
		XInterface1 aInterface1;
	};

	module ModuleB
	{
		enum EnumA { VAL_1, VAL_2, VAL_3 = 17};
	};

};

module ModuleC
{
	const boolean 			aConstBoolean 	= True;
	const byte 				aConstByte 		= 0;
	const short 			aConstShort 	= -1;
	const unsigned short 	aConstUShort 	= 1;
	const long 				aConstLong 		= -2;
	const unsigned long 	aConstULong 	= 2;
//  	const hyper				aConstHyper 	= -3;
//  	const unsigned hyper	aConstUHyper	= 3;
	const float				aConstFloat 	= 3.14;
	const double			aConstDouble	= 3.14e-10;


	interface XInterfaceA : com::sun::star::uno::XInterface
	{
		void methodA();
		[oneway] void methodB([in] short aShort);
		sequence<ModuleA::StructB> methodC([in] ModuleA::StructC aStructC, [inout] ModuleA::StructA aStructA);
	};

	interface XInterfaceB : XInterfaceA
	{
		[attribute] string aString;

		XInterfaceA methodD([in] ModuleA::ModuleB::EnumA aEnumA) raises (ModuleA::ExceptionA, ModuleA::ExceptionB, ModuleA::ExceptionC);
	};
};
