Kaydet (Commit) 3a3b64a9 authored tarafından Caolán McNamara's avatar Caolán McNamara

retain references to loaded modules for builders lifetime

Change-Id: Iab8b53dc50d69ba781978e1e7fd9b9c5a19c6d59
üst 1b14676b
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#define _VCLBUILDER_HXX #define _VCLBUILDER_HXX
#include <typeinfo> #include <typeinfo>
#include <osl/module.hxx>
#include <tools/resmgr.hxx> //for poxy ResHookProc typedef #include <tools/resmgr.hxx> //for poxy ResHookProc typedef
#include <vcl/dllapi.h> #include <vcl/dllapi.h>
#include <vcl/window.hxx> #include <vcl/window.hxx>
...@@ -19,6 +20,7 @@ ...@@ -19,6 +20,7 @@
#include <set> #include <set>
#include <stack> #include <stack>
#include <vector> #include <vector>
#include <boost/ptr_container/ptr_map.hpp>
class ListBox; class ListBox;
class NumericFormatter; class NumericFormatter;
...@@ -34,6 +36,11 @@ public: ...@@ -34,6 +36,11 @@ public:
typedef std::map<OString, OString> stringmap; typedef std::map<OString, OString> stringmap;
typedef Window* (*customMakeWidget)(Window *pParent, stringmap &rVec); typedef Window* (*customMakeWidget)(Window *pParent, stringmap &rVec);
private: 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 struct PackingData
{ {
......
...@@ -1203,20 +1203,27 @@ Window *VclBuilder::makeObject(Window *pParent, const OString &name, const OStri ...@@ -1203,20 +1203,27 @@ Window *VclBuilder::makeObject(Window *pParent, const OString &name, const OStri
if (nDelim != -1) if (nDelim != -1)
{ {
#ifndef DISABLE_DYNLOADING #ifndef DISABLE_DYNLOADING
OUStringBuffer sModule; OUStringBuffer sModuleBuf;
#ifdef SAL_DLLPREFIX #ifdef SAL_DLLPREFIX
sModule.append(SAL_DLLPREFIX); sModuleBuf.append(SAL_DLLPREFIX);
#endif #endif
sModule.append(OStringToOUString(name.copy(0, nDelim), RTL_TEXTENCODING_UTF8)); sModuleBuf.append(OStringToOUString(name.copy(0, nDelim), RTL_TEXTENCODING_UTF8));
#ifdef SAL_DLLEXTENSION #ifdef SAL_DLLEXTENSION
sModule.append(SAL_DLLEXTENSION); sModuleBuf.append(SAL_DLLEXTENSION);
#endif #endif
#endif #endif
OUString sFunction(OStringToOUString(OString("make") + name.copy(nDelim+1), RTL_TEXTENCODING_UTF8)); OUString sFunction(OStringToOUString(OString("make") + name.copy(nDelim+1), RTL_TEXTENCODING_UTF8));
#ifndef DISABLE_DYNLOADING #ifndef DISABLE_DYNLOADING
osl::Module aModule; OUString sModule = sModuleBuf.makeStringAndClear();
aModule.loadRelative(&thisModule, sModule.makeStringAndClear()); ModuleMap::iterator aI = m_aModuleMap.find(sModule);
customMakeWidget pFunction = (customMakeWidget)aModule.getFunctionSymbol(sFunction); 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 #else
customMakeWidget pFunction = (customMakeWidget)osl_getFunctionSymbol((oslModule) RTLD_DEFAULT, sFunction.pData); customMakeWidget pFunction = (customMakeWidget)osl_getFunctionSymbol((oslModule) RTLD_DEFAULT, sFunction.pData);
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment