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



#if !defined(OSL_DEBUG_LEVEL) || OSL_DEBUG_LEVEL == 0
# undef OSL_DEBUG_LEVEL
# define OSL_DEBUG_LEVEL 2
#endif

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

#include <stdio.h>

#include <cppuhelper/implbase1.hxx>
#include <cppuhelper/implbase2.hxx>
#include <cppuhelper/implbase3.hxx>
#include <cppuhelper/implbase4.hxx>
#include <cppuhelper/implbase5.hxx>
#include <cppuhelper/implbase6.hxx>
#include <cppuhelper/implbase7.hxx>
#include <cppuhelper/implbase8.hxx>
#include <cppuhelper/implbase9.hxx>
#include <cppuhelper/implbase10.hxx>
#include <cppuhelper/implbase11.hxx>
#include <cppuhelper/implbase12.hxx>

#include <cppuhelper/compbase1.hxx>
#include <cppuhelper/compbase2.hxx>
#include <cppuhelper/compbase3.hxx>
#include <cppuhelper/compbase4.hxx>
#include <cppuhelper/compbase5.hxx>
#include <cppuhelper/compbase6.hxx>
#include <cppuhelper/compbase7.hxx>
#include <cppuhelper/compbase8.hxx>
#include <cppuhelper/compbase9.hxx>
#include <cppuhelper/compbase10.hxx>
#include <cppuhelper/compbase11.hxx>
#include <cppuhelper/compbase12.hxx>

#include <osl/diagnose.h>
#include <cppuhelper/servicefactory.hxx>
#include <cppuhelper/implbase4.hxx>
#include <cppuhelper/compbase4.hxx>
#include <cppuhelper/exc_hlp.hxx>

#include <test/A.hpp>
#include <test/BA.hpp>
#include <test/CA.hpp>
#include <test/DBA.hpp>
#include <test/E.hpp>
#include <test/FE.hpp>
#include <test/G.hpp>
#include <test/H.hpp>
#include <test/I.hpp>

#include <com/sun/star/lang/IllegalAccessException.hpp>

using namespace test;
using namespace rtl;
using namespace osl;
using namespace cppu;
using namespace com::sun::star;
using namespace com::sun::star::uno;

//==================================================================================================
struct TestImpl : public ImplHelper4< CA, DBA, FE, G >
{
	sal_Int32 nRef;

	virtual ~TestImpl()
		{ OSL_TRACE( "> TestImpl dtor called... <\n" ); }

    virtual Any SAL_CALL queryInterface( const Type & rType ) throw(RuntimeException)
		{ return ImplHelper4< CA, DBA, FE, G >::queryInterface( rType ); }
    virtual void SAL_CALL acquire(  ) throw()
		{ ++nRef; }
    virtual void SAL_CALL release(  ) throw()
		{ if (! --nRef) delete this; }

	// A
	virtual OUString SAL_CALL a() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("a") ); }
	// BA
	virtual OUString SAL_CALL ba() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("ba") ); }
	// CA
	virtual OUString SAL_CALL ca() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("ca") ); }
	// DBA
	virtual OUString SAL_CALL dba() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("dba") ); }
	// E
	virtual OUString SAL_CALL e() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("e") ); }
	// FE
	virtual OUString SAL_CALL fe() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("fe") ); }
	// G
	virtual OUString SAL_CALL g() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("g") ); }
};

//==================================================================================================
struct TestWeakAggImpl : public WeakAggImplHelper4< CA, DBA, FE, G >
{
	virtual ~TestWeakAggImpl()
		{ OSL_TRACE( "> TestWeakAggImpl dtor called... <\n" ); }

	// A
	virtual OUString SAL_CALL a() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("a") ); }
	// BA
	virtual OUString SAL_CALL ba() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("ba") ); }
	// CA
	virtual OUString SAL_CALL ca() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("ca") ); }
	// DBA
	virtual OUString SAL_CALL dba() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("dba") ); }
	// E
	virtual OUString SAL_CALL e() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("e") ); }
	// FE
	virtual OUString SAL_CALL fe() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("fe") ); }
	// G
	virtual OUString SAL_CALL g() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("g") ); }
};

//==================================================================================================
struct TestWeakImpl : public WeakImplHelper4< CA, DBA, FE, G >
{
    TestWeakImpl() {}

	virtual ~TestWeakImpl()
		{ OSL_TRACE( "> TestWeakImpl dtor called... <\n" ); }

	// A
	virtual OUString SAL_CALL a() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("a") ); }
	// BA
	virtual OUString SAL_CALL ba() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("ba") ); }
	// CA
	virtual OUString SAL_CALL ca() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("ca") ); }
	// DBA
	virtual OUString SAL_CALL dba() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("dba") ); }
	// E
	virtual OUString SAL_CALL e() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("e") ); }
	// FE
	virtual OUString SAL_CALL fe() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("fe") ); }
	// G
	virtual OUString SAL_CALL g() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("g") ); }

protected:
    TestWeakImpl(int) {}

    TestWeakImpl(int, int) {}

    TestWeakImpl(int, int, int) {}

    TestWeakImpl(int, int, int, int) {}

    TestWeakImpl(int, int, int, int, int) {}

    TestWeakImpl(int, int, int, int, int, int, int = 0) {}
};

//==================================================================================================
struct TestWeakComponentImpl : public WeakComponentImplHelper4< CA, DBA, FE, G >
{
	Mutex m;
	TestWeakComponentImpl()
		: WeakComponentImplHelper4< CA, DBA, FE, G >( m )
		{}
	virtual ~TestWeakComponentImpl()
		{ OSL_TRACE( "> TestWeakComponentImpl dtor called... <\n" ); }

	void SAL_CALL disposing()
		{ OSL_TRACE( "> TestWeakComponentImpl disposing called... <\n" ); }

	// A
	virtual OUString SAL_CALL a() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("a") ); }
	// BA
	virtual OUString SAL_CALL ba() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("ba") ); }
	// CA
	virtual OUString SAL_CALL ca() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("ca") ); }
	// DBA
	virtual OUString SAL_CALL dba() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("dba") ); }
	// E
	virtual OUString SAL_CALL e() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("e") ); }
	// FE
	virtual OUString SAL_CALL fe() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("fe") ); }
	// G
	virtual OUString SAL_CALL g() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("g") ); }
};

//==================================================================================================
struct TestWeakAggComponentImpl : public WeakAggComponentImplHelper4< CA, DBA, FE, G >
{
	Mutex m;
	TestWeakAggComponentImpl()
		: WeakAggComponentImplHelper4< CA, DBA, FE, G >( m )
		{}
	virtual ~TestWeakAggComponentImpl()
		{ OSL_TRACE( "> TestWeakAggComponentImpl dtor called... <\n" ); }

	void SAL_CALL disposing()
		{ OSL_TRACE( "> TestWeakAggComponentImpl disposing called... <\n" ); }

	// A
	virtual OUString SAL_CALL a() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("a") ); }
	// BA
	virtual OUString SAL_CALL ba() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("ba") ); }
	// CA
	virtual OUString SAL_CALL ca() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("ca") ); }
	// DBA
	virtual OUString SAL_CALL dba() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("dba") ); }
	// E
	virtual OUString SAL_CALL e() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("e") ); }
	// FE
	virtual OUString SAL_CALL fe() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("fe") ); }
	// G
	virtual OUString SAL_CALL g() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("g") ); }
};

//==================================================================================================
struct TestImplInh : public ImplInheritanceHelper2< TestWeakImpl, H, I >
{
    TestImplInh() {}

    explicit TestImplInh(int):
        ImplInheritanceHelper2< TestWeakImpl, H, I >(1) {}

    TestImplInh(int, int):
        ImplInheritanceHelper2< TestWeakImpl, H, I >(1, 2) {}

    TestImplInh(int, int, int):
        ImplInheritanceHelper2< TestWeakImpl, H, I >(1, 2, 3) {}

    TestImplInh(int, int, int, int):
        ImplInheritanceHelper2< TestWeakImpl, H, I >(1, 2, 3, 4) {}

    TestImplInh(int, int, int, int, int):
        ImplInheritanceHelper2< TestWeakImpl, H, I >(1, 2, 3, 4, 5) {}

    TestImplInh(int, int, int, int, int, int):
        ImplInheritanceHelper2< TestWeakImpl, H, I >(1, 2, 3, 4, 5, 6) {}

	virtual ~TestImplInh()
		{ OSL_TRACE( "> TestWeakImplInh dtor called... <\n" ); }

	// H
	virtual OUString SAL_CALL h() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("h") ); }
	// I
	virtual OUString SAL_CALL i() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("i") ); }
};

//==================================================================================================
struct TestAggImplInh : public AggImplInheritanceHelper2< TestWeakAggImpl, H, I >
{
	virtual ~TestAggImplInh()
		{ OSL_TRACE( "> TestAggImplInh dtor called... <\n" ); }

	// H
	virtual OUString SAL_CALL h() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("h2") ); }
	// I
	virtual OUString SAL_CALL i() throw(RuntimeException)
		{ return OUString( RTL_CONSTASCII_USTRINGPARAM("i2") ); }
};


static bool isIn( Sequence< Type > const & rTypes, char const * name )
{
    OUString str( OUString::createFromAscii( name ) );
    Type const * pTypes = rTypes.getConstArray();
    for ( sal_Int32 nPos = rTypes.getLength(); nPos--; )
    {
        if (pTypes[ nPos ].getTypeName().equals( str ))
            return true;
    }
    return false;
}

//==================================================================================================
static void dotest( const Reference< XInterface > & xOriginal )
{
    Reference< lang::XTypeProvider > xTP( xOriginal, UNO_QUERY );
    Sequence< sal_Int8 > id( xTP->getImplementationId() );
    Sequence< Type > types( xTP->getTypes() );
    ::fprintf( stderr, "> supported types: " );
    long n = 0;
    for ( ; n < types.getLength(); ++n )
    {
        OString str( OUStringToOString( types[ n ].getTypeName(), RTL_TEXTENCODING_ASCII_US ) );
        ::fprintf( stderr, (n < (types.getLength()-1)) ? "%s, " : "%s; type-id=\n", str.getStr() );
    }
    for ( n = 0; n < 16; ++n )
    {
        ::fprintf( stderr, n < 15 ? "%x " : "%x \n", id[ n ] );
    }

	Reference< A > xa( xOriginal, UNO_QUERY );
	OSL_ENSURE( xa->a().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("a") ), "### A failed!" );
	Reference< BA > xba( xa, UNO_QUERY );
	OSL_ENSURE( xba->ba().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("ba") ), "### BA failed!" );
	OSL_ENSURE( xba->a().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("a") ), "### BA failed!" );
	Reference< CA > xca( xba, UNO_QUERY );
	OSL_ENSURE( xca->ca().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("ca") ), "### CA failed!" );
	OSL_ENSURE( xca->a().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("a") ), "### CA failed!" );
	Reference< DBA > xdba( xca, UNO_QUERY );
	OSL_ENSURE( xdba->dba().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("dba") ), "### DBA failed!" );
	OSL_ENSURE( xdba->ba().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("ba") ), "### DBA failed!" );
	OSL_ENSURE( xdba->a().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("a") ), "### DBA failed!" );
	Reference< E > xe( xdba, UNO_QUERY );
	OSL_ENSURE( xe->e().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("e") ), "### E failed!" );
	Reference< FE > xfe( xe, UNO_QUERY );
	OSL_ENSURE( xfe->fe().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("fe") ), "### FE failed!" );
	Reference< G > xg( xfe, UNO_QUERY );
	OSL_ENSURE( xg->g().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("g") ), "### G failed!" );
	OSL_ENSURE( xg->a().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("a") ), "### G failed!" );

	// type provider
	Reference< lang::XTypeProvider > xProv( xg, UNO_QUERY );
	Sequence< Type > aTypes( xProv->getTypes() );

	// CA, DBA, FE, G, XTypeProvider
	OSL_ASSERT( isIn( aTypes, "test.CA" ) );
	OSL_ASSERT( isIn( aTypes, "test.DBA" ) );
	OSL_ASSERT( isIn( aTypes, "test.FE") );
	OSL_ASSERT( isIn( aTypes, "test.G") );
	OSL_ASSERT( isIn( aTypes, "com.sun.star.lang.XTypeProvider") );

	Reference< XWeak > xWeak( xg, UNO_QUERY );
    if (xWeak.is())
    {
        OSL_ASSERT( isIn( aTypes, "com.sun.star.uno.XWeak") );
    }
	Reference< lang::XComponent > xComp( xg, UNO_QUERY );
	if (xComp.is())
	{
        OSL_ASSERT( isIn( aTypes, "com.sun.star.lang.XComponent") );
    }

	Reference< XAggregation > xAgg( xg, UNO_QUERY );
    if (xAgg.is())
    {
        OSL_ASSERT( isIn( aTypes, "com.sun.star.uno.XAggregation") );
	}
    Reference< H > xH( xg, UNO_QUERY );
    if (xH.is())
    {
        OSL_ASSERT( isIn( aTypes, "test.H") );
    }
    Reference< I > xI( xg, UNO_QUERY );
    if (xI.is())
    {
        OSL_ASSERT( isIn( aTypes, "test.I") );
    }

	OSL_ENSURE( xg == xOriginal, "### root!" );
}

void rethrow()
{
    throw;
}

void throw_one(
    lang::IllegalAccessException exc )
{
    try
    {
        throw exc;
    }
    catch (...)
    {
        rethrow();
    }
}


//==================================================================================================
void test_ImplHelper( const Reference< lang::XMultiServiceFactory > & /*xSF*/ )
{
	Reference< XInterface > xImpl( (lang::XTypeProvider *)new TestImpl() );
    Reference< lang::XTypeProvider > xTP1( xImpl, UNO_QUERY );
	Reference< XInterface > xWeakImpl( (OWeakObject *)new TestWeakImpl() );
    Reference< lang::XTypeProvider > xTP2( xWeakImpl, UNO_QUERY );
	Reference< XInterface > xWeakAggImpl( (OWeakObject *)new TestWeakAggImpl() );
    Reference< lang::XTypeProvider > xTP3( xWeakAggImpl, UNO_QUERY );
	Reference< XInterface > xWeakComponentImpl( (OWeakObject *)new TestWeakComponentImpl() );
    Reference< lang::XTypeProvider > xTP4( xWeakComponentImpl, UNO_QUERY );
	Reference< XInterface > xWeakAggComponentImpl( (OWeakObject *)new TestWeakAggComponentImpl() );
    Reference< lang::XTypeProvider > xTP5( xWeakAggComponentImpl, UNO_QUERY );
	//
    OSL_ASSERT(
        xTP1->getImplementationId() != xTP2->getImplementationId() &&
        xTP1->getImplementationId() != xTP3->getImplementationId() &&
        xTP1->getImplementationId() != xTP4->getImplementationId() &&
        xTP1->getImplementationId() != xTP5->getImplementationId() &&
        xTP2->getImplementationId() != xTP3->getImplementationId() &&
        xTP2->getImplementationId() != xTP4->getImplementationId() &&
        xTP2->getImplementationId() != xTP5->getImplementationId() &&
        xTP3->getImplementationId() != xTP4->getImplementationId() &&
        xTP3->getImplementationId() != xTP5->getImplementationId() &&
        xTP4->getImplementationId() != xTP5->getImplementationId() );
    //

	dotest( xImpl );
	dotest( xWeakImpl );
	dotest( xWeakAggImpl );
	dotest( xWeakComponentImpl );
	dotest( xWeakAggComponentImpl );

	xWeakImpl = (OWeakObject *)new TestImplInh();
    Reference< lang::XTypeProvider > xTP6( xWeakImpl, UNO_QUERY );
    dotest( xWeakImpl );
    Reference< H > xH( xWeakImpl, UNO_QUERY );
    Reference< I > xI( xH, UNO_QUERY );
    OSL_ASSERT( xH->h().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("h") ) );
    OSL_ASSERT( xI->i().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("i") ) );

	xWeakAggImpl = (OWeakObject *)new TestAggImplInh();
    Reference< lang::XTypeProvider > xTP7( xWeakAggImpl, UNO_QUERY );
    dotest( xWeakAggImpl );
    xH.set( xWeakAggImpl, UNO_QUERY );
    xI.set( xH, UNO_QUERY );
    OSL_ASSERT( xH->h().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("h2") ) );
    OSL_ASSERT( xI->i().equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("i2") ) );

    //
    OSL_ASSERT(
        xTP6->getImplementationId() != xTP1->getImplementationId() &&
        xTP6->getImplementationId() != xTP2->getImplementationId() &&
        xTP6->getImplementationId() != xTP3->getImplementationId() &&
        xTP6->getImplementationId() != xTP4->getImplementationId() &&
        xTP6->getImplementationId() != xTP5->getImplementationId() &&
        xTP6->getImplementationId() != xTP7->getImplementationId() &&
        xTP7->getImplementationId() != xTP1->getImplementationId() &&
        xTP7->getImplementationId() != xTP2->getImplementationId() &&
        xTP7->getImplementationId() != xTP3->getImplementationId() &&
        xTP7->getImplementationId() != xTP4->getImplementationId() &&
        xTP7->getImplementationId() != xTP5->getImplementationId() );
    //

    bool exc_succ = false;
    lang::IllegalAccessException exc(
        OUString( RTL_CONSTASCII_USTRINGPARAM("testtest") ),
        xWeakAggImpl );
	// exception helper tests
    try
    {
        throw exc;
    }
    catch (Exception &)
    {
        Any a( getCaughtException() );
        OSL_ASSERT( a == exc );

        try
        {
            throwException( a );
        }
        catch (lang::IllegalAccessException & e)
        {
            OSL_ASSERT( exc.Message == e.Message && exc.Context == e.Context );

            try
            {
                throw_one( exc );
            }
            catch (Exception &)
            {
                Any a2( getCaughtException() );
                OSL_ASSERT( (a2 == a) && (a2 == exc) );

                try
                {
                    throw_one( exc );
                }
                catch (lang::IllegalAccessException &)
                {
                    Any a3( getCaughtException() );
                    OSL_ASSERT( (a3 == a) && (a3 == a2) && (a3 == exc) );
                    exc_succ = true;
                }
            }
        }
    }
    OSL_ASSERT( exc_succ );

	try
	{
		throwException( makeAny( RuntimeException(
			OUString( RTL_CONSTASCII_USTRINGPARAM("runtime exc") ), xImpl ) ) );
	}
	catch (RuntimeException & rExc)
	{
		OSL_ENSURE( rExc.Message.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("runtime exc") ) && rExc.Context == xImpl,
					 "### unexpected exception content!" );
		try
		{
			throwException( makeAny( Exception(
				OUString( RTL_CONSTASCII_USTRINGPARAM("exc") ), rExc.Context ) ) );
		}
		catch (lang::IllegalAccessException &)
		{
			OSL_ENSURE( sal_False, "### unexpected IllegalAccessException exception caught!" );
		}
		catch (Exception & rExc2)
		{
			OSL_ENSURE( rExc2.Message.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("exc") ) && rExc2.Context == xImpl,
						 "### unexpected exception content!" );
			try
			{
				throwException( makeAny( lang::IllegalAccessException(
					OUString( RTL_CONSTASCII_USTRINGPARAM("axxess exc") ), rExc2.Context ) ) );
			}
			catch (lang::IllegalAccessException & rExc3)
			{
				OSL_ENSURE( rExc3.Message.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("axxess exc") ) && rExc3.Context == xImpl,
							 "### unexpected exception content!" );
				return;
			}
		}
	}
	catch (...)
	{
	}
	OSL_ENSURE( sal_False, "### exception test failed!" );
}
