/************************************************************** * * 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 _TOOLKIT_HELPER_MACROS_HXX_ #define _TOOLKIT_HELPER_MACROS_HXX_ // ------------------------------------------------------------------------------------- #define IMPL_XUNOTUNNEL( ClassName ) \ sal_Int64 ClassName::getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& rIdentifier ) throw(::com::sun::star::uno::RuntimeException) \ { \ if( ( rIdentifier.getLength() == 16 ) && ( 0 == rtl_compareMemory( ClassName::GetUnoTunnelId().getConstArray(), rIdentifier.getConstArray(), 16 ) ) ) \ { \ return sal::static_int_cast< sal_Int64 >(reinterpret_cast< sal_IntPtr >(this)); \ } \ return 0; \ } \ const ::com::sun::star::uno::Sequence< sal_Int8 >& ClassName::GetUnoTunnelId() throw() \ { \ static ::com::sun::star::uno::Sequence< sal_Int8 > * pSeq = NULL; \ if( !pSeq ) \ { \ ::osl::Guard< ::osl::Mutex > aGuard( ::osl::Mutex::getGlobalMutex() ); \ if( !pSeq ) \ { \ static ::com::sun::star::uno::Sequence< sal_Int8 > aSeq( 16 ); \ rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True ); \ pSeq = &aSeq; \ } \ } \ return *pSeq; \ } \ ClassName* ClassName::GetImplementation( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& rxIFace ) throw() \ { \ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XUnoTunnel > xUT( rxIFace, ::com::sun::star::uno::UNO_QUERY ); \ return xUT.is() ? reinterpret_cast(sal::static_int_cast(xUT->getSomething( ClassName::GetUnoTunnelId() ))) : NULL; \ } #define IMPL_XUNOTUNNEL2( ClassName, BaseClass ) \ sal_Int64 ClassName::getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& rIdentifier ) throw(::com::sun::star::uno::RuntimeException) \ { \ if( ( rIdentifier.getLength() == 16 ) && ( 0 == rtl_compareMemory( ClassName::GetUnoTunnelId().getConstArray(), rIdentifier.getConstArray(), 16 ) ) ) \ { \ return sal::static_int_cast< sal_Int64 >(reinterpret_cast< sal_IntPtr >(this)); \ } \ return BaseClass::getSomething( rIdentifier ); \ } \ const ::com::sun::star::uno::Sequence< sal_Int8 >& ClassName::GetUnoTunnelId() throw() \ { \ static ::com::sun::star::uno::Sequence< sal_Int8 > * pSeq = NULL; \ if( !pSeq ) \ { \ ::osl::Guard< ::osl::Mutex > aGuard( ::osl::Mutex::getGlobalMutex() ); \ if( !pSeq ) \ { \ static ::com::sun::star::uno::Sequence< sal_Int8 > aSeq( 16 ); \ rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True ); \ pSeq = &aSeq; \ } \ } \ return *pSeq; \ } \ ClassName* ClassName::GetImplementation( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& rxIFace ) throw() \ { \ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XUnoTunnel > xUT( rxIFace, ::com::sun::star::uno::UNO_QUERY ); \ return xUT.is() ? reinterpret_cast(sal::static_int_cast(xUT->getSomething( ClassName::GetUnoTunnelId() ))) : NULL; \ } // ------------------------------------------------------------------------------------- #define IMPL_IMPLEMENTATION_ID( ClassName ) \ ::com::sun::star::uno::Sequence< sal_Int8 > ClassName::getImplementationId() throw(::com::sun::star::uno::RuntimeException) \ { \ static ::cppu::OImplementationId* pId = NULL; \ if( !pId ) \ { \ ::osl::Guard< ::osl::Mutex > aGuard( ::osl::Mutex::getGlobalMutex() ); \ if( ! pId ) \ { \ static ::cppu::OImplementationId id( sal_False ); \ pId = &id; \ } \ } \ return (*pId).getImplementationId(); \ } #define IMPL_XTYPEPROVIDER_START( ClassName ) \ IMPL_IMPLEMENTATION_ID( ClassName ) \ ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > ClassName::getTypes() throw(::com::sun::star::uno::RuntimeException) \ { \ static ::cppu::OTypeCollection* pCollection = NULL; \ if( !pCollection ) \ { \ ::osl::Guard< ::osl::Mutex > aGuard( ::osl::Mutex::getGlobalMutex() ); \ if( !pCollection ) \ { \ static ::cppu::OTypeCollection collection( \ getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::lang::XTypeProvider>* ) NULL ), // ------------------------------------------------------------------------------------- #define IMPL_XTYPEPROVIDER_END \ ); \ pCollection = &collection; \ } \ } \ return (*pCollection).getTypes(); \ } // ------------------------------------------------------------------------------------- #define DECL_LISTENERMULTIPLEXER_START( ClassName, InterfaceName ) \ class ClassName : public ListenerMultiplexerBase, public InterfaceName \ { \ public: \ ClassName( ::cppu::OWeakObject& rSource ); \ ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); \ void SAL_CALL acquire() throw() { ListenerMultiplexerBase::acquire(); } \ void SAL_CALL release() throw() { ListenerMultiplexerBase::release(); } \ void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw(::com::sun::star::uno::RuntimeException); // ------------------------------------------------------------------------------------- #define DECL_LISTENERMULTIPLEXER_START_DLLPUB( ClassName, InterfaceName ) \ class TOOLKIT_DLLPUBLIC ClassName : public ListenerMultiplexerBase, public InterfaceName \ { \ public: \ ClassName( ::cppu::OWeakObject& rSource ); \ ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); \ void SAL_CALL acquire() throw() { ListenerMultiplexerBase::acquire(); } \ void SAL_CALL release() throw() { ListenerMultiplexerBase::release(); } \ void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw(::com::sun::star::uno::RuntimeException); // ------------------------------------------------------------------------------------- #define DECL_LISTENERMULTIPLEXER_END \ }; // ------------------------------------------------------------------------------------- #define IMPL_LISTENERMULTIPLEXER_BASEMETHODS( ClassName, InterfaceName ) \ ClassName::ClassName( ::cppu::OWeakObject& rSource ) \ : ListenerMultiplexerBase( rSource ) \ { \ } \ ::com::sun::star::uno::Any ClassName::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException) \ { \ ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType, \ SAL_STATIC_CAST( ::com::sun::star::lang::XEventListener*, this ), \ SAL_STATIC_CAST( InterfaceName*, this ) ); \ return (aRet.hasValue() ? aRet : ListenerMultiplexerBase::queryInterface( rType )); \ } \ void ClassName::disposing( const ::com::sun::star::lang::EventObject& ) throw(::com::sun::star::uno::RuntimeException) \ { \ } // ------------------------------------------------------------------------------------- #if OSL_DEBUG_LEVEL > 0 #define DISPLAY_EXCEPTION( ClassName, MethodName, e ) \ ::rtl::OString sMessage( #ClassName "::" #MethodName ": caught an exception!\n" ); \ sMessage += ::rtl::OString( e.Message.getStr(), e.Message.getLength(), RTL_TEXTENCODING_ASCII_US ); \ OSL_ENSURE( sal_False, sMessage.getStr() ); #else #define DISPLAY_EXCEPTION( ClassName, MethodName, e ) #endif #define IMPL_LISTENERMULTIPLEXER_LISTENERMETHOD_BODY( ClassName, InterfaceName, MethodName, EventType ) \ { \ EventType aMulti( evt ); \ aMulti.Source = &GetContext(); \ ::cppu::OInterfaceIteratorHelper aIt( *this ); \ while( aIt.hasMoreElements() ) \ { \ ::com::sun::star::uno::Reference< InterfaceName > xListener( \ static_cast< InterfaceName* >( aIt.next() ) ); \ try \ { \ xListener->MethodName( aMulti ); \ } \ catch( ::com::sun::star::lang::DisposedException e ) \ { \ OSL_ENSURE( e.Context.is(), "caught DisposedException with empty Context field" ); \ if ( e.Context == xListener || !e.Context.is() ) \ aIt.remove(); \ } \ catch( ::com::sun::star::uno::RuntimeException e ) \ { \ DISPLAY_EXCEPTION( ClassName, MethodName, e ) \ } \ } \ } #define IMPL_LISTENERMULTIPLEXER_LISTENERMETHOD_EXCEPTION( ClassName, InterfaceName, MethodName, EventType, Exception ) \ void ClassName::MethodName( const EventType& evt ) throw(::com::sun::star::uno::RuntimeException, Exception) \ IMPL_LISTENERMULTIPLEXER_LISTENERMETHOD_BODY( ClassName, InterfaceName, MethodName, EventType ) #define IMPL_LISTENERMULTIPLEXER_LISTENERMETHOD( ClassName, InterfaceName, MethodName, EventType ) \ void ClassName::MethodName( const EventType& evt ) throw(::com::sun::star::uno::RuntimeException) \ IMPL_LISTENERMULTIPLEXER_LISTENERMETHOD_BODY( ClassName, InterfaceName, MethodName, EventType ) // ------------------------------------------------------------------------------------- #define DECLIMPL_SUPPORTS_SERVICE( ) \ sal_Bool SAL_CALL supportsService( const ::rtl::OUString& rServiceName ) throw(::com::sun::star::uno::RuntimeException) \ { \ ::com::sun::star::uno::Sequence< ::rtl::OUString > aServiceNames( getSupportedServiceNames() ); \ const ::rtl::OUString* pSupported = aServiceNames.getConstArray(); \ const ::rtl::OUString* pSupportedEnd = pSupported + aServiceNames.getLength(); \ for ( ; pSupported != pSupportedEnd; ++pSupported ) \ if ( *pSupported == rServiceName ) \ return sal_True; \ return sal_False; \ } // ------------------------------------------------------------------------------------- #define DECLIMPL_SERVICEINFO_DERIVED( ImplName, BaseClass, ServiceName ) \ ::rtl::OUString SAL_CALL getImplementationName( ) throw(::com::sun::star::uno::RuntimeException) { return ::rtl::OUString::createFromAscii( "stardiv.Toolkit." #ImplName ); } \ ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException) \ { \ ::com::sun::star::uno::Sequence< ::rtl::OUString > aNames = BaseClass::getSupportedServiceNames( ); \ aNames.realloc( aNames.getLength() + 1 ); \ aNames[ aNames.getLength() - 1 ] = ::rtl::OUString::createFromAscii( ServiceName ); \ return aNames; \ } \ // ------------------------------------------------------------------------------------- #define DECLIMPL_SERVICEINFO( ImplName, ServiceName ) \ ::rtl::OUString SAL_CALL getImplementationName( ) throw(::com::sun::star::uno::RuntimeException) { return ::rtl::OUString::createFromAscii( "stardiv.Toolkit." #ImplName ); } \ ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException) \ { \ ::com::sun::star::uno::Sequence< ::rtl::OUString > aNames( 1 ); \ aNames[ 0 ] = ::rtl::OUString::createFromAscii( ServiceName ); \ return aNames; \ } \ DECLIMPL_SUPPORTS_SERVICE( ) #endif // _TOOLKIT_HELPER_MACROS_HXX_