diff options
Diffstat (limited to 'io/source/acceptor/acceptor.cxx')
-rw-r--r-- | io/source/acceptor/acceptor.cxx | 293 |
1 files changed, 138 insertions, 155 deletions
diff --git a/io/source/acceptor/acceptor.cxx b/io/source/acceptor/acceptor.cxx index 15df65592a33..fe761018de52 100644 --- a/io/source/acceptor/acceptor.cxx +++ b/io/source/acceptor/acceptor.cxx @@ -31,7 +31,6 @@ #include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/uno/XComponentContext.hpp> -#include <services.hxx> #include "acceptor.hxx" #include <memory> @@ -44,9 +43,7 @@ using namespace ::com::sun::star::uno; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::connection; -namespace io_acceptor -{ - namespace { +namespace { class OAcceptor : public WeakImplHelper< XAcceptor, XServiceInfo > { @@ -64,8 +61,8 @@ namespace io_acceptor virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override; private: - std::unique_ptr<PipeAcceptor> m_pPipe; - std::unique_ptr<SocketAcceptor> m_pSocket; + std::unique_ptr<io_acceptor::PipeAcceptor> m_pPipe; + std::unique_ptr<io_acceptor::SocketAcceptor> m_pSocket; Mutex m_mutex; OUString m_sLastDescription; bool m_bInAccept; @@ -75,199 +72,185 @@ namespace io_acceptor Reference<XAcceptor> _xAcceptor; }; - } +} - OAcceptor::OAcceptor( const Reference< XComponentContext > & xCtx ) - : m_bInAccept( false ) - , _xSMgr( xCtx->getServiceManager() ) - , _xCtx( xCtx ) - {} +OAcceptor::OAcceptor( const Reference< XComponentContext > & xCtx ) + : m_bInAccept( false ) + , _xSMgr( xCtx->getServiceManager() ) + , _xCtx( xCtx ) +{} - OAcceptor::~OAcceptor() - { - m_pPipe.reset(); - } +OAcceptor::~OAcceptor() +{ + m_pPipe.reset(); +} - namespace { +namespace { +struct BeingInAccept +{ + /// @throws AlreadyAcceptingException + BeingInAccept( bool *pFlag,const OUString & sConnectionDescription ) + : m_pFlag( pFlag ) + { + if( *m_pFlag ) + throw AlreadyAcceptingException( "AlreadyAcceptingException :" + sConnectionDescription ); + *m_pFlag = true; + } + ~BeingInAccept() + { + *m_pFlag = false; + } + bool *m_pFlag; +}; +} - struct BeingInAccept - { - /// @throws AlreadyAcceptingException - BeingInAccept( bool *pFlag,const OUString & sConnectionDescription ) - : m_pFlag( pFlag ) - { - if( *m_pFlag ) - throw AlreadyAcceptingException( "AlreadyAcceptingException :" + sConnectionDescription ); - *m_pFlag = true; - } - ~BeingInAccept() - { - *m_pFlag = false; - } - bool *m_pFlag; - }; +Reference< XConnection > OAcceptor::accept( const OUString &sConnectionDescription ) +{ + // if there is a thread already accepting in this object, throw an exception. + struct BeingInAccept guard( &m_bInAccept, sConnectionDescription ); + Reference< XConnection > r; + if( !m_sLastDescription.isEmpty() && + m_sLastDescription != sConnectionDescription ) + { + // instantiate another acceptor for different ports + throw ConnectionSetupException( "acceptor::accept called multiple times with different connection strings\n" ); } - Reference< XConnection > OAcceptor::accept( const OUString &sConnectionDescription ) + if( m_sLastDescription.isEmpty() ) { - // if there is a thread already accepting in this object, throw an exception. - struct BeingInAccept guard( &m_bInAccept, sConnectionDescription ); - - Reference< XConnection > r; - if( !m_sLastDescription.isEmpty() && - m_sLastDescription != sConnectionDescription ) - { - // instantiate another acceptor for different ports - throw ConnectionSetupException( "acceptor::accept called multiple times with different connection strings\n" ); - } - - if( m_sLastDescription.isEmpty() ) + // setup the acceptor + try { - // setup the acceptor - try + cppu::UnoUrlDescriptor aDesc(sConnectionDescription); + if ( aDesc.getName() == "pipe" ) { - cppu::UnoUrlDescriptor aDesc(sConnectionDescription); - if ( aDesc.getName() == "pipe" ) - { - OUString aName( - aDesc.getParameter( - "name")); + OUString aName( + aDesc.getParameter( + "name")); - m_pPipe.reset(new PipeAcceptor(aName, sConnectionDescription)); + m_pPipe.reset(new io_acceptor::PipeAcceptor(aName, sConnectionDescription)); - try - { - m_pPipe->init(); - } - catch( ... ) - { - { - MutexGuard g( m_mutex ); - m_pPipe.reset(); - } - throw; - } + try + { + m_pPipe->init(); } - else if ( aDesc.getName() == "socket" ) + catch( ... ) { - OUString aHost; - if (aDesc.hasParameter( - "host")) - aHost = aDesc.getParameter( - "host"); - else - aHost = "localhost"; - sal_uInt16 nPort = static_cast< sal_uInt16 >( - aDesc.getParameter( - "port"). - toInt32()); - bool bTcpNoDelay - = aDesc.getParameter( - "tcpnodelay").toInt32() != 0; - - m_pSocket.reset(new SocketAcceptor( - aHost, nPort, bTcpNoDelay, sConnectionDescription)); - - try { - m_pSocket->init(); - } - catch( ... ) - { - { - MutexGuard g( m_mutex ); - m_pSocket.reset(); - } - throw; + MutexGuard g( m_mutex ); + m_pPipe.reset(); } + throw; } + } + else if ( aDesc.getName() == "socket" ) + { + OUString aHost; + if (aDesc.hasParameter( + "host")) + aHost = aDesc.getParameter( + "host"); else + aHost = "localhost"; + sal_uInt16 nPort = static_cast< sal_uInt16 >( + aDesc.getParameter( + "port"). + toInt32()); + bool bTcpNoDelay + = aDesc.getParameter( + "tcpnodelay").toInt32() != 0; + + m_pSocket.reset(new io_acceptor::SocketAcceptor( + aHost, nPort, bTcpNoDelay, sConnectionDescription)); + + try { - OUString delegatee = "com.sun.star.connection.Acceptor." + aDesc.getName(); - _xAcceptor.set(_xSMgr->createInstanceWithContext(delegatee, _xCtx), UNO_QUERY); - - if(!_xAcceptor.is()) - throw ConnectionSetupException("Acceptor: unknown delegatee " + delegatee); + m_pSocket->init(); + } + catch( ... ) + { + { + MutexGuard g( m_mutex ); + m_pSocket.reset(); + } + throw; } } - catch (const rtl::MalformedUriException & rEx) + else { - throw IllegalArgumentException( - rEx.getMessage(), - Reference< XInterface > (), - 0 ); - } - m_sLastDescription = sConnectionDescription; - } + OUString delegatee = "com.sun.star.connection.Acceptor." + aDesc.getName(); + _xAcceptor.set(_xSMgr->createInstanceWithContext(delegatee, _xCtx), UNO_QUERY); - if( m_pPipe ) - { - r = m_pPipe->accept(); - } - else if( m_pSocket ) - { - r = m_pSocket->accept(); + if(!_xAcceptor.is()) + throw ConnectionSetupException("Acceptor: unknown delegatee " + delegatee); + } } - else + catch (const rtl::MalformedUriException & rEx) { - r = _xAcceptor->accept(sConnectionDescription); + throw IllegalArgumentException( + rEx.getMessage(), + Reference< XInterface > (), + 0 ); } - - return r; + m_sLastDescription = sConnectionDescription; } - void SAL_CALL OAcceptor::stopAccepting( ) + if( m_pPipe ) { - MutexGuard guard( m_mutex ); - - if( m_pPipe ) - { - m_pPipe->stopAccepting(); - } - else if ( m_pSocket ) - { - m_pSocket->stopAccepting(); - } - else if( _xAcceptor.is() ) - { - _xAcceptor->stopAccepting(); - } - + r = m_pPipe->accept(); } - - OUString acceptor_getImplementationName() + else if( m_pSocket ) { - return IMPLEMENTATION_NAME; + r = m_pSocket->accept(); } - - Reference< XInterface > acceptor_CreateInstance( const Reference< XComponentContext > & xCtx) + else { - return Reference < XInterface >( static_cast<OWeakObject *>(new OAcceptor(xCtx)) ); + r = _xAcceptor->accept(sConnectionDescription); } - Sequence< OUString > acceptor_getSupportedServiceNames() - { - Sequence< OUString > seqNames { SERVICE_NAME }; - return seqNames; - } + return r; +} + +void SAL_CALL OAcceptor::stopAccepting( ) +{ + MutexGuard guard( m_mutex ); - OUString OAcceptor::getImplementationName() + if( m_pPipe ) { - return acceptor_getImplementationName(); + m_pPipe->stopAccepting(); } - - sal_Bool OAcceptor::supportsService(const OUString& ServiceName) + else if ( m_pSocket ) { - return cppu::supportsService(this, ServiceName); + m_pSocket->stopAccepting(); } - - Sequence< OUString > OAcceptor::getSupportedServiceNames() + else if( _xAcceptor.is() ) { - return acceptor_getSupportedServiceNames(); + _xAcceptor->stopAccepting(); } +} + +OUString OAcceptor::getImplementationName() +{ + return IMPLEMENTATION_NAME; +} + +sal_Bool OAcceptor::supportsService(const OUString& ServiceName) +{ + return cppu::supportsService(this, ServiceName); +} +Sequence< OUString > OAcceptor::getSupportedServiceNames() +{ + return { SERVICE_NAME }; +} + +extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* +io_OAcceptor_get_implementation( + css::uno::XComponentContext* context, css::uno::Sequence<css::uno::Any> const&) +{ + return cppu::acquire(new OAcceptor(context)); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |