From 3d3a3e5e07f647ef7c631772f5cde899d9bb9b57 Mon Sep 17 00:00:00 2001 From: Mathias Bauer Date: Sat, 12 Jun 2010 20:29:06 +0200 Subject: CWS mba33issues01: put code to load libraries on demand into class SvLibrary --- tools/inc/tools/svlibrary.hxx | 41 ++++++++++++ tools/prj/d.lst | 1 + tools/source/generic/makefile.mk | 3 +- tools/source/generic/svlibrary.cxx | 129 +++++++++++++++++++++++++++++++++++++ 4 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 tools/inc/tools/svlibrary.hxx create mode 100644 tools/source/generic/svlibrary.cxx (limited to 'tools') diff --git a/tools/inc/tools/svlibrary.hxx b/tools/inc/tools/svlibrary.hxx new file mode 100644 index 000000000000..2d85b9764802 --- /dev/null +++ b/tools/inc/tools/svlibrary.hxx @@ -0,0 +1,41 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ +#ifndef _SVLIBRARY_HXX +#define _SVLIBRARY_HXX + +#include "tools/toolsdllapi.h" + +#include +#include + +class TOOLS_DLLPUBLIC SvLibrary +{ +public: + static bool LoadModule( osl::Module&, const rtl::OUString& rLibName, ::oslGenericFunction baseModule, ::sal_Int32 mode = SAL_LOADMODULE_DEFAULT ); +}; + +#endif \ No newline at end of file diff --git a/tools/prj/d.lst b/tools/prj/d.lst index 6b4a99a3a676..e0291c2f8ad0 100644 --- a/tools/prj/d.lst +++ b/tools/prj/d.lst @@ -37,6 +37,7 @@ mkdir: %_DEST%\inc%_EXT%\bootstrp ..\inc\tools\postextstl.h %_DEST%\inc%_EXT%\tools\postextstl.h ..\inc\tools\preextstl.h %_DEST%\inc%_EXT%\tools\preextstl.h +..\inc\tools\svlibrary.hxx %_DEST%\inc%_EXT%\tools\svlibrary.hxx ..\inc\tools\solarmutex.hxx %_DEST%\inc%_EXT%\tools\solarmutex.hxx ..\inc\tools\wintypes.hxx %_DEST%\inc%_EXT%\tools\wintypes.hxx ..\inc\tools\mapunit.hxx %_DEST%\inc%_EXT%\tools\mapunit.hxx diff --git a/tools/source/generic/makefile.mk b/tools/source/generic/makefile.mk index 5cdaa02065ae..07bab82f32b0 100644 --- a/tools/source/generic/makefile.mk +++ b/tools/source/generic/makefile.mk @@ -37,9 +37,10 @@ TARGET=gen # --- Files -------------------------------------------------------- -EXCEPTIONSFILES = $(SLO)$/poly.obj $(OBJ)$/poly.obj +EXCEPTIONSFILES = $(SLO)$/poly.obj $(OBJ)$/poly.obj $(SLO)$/svlibrary.obj SLOFILES= $(SLO)$/toolsin.obj \ + $(SLO)$/svlibrary.obj \ $(SLO)$/b3dtrans.obj \ $(SLO)$/link.obj \ $(SLO)$/bigint.obj \ diff --git a/tools/source/generic/svlibrary.cxx b/tools/source/generic/svlibrary.cxx new file mode 100644 index 000000000000..365d61ca4244 --- /dev/null +++ b/tools/source/generic/svlibrary.cxx @@ -0,0 +1,129 @@ +/************************************************************************* + * + * 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_tools.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace com::sun::star; + +static uno::Sequence< rtl::OUString > GetMultiPaths_Impl() +{ + uno::Sequence< rtl::OUString > aRes; + uno::Sequence< rtl::OUString > aInternalPaths; + uno::Sequence< rtl::OUString > aUserPaths; + + bool bSuccess = true; + uno::Reference< lang::XMultiServiceFactory > xMgr( comphelper::getProcessServiceFactory() ); + if (xMgr.is()) + { + try + { + String aInternal; + aInternal.AppendAscii("Libraries"); + String aUser; + aUser.AppendAscii("Libraries"); + aInternal .AppendAscii( "_internal" ); + aUser .AppendAscii( "_user" ); + + uno::Reference< beans::XPropertySet > xPathSettings( xMgr->createInstance( + rtl::OUString::createFromAscii( "com.sun.star.util.PathSettings" ) ), uno::UNO_QUERY_THROW ); + xPathSettings->getPropertyValue( aInternal ) >>= aInternalPaths; + xPathSettings->getPropertyValue( aUser ) >>= aUserPaths; + } + catch (uno::Exception &) + { + bSuccess = false; + } + } + if (bSuccess) + { + sal_Int32 nMaxEntries = aInternalPaths.getLength() + aUserPaths.getLength(); + aRes.realloc( nMaxEntries ); + rtl::OUString *pRes = aRes.getArray(); + sal_Int32 nCount = 0; // number of actually added entries + for (int i = 0; i < 2; ++i) + { + const uno::Sequence< rtl::OUString > &rPathSeq = i == 0 ? aUserPaths : aInternalPaths; + const rtl::OUString *pPathSeq = rPathSeq.getConstArray(); + for (sal_Int32 k = 0; k < rPathSeq.getLength(); ++k) + { + const bool bAddUser = (&rPathSeq == &aUserPaths); + const bool bAddInternal = (&rPathSeq == &aInternalPaths); + if ((bAddUser || bAddInternal) && pPathSeq[k].getLength() > 0) + pRes[ nCount++ ] = pPathSeq[k]; + } + } + aRes.realloc( nCount ); + } + + return aRes; +} + +bool SvLibrary::LoadModule( osl::Module& rModule, const rtl::OUString& rLibName, ::oslGenericFunction baseModule, ::sal_Int32 mode ) +{ + static uno::Sequence < rtl::OUString > aPaths = GetMultiPaths_Impl(); + bool bLoaded = false; + + for (sal_Int32 n=0; n xComponentContext = comphelper::getProcessComponentContext(); + uno::Reference< util::XMacroExpander > xMacroExpander; + xComponentContext->getValueByName( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("/singletons/com.sun.star.util.theMacroExpander") ) ) + >>= xMacroExpander; + + aMod = aMod.copy( sizeof("vnd.sun.star.expand:") -1 ); + aMod = ::rtl::Uri::decode( aMod, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8 ); + aMod = xMacroExpander->expandMacros( aMod ); + } + + aMod += ::rtl::OUString( sal_Unicode('/') ); + aMod += rLibName; + bLoaded = rModule.load( aMod, mode ); + if ( bLoaded ) + break; + } + + if (!bLoaded ) + bLoaded = rModule.loadRelative( baseModule, rLibName, mode ); + + return bLoaded; +} -- cgit From f456a5cd95093b62a5ed0b956173c5ed55151ca3 Mon Sep 17 00:00:00 2001 From: Mathias Bauer Date: Sat, 12 Jun 2010 21:26:57 +0200 Subject: CWS mba33issues01: typo --- tools/source/generic/svlibrary.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tools') diff --git a/tools/source/generic/svlibrary.cxx b/tools/source/generic/svlibrary.cxx index 365d61ca4244..6ebfd0086b5c 100644 --- a/tools/source/generic/svlibrary.cxx +++ b/tools/source/generic/svlibrary.cxx @@ -34,7 +34,7 @@ #include #include #include -#include +#include #include #include #include -- cgit From 53b64badd63099eecf393c2a9afc27d816014940 Mon Sep 17 00:00:00 2001 From: Mathias Bauer Date: Mon, 14 Jun 2010 18:35:49 +0200 Subject: CWS mba33issues01: missing EOF --- tools/inc/tools/svlibrary.hxx | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'tools') diff --git a/tools/inc/tools/svlibrary.hxx b/tools/inc/tools/svlibrary.hxx index 2d85b9764802..fa8ff7c8068b 100644 --- a/tools/inc/tools/svlibrary.hxx +++ b/tools/inc/tools/svlibrary.hxx @@ -29,13 +29,14 @@ #include "tools/toolsdllapi.h" -#include -#include - -class TOOLS_DLLPUBLIC SvLibrary -{ -public: +#include +#include + +class TOOLS_DLLPUBLIC SvLibrary +{ +public: static bool LoadModule( osl::Module&, const rtl::OUString& rLibName, ::oslGenericFunction baseModule, ::sal_Int32 mode = SAL_LOADMODULE_DEFAULT ); }; -#endif \ No newline at end of file +#endif + -- cgit