[Libreoffice-commits] core.git: include/vcl vcl/source

Caolán McNamara caolanm at redhat.com
Tue Apr 30 06:59:08 PDT 2013


 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 <caolanm at 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


More information about the Libreoffice-commits mailing list