include/vcl/builder.hxx | 7 +++++++ vcl/source/window/builder.cxx | 21 ++++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-)
New commits: commit 3a3b64a964f92a63d15407fc7769311a9ecbfb48 Author: Caolán McNamara <caol...@redhat.com> Date: Tue Apr 30 14:55:14 2013 +0100 retain references to loaded modules for builders lifetime Change-Id: Iab8b53dc50d69ba781978e1e7fd9b9c5a19c6d59 diff --git a/include/vcl/builder.hxx b/include/vcl/builder.hxx index 5de792a..ff72766 100644 --- a/include/vcl/builder.hxx +++ b/include/vcl/builder.hxx @@ -11,6 +11,7 @@ #define _VCLBUILDER_HXX #include <typeinfo> +#include <osl/module.hxx> #include <tools/resmgr.hxx> //for poxy ResHookProc typedef #include <vcl/dllapi.h> #include <vcl/window.hxx> @@ -19,6 +20,7 @@ #include <set> #include <stack> #include <vector> +#include <boost/ptr_container/ptr_map.hpp> class ListBox; class NumericFormatter; @@ -34,6 +36,11 @@ public: typedef std::map<OString, OString> stringmap; typedef Window* (*customMakeWidget)(Window *pParent, stringmap &rVec); private: + typedef boost::ptr_map<OUString, osl::Module> ModuleMap; + //We store these until the builder is deleted, that way we can use the + //ui-previewer on custom widgets and guarantee the modules they are from + //exist for the duration of the dialog + ModuleMap m_aModuleMap; struct PackingData { diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index 0833a35..1cf5b8b 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -1203,20 +1203,27 @@ Window *VclBuilder::makeObject(Window *pParent, const OString &name, const OStri if (nDelim != -1) { #ifndef DISABLE_DYNLOADING - OUStringBuffer sModule; + OUStringBuffer sModuleBuf; #ifdef SAL_DLLPREFIX - sModule.append(SAL_DLLPREFIX); + sModuleBuf.append(SAL_DLLPREFIX); #endif - sModule.append(OStringToOUString(name.copy(0, nDelim), RTL_TEXTENCODING_UTF8)); + sModuleBuf.append(OStringToOUString(name.copy(0, nDelim), RTL_TEXTENCODING_UTF8)); #ifdef SAL_DLLEXTENSION - sModule.append(SAL_DLLEXTENSION); + sModuleBuf.append(SAL_DLLEXTENSION); #endif #endif OUString sFunction(OStringToOUString(OString("make") + name.copy(nDelim+1), RTL_TEXTENCODING_UTF8)); #ifndef DISABLE_DYNLOADING - osl::Module aModule; - aModule.loadRelative(&thisModule, sModule.makeStringAndClear()); - customMakeWidget pFunction = (customMakeWidget)aModule.getFunctionSymbol(sFunction); + OUString sModule = sModuleBuf.makeStringAndClear(); + ModuleMap::iterator aI = m_aModuleMap.find(sModule); + osl::Module* pModule = NULL; + if (aI == m_aModuleMap.end()) + { + pModule = new osl::Module; + pModule->loadRelative(&thisModule, sModule); + aI = m_aModuleMap.insert(sModule, pModule).first; + } + customMakeWidget pFunction = (customMakeWidget)aI->second->getFunctionSymbol(sFunction); #else customMakeWidget pFunction = (customMakeWidget)osl_getFunctionSymbol((oslModule) RTLD_DEFAULT, sFunction.pData); #endif
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits