/**************************************************************
 *
 * 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_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
{

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

/**
 * simple types
 */
published 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
 */
published struct TestElement : TestSimple
{
	string					   String;
	com::sun::star::uno::XInterface   Interface;
	any						   Any;
};
/**
 * adding even more complexity, sequence< TestElement >
 */
published struct TestDataElements : TestElement
{
	sequence< TestElement > Sequence;
};

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

published 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.
 */
published 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.
 */
published 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;
};

/** Extended tests with sequences.
 */
published interface XBridgeTest2 : XBridgeTest
{
    sequence< boolean > setSequenceBool( [in] sequence< boolean > aSeq);
    sequence< char > setSequenceChar( [in] sequence< char > aSeq);
    sequence< byte> setSequenceByte( [in] sequence< byte > aSeq);
    sequence< short> setSequenceShort( [in] sequence< short > aSeq);
    sequence< unsigned short > setSequenceUShort( [in] sequence< unsigned short > aSeq);
    sequence< long > setSequenceLong( [in] sequence< long > aSeq);
    sequence< unsigned long > setSequenceULong( [in] sequence< unsigned long > aSeq);
    sequence< hyper > setSequenceHyper( [in] sequence< hyper > aSeq);
    sequence< unsigned hyper > setSequenceUHyper( [in] sequence< unsigned hyper > aSeq);
    sequence< float > setSequenceFloat( [in] sequence< float > aSeq);
    sequence< double > setSequenceDouble( [in] sequence< double > aSeq);
    sequence< TestEnum > setSequenceEnum( [in] sequence< TestEnum > aSeq);
    sequence< string > setSequenceString( [in] sequence< string > aString);
    sequence< com::sun::star::uno::XInterface > setSequenceXInterface(
        [in] sequence< com::sun::star::uno::XInterface > aSeq);
    sequence< any > setSequenceAny( [in] sequence< any > aSeq);
    sequence< TestElement > setSequenceStruct( [in] sequence< TestElement > aSeq);

    sequence< sequence< long > > setDim2( [in] sequence< sequence< long > > aSeq);
    sequence< sequence < sequence < long > > > setDim3(
        [in] sequence< sequence < sequence < long > > > aSeq);

    void setSequencesInOut( [inout] sequence< boolean > aSeqBoolean,
                       [inout] sequence< char > aSeqChar,
                       [inout] sequence< byte > aSeqByte,
                       [inout] sequence< short > aSeqShort,
                       [inout] sequence< unsigned short> aSeqUShort,
                       [inout] sequence< long > aSeqLong,
                       [inout] sequence< unsigned long > aSeqULong,
                       [inout] sequence< hyper > aSeqHyper,
                       [inout] sequence< unsigned hyper > aSeqUHyper,
                       [inout] sequence< float > aSeqFloat,
                       [inout] sequence< double > aSeqDouble,
                       [inout] sequence< TestEnum > aSeqEnum,
                       [inout] sequence< string > aSeqString,
                       [inout] sequence< com::sun::star::uno::XInterface > aSeqXInterface,
                       [inout] sequence< any > aSeqAny,
                       [inout] sequence< sequence< long > > aSeqDim2,
                       [inout] sequence< sequence < sequence < long > > > aSeqDim3);

    void setSequencesOut( [out] sequence< boolean > aSeqBoolean,
                       [out] sequence< char > aSeqChar,
                       [out] sequence< byte > aSeqByte,
                       [out] sequence< short > aSeqShort,
                       [out] sequence< unsigned short> aSeqUShort,
                       [out] sequence< long > aSeqLong,
                       [out] sequence< unsigned long > aSeqULong,
                       [out] sequence< hyper > aSeqHyper,
                       [out] sequence< unsigned hyper > aSeqUHyper,
                       [out] sequence< float > aSeqFloat,
                       [out] sequence< double > aSeqDouble,
                       [out] sequence< TestEnum > aSeqEnum,
                       [out] sequence< string > aSeqString,
                       [out] sequence< com::sun::star::uno::XInterface > aSeqXInterface,
                       [out] sequence< any > aSeqAny,
                       [out] sequence< sequence< long > > aSeqDim2,
                       [out] sequence< sequence < sequence < long > > > aSeqDim3);


};
//=============================================================================

};
};
};
};
};

#endif
