diff options
Diffstat (limited to 'stoc/source/loader/dllcomponentloader.cxx')
-rw-r--r-- | stoc/source/loader/dllcomponentloader.cxx | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/stoc/source/loader/dllcomponentloader.cxx b/stoc/source/loader/dllcomponentloader.cxx new file mode 100644 index 000000000000..d50f209718ed --- /dev/null +++ b/stoc/source/loader/dllcomponentloader.cxx @@ -0,0 +1,261 @@ +/************************************************************************* + * + * 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 + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_stoc.hxx" + +#include <stdlib.h> +#include <osl/file.h> +#include <vector> +#include <osl/mutex.hxx> +#include <osl/diagnose.h> +#include <osl/module.h> +#include <rtl/ustring.hxx> +#include <uno/environment.h> +#include <uno/mapping.hxx> +#include <cppuhelper/queryinterface.hxx> +#include <cppuhelper/weak.hxx> +#include <cppuhelper/factory.hxx> +#include <cppuhelper/shlib.hxx> +#include <cppuhelper/implbase3.hxx> +#ifndef _CPPUHELPER_IMPLEMENTATIONENTRY_HXX__ +#include <cppuhelper/implementationentry.hxx> +#endif +#include <cppuhelper/bootstrap.hxx> + +#include <com/sun/star/loader/XImplementationLoader.hpp> +#include <com/sun/star/lang/IllegalArgumentException.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/lang/XInitialization.hpp> +#include <com/sun/star/registry/XRegistryKey.hpp> + +#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<XComponentContext> & 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<XInterface> SAL_CALL activate( const OUString& implementationName, const OUString& implementationLoaderUrl, const OUString& locationUrl, const Reference<XRegistryKey>& xKey ) throw(CannotActivateFactoryException, RuntimeException); + virtual sal_Bool SAL_CALL writeRegistryInfo( const Reference<XRegistryKey>& xKey, const OUString& implementationLoaderUrl, const OUString& locationUrl ) throw(CannotRegisterImplementationException, RuntimeException); + +private: + OUString expand_url( OUString const & url ) + SAL_THROW( (RuntimeException) ); + + Reference<XMultiServiceFactory> m_xSMgr; +}; + +//************************************************************************* +DllComponentLoader::DllComponentLoader( const Reference<XComponentContext> & 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<OUString> 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<XInterface> 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<XInterface> SAL_CALL DllComponentLoader_CreateInstance( const Reference<XComponentContext> & xCtx ) throw(Exception) +{ + Reference<XInterface> xRet; + + XImplementationLoader *pXLoader = (XImplementationLoader *)new stoc_loader::DllComponentLoader(xCtx); + + if (pXLoader) + { + xRet = Reference<XInterface>::query(pXLoader); + } + + return xRet; +} + +} + |