diff --git a/remotebridges/source/factory/brdgfctr.xml b/remotebridges/source/factory/brdgfctr.xml index fde129c103c7..2bfd1e8fb2d5 100644 --- a/remotebridges/source/factory/brdgfctr.xml +++ b/remotebridges/source/factory/brdgfctr.xml @@ -40,6 +40,7 @@ com.sun.star.bridge.XInstanceProvider com.sun.star.bridge.XBridge com.sun.star.bridge.BridgeExistsException + com.sun.star.container.XContentEnumerationAccess com.sun.star.lang.XMultiServiceFactory com.sun.star.lang.XSingleServiceFactory com.sun.star.lang.XInitialization diff --git a/remotebridges/source/factory/bridgefactory.cxx b/remotebridges/source/factory/bridgefactory.cxx index e58a4b99017a..14597ba57ba8 100644 --- a/remotebridges/source/factory/bridgefactory.cxx +++ b/remotebridges/source/factory/bridgefactory.cxx @@ -2,9 +2,9 @@ * * $RCSfile: bridgefactory.cxx,v $ * - * $Revision: 1.1.1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: hr $ $Date: 2000-09-18 15:29:56 $ + * last change: $Author: jbu $ $Date: 2000-10-27 09:08:43 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -59,11 +59,11 @@ * ************************************************************************/ #include -#include #include #include +#include #include @@ -72,11 +72,15 @@ #include #include +#include #include #include +#include + + #include "bridgeimpl.hxx" using namespace ::rtl; @@ -88,19 +92,20 @@ using namespace ::com::sun::star::lang; using namespace ::com::sun::star::bridge; using namespace ::com::sun::star::connection; using namespace ::com::sun::star::registry; +using namespace ::com::sun::star::container; #define SERVICE_NAME "com.sun.star.bridge.BridgeFactory" #define IMPLEMENTATION_NAME "com.sun.star.comp.remotebridges.BridgeFactory" namespace remotebridges_factory { - struct hashOWString + struct hashOUString { size_t operator()(const OUString & s) const { return s.hashCode(); } }; - struct equalOWString + struct equalOUString { sal_Bool operator()(const OUString & s1 , const OUString &s2 ) const { @@ -112,15 +117,24 @@ namespace remotebridges_factory < OUString, WeakReference< XBridge >, - hashOWString, - equalOWString + hashOUString, + equalOUString > BridgeHashMap; + typedef ::std::hash_map + < + OUString, + OUString, + hashOUString, + equalOUString + > ServiceHashMap; + class OBridgeFactory : public MyMutex, public OComponentHelper, - public XBridgeFactory + public XBridgeFactory, + public XServiceInfo { public: OBridgeFactory( const Reference < XMultiServiceFactory > &rSMgr ); @@ -155,18 +169,91 @@ namespace remotebridges_factory virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId( ) throw(::com::sun::star::uno::RuntimeException); + private: //XServiceInfo + virtual OUString SAL_CALL getImplementationName( ) throw(RuntimeException); + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw(RuntimeException); + virtual Sequence< OUString > SAL_CALL getSupportedServiceNames( ) throw(RuntimeException); + + private: + void init(); + OUString getServiceNameForProtocol( const OUString &sProtocol ); + private: Reference < XMultiServiceFactory > m_rSMgr; BridgeHashMap m_mapBridge; + ServiceHashMap m_mapProtocolToService; + sal_Bool m_bInitialized; + ::osl::Mutex m_mutexInit; }; OBridgeFactory::OBridgeFactory( const Reference < XMultiServiceFactory > &rSMgr ) : OComponentHelper( m_mutex ), - m_rSMgr( rSMgr ) + m_rSMgr( rSMgr ), + m_bInitialized( sal_False ) { } + void OBridgeFactory::init() + { + MutexGuard guard( m_mutexInit ); + if( ! m_bInitialized ) + { + Reference< XContentEnumerationAccess > rContent( m_rSMgr , UNO_QUERY ); + if( rContent.is() ) + { + OUString sMetaService = OUString::createFromAscii( "com.sun.star.bridge.Bridge" ); + Reference < XEnumeration > rEnum = + rContent->createContentEnumeration( sMetaService ); + while( rEnum->hasMoreElements() ) + { + Any a = rEnum->nextElement(); + Reference rInfo; + if( a >>= rInfo ) + { + Sequence< OUString > seq = rInfo->getSupportedServiceNames(); + sal_Int32 i; + for( i = 0 ; i < seq.getLength() ; i ++ ) + { + if( seq.getConstArray()[i] != sMetaService ) + { + sal_Int32 nIndex = seq.getConstArray()[i].lastIndexOf( '.' ); + OUString sProtocol = seq.getConstArray()[i].copy( nIndex+1).toLowerCase(); + m_mapProtocolToService[ sProtocol ] = seq.getConstArray()[i]; + } + } + } + } + } + m_bInitialized = sal_True; + } + } + + OUString OBridgeFactory::getServiceNameForProtocol( const OUString & sProtocol ) + { + init(); + OUString sService; + OUString sProtocolName = sProtocol.toLowerCase(); + ServiceHashMap::iterator ii = m_mapProtocolToService.find( sProtocolName ); + if( ii != m_mapProtocolToService.end() ) + { + sService = (*ii).second; + } + else + { + // fallback to the old solution, deprecated, should be removed ! + OUString sService = OUString::createFromAscii( "com.sun.star.bridge.Bridge." ); + OUString sProtocolName = sProtocol; + sal_Int32 nIndex = sProtocol.indexOf( (sal_Unicode)',' ); + if( nIndex > 0 ) + { + sProtocolName = sProtocol.copy( 0 , nIndex ); + } + sService += sProtocolName; + } + return sService; + } + Any OBridgeFactory::queryInterface( const Type &aType ) { Any a = ::cppu::queryInterface( @@ -190,21 +277,12 @@ namespace remotebridges_factory ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException) { - OUString sService = OUString::createFromAscii( "com.sun.star.bridge.Bridge." ); - OUString sProtocolName = sProtocol; - sal_Int32 nIndex = sProtocol.indexOf( (sal_Unicode)',' ); - if( nIndex > 0 ) - { - sProtocolName = sProtocol.copy( 0 , nIndex ); - } - sService += sProtocolName; + OUString sService = getServiceNameForProtocol( sProtocol ); Reference < XInterface > rXInterface = m_rSMgr->createInstance ( sService ); - Reference < XInitialization > rInit = Reference< XInitialization > ( - rXInterface, - UNO_QUERY ); - + Reference < XInitialization > rInit(rXInterface, UNO_QUERY ); Reference < XBridge > rBridge( rInit , UNO_QUERY ); + if( rInit.is() && rBridge.is() ) { Sequence < Any > seqAny( 4 ); @@ -324,13 +402,6 @@ namespace remotebridges_factory return (*pId).getImplementationId(); } - - - Reference< XInterface > SAL_CALL CreateInstance( const Reference< XMultiServiceFactory > &r) - { - return Reference < XInterface > (( OWeakObject * ) new OBridgeFactory( r ) ); - } - Sequence< OUString > getSupportedServiceNames() { static Sequence < OUString > *pNames = 0; @@ -346,6 +417,37 @@ namespace remotebridges_factory } return *pNames; } + + OUString OBridgeFactory::getImplementationName( ) throw(RuntimeException) + { + return OUString::createFromAscii( IMPLEMENTATION_NAME ); + } + + sal_Bool SAL_CALL OBridgeFactory::supportsService( const OUString& ServiceName ) throw(RuntimeException) + { + Sequence< OUString > seq = remotebridges_factory::getSupportedServiceNames(); + sal_Bool bReturn = sal_False; + for( sal_Int32 i = 0 ; i < seq.getLength() ; i ++ ) + { + if( seq.getConstArray()[i] == ServiceName ) + { + bReturn = sal_True; + break; + } + } + return bReturn; + } + + Sequence< OUString > SAL_CALL OBridgeFactory::getSupportedServiceNames( ) throw(RuntimeException) + { + return remotebridges_factory::getSupportedServiceNames(); + } + + Reference< XInterface > SAL_CALL CreateInstance( const Reference< XMultiServiceFactory > &r) + { + return Reference < XInterface > (( OWeakObject * ) new OBridgeFactory( r ) ); + } + } using namespace remotebridges_factory;