/**************************************************************
 * 
 * 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 _DBASHARED_APITOOLS_HXX_
#define _DBASHARED_APITOOLS_HXX_

#ifndef _CPPUHELPER_COMPONENT_HXX_
#include <cppuhelper/component.hxx>
#endif
#ifndef _OSL_MUTEX_HXX_
#include <osl/mutex.hxx>
#endif
#ifndef _CPPUHELPER_INTERFACECONTAINER_HXX_
#include <cppuhelper/interfacecontainer.hxx>
#endif
#ifndef _OSL_DIAGNOSE_H_
#include <osl/diagnose.h>
#endif
#ifndef _COMPHELPER_STLTYPES_HXX_
#include <comphelper/stl_types.hxx>
#endif
#ifndef _CPPUHELPER_TYPEPROVIDER_HXX_
#include <cppuhelper/typeprovider.hxx>
#endif
#ifndef _COMPHELPER_SEQUENCE_HXX_
#include <comphelper/sequence.hxx>
#endif

//==================================================================================
//= various typedefs
//==================================================================================
DECLARE_STL_VECTOR(::com::sun::star::uno::WeakReferenceHelper, OWeakRefArray);

//==================================================================================
//= OSubComponent - a component which holds a hard ref to it's parent
//=					and is been hold itself (by the parent) with a weak ref
//==================================================================================
class OSubComponent : public ::cppu::OComponentHelper
{
protected:
	// the parent must support the tunnel implementation
	::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > m_xParent;
	virtual ~OSubComponent();

public:
	OSubComponent(::osl::Mutex& _rMutex,
				  const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _xParent);

// ::com::sun::star::lang::XTypeProvider
	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes() throw (::com::sun::star::uno::RuntimeException);

// ::com::sun::star::uno::XInterface
	virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType )
			throw(::com::sun::star::uno::RuntimeException);
	virtual void SAL_CALL acquire() throw();
	virtual void SAL_CALL release() throw();

	inline operator ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > () const
		{ return (::com::sun::star::uno::XWeak *)this; }

};

//==================================================================================
//= helper for implementing the XServiceInfo interface

//----------------------------------------------------------------------------------
// (internal - not to be used outside - usually)
#define IMPLEMENT_SERVICE_INFO_IMPLNAME(classname, implasciiname)	\
	::rtl::OUString SAL_CALL classname::getImplementationName(  ) throw (::com::sun::star::uno::RuntimeException)	\
	{	\
		return ::rtl::OUString::createFromAscii(implasciiname);	\
	}	\

#define IMPLEMENT_SERVICE_INFO_IMPLNAME_STATIC(classname, implasciiname)	\
	::rtl::OUString SAL_CALL classname::getImplementationName(  ) throw (::com::sun::star::uno::RuntimeException)	\
	{	\
		return getImplementationName_Static();	\
	}	\
	::rtl::OUString SAL_CALL classname::getImplementationName_Static(  ) throw (::com::sun::star::uno::RuntimeException)	\
	{	\
		return ::rtl::OUString::createFromAscii(implasciiname);	\
	}	\

#define IMPLEMENT_SERVICE_INFO_SUPPORTS(classname)	\
    sal_Bool SAL_CALL classname::supportsService( const ::rtl::OUString& _rServiceName ) throw(::com::sun::star::uno::RuntimeException)	\
	{	\
		::com::sun::star::uno::Sequence< ::rtl::OUString > aSupported(getSupportedServiceNames());	\
		const ::rtl::OUString* pSupported = aSupported.getConstArray();	\
		for (sal_Int32 i=0; i<aSupported.getLength(); ++i, ++pSupported)	\
			if (pSupported->equals(_rServiceName))	\
				return sal_True;	\
	\
		return sal_False;	\
	}	\

#define IMPLEMENT_SERVICE_INFO_GETSUPPORTED1(classname, serviceasciiname)	\
    ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL classname::getSupportedServiceNames(  ) throw(::com::sun::star::uno::RuntimeException)	\
	{	\
		::com::sun::star::uno::Sequence< ::rtl::OUString > aSupported(1);	\
		aSupported[0] = ::rtl::OUString::createFromAscii(serviceasciiname);	\
		return aSupported;	\
	}	\

#define IMPLEMENT_SERVICE_INFO_GETSUPPORTED1_STATIC(classname, serviceasciiname)	\
    ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL classname::getSupportedServiceNames(  ) throw(::com::sun::star::uno::RuntimeException)	\
	{	\
		return getSupportedServiceNames_Static();	\
	}	\
    ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL classname::getSupportedServiceNames_Static(  ) throw(::com::sun::star::uno::RuntimeException)	\
	{	\
		::com::sun::star::uno::Sequence< ::rtl::OUString > aSupported(1);	\
		aSupported[0] = ::rtl::OUString::createFromAscii(serviceasciiname);	\
		return aSupported;	\
	}	\

#define IMPLEMENT_SERVICE_INFO_GETSUPPORTED2_STATIC(classname, serviceasciiname1, serviceasciiname2)	\
    ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL classname::getSupportedServiceNames(  ) throw(::com::sun::star::uno::RuntimeException)	\
	{	\
		return getSupportedServiceNames_Static();	\
	}	\
    ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL classname::getSupportedServiceNames_Static(  ) throw(::com::sun::star::uno::RuntimeException)	\
	{	\
		::com::sun::star::uno::Sequence< ::rtl::OUString > aSupported(2);	\
		aSupported[0] = ::rtl::OUString::createFromAscii(serviceasciiname1);	\
		aSupported[1] = ::rtl::OUString::createFromAscii(serviceasciiname2);	\
		return aSupported;	\
	}	\

#define IMPLEMENT_SERVICE_INFO_GETSUPPORTED2(classname, serviceasciiname1, serviceasciiname2)	\
    ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL classname::getSupportedServiceNames(  ) throw(::com::sun::star::uno::RuntimeException)	\
	{	\
		::com::sun::star::uno::Sequence< ::rtl::OUString > aSupported(2);	\
		aSupported[0] = ::rtl::OUString::createFromAscii(serviceasciiname1);	\
		aSupported[1] = ::rtl::OUString::createFromAscii(serviceasciiname2);	\
		return aSupported;	\
	}	\

#define IMPLEMENT_SERVICE_INFO_GETSUPPORTED3(classname, serviceasciiname1, serviceasciiname2, serviceasciiname3)	\
    ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL classname::getSupportedServiceNames(  ) throw(::com::sun::star::uno::RuntimeException)	\
	{	\
		::com::sun::star::uno::Sequence< ::rtl::OUString > aSupported(3);	\
		aSupported[0] = ::rtl::OUString::createFromAscii(serviceasciiname1);	\
		aSupported[1] = ::rtl::OUString::createFromAscii(serviceasciiname2);	\
		aSupported[2] = ::rtl::OUString::createFromAscii(serviceasciiname3);	\
		return aSupported;	\
	}	\

#define IMPLEMENT_SERVICE_INFO_CREATE_STATIC(classname)	\
	::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >	\
		SAL_CALL classname::Create(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB)	\
	{	\
		return static_cast< XServiceInfo* >(new classname(_rxORB));	\
	}	\

//----------------------------------------------------------------------------------
// declare service info methods - no getImplementationName, so the class is abstract
#define DECLARE_SERVICE_INFO_ABSTRACT()	\
    virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw(::com::sun::star::uno::RuntimeException);	\
    virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(  ) throw(::com::sun::star::uno::RuntimeException)	\

//----------------------------------------------------------------------------------
// declare service info methods
#define DECLARE_SERVICE_INFO()	\
	virtual ::rtl::OUString SAL_CALL getImplementationName(  ) throw (::com::sun::star::uno::RuntimeException);	\
    virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw(::com::sun::star::uno::RuntimeException);	\
    virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(  ) throw(::com::sun::star::uno::RuntimeException)	\

#define DECLARE_SERVICE_INFO_STATIC()	\
	DECLARE_SERVICE_INFO();	\
	static ::rtl::OUString SAL_CALL getImplementationName_Static(  ) throw (::com::sun::star::uno::RuntimeException);	\
    static ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames_Static(  ) throw(::com::sun::star::uno::RuntimeException);	\
	static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >	\
		SAL_CALL Create(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >&)	\

//----------------------------------------------------------------------------------
#define IMPLEMENT_SERVICE_INFO1(classname, implasciiname, serviceasciiname)	\
	IMPLEMENT_SERVICE_INFO_IMPLNAME(classname, implasciiname)	\
	IMPLEMENT_SERVICE_INFO_SUPPORTS(classname)	\
	IMPLEMENT_SERVICE_INFO_GETSUPPORTED1(classname, serviceasciiname)	\

//----------------------------------------------------------------------------------
#define IMPLEMENT_SERVICE_INFO1_STATIC(classname, implasciiname, serviceasciiname)	\
	IMPLEMENT_SERVICE_INFO_IMPLNAME_STATIC(classname, implasciiname)	\
	IMPLEMENT_SERVICE_INFO_SUPPORTS(classname)	\
	IMPLEMENT_SERVICE_INFO_GETSUPPORTED1_STATIC(classname, serviceasciiname)	\
	IMPLEMENT_SERVICE_INFO_CREATE_STATIC(classname)	\

//----------------------------------------------------------------------------------
#define IMPLEMENT_SERVICE_INFO2(classname, implasciiname, serviceasciiname1, serviceasciiname2)	\
	IMPLEMENT_SERVICE_INFO_IMPLNAME(classname, implasciiname)	\
	IMPLEMENT_SERVICE_INFO_SUPPORTS(classname)	\
	IMPLEMENT_SERVICE_INFO_GETSUPPORTED2(classname, serviceasciiname1, serviceasciiname2)
	
//----------------------------------------------------------------------------------
#define IMPLEMENT_SERVICE_INFO2_STATIC(classname, implasciiname, serviceasciiname1, serviceasciiname2)	\
	IMPLEMENT_SERVICE_INFO_IMPLNAME_STATIC(classname, implasciiname)	\
	IMPLEMENT_SERVICE_INFO_SUPPORTS(classname)	\
	IMPLEMENT_SERVICE_INFO_GETSUPPORTED2_STATIC(classname, serviceasciiname1,serviceasciiname2)	\
	IMPLEMENT_SERVICE_INFO_CREATE_STATIC(classname)	\

//----------------------------------------------------------------------------------
#define IMPLEMENT_SERVICE_INFO3(classname, implasciiname, serviceasciiname1, serviceasciiname2, serviceasciiname3)	\
	IMPLEMENT_SERVICE_INFO_IMPLNAME(classname, implasciiname)	\
	IMPLEMENT_SERVICE_INFO_SUPPORTS(classname)	\
	IMPLEMENT_SERVICE_INFO_GETSUPPORTED3(classname, serviceasciiname1, serviceasciiname2, serviceasciiname3)	\

//----------------------------------------------------------------------------------
#define IMPLEMENT_SERVICE_INFO1_ABSTRACT(classname, serviceasciiname)	\
	IMPLEMENT_SERVICE_INFO_SUPPORTS(classname)	\
	IMPLEMENT_SERVICE_INFO_GETSUPPORTED1(classname, serviceasciiname)	\

//----------------------------------------------------------------------------------
#define IMPLEMENT_SERVICE_INFO2_ABSTRACT(classname, serviceasciiname1, serviceasciiname2)	\
	IMPLEMENT_SERVICE_INFO_SUPPORTS(classname)	\
	IMPLEMENT_SERVICE_INFO_GETSUPPORTED2(classname, serviceasciiname1, serviceasciiname2)	\

//==================================================================================
//= XTypeProvider helpers

//--------------------------------------------------------------------------
#define DECLARE_IMPLEMENTATION_ID( )	\
	virtual ::com::sun::star::uno::Sequence<sal_Int8> SAL_CALL getImplementationId(  ) throw(::com::sun::star::uno::RuntimeException);  \
	static ::com::sun::star::uno::Sequence< sal_Int8 >	getUnoTunnelImplementationId() \

//--------------------------------------------------------------------------
#define DECLARE_GETTYPES( )	\
    virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw (::com::sun::star::uno::RuntimeException);

//--------------------------------------------------------------------------
#define DECLARE_TYPEPROVIDER( )	\
	DECLARE_GETTYPES( )	\
	DECLARE_IMPLEMENTATION_ID( )

//--------------------------------------------------------------------------
#define IMPLEMENT_IMPLEMENTATION_ID( classname )	\
::com::sun::star::uno::Sequence< sal_Int8 >	classname::getUnoTunnelImplementationId() \
{	\
	static ::cppu::OImplementationId* pId = 0;	\
	if ( !pId )	\
	{	\
		::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );	\
		if ( !pId )	\
		{	\
			static ::cppu::OImplementationId aId;	\
			pId = &aId;	\
		}	\
	}	\
	return pId->getImplementationId();	\
} \
::com::sun::star::uno::Sequence< sal_Int8 > classname::getImplementationId() throw (::com::sun::star::uno::RuntimeException)	\
{	\
	return classname::getUnoTunnelImplementationId(); \
}

//--------------------------------------------------------------------------
#define IMPLEMENT_GETTYPES2( classname, baseclass1, baseclass2 )	\
	::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > classname::getTypes() throw (::com::sun::star::uno::RuntimeException)	\
	{	\
		return	::comphelper::concatSequences(	\
			baseclass1::getTypes( ),	\
			baseclass2::getTypes( )	\
		);	\
	}

//--------------------------------------------------------------------------
#define IMPLEMENT_GETTYPES3( classname, baseclass1, baseclass2, baseclass3 )	\
	::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > classname::getTypes() throw (::com::sun::star::uno::RuntimeException)	\
	{	\
		return	::comphelper::concatSequences(	\
			baseclass1::getTypes( ),	\
			baseclass2::getTypes( ),	\
			baseclass3::getTypes( )	\
		);	\
	}

//--------------------------------------------------------------------------
#define IMPLEMENT_TYPEPROVIDER2( classname, baseclass1, baseclass2 )	\
	IMPLEMENT_IMPLEMENTATION_ID( classname)	\
	IMPLEMENT_GETTYPES2( classname, baseclass1, baseclass2 )

//--------------------------------------------------------------------------
#define IMPLEMENT_TYPEPROVIDER3( classname, baseclass1, baseclass2, baseclass3 )	\
	IMPLEMENT_IMPLEMENTATION_ID( classname)	\
	IMPLEMENT_GETTYPES3(classname, baseclass1, baseclass2, baseclass3 )

//==================================================================================
//= helper for declaring/implementing classes based on the OPropertyContainer and an OPropertyArrayUsageHelper
//----------------------------------------------------------------------------------
#define DECLARE_PROPERTYCONTAINER_DEFAULTS( )	\
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo>  SAL_CALL getPropertySetInfo() throw(::com::sun::star::uno::RuntimeException);	\
	virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper();	\
	virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const
	
//----------------------------------------------------------------------------------
#define IMPLEMENT_PROPERTYCONTAINER_DEFAULTS2( classname , baseclass1)	\
	::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >  SAL_CALL classname::getPropertySetInfo() throw(::com::sun::star::uno::RuntimeException)	\
	{	\
		Reference< XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) );	\
		return xInfo;	\
	}	\
	::cppu::IPropertyArrayHelper& classname::getInfoHelper()	\
	{	\
	return *baseclass1::getArrayHelper();	\
	}	\
	::cppu::IPropertyArrayHelper* classname::createArrayHelper( ) const	\
	{	\
		::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property > aProps;	\
		describeProperties(aProps);	\
		return new ::cppu::OPropertyArrayHelper(aProps);	\
	}
//----------------------------------------------------------------------------------
#define IMPLEMENT_PROPERTYCONTAINER_DEFAULTS( classname )	\
	IMPLEMENT_PROPERTYCONTAINER_DEFAULTS2( classname, classname )

//==================================================================================
//= helper for implementing the createArrayHelper
//----------------------------------------------------------------------------------
#define BEGIN_PROPERTY_SEQUENCE(count)	\
	::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property> aDescriptor(count);	\
	::com::sun::star::beans::Property* pDesc = aDescriptor.getArray();					\
	sal_Int32 nPos = 0;												\

//----------------------------------------------------------------------------------
#define BEGIN_PROPERTY_HELPER(count)							\
	BEGIN_PROPERTY_SEQUENCE(count)

//----------------------------------------------------------------------------------
#define DECL_PROP_IMPL(varname, cpputype) \
	pDesc[nPos++] = ::com::sun::star::beans::Property(PROPERTY_##varname, PROPERTY_ID_##varname, cpputype,

//----------------------------------------------------------------------------------
#define DECL_PROP0(varname, type)	\
	DECL_PROP_IMPL(varname, ::getCppuType((const type *)0)) 0)
//----------------------------------------------------------------------------------
#define DECL_PROP0_BOOL(varname)	\
	DECL_PROP_IMPL(varname, ::getBooleanCppuType()) 0)
//----------------------------------------------------------------------------------
#define DECL_PROP0_IFACE(varname, iface)	\
	DECL_PROP_IMPL(varname, ::getCppuType(static_cast< ::com::sun::star::uno::Reference< iface >* >(NULL))) 0)

//----------------------------------------------------------------------------------
#define DECL_PROP1(varname, type, attrib1)	\
	DECL_PROP_IMPL(varname, ::getCppuType((const type *)0)) ::com::sun::star::beans::PropertyAttribute::attrib1)
//----------------------------------------------------------------------------------
#define DECL_PROP1_BOOL(varname, attrib1)	\
	DECL_PROP_IMPL(varname, ::getBooleanCppuType()) ::com::sun::star::beans::PropertyAttribute::attrib1)
//----------------------------------------------------------------------------------
#define DECL_PROP1_IFACE(varname, iface, attrib1)	\
	DECL_PROP_IMPL(varname, ::getCppuType(static_cast< ::com::sun::star::uno::Reference< iface >* >(NULL))) ::com::sun::star::beans::PropertyAttribute::attrib1)
//----------------------------------------------------------------------------------
#define DECL_PROP2_IFACE(varname, iface, attrib1, attrib2)	\
	DECL_PROP_IMPL(varname, ::getCppuType(static_cast< ::com::sun::star::uno::Reference< iface >* >(NULL))) ::com::sun::star::beans::PropertyAttribute::attrib1 | ::com::sun::star::beans::PropertyAttribute::attrib2)

//----------------------------------------------------------------------------------
#define DECL_PROP2(varname, type, attrib1, attrib2)	\
	DECL_PROP_IMPL(varname, ::getCppuType((const type *)0)) ::com::sun::star::beans::PropertyAttribute::attrib1 | ::com::sun::star::beans::PropertyAttribute::attrib2)
//----------------------------------------------------------------------------------
#define DECL_PROP2_BOOL(varname, attrib1, attrib2)	\
	DECL_PROP_IMPL(varname, ::getBooleanCppuType()) ::com::sun::star::beans::PropertyAttribute::attrib1 | ::com::sun::star::beans::PropertyAttribute::attrib2)

//----------------------------------------------------------------------------------
#define DECL_PROP3(varname, type, attrib1, attrib2, attrib3)	\
	DECL_PROP_IMPL(varname, ::getCppuType((const type *)0)) ::com::sun::star::beans::PropertyAttribute::attrib1 | ::com::sun::star::beans::PropertyAttribute::attrib2 | ::com::sun::star::beans::PropertyAttribute::attrib3)
//----------------------------------------------------------------------------------
#define DECL_PROP3_BOOL(varname, attrib1, attrib2, attrib3)	\
	DECL_PROP_IMPL(varname, ::getBooleanCppuType()) ::com::sun::star::beans::PropertyAttribute::attrib1 | ::com::sun::star::beans::PropertyAttribute::attrib2 | ::com::sun::star::beans::PropertyAttribute::attrib3)


//----------------------------------------------------------------------------------
#define END_PROPERTY_SEQUENCE()								\
	OSL_ENSURE(nPos == aDescriptor.getLength(), "forgot to adjust the count ?");	\

//----------------------------------------------------------------------------------
#define END_PROPERTY_HELPER()								\
	END_PROPERTY_SEQUENCE()	\
	return new ::cppu::OPropertyArrayHelper(aDescriptor);


#define NOTIFY_LISTERNERS(_rListeners,T,method)									  \
	Sequence< Reference< XInterface > > aListenerSeq = _rListeners.getElements(); \
																				  \
	const Reference< XInterface >* pxIntBegin = aListenerSeq.getConstArray();	  \
	const Reference< XInterface >* pxInt = pxIntBegin + aListenerSeq.getLength(); \
																				  \
	_rGuard.clear();															  \
	while( pxInt > pxIntBegin )													  \
	{																			  \
		try																		  \
		{																		  \
			while( pxInt > pxIntBegin )											  \
			{																	  \
				--pxInt;														  \
				static_cast< T* >( pxInt->get() )->method(aEvt);				  \
			}																	  \
		}																		  \
		catch( RuntimeException& )												  \
		{																		  \
		}																		  \
	}																			  \
	_rGuard.reset();

#define NOTIFY_LISTERNERS1(_rListeners,T,method,arg1)							  \
	Sequence< Reference< XInterface > > aListenerSeq = _rListeners.getElements(); \
																				  \
	const Reference< XInterface >* pxIntBegin = aListenerSeq.getConstArray();	  \
	const Reference< XInterface >* pxInt = pxIntBegin + aListenerSeq.getLength(); \
																				  \
	_rGuard.clear();															  \
	while( pxInt > pxIntBegin )													  \
	{																			  \
		try																		  \
		{																		  \
			while( pxInt > pxIntBegin )											  \
			{																	  \
				--pxInt;														  \
				static_cast< T* >( pxInt->get() )->method(aEvt,arg1);			  \
			}																	  \
		}																		  \
		catch( RuntimeException& )												  \
		{																		  \
		}																		  \
	}																			  \
	_rGuard.reset();


//==================================================================================
// miscellaneous
#define UNUSED(x)	x;

#endif // _DBASHARED_APITOOLS_HXX_

