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 @@
#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
{
......
......@@ -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
......
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