/*************************************************************************
 *
 *  $RCSfile: XBridgeTest.idl,v $
 *
 *  $Revision: 1.6 $
 *
 *  last change: $Author: jsc $ $Date: 2001/03/16 15:10:43 $
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (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.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 *
 *  Copyright: 2000 by Sun Microsystems, Inc.
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
#ifndef __com_sun_star_test_bridge_XBridge_idl__
#define __com_sun_star_test_bridge_XBridge_idl__

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

#ifndef __com_sun_star_lang_IllegalArgumentException_idl__
#include <com/sun/star/lang/IllegalArgumentException.idl>
#endif

module com
{
module sun
{
module star
{
module test
{
module bridge
{

enum TestEnum
{
	TEST,
	ONE,
	TWO,
	CHECK,
	LOLA,
	PALOO,
	ZA
};

/**
 * simple types
 */
struct TestSimple
{
	boolean					   Bool;
	char					   Char;
	byte					   Byte;
	short					   Short;
	unsigned short			   UShort;
	long					   Long;
	unsigned long			   ULong;
	hyper					   Hyper;
	unsigned hyper			   UHyper;
	float					   Float;
	double					   Double;
	TestEnum				   Enum;
};
/**
 * complex types adding string, inteface, any
 */
struct TestElement : TestSimple
{
	string					   String;
	com::sun::star::uno::XInterface   Interface;
	any						   Any;
};
/**
 * adding even more complexity, sequence< TestElement >
 */
struct TestDataElements : TestElement
{
	sequence< TestElement > Sequence;
};

/**
 * typedef used in interface
 */
typedef TestDataElements TestData;

interface XRecursiveCall : com::sun::star::uno::XInterface
{
	/***
	 * @param nToCall If nToCall is 0, the method returns immeadiatly.
	 *                Otherwise, call the given interface with nToCall -1
	 * 
	 ***/
	void callRecursivly( [in] XRecursiveCall xCall , [in] long nToCall );
};

/** 
 * Monster test interface to test bridge calls.
 * An implementation of this object has to store given values and return whenever there
 * is an out param or return value.
 */
interface XBridgeTestBase : com::sun::star::uno::XInterface
{	
	/**
	 * in parameter test, tests by calls reference also (complex types)
	 */
	[oneway] void setValues( [in] boolean bBool, [in] char cChar, [in] byte nByte,
							 [in] short nShort, [in] unsigned short nUShort,
							 [in] long nLong, [in] unsigned long nULong,
							 [in] hyper nHyper, [in] unsigned hyper nUHyper,
							 [in] float fFloat, [in] double fDouble,
							 [in] TestEnum eEnum, [in] string aString,
							 [in] com::sun::star::uno::XInterface xInterface, [in] any aAny,
							 [in] sequence< TestElement > aSequence,
							 [in] TestData aStruct );
	/**
	 * inout parameter test
	 * 
	 * @return aStruct. The out parameter contain the values, that were previously set
	 *         by setValues or (if not called before) default constructed values.
	 * 
	 */
	TestData setValues2( [inout] boolean bBool, [inout] char cChar, [inout] byte nByte,
						 [inout] short nShort, [inout] unsigned short nUShort,
						 [inout] long nLong, [inout] unsigned long nULong,
						 [inout] hyper nHyper, [inout] unsigned hyper nUHyper,
						 [inout] float fFloat, [inout] double fDouble,
						 [inout] TestEnum eEnum, [inout] string aString,
						 [inout] com::sun::star::uno::XInterface xInterface, [inout] any aAny,
						 [inout] sequence< TestElement > aSequence,
						 [inout] TestData aStruct );
	
	/**
	 * out parameter test
	 */
	TestData getValues( [out] boolean bBool, [out] char cChar, [out] byte nByte,
						[out] short nShort, [out] unsigned short nUShort,
						[out] long nLong, [out] unsigned long nULong,
						[out] hyper nHyper, [out] unsigned hyper nUHyper,
						[out] float fFloat, [out] double fDouble,
						[out] TestEnum eEnum, [out] string aString,
						[out] com::sun::star::uno::XInterface xInterface, [out] any aAny,
						[out] sequence< TestElement > aSequence,
						[out] TestData aStruct );
	
	[attribute] boolean					 Bool;
	[attribute] byte					 Byte;
	[attribute] char					 Char;
	[attribute] short					 Short;
	[attribute] unsigned short			 UShort;
	[attribute] long					 Long;
	[attribute] unsigned long			 ULong;
	[attribute] hyper					 Hyper;
	[attribute] unsigned hyper			 UHyper;
	[attribute] float					 Float;
	[attribute] double					 Double;
	[attribute] TestEnum				 Enum;
	[attribute] string					 String;
	[attribute] com::sun::star::uno::XInterface Interface;
	[attribute] any						 Any;
	[attribute] sequence< TestElement >	 Sequence;
	[attribute] TestData				 Struct;


	/***
	 * This method returns the parameter value. 
	 * Method to extensivly test anys.
	 ****/
	any transportAny( [in] any value );

	/***
	 * methods to check sequence of calls. Call call() and callOneway
	 * in an arbitrary sequence. Increase the callId for every call.
	 * The testobject sets an error flag. 

		@see testSequencePassed
	 ***/
	void call( [in] long nCallId, [in] long nWaitMUSEC );
	[oneway] void callOneway( [in] long nCallId, [in] long nWaitMUSEC );
	boolean sequenceOfCallTestPassed();

	/****
	 * methods to check, if threads thread identity is holded.
	 *                  
	 ***/
	void startRecursiveCall( [in] XRecursiveCall xCall , [in] long nToCall );
};


/** 
 * Inherting from monster; adds raiseException(), attribute raising RuntimeException.
 */
interface XBridgeTest : XBridgeTestBase
{
	/**
	 * the exception struct returned has to be filled with given arguments.
	 * return value is for dummy.
	 */
	TestData raiseException( [in] short ArgumentPosition,
							 [in] string Message,
							 [in] com::sun::star::uno::XInterface Context )
		raises( com::sun::star::lang::IllegalArgumentException );
	

	/**
	 * Throws runtime exception.
	 * check remote bridges handle exceptions during oneway calls properly.
	 * Note that on client side the execption may fly or not. When it flies, it should
	 * have the proper message and context.
	 ***/
	[oneway] void raiseRuntimeExceptionOneway(	[in] string Message,
												[in] com::sun::star::uno::XInterface Context );
		
    /**
	 * raises runtime exception;
	 * the exception struct returned has to be filled with formerly set test data.
	 */
	[attribute] long					 RuntimeException;
};

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

};
};
};
};
};

#endif
