/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_stoc.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef _CPPUHELPER_IMPLEMENTATIONENTRY_HXX__ #include #endif #include #include #include #include #include #include #include #define SERVICENAME "com.sun.star.loader.SharedLibrary" #define IMPLNAME "com.sun.star.comp.stoc.DLLComponentLoader" #define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) ) using namespace com::sun::star; using namespace com::sun::star::uno; using namespace com::sun::star::loader; using namespace com::sun::star::lang; using namespace com::sun::star::registry; using namespace cppu; using namespace rtl; using namespace osl; extern rtl_StandardModuleCount g_moduleCount; namespace stoc_bootstrap { Sequence< OUString > loader_getSupportedServiceNames() { static Sequence < OUString > *pNames = 0; if( ! pNames ) { MutexGuard guard( Mutex::getGlobalMutex() ); if( !pNames ) { static Sequence< OUString > seqNames(1); seqNames.getArray()[0] = OUString(RTL_CONSTASCII_USTRINGPARAM(SERVICENAME)); pNames = &seqNames; } } return *pNames; } OUString loader_getImplementationName() { static OUString *pImplName = 0; if( ! pImplName ) { MutexGuard guard( Mutex::getGlobalMutex() ); if( ! pImplName ) { static OUString implName( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME ) ); pImplName = &implName; } } return *pImplName; } } namespace stoc_loader { //************************************************************************* // DllComponentLoader //************************************************************************* class DllComponentLoader : public WeakImplHelper3< XImplementationLoader, XInitialization, XServiceInfo > { public: DllComponentLoader( const Reference & xCtx ); ~DllComponentLoader(); // XServiceInfo virtual OUString SAL_CALL getImplementationName( ) throw(::com::sun::star::uno::RuntimeException); virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw(::com::sun::star::uno::RuntimeException); virtual Sequence< OUString > SAL_CALL getSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException); // XInitialization virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments ) throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException); // XImplementationLoader virtual Reference SAL_CALL activate( const OUString& implementationName, const OUString& implementationLoaderUrl, const OUString& locationUrl, const Reference& xKey ) throw(CannotActivateFactoryException, RuntimeException); virtual sal_Bool SAL_CALL writeRegistryInfo( const Reference& xKey, const OUString& implementationLoaderUrl, const OUString& locationUrl ) throw(CannotRegisterImplementationException, RuntimeException); private: OUString expand_url( OUString const & url ) SAL_THROW( (RuntimeException) ); Reference m_xSMgr; }; //************************************************************************* DllComponentLoader::DllComponentLoader( const Reference & xCtx ) { g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt ); m_xSMgr.set( xCtx->getServiceManager(), UNO_QUERY ); } //************************************************************************* DllComponentLoader::~DllComponentLoader() { g_moduleCount.modCnt.release( &g_moduleCount.modCnt ); } //************************************************************************* OUString SAL_CALL DllComponentLoader::getImplementationName( ) throw(::com::sun::star::uno::RuntimeException) { return stoc_bootstrap::loader_getImplementationName(); } //************************************************************************* sal_Bool SAL_CALL DllComponentLoader::supportsService( const OUString& ServiceName ) throw(::com::sun::star::uno::RuntimeException) { Sequence< OUString > aSNL = getSupportedServiceNames(); const OUString * pArray = aSNL.getArray(); for( sal_Int32 i = 0; i < aSNL.getLength(); i++ ) if( pArray[i] == ServiceName ) return sal_True; return sal_False; } //************************************************************************* Sequence SAL_CALL DllComponentLoader::getSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException) { return stoc_bootstrap::loader_getSupportedServiceNames(); } //************************************************************************* void DllComponentLoader::initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& ) throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException) { OSL_ENSURE( 0, "dllcomponentloader::initialize should not be called !" ); // if( aArgs.getLength() != 1 ) // { // throw IllegalArgumentException(); // } // Reference< XMultiServiceFactory > rServiceManager; // if( aArgs.getConstArray()[0].getValueType().getTypeClass() == TypeClass_INTERFACE ) // { // aArgs.getConstArray()[0] >>= rServiceManager; // } // if( !rServiceManager.is() ) // { // throw IllegalArgumentException(); // } // m_xSMgr = rServiceManager; } //================================================================================================== OUString DllComponentLoader::expand_url( OUString const & url ) SAL_THROW( (RuntimeException) ) { try { return cppu::bootstrap_expandUri( url ); } catch ( IllegalArgumentException & e ) { throw RuntimeException( e.Message, e.Context ); } } //************************************************************************* Reference SAL_CALL DllComponentLoader::activate( const OUString & rImplName, const OUString &, const OUString & rLibName, const Reference< XRegistryKey > & xKey ) throw(CannotActivateFactoryException, RuntimeException) { return loadSharedLibComponentFactory( expand_url( rLibName ), OUString(), rImplName, m_xSMgr, xKey ); } //************************************************************************* sal_Bool SAL_CALL DllComponentLoader::writeRegistryInfo( const Reference< XRegistryKey > & xKey, const OUString &, const OUString & rLibName ) throw(CannotRegisterImplementationException, RuntimeException) { writeSharedLibComponentInfo( expand_url( rLibName ), OUString(), m_xSMgr, xKey ); return sal_True; } } namespace stoc_bootstrap { //************************************************************************* Reference SAL_CALL DllComponentLoader_CreateInstance( const Reference & xCtx ) throw(Exception) { Reference xRet; XImplementationLoader *pXLoader = (XImplementationLoader *)new stoc_loader::DllComponentLoader(xCtx); if (pXLoader) { xRet = Reference::query(pXLoader); } return xRet; } }