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



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_stoc.hxx"

#include <stdio.h>

#include <sal/main.h>
#include <osl/diagnose.h>

#include <cppuhelper/servicefactory.hxx>
#include <cppuhelper/weak.hxx>

#include <test/XLanguageBindingTest.hpp>
#include <com/sun/star/registry/XSimpleRegistry.hpp>
#include <com/sun/star/registry/XImplementationRegistration.hpp>
#include <com/sun/star/script/XInvocation.hpp>
#include <com/sun/star/script/XInvocationAdapterFactory.hpp>
#include <com/sun/star/script/XInvocationAdapterFactory2.hpp>
#include <com/sun/star/lang/XComponent.hpp>
#include <com/sun/star/lang/XSingleServiceFactory.hpp>

#include <cppuhelper/implbase1.hxx>


using namespace test;
using namespace rtl;
using namespace cppu;
using namespace osl;
using namespace com::sun::star::uno;
using namespace com::sun::star::script;
using namespace com::sun::star::beans;
using namespace com::sun::star::lang;
using namespace com::sun::star::reflection;
using namespace com::sun::star::lang;
using namespace com::sun::star::registry;


//==================================================================================================
sal_Bool equals( const test::TestElement & rData1, const test::TestElement & rData2 )
{
	OSL_ENSURE( rData1.Bool == rData2.Bool, "### bool does not match!" );
	OSL_ENSURE( rData1.Char == rData2.Char, "### char does not match!" );
	OSL_ENSURE( rData1.Byte == rData2.Byte, "### byte does not match!" );
	OSL_ENSURE( rData1.Short == rData2.Short, "### short does not match!" );
	OSL_ENSURE( rData1.UShort == rData2.UShort, "### unsigned short does not match!" );
	OSL_ENSURE( rData1.Long == rData2.Long, "### long does not match!" );
	OSL_ENSURE( rData1.ULong == rData2.ULong, "### unsigned long does not match!" );
	OSL_ENSURE( rData1.Hyper == rData2.Hyper, "### hyper does not match!" );
	OSL_ENSURE( rData1.UHyper == rData2.UHyper, "### unsigned hyper does not match!" );
	OSL_ENSURE( rData1.Float == rData2.Float, "### float does not match!" );
	OSL_ENSURE( rData1.Double == rData2.Double, "### double does not match!" );
	OSL_ENSURE( rData1.Enum == rData2.Enum, "### enum does not match!" );
	OSL_ENSURE( rData1.String == rData2.String, "### string does not match!" );
	OSL_ENSURE( rData1.Interface == rData2.Interface, "### interface does not match!" );
	OSL_ENSURE( rData1.Any == rData2.Any, "### any does not match!" );
	
	return (rData1.Bool == rData2.Bool &&
			rData1.Char == rData2.Char &&
			rData1.Byte == rData2.Byte &&
			rData1.Short == rData2.Short &&
			rData1.UShort == rData2.UShort &&
			rData1.Long == rData2.Long &&
			rData1.ULong == rData2.ULong &&
			rData1.Hyper == rData2.Hyper &&
			rData1.UHyper == rData2.UHyper &&
			rData1.Float == rData2.Float &&
			rData1.Double == rData2.Double &&
			rData1.Enum == rData2.Enum &&
			rData1.String == rData2.String &&
			rData1.Interface == rData2.Interface &&
			rData1.Any == rData2.Any);
}
//==================================================================================================
sal_Bool equals( const test::TestData & rData1, const test::TestData & rData2 )
{
	sal_Int32 nLen;
	
	if ((rData1.Sequence == rData2.Sequence) &&
		equals( (const test::TestElement &)rData1, (const test::TestElement &)rData2 ) &&
		(nLen = rData1.Sequence.getLength()) == rData2.Sequence.getLength())
	{
		// once again by hand sequence ==
		const test::TestElement * pElements1 = rData1.Sequence.getConstArray();
		const test::TestElement * pElements2 = rData2.Sequence.getConstArray();
		for ( ; nLen--; )
		{
			if (! equals( pElements1[nLen], pElements2[nLen] ))
			{
				OSL_ENSURE( sal_False, "### sequence element did not match!" );
				return sal_False;
			}
		}
		return sal_True;
	}
	return sal_False;
}
//==================================================================================================
void assign( test::TestElement & rData,
			 sal_Bool bBool, sal_Unicode cChar, sal_Int8 nByte,
			 sal_Int16 nShort, sal_uInt16 nUShort,
			 sal_Int32 nLong, sal_uInt32 nULong,
			 sal_Int64 nHyper, sal_uInt64 nUHyper,
			 float fFloat, double fDouble,
			 test::TestEnum eEnum, const ::rtl::OUString& rStr,
			 const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xTest,
			 const ::com::sun::star::uno::Any& rAny )
{
	rData.Bool = bBool;
	rData.Char = cChar;
	rData.Byte = nByte;
	rData.Short = nShort;
	rData.UShort = nUShort;
	rData.Long = nLong;
	rData.ULong = nULong;
	rData.Hyper = nHyper;
	rData.UHyper = nUHyper;
	rData.Float = fFloat;
	rData.Double = fDouble;
	rData.Enum = eEnum;
	rData.String = rStr;
	rData.Interface = xTest;
	rData.Any = rAny;
}
//==================================================================================================
void assign( test::TestData & rData,
			 sal_Bool bBool, sal_Unicode cChar, sal_Int8 nByte,
			 sal_Int16 nShort, sal_uInt16 nUShort,
			 sal_Int32 nLong, sal_uInt32 nULong,
			 sal_Int64 nHyper, sal_uInt64 nUHyper,
			 float fFloat, double fDouble,
			 test::TestEnum eEnum, const ::rtl::OUString& rStr,
			 const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xTest,
			 const ::com::sun::star::uno::Any& rAny,
			 const com::sun::star::uno::Sequence< test::TestElement >& rSequence )
{
	assign( (test::TestElement &)rData,
			bBool, cChar, nByte, nShort, nUShort, nLong, nULong, nHyper, nUHyper, fFloat, fDouble,
			eEnum, rStr, xTest, rAny );
	rData.Sequence = rSequence;
}

//==================================================================================================
class Test_Impl : public WeakImplHelper1< XLanguageBindingTest >
{
	test::TestData _aData, _aStructData;
	
public:
	virtual ~Test_Impl()
		{ OSL_TRACE( "> scalar Test_Impl dtor <\n" ); }
	
	// XLBTestBase
    virtual void SAL_CALL setValues( sal_Bool bBool, sal_Unicode cChar, sal_Int8 nByte,
									 sal_Int16 nShort, sal_uInt16 nUShort,
									 sal_Int32 nLong, sal_uInt32 nULong,
									 sal_Int64 nHyper, sal_uInt64 nUHyper,
									 float fFloat, double fDouble,
									 test::TestEnum eEnum, const ::rtl::OUString& rStr,
									 const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xTest,
									 const ::com::sun::star::uno::Any& rAny,
									 const ::com::sun::star::uno::Sequence<test::TestElement >& rSequence,
									 const test::TestData& rStruct )
		throw(com::sun::star::uno::RuntimeException);
	
    virtual test::TestData SAL_CALL setValues2( sal_Bool& bBool, sal_Unicode& cChar, sal_Int8& nByte,
												sal_Int16& nShort, sal_uInt16& nUShort,
												sal_Int32& nLong, sal_uInt32& nULong,
												sal_Int64& nHyper, sal_uInt64& nUHyper,
												float& fFloat, double& fDouble,
												test::TestEnum& eEnum, rtl::OUString& rStr,
												::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xTest,
												::com::sun::star::uno::Any& rAny,
												::com::sun::star::uno::Sequence<test::TestElement >& rSequence,
												test::TestData& rStruct )
		throw(com::sun::star::uno::RuntimeException);
	
    virtual test::TestData SAL_CALL getValues( sal_Bool& bBool, sal_Unicode& cChar, sal_Int8& nByte,
											   sal_Int16& nShort, sal_uInt16& nUShort,
											   sal_Int32& nLong, sal_uInt32& nULong,
											   sal_Int64& nHyper, sal_uInt64& nUHyper,
											   float& fFloat, double& fDouble,
											   test::TestEnum& eEnum, rtl::OUString& rStr,
											   ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xTest,
											   ::com::sun::star::uno::Any& rAny,
											   ::com::sun::star::uno::Sequence< test::TestElement >& rSequence,
											   test::TestData& rStruct )
		throw(com::sun::star::uno::RuntimeException);
	
    virtual sal_Bool SAL_CALL getBool() throw(com::sun::star::uno::RuntimeException)
		{ return _aData.Bool; }
    virtual sal_Int8 SAL_CALL getByte() throw(com::sun::star::uno::RuntimeException)
		{ return _aData.Byte; }
    virtual sal_Unicode SAL_CALL getChar() throw(com::sun::star::uno::RuntimeException)
		{ return _aData.Char; }
    virtual sal_Int16 SAL_CALL getShort() throw(com::sun::star::uno::RuntimeException)
		{ return _aData.Short; }
    virtual sal_uInt16 SAL_CALL getUShort() throw(com::sun::star::uno::RuntimeException)
		{ return _aData.UShort; }
    virtual sal_Int32 SAL_CALL getLong() throw(com::sun::star::uno::RuntimeException)
		{ return _aData.Long; }
    virtual sal_uInt32 SAL_CALL getULong() throw(com::sun::star::uno::RuntimeException)
		{ return _aData.ULong; }
    virtual sal_Int64 SAL_CALL getHyper() throw(com::sun::star::uno::RuntimeException)
		{ return _aData.Hyper; }
    virtual sal_uInt64 SAL_CALL getUHyper() throw(com::sun::star::uno::RuntimeException)
		{ return _aData.UHyper; }
    virtual float SAL_CALL getFloat() throw(com::sun::star::uno::RuntimeException)
		{ return _aData.Float; }
    virtual double SAL_CALL getDouble() throw(com::sun::star::uno::RuntimeException)
		{ return _aData.Double; }
    virtual test::TestEnum SAL_CALL getEnum() throw(com::sun::star::uno::RuntimeException)
		{ return _aData.Enum; }
    virtual rtl::OUString SAL_CALL getString() throw(com::sun::star::uno::RuntimeException)
		{ return _aData.String; }
    virtual com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL getInterface(  ) throw(com::sun::star::uno::RuntimeException)
		{ return _aData.Interface; }
    virtual com::sun::star::uno::Any SAL_CALL getAny() throw(com::sun::star::uno::RuntimeException)
		{ return _aData.Any; }
    virtual com::sun::star::uno::Sequence< test::TestElement > SAL_CALL getSequence() throw(com::sun::star::uno::RuntimeException)
		{ return _aData.Sequence; }
    virtual test::TestData SAL_CALL getStruct() throw(com::sun::star::uno::RuntimeException)
		{ return _aStructData; }

    virtual void SAL_CALL setBool( sal_Bool _bool ) throw(::com::sun::star::uno::RuntimeException)
		{ _aData.Bool = _bool; }
    virtual void SAL_CALL setByte( sal_Int8 _byte ) throw(::com::sun::star::uno::RuntimeException)
		{ _aData.Byte = _byte; }
    virtual void SAL_CALL setChar( sal_Unicode _char ) throw(::com::sun::star::uno::RuntimeException)
		{ _aData.Char = _char; }
    virtual void SAL_CALL setShort( sal_Int16 _short ) throw(::com::sun::star::uno::RuntimeException)
		{ _aData.Short = _short; }
    virtual void SAL_CALL setUShort( sal_uInt16 _ushort ) throw(::com::sun::star::uno::RuntimeException)
		{ _aData.UShort = _ushort; }
    virtual void SAL_CALL setLong( sal_Int32 _long ) throw(::com::sun::star::uno::RuntimeException)
		{ _aData.Long = _long; }
    virtual void SAL_CALL setULong( sal_uInt32 _ulong ) throw(::com::sun::star::uno::RuntimeException)
		{ _aData.ULong = _ulong; }
    virtual void SAL_CALL setHyper( sal_Int64 _hyper ) throw(::com::sun::star::uno::RuntimeException)
		{ _aData.Hyper = _hyper; }
    virtual void SAL_CALL setUHyper( sal_uInt64 _uhyper ) throw(::com::sun::star::uno::RuntimeException)
		{ _aData.UHyper = _uhyper; }
    virtual void SAL_CALL setFloat( float _float ) throw(::com::sun::star::uno::RuntimeException)
		{ _aData.Float = _float; }
    virtual void SAL_CALL setDouble( double _double ) throw(::com::sun::star::uno::RuntimeException)
		{ _aData.Double = _double; }
    virtual void SAL_CALL setEnum( test::TestEnum _enum ) throw(::com::sun::star::uno::RuntimeException)
		{ _aData.Enum = _enum; }
    virtual void SAL_CALL setString( const ::rtl::OUString& _string ) throw(::com::sun::star::uno::RuntimeException)
		{ _aData.String = _string; }
    virtual void SAL_CALL setInterface( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _interface ) throw(::com::sun::star::uno::RuntimeException)
		{ _aData.Interface = _interface; }
    virtual void SAL_CALL setAny( const ::com::sun::star::uno::Any& _any ) throw(::com::sun::star::uno::RuntimeException)
		{ _aData.Any = _any; }
    virtual void SAL_CALL setSequence( const ::com::sun::star::uno::Sequence<test::TestElement >& _sequence ) throw(::com::sun::star::uno::RuntimeException)
		{ _aData.Sequence = _sequence; }
    virtual void SAL_CALL setStruct( const test::TestData& _struct ) throw(::com::sun::star::uno::RuntimeException)
		{ _aStructData = _struct; }

	// XLanguageBindingTest
    virtual test::TestData SAL_CALL raiseException( sal_Bool& bBool, sal_Unicode& cChar, sal_Int8& nByte, sal_Int16& nShort, sal_uInt16& nUShort, sal_Int32& nLong, sal_uInt32& nULong, sal_Int64& nHyper, sal_uInt64& nUHyper, float& fFloat, double& fDouble, test::TestEnum& eEnum, ::rtl::OUString& aString, ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xInterface, ::com::sun::star::uno::Any& aAny, ::com::sun::star::uno::Sequence<test::TestElement >& aSequence,test::TestData& aStruct )
		throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
	
    virtual sal_Int32 SAL_CALL getRuntimeException() throw(::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setRuntimeException( sal_Int32 _runtimeexception ) throw(::com::sun::star::uno::RuntimeException);
};
//==================================================================================================
class XLB_Invocation : public WeakImplHelper1< XInvocation >
{
	Reference< XLanguageBindingTest > _xLBT;
	
public:
	XLB_Invocation( const Reference< XMultiServiceFactory > & /*xMgr*/,
					const Reference< XLanguageBindingTest > & xLBT )
		: _xLBT( xLBT )
		{}
	
	// XInvocation
    virtual Reference< XIntrospectionAccess > SAL_CALL getIntrospection() throw(::com::sun::star::uno::RuntimeException)
		{ return Reference< XIntrospectionAccess >(); }
    virtual Any SAL_CALL invoke( const OUString & rFunctionName,
								 const Sequence< Any > & rParams,
								 Sequence< sal_Int16 > & rOutParamIndex,
								 Sequence< Any > & rOutParam ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::script::CannotConvertException, ::com::sun::star::reflection::InvocationTargetException, ::com::sun::star::uno::RuntimeException);
    virtual void SAL_CALL setValue( const OUString & rPropertyName, const Any & rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::script::CannotConvertException, ::com::sun::star::reflection::InvocationTargetException, ::com::sun::star::uno::RuntimeException);
    virtual Any SAL_CALL getValue( const OUString & rPropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasMethod( const OUString & rName ) throw(::com::sun::star::uno::RuntimeException);
    virtual sal_Bool SAL_CALL hasProperty( const OUString & rName ) throw(::com::sun::star::uno::RuntimeException);
};
//__________________________________________________________________________________________________
Any XLB_Invocation::invoke( const OUString & rFunctionName,
							const Sequence< Any > & rParams,
							Sequence< sal_Int16 > & rOutParamIndex,
							Sequence< Any > & rOutParam )
	throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::script::CannotConvertException, ::com::sun::star::reflection::InvocationTargetException, ::com::sun::star::uno::RuntimeException)
{
    bool bImplementedMethod = true;
    
	Any aRet;
	
	OSL_ASSERT( rOutParam.getLength() == 0 );
	OSL_ASSERT( rOutParamIndex.getLength() == 0 );
	
	try
	{
		sal_Bool aBool;
		sal_Unicode aChar;
		sal_Int8 nByte;
		sal_Int16 nShort;
		sal_uInt16 nUShort;
		sal_Int32 nLong;
		sal_uInt32 nULong;
		sal_Int64 nHyper;
		sal_uInt64 nUHyper;
		float fFloat;
		double fDouble;
		TestEnum eEnum;
		OUString aString;
		Reference< XInterface > xInterface;
		Any aAny;
		Sequence< TestElement > aSeq;
		TestData aData;
		
		if (rFunctionName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("setValues") ))
		{
			OSL_ASSERT( rParams.getLength() == 17 );
			aBool = *(sal_Bool *)rParams[0].getValue();
			aChar = *(sal_Unicode *)rParams[1].getValue();
			rParams[2] >>= nByte;
			rParams[3] >>= nShort;
			rParams[4] >>= nUShort;
			rParams[5] >>= nLong;
			rParams[6] >>= nULong;
			rParams[7] >>= nHyper;
			rParams[8] >>= nUHyper;
			rParams[9] >>= fFloat;
			rParams[10] >>= fDouble;
			rParams[11] >>= eEnum;
			rParams[12] >>= aString;
			rParams[13] >>= xInterface;
			rParams[14] >>= aAny;
			rParams[15] >>= aSeq;
			rParams[16] >>= aData;
			
			_xLBT->setValues( aBool, aChar, nByte, nShort, nUShort, nLong, nULong,
							  nHyper, nUHyper, fFloat, fDouble, eEnum, aString, xInterface,
							  aAny, aSeq, aData );
			
			rOutParamIndex.realloc( 0 );
			rOutParam.realloc( 0 );
		}
		else if (rFunctionName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("setValues2") ))
		{
			aBool = *(sal_Bool *)rParams[0].getValue();
			aChar = *(sal_Unicode *)rParams[1].getValue();
			rParams[2] >>= nByte;
			rParams[3] >>= nShort;
			rParams[4] >>= nUShort;
			rParams[5] >>= nLong;
			rParams[6] >>= nULong;
			rParams[7] >>= nHyper;
			rParams[8] >>= nUHyper;
			rParams[9] >>= fFloat;
			rParams[10] >>= fDouble;
			rParams[11] >>= eEnum;
			rParams[12] >>= aString;
			rParams[13] >>= xInterface;
			rParams[14] >>= aAny;
			rParams[15] >>= aSeq;
			rParams[16] >>= aData;
			
			aRet <<= _xLBT->setValues2( aBool, aChar, nByte, nShort, nUShort, nLong, nULong,
										nHyper, nUHyper, fFloat, fDouble, eEnum, aString, xInterface,
										aAny, aSeq, aData );
			
			rOutParamIndex.realloc( 17 );
			rOutParamIndex[0] = 0;
			rOutParamIndex[1] = 1;
			rOutParamIndex[2] = 2;
			rOutParamIndex[3] = 3;
			rOutParamIndex[4] = 4;
			rOutParamIndex[5] = 5;
			rOutParamIndex[6] = 6;
			rOutParamIndex[7] = 7;
			rOutParamIndex[8] = 8;
			rOutParamIndex[9] = 9;
			rOutParamIndex[10] = 10;
			rOutParamIndex[11] = 11;
			rOutParamIndex[12] = 12;
			rOutParamIndex[13] = 13;
			rOutParamIndex[14] = 14;
			rOutParamIndex[15] = 15;
			rOutParamIndex[16] = 16;
			
			rOutParam.realloc( 17 );
			rOutParam[0].setValue( &aBool, ::getCppuBooleanType() );
			rOutParam[1].setValue( &aChar, ::getCppuCharType() );
			rOutParam[2] <<= nByte;
			rOutParam[3] <<= nShort;
			rOutParam[4] <<= nUShort;
			rOutParam[5] <<= nLong;
			rOutParam[6] <<= nULong;
			rOutParam[7] <<= nHyper;
			rOutParam[8] <<= nUHyper;
			rOutParam[9] <<= fFloat;
			rOutParam[10] <<= fDouble;
			rOutParam[11] <<= eEnum;
			rOutParam[12] <<= aString;
			rOutParam[13] <<= xInterface;
			rOutParam[14] <<= aAny;
			rOutParam[15] <<= aSeq;
			rOutParam[16] <<= aData;
		}
		else if (rFunctionName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("getValues") ))
		{
			aRet <<= _xLBT->getValues( aBool, aChar, nByte, nShort, nUShort, nLong, nULong,
									   nHyper, nUHyper, fFloat, fDouble, eEnum, aString, xInterface,
									   aAny, aSeq, aData );
			
			rOutParamIndex.realloc( 17 );
			rOutParamIndex[0] = 0;
			rOutParamIndex[1] = 1;
			rOutParamIndex[2] = 2;
			rOutParamIndex[3] = 3;
			rOutParamIndex[4] = 4;
			rOutParamIndex[5] = 5;
			rOutParamIndex[6] = 6;
			rOutParamIndex[7] = 7;
			rOutParamIndex[8] = 8;
			rOutParamIndex[9] = 9;
			rOutParamIndex[10] = 10;
			rOutParamIndex[11] = 11;
			rOutParamIndex[12] = 12;
			rOutParamIndex[13] = 13;
			rOutParamIndex[14] = 14;
			rOutParamIndex[15] = 15;
			rOutParamIndex[16] = 16;
			
			rOutParam.realloc( 17 );
			rOutParam[0].setValue( &aBool, ::getCppuBooleanType() );
			rOutParam[1].setValue( &aChar, ::getCppuCharType() );
			rOutParam[2] <<= nByte;
			rOutParam[3] <<= nShort;
			rOutParam[4] <<= nUShort;
			rOutParam[5] <<= nLong;
			rOutParam[6] <<= nULong;
			rOutParam[7] <<= nHyper;
			rOutParam[8] <<= nUHyper;
			rOutParam[9] <<= fFloat;
			rOutParam[10] <<= fDouble;
			rOutParam[11] <<= eEnum;
			rOutParam[12] <<= aString;
			rOutParam[13] <<= xInterface;
			rOutParam[14] <<= aAny;
			rOutParam[15] <<= aSeq;
			rOutParam[16] <<= aData;
		}
		else if (rFunctionName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("raiseException") ))
		{
			aRet <<= _xLBT->raiseException( aBool, aChar, nByte, nShort, nUShort, nLong, nULong,
											nHyper, nUHyper, fFloat, fDouble, eEnum, aString, xInterface,
											aAny, aSeq, aData );
			
			rOutParamIndex.realloc( 17 );
			rOutParamIndex[0] = 0;
			rOutParamIndex[1] = 1;
			rOutParamIndex[2] = 2;
			rOutParamIndex[3] = 3;
			rOutParamIndex[4] = 4;
			rOutParamIndex[5] = 5;
			rOutParamIndex[6] = 6;
			rOutParamIndex[7] = 7;
			rOutParamIndex[8] = 8;
			rOutParamIndex[9] = 9;
			rOutParamIndex[10] = 10;
			rOutParamIndex[11] = 11;
			rOutParamIndex[12] = 12;
			rOutParamIndex[13] = 13;
			rOutParamIndex[14] = 14;
			rOutParamIndex[15] = 15;
			rOutParamIndex[16] = 16;
			
			rOutParam.realloc( 17 );
			rOutParam[0].setValue( &aBool, ::getCppuBooleanType() );
			rOutParam[1].setValue( &aChar, ::getCppuCharType() );
			rOutParam[2] <<= nByte;
			rOutParam[3] <<= nShort;
			rOutParam[4] <<= nUShort;
			rOutParam[5] <<= nLong;
			rOutParam[6] <<= nULong;
			rOutParam[7] <<= nHyper;
			rOutParam[8] <<= nUHyper;
			rOutParam[9] <<= fFloat;
			rOutParam[10] <<= fDouble;
			rOutParam[11] <<= eEnum;
			rOutParam[12] <<= aString;
			rOutParam[13] <<= xInterface;
			rOutParam[14] <<= aAny;
			rOutParam[15] <<= aSeq;
			rOutParam[16] <<= aData;
		}
		else
		{
            bImplementedMethod = false;
		}
	}
	catch (IllegalArgumentException & rExc)
	{
		// thrown by raiseException() call
		InvocationTargetException aExc;
		aExc.TargetException <<= rExc;
		throw aExc;
	}
	catch (Exception &)
	{
		OSL_ENSURE( sal_False, "### unexpected exception caught!" );
		throw;
	}

    if (! bImplementedMethod)
    {
        throw IllegalArgumentException(
            OUString( RTL_CONSTASCII_USTRINGPARAM("not an implemented method!") ),
            (OWeakObject *)this, 0 );
    }
    
	return aRet;
}
//__________________________________________________________________________________________________
void XLB_Invocation::setValue( const OUString & rName, const Any & rValue )
	throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::script::CannotConvertException, ::com::sun::star::reflection::InvocationTargetException, ::com::sun::star::uno::RuntimeException)
{
	if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Bool") ))
		_xLBT->setBool( *(const sal_Bool *)rValue.getValue() );
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Byte") ))
		_xLBT->setByte( *(const sal_Int8 *)rValue.getValue() );
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Char") ))
		_xLBT->setChar( *(const sal_Unicode *)rValue.getValue() );
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Short") ))
		_xLBT->setShort( *(const sal_Int16 *)rValue.getValue() );
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("UShort") ))
		_xLBT->setUShort( *(const sal_uInt16 *)rValue.getValue() );
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Long") ))
		_xLBT->setLong( *(const sal_Int32 *)rValue.getValue() );
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("ULong") ))
		_xLBT->setULong( *(const sal_uInt32 *)rValue.getValue() );
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Hyper") ))
		_xLBT->setHyper( *(const sal_Int64 *)rValue.getValue() );
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("UHyper") ))
		_xLBT->setUHyper( *(const sal_uInt64 *)rValue.getValue() );
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Float") ))
		_xLBT->setFloat( *(const float *)rValue.getValue() );
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Double") ))
		_xLBT->setDouble( *(const double *)rValue.getValue() );
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Enum") ))
		_xLBT->setEnum( *(const TestEnum *)rValue.getValue() );
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("String") ))
		_xLBT->setString( *(const OUString *)rValue.getValue() );
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Interface") ))
		_xLBT->setInterface( *(const Reference< XInterface > *)rValue.getValue() );
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Any") ))
		_xLBT->setAny( rValue );
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Sequence") ))
		_xLBT->setSequence( *(const Sequence< TestElement > *)rValue.getValue() );
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Struct") ))
		_xLBT->setStruct( *(const TestData *)rValue.getValue() );
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("RuntimeException") ))
		_xLBT->setRuntimeException( *(const sal_Int32 *)rValue.getValue() );
}
//__________________________________________________________________________________________________
Any XLB_Invocation::getValue( const OUString & rName )
	throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException)
{
	Any aRet;
	if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Bool") ))
	{
		sal_Bool aBool = _xLBT->getBool();
		aRet.setValue( &aBool, ::getCppuBooleanType() );
	}
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Byte") ))
		aRet <<= _xLBT->getByte();
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Char") ))
	{
		sal_Unicode aChar = _xLBT->getChar();
		aRet.setValue( &aChar, ::getCppuCharType() );
	}
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Short") ))
		aRet <<= _xLBT->getShort();
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("UShort") ))
		aRet <<= _xLBT->getUShort();
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Long") ))
		aRet <<= _xLBT->getLong();
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("ULong") ))
		aRet <<= _xLBT->getULong();
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Hyper") ))
		aRet <<= _xLBT->getHyper();
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("UHyper") ))
		aRet <<= _xLBT->getUHyper();
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Float") ))
		aRet <<= _xLBT->getFloat();
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Double") ))
		aRet <<= _xLBT->getDouble();
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Enum") ))
		aRet <<= _xLBT->getEnum();
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("String") ))
		aRet <<= _xLBT->getString();
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Interface") ))
		aRet <<= _xLBT->getInterface();
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Any") ))
		aRet <<= _xLBT->getAny();
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Sequence") ))
		aRet <<= _xLBT->getSequence();
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Struct") ))
		aRet <<= _xLBT->getStruct();
	else if (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("RuntimeException") ))
		aRet <<= _xLBT->getRuntimeException();
	return aRet;
}
//__________________________________________________________________________________________________
sal_Bool XLB_Invocation::hasMethod( const OUString & rName )
	throw(::com::sun::star::uno::RuntimeException)
{
	return (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("raiseException") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("getValues") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("setValues2") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("setValues") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("acquire") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("release") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("queryInterface") ));
}
//__________________________________________________________________________________________________
sal_Bool XLB_Invocation::hasProperty( const OUString & rName )
	throw(::com::sun::star::uno::RuntimeException)
{
	return (rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Bool") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Byte") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Char") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Short") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("UShort") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Long") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("ULong") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Hyper") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("UHyper") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Float") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Double") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Enum") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("String") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Interface") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Any") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Sequence") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("Struct") ) ||
			rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("RuntimeException") ) );
}

//##################################################################################################

//__________________________________________________________________________________________________
void Test_Impl::setValues( sal_Bool bBool, sal_Unicode cChar, sal_Int8 nByte,
						   sal_Int16 nShort, sal_uInt16 nUShort,
						   sal_Int32 nLong, sal_uInt32 nULong,
						   sal_Int64 nHyper, sal_uInt64 nUHyper,
						   float fFloat, double fDouble,
						   test::TestEnum eEnum, const ::rtl::OUString& rStr,
						   const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xTest,
						   const ::com::sun::star::uno::Any& rAny,
						   const ::com::sun::star::uno::Sequence<test::TestElement >& rSequence,
						   const test::TestData& rStruct )
	throw(com::sun::star::uno::RuntimeException)
{
	assign( _aData,
			bBool, cChar, nByte, nShort, nUShort, nLong, nULong, nHyper, nUHyper, fFloat, fDouble,
			eEnum, rStr, xTest, rAny, rSequence );
	_aStructData = rStruct;
}
//__________________________________________________________________________________________________
test::TestData Test_Impl::setValues2( sal_Bool& bBool, sal_Unicode& cChar, sal_Int8& nByte,
									  sal_Int16& nShort, sal_uInt16& nUShort,
									  sal_Int32& nLong, sal_uInt32& nULong,
									  sal_Int64& nHyper, sal_uInt64& nUHyper,
									  float& fFloat, double& fDouble,
									  test::TestEnum& eEnum, rtl::OUString& rStr,
									  ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xTest,
									  ::com::sun::star::uno::Any& rAny,
									  ::com::sun::star::uno::Sequence<test::TestElement >& rSequence,
									  test::TestData& rStruct )
	throw(com::sun::star::uno::RuntimeException)
{
	assign( _aData,
			bBool, cChar, nByte, nShort, nUShort, nLong, nULong, nHyper, nUHyper, fFloat, fDouble,
			eEnum, rStr, xTest, rAny, rSequence );
	_aStructData = rStruct;
	return _aStructData;
}
//__________________________________________________________________________________________________
test::TestData Test_Impl::getValues( sal_Bool& bBool, sal_Unicode& cChar, sal_Int8& nByte,
									 sal_Int16& nShort, sal_uInt16& nUShort,
									 sal_Int32& nLong, sal_uInt32& nULong,
									 sal_Int64& nHyper, sal_uInt64& nUHyper,
									 float& fFloat, double& fDouble,
									 test::TestEnum& eEnum, rtl::OUString& rStr,
									 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xTest,
									 ::com::sun::star::uno::Any& rAny,
									 ::com::sun::star::uno::Sequence<test::TestElement >& rSequence,
									 test::TestData& rStruct )
	throw(com::sun::star::uno::RuntimeException)
{
	 bBool = _aData.Bool;
	 cChar = _aData.Char;
	 nByte = _aData.Byte;
	 nShort = _aData.Short;
	 nUShort = _aData.UShort;
	 nLong = _aData.Long;
	 nULong = _aData.ULong;
	 nHyper = _aData.Hyper;
	 nUHyper = _aData.UHyper;
	 fFloat = _aData.Float;
	 fDouble = _aData.Double;
	 eEnum = _aData.Enum;
	 rStr = _aData.String;
	 xTest = _aData.Interface;
	 rAny = _aData.Any;
	 rSequence = _aData.Sequence;
	 rStruct = _aStructData;
	 return _aStructData;
}

//==================================================================================================
sal_Bool performTest( const Reference<XLanguageBindingTest > & xLBT )
{
	OSL_ENSURE( xLBT.is(), "### no test interface!" );
	if (xLBT.is())
	{
		// this data is never ever granted access to by calls other than equals(), assign()!
		test::TestData aData; // test against this data
		
		Reference<XInterface > xI( *new OWeakObject() );
		
		assign( (test::TestElement &)aData,
				sal_True, '@', 17, 0x1234, 0xfedc, 0x12345678, 0xfedcba98,
				SAL_CONST_INT64(0x123456789abcdef0),
                SAL_CONST_UINT64(0xfedcba9876543210),
				(float)17.0815, 3.1415926359, TestEnum_LOLA, OUString::createFromAscii("dumdidum"), xI,
				Any( &xI, ::getCppuType( (const Reference<XInterface > *)0 ) ) );

		OSL_ENSURE( aData.Any == xI, "### unexpected any!" );
		OSL_ENSURE( !(aData.Any != xI), "### unexpected any!" );
		
		aData.Sequence = Sequence<test::TestElement >( (const test::TestElement *)&aData, 1 );
		// aData complete
		//================================================================================

		// this is a manually copy of aData for first setting...
		test::TestData aSetData;
		
		assign( (test::TestElement &)aSetData,
				aData.Bool, aData.Char, aData.Byte, aData.Short, aData.UShort,
				aData.Long, aData.ULong, aData.Hyper, aData.UHyper, aData.Float, aData.Double,
				aData.Enum, aData.String, xI,
				Any( &xI, ::getCppuType( (const Reference<XInterface > *)0 ) ) );
		
		aSetData.Sequence = Sequence<test::TestElement >( (const test::TestElement *)&aSetData, 1 );
		
		xLBT->setValues(
			aSetData.Bool, aSetData.Char, aSetData.Byte, aSetData.Short, aSetData.UShort,
			aSetData.Long, aSetData.ULong, aSetData.Hyper, aSetData.UHyper, aSetData.Float, aSetData.Double,
			aSetData.Enum, aSetData.String, aSetData.Interface, aSetData.Any, aSetData.Sequence, aSetData );

		{
		test::TestData aRet, aRet2;
		xLBT->getValues(
			aRet.Bool, aRet.Char, aRet.Byte, aRet.Short, aRet.UShort,
			aRet.Long, aRet.ULong, aRet.Hyper, aRet.UHyper, aRet.Float, aRet.Double,
			aRet.Enum, aRet.String, aRet.Interface, aRet.Any, aRet.Sequence, aRet2 );
		
		OSL_ASSERT( equals( aData, aRet ) && equals( aData, aRet2 ) );
		
		// set last retrieved values
		test::TestData aSV2ret = xLBT->setValues2(
			aRet.Bool, aRet.Char, aRet.Byte, aRet.Short, aRet.UShort,
			aRet.Long, aRet.ULong, aRet.Hyper, aRet.UHyper, aRet.Float, aRet.Double,
			aRet.Enum, aRet.String, aRet.Interface, aRet.Any, aRet.Sequence, aRet2 );
		
		OSL_ASSERT( equals( aData, aSV2ret ) && equals( aData, aRet2 ) );
		}
		{
		test::TestData aRet, aRet2;
		test::TestData aGVret = xLBT->getValues(
			aRet.Bool, aRet.Char, aRet.Byte, aRet.Short, aRet.UShort,
			aRet.Long, aRet.ULong, aRet.Hyper, aRet.UHyper, aRet.Float, aRet.Double,
			aRet.Enum, aRet.String, aRet.Interface, aRet.Any, aRet.Sequence, aRet2 );
		
		OSL_ASSERT( equals( aData, aRet ) && equals( aData, aRet2 ) && equals( aData, aGVret ) );
		
		// set last retrieved values
		xLBT->setBool( aRet.Bool );
		xLBT->setChar( aRet.Char );
		xLBT->setByte( aRet.Byte );
		xLBT->setShort( aRet.Short );
		xLBT->setUShort( aRet.UShort );
		xLBT->setLong( aRet.Long );
		xLBT->setULong( aRet.ULong );
		xLBT->setHyper( aRet.Hyper );
		xLBT->setUHyper( aRet.UHyper );
		xLBT->setFloat( aRet.Float );
		xLBT->setDouble( aRet.Double );
		xLBT->setEnum( aRet.Enum );
		xLBT->setString( aRet.String );
		xLBT->setInterface( aRet.Interface );
		xLBT->setAny( aRet.Any );
		xLBT->setSequence( aRet.Sequence );
		xLBT->setStruct( aRet2 );
		}
		{
		test::TestData aRet, aRet2;
		aRet.Hyper = xLBT->getHyper();
		aRet.UHyper = xLBT->getUHyper();
		aRet.Float = xLBT->getFloat();
		aRet.Double = xLBT->getDouble();
		aRet.Byte = xLBT->getByte();
		aRet.Char = xLBT->getChar();
		aRet.Bool = xLBT->getBool();
		aRet.Short = xLBT->getShort();
		aRet.UShort = xLBT->getUShort();
		aRet.Long = xLBT->getLong();
		aRet.ULong = xLBT->getULong();
		aRet.Enum = xLBT->getEnum();
		aRet.String = xLBT->getString();
		aRet.Interface = xLBT->getInterface();
		aRet.Any = xLBT->getAny();
		aRet.Sequence = xLBT->getSequence();
		aRet2 = xLBT->getStruct();
		
		return (equals( aData, aRet ) && equals( aData, aRet2 ));
		}
	}
	return sal_False;
}

//__________________________________________________________________________________________________
test::TestData Test_Impl::raiseException( sal_Bool& /*bBool*/, sal_Unicode& /*cChar*/, sal_Int8& /*nByte*/, sal_Int16& /*nShort*/, sal_uInt16& /*nUShort*/, sal_Int32& /*nLong*/, sal_uInt32& /*nULong*/, sal_Int64& /*nHyper*/, sal_uInt64& /*nUHyper*/, float& /*fFloat*/, double& /*fDouble*/, test::TestEnum& /*eEnum*/, ::rtl::OUString& /*aString*/, ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& /*xInterface*/, ::com::sun::star::uno::Any& /*aAny*/, ::com::sun::star::uno::Sequence< test::TestElement >& /*aSequence*/, test::TestData& /*aStruct*/ )
	throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
{
	IllegalArgumentException aExc;
	aExc.ArgumentPosition = 5;
	aExc.Message		  = OUString::createFromAscii("dum dum dum ich tanz im kreis herum...");
	aExc.Context		  = *this;
	throw aExc;
}
//__________________________________________________________________________________________________
sal_Int32 Test_Impl::getRuntimeException() throw(::com::sun::star::uno::RuntimeException)
{
	RuntimeException aExc;
	aExc.Message		  = OUString::createFromAscii("dum dum dum ich tanz im kreis herum...");
	aExc.Context		  = *this;
	throw aExc;
}
//__________________________________________________________________________________________________
void Test_Impl::setRuntimeException( sal_Int32 /*_runtimeexception*/ ) throw(::com::sun::star::uno::RuntimeException)
{
	RuntimeException aExc;
	aExc.Message		  = OUString::createFromAscii("dum dum dum ich tanz im kreis herum...");
	aExc.Context		  = *this;
	throw aExc;
}

//==================================================================================================
sal_Bool raiseException( const Reference<XLanguageBindingTest > & xLBT )
{
	try
	{
		try
		{
			try
			{
				test::TestData aRet, aRet2;
				xLBT->raiseException(
					aRet.Bool, aRet.Char, aRet.Byte, aRet.Short, aRet.UShort,
					aRet.Long, aRet.ULong, aRet.Hyper, aRet.UHyper, aRet.Float, aRet.Double,
					aRet.Enum, aRet.String, aRet.Interface, aRet.Any, aRet.Sequence, aRet2 );
				return sal_False;
			}
			catch (IllegalArgumentException aExc)
			{
				OSL_ENSURE( aExc.ArgumentPosition == 5 &&
//  							 aExc.Context == xLBT &&
							 aExc.Message.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("dum dum dum ich tanz im kreis herum...")),
							 "### unexpected exception content!" );
				
				Reference<XLanguageBindingTest > xLBT2(
					Reference<XLanguageBindingTest >::query( aExc.Context ) );
				
				OSL_ENSURE( xLBT2.is(), "### unexpected source of exception!" );
				if (xLBT2.is())
					xLBT2->getRuntimeException();
				else
					return sal_False;
			}
		}
		catch (const RuntimeException & rExc)
		{
			OSL_ENSURE(//rExc.Context == xLBT &&
						rExc.Message.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("dum dum dum ich tanz im kreis herum...")),
						"### unexpected exception content!" );
			
			Reference<XLanguageBindingTest > xLBT2(
				Reference<XLanguageBindingTest >::query( rExc.Context ) );
			
			OSL_ENSURE( xLBT2.is(), "### unexpected source of exception!" );
			if (xLBT2.is())
				xLBT2->setRuntimeException( 0xcafebabe );
			else
				return sal_False;
		}
	}
	catch (Exception & aExc)
	{
		OSL_ENSURE( //aExc.Context == xLBT &&
					 aExc.Message.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("dum dum dum ich tanz im kreis herum...")),
					 "### unexpected exception content!" );
		return (//aExc.Context == xLBT &&
				aExc.Message.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("dum dum dum ich tanz im kreis herum...")));
	}
	return sal_False;
}

//==================================================================================================
static sal_Bool test_adapter( const Reference< XMultiServiceFactory > & xMgr )
{
	Reference< XInvocationAdapterFactory > xAdapFac(
		xMgr->createInstance( OUString::createFromAscii("com.sun.star.script.InvocationAdapterFactory") ), UNO_QUERY );
	Reference< XInvocationAdapterFactory2 > xAdapFac2( xAdapFac, UNO_QUERY_THROW );
	
	Reference< XLanguageBindingTest > xOriginal( (XLanguageBindingTest *)new Test_Impl() );
	Reference< XInvocation > xInvok( new XLB_Invocation( xMgr, xOriginal ) );
	Reference< XLanguageBindingTest > xLBT( xAdapFac->createAdapter(
		xInvok, ::getCppuType( (const Reference< XLanguageBindingTest > *)0 ) ), UNO_QUERY );
	Reference< XLanguageBindingTest > xLBT2(
        xAdapFac->createAdapter(
            xInvok, ::getCppuType( (const Reference< XLanguageBindingTest > *)0 ) ), UNO_QUERY );
    if (xLBT != xLBT2)
        return sal_False;
	Reference< XInterface > xLBT3(
        xAdapFac->createAdapter(
            xInvok, ::getCppuType( (const Reference< XInterface > *)0 ) ), UNO_QUERY );
    if (xLBT != xLBT3)
        return sal_False;
    Type ar[ 2 ] = {
        ::getCppuType( (const Reference< XLBTestBase > *)0 ),
        ::getCppuType( (const Reference< XInterface > *)0 ) };
	Reference< XInterface > xLBT4(
        xAdapFac2->createAdapter( xInvok, Sequence< Type >( ar, 2 ) ), UNO_QUERY );
    if (xLBT != xLBT4)
        return sal_False;
    Reference< XSimpleRegistry > xInvalidAdapter(
        xAdapFac->createAdapter(
            xInvok, ::getCppuType( (const Reference< XSimpleRegistry > *)0 ) ), UNO_QUERY );
    if (xLBT == xInvalidAdapter)
        return sal_False;
    
    try
    {
        xInvalidAdapter->isValid();
        return sal_False;
    }
    catch (RuntimeException &)
    {
    }
    
	return (performTest( xLBT ) && raiseException( xLBT ));
}
//==================================================================================================
static sal_Bool test_invocation( const Reference< XMultiServiceFactory > & xMgr )
{
	Reference< XInvocationAdapterFactory > xAdapFac(
		xMgr->createInstance( OUString::createFromAscii("com.sun.star.script.InvocationAdapterFactory") ), UNO_QUERY );
	Reference< XSingleServiceFactory > xInvocFac(
		xMgr->createInstance( OUString::createFromAscii("com.sun.star.script.Invocation") ), UNO_QUERY );

	Reference< XLanguageBindingTest > xOriginal( (XLanguageBindingTest *)new Test_Impl() );
	Any aOriginal( &xOriginal, ::getCppuType( &xOriginal ) );
	Reference< XInvocation > xInvok(
		xInvocFac->createInstanceWithArguments( Sequence< Any >( &aOriginal, 1 ) ), UNO_REF_QUERY );
	
	Reference< XLanguageBindingTest > xLBT( xAdapFac->createAdapter(
		xInvok, ::getCppuType( (const Reference< XLanguageBindingTest > *)0 ) ), UNO_QUERY );

	return (performTest( xLBT ) && raiseException( xLBT ));
}

SAL_IMPLEMENT_MAIN()
{
	Reference< XMultiServiceFactory > xMgr( createRegistryServiceFactory(
		OUString( RTL_CONSTASCII_USTRINGPARAM("stoctest.rdb") ) ) );
	
	try
	{
		Reference< XImplementationRegistration > xImplReg(
			xMgr->createInstance(
				OUString(
                    RTL_CONSTASCII_USTRINGPARAM(
                        "com.sun.star.registry.ImplementationRegistration") ) ),
			UNO_QUERY );
		OSL_ENSURE( xImplReg.is(), "### no impl reg!" );
		
		xImplReg->registerImplementation(
			OUString::createFromAscii("com.sun.star.loader.SharedLibrary"),
			OUString::createFromAscii("invocadapt.uno" SAL_DLLEXTENSION),
			Reference< XSimpleRegistry >() );
		xImplReg->registerImplementation(
			OUString::createFromAscii("com.sun.star.loader.SharedLibrary"),
			OUString::createFromAscii("stocservices.uno" SAL_DLLEXTENSION),
			Reference< XSimpleRegistry >() );
		xImplReg->registerImplementation(
			OUString::createFromAscii("com.sun.star.loader.SharedLibrary"),
			OUString::createFromAscii("invocation.uno" SAL_DLLEXTENSION),
			Reference< XSimpleRegistry >() );
		xImplReg->registerImplementation(
			OUString::createFromAscii("com.sun.star.loader.SharedLibrary"),
			OUString::createFromAscii("reflection.uno" SAL_DLLEXTENSION),
			Reference< XSimpleRegistry >() );
		xImplReg->registerImplementation(
			OUString::createFromAscii("com.sun.star.loader.SharedLibrary"),
			OUString::createFromAscii("introspection.uno" SAL_DLLEXTENSION),
			Reference< XSimpleRegistry >() );
		
		if (test_adapter( xMgr ))
		{
			fprintf( stderr, "> test_iadapter() succeeded.\n" );
			if (test_invocation( xMgr ))
			{
				fprintf( stderr, "> test_invocation() succeeded.\n" );
			}
		}
	}
	catch (Exception & rExc)
	{
		fprintf( stderr, "> exception occurred: " );
		OString aMsg( OUStringToOString( rExc.Message, RTL_TEXTENCODING_ASCII_US ) );
		fprintf( stderr, "%s\n", aMsg.getStr() );
	}
	
	Reference< XComponent >( xMgr, UNO_QUERY )->dispose();

	return 0;
}
