summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Page <aptitude@btconnect.com>2016-07-04 17:30:42 +0100
committerNoel Grandin <noelgrandin@gmail.com>2016-07-13 06:32:46 +0000
commitf7b1cd66167050afecf487e3d89ea12de74200b5 (patch)
tree75381b63bb5dca7ed1fa2ff5602064750f46f042
parent633413a37ee7442cd899db1269fd3ef404efe58a (diff)
Moved SfxModule owner to SfxApplication
::GetAppData replaced with SfxApplication::GetModule that now returns SfxModule* SfxModule no longer registers self for ownership instead it is now registered using SfxApplication::SetModule Change-Id: Ifbbe1b2b4c5122da8e643b7926d47878d116c6c8 Reviewed-on: https://gerrit.libreoffice.org/26914 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Noel Grandin <noelgrandin@gmail.com>
-rw-r--r--basctl/source/basicide/basicmod.hxx3
-rw-r--r--basctl/source/basicide/iderdll.cxx12
-rw-r--r--cui/source/options/treeopt.cxx9
-rw-r--r--cui/source/tabpages/autocdlg.cxx3
-rw-r--r--include/sfx2/app.hxx13
-rw-r--r--include/sfx2/module.hxx2
-rw-r--r--include/tools/shl.hxx87
-rw-r--r--sc/inc/scmod.hxx3
-rw-r--r--sc/source/ui/app/scdll.cxx9
-rw-r--r--sd/inc/sddll.hxx6
-rw-r--r--sd/inc/sdmod.hxx3
-rw-r--r--sd/qa/unit/misc-tests.cxx1
-rw-r--r--sd/source/core/drawdoc4.cxx1
-rw-r--r--sd/source/ui/app/sddll.cxx31
-rw-r--r--sd/source/ui/app/sdmod.cxx5
-rw-r--r--sfx2/source/appl/app.cxx17
-rw-r--r--sfx2/source/appl/module.cxx40
-rw-r--r--sfx2/source/inc/appdata.hxx4
-rw-r--r--starmath/inc/smmod.hxx3
-rw-r--r--starmath/source/smdll.cxx17
-rw-r--r--sw/CppunitTest_sw_htmlexport.mk1
-rw-r--r--sw/inc/swmodule.hxx3
-rw-r--r--sw/qa/extras/htmlexport/htmlexport.cxx1
-rw-r--r--sw/source/uibase/app/swdll.cxx11
-rw-r--r--tools/Library_tl.mk1
-rw-r--r--tools/source/misc/toolsdll.cxx33
26 files changed, 76 insertions, 243 deletions
diff --git a/basctl/source/basicide/basicmod.hxx b/basctl/source/basicide/basicmod.hxx
index 3bed4f242452..ffc960cea598 100644
--- a/basctl/source/basicide/basicmod.hxx
+++ b/basctl/source/basicide/basicmod.hxx
@@ -28,13 +28,10 @@ namespace basctl
class Module : public SfxModule
{
- static Module* mpModule;
public:
Module ( ResMgr *pMgr, SfxObjectFactory *pObjFact) :
SfxModule( pMgr, {pObjFact} )
{ }
-public:
- static Module*& Get () { return mpModule; }
};
} // namespace basctl
diff --git a/basctl/source/basicide/iderdll.cxx b/basctl/source/basicide/iderdll.cxx
index 19d5961eb93b..2ea8a295d113 100644
--- a/basctl/source/basicide/iderdll.cxx
+++ b/basctl/source/basicide/iderdll.cxx
@@ -32,7 +32,7 @@
#include <com/sun/star/frame/Desktop.hpp>
#include <com/sun/star/script/XLibraryContainerPassword.hpp>
#include <vcl/settings.hxx>
-
+#include <o3tl/make_unique.hxx>
namespace basctl
{
@@ -40,8 +40,6 @@ namespace basctl
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
-Module* Module::mpModule = nullptr;
-
namespace
{
@@ -106,7 +104,7 @@ ExtraData* GetExtraData()
IDEResId::IDEResId( sal_uInt16 nId ):
- ResId(nId, *Module::Get()->GetResMgr())
+ ResId(nId, *SfxApplication::GetModule(SfxToolsModule::Basic)->GetResMgr())
{ }
namespace
@@ -121,12 +119,12 @@ Dll::Dll () :
ResMgr* pMgr = ResMgr::CreateResMgr(
"basctl", Application::GetSettings().GetUILanguageTag());
- Module::Get() = new Module( pMgr, &DocShell::Factory() );
+ auto pModule = o3tl::make_unique<Module>( pMgr, &DocShell::Factory() );
+ SfxModule* pMod = pModule.get();
+ SfxApplication::SetModule(SfxToolsModule::Basic, std::move(pModule));
GetExtraData(); // to cause GlobalErrorHdl to be set
- SfxModule* pMod = Module::Get();
-
SfxObjectFactory& rFactory = DocShell::Factory();
rFactory.SetDocumentServiceName( "com.sun.star.script.BasicIDE" );
diff --git a/cui/source/options/treeopt.cxx b/cui/source/options/treeopt.cxx
index 3b3e52c62506..d61a661d2ce8 100644
--- a/cui/source/options/treeopt.cxx
+++ b/cui/source/options/treeopt.cxx
@@ -89,7 +89,6 @@
#include <svx/xtable.hxx>
#include <svx/xpool.hxx>
#include <toolkit/helper/vclunohelper.hxx>
-#include <tools/shl.hxx>
#include <tools/urlobj.hxx>
#include <unotools/linguprops.hxx>
#include <unotools/misccfg.hxx>
@@ -1586,7 +1585,7 @@ void OfaTreeOptionsDialog::Initialize( const Reference< XFrame >& _xFrame )
|| aFactory == "com.sun.star.text.WebDocument"
|| aFactory == "com.sun.star.text.GlobalDocument" )
{
- SfxModule* pSwMod = *reinterpret_cast<SfxModule**>(GetAppData(SHL_WRITER));
+ SfxModule* pSwMod = SfxApplication::GetModule(SfxToolsModule::Writer);
if ( !lcl_isOptionHidden( SID_SW_EDITOPTIONS, aOptionsDlgOpt ) )
{
if ( aFactory == "com.sun.star.text.WebDocument" )
@@ -1635,7 +1634,7 @@ void OfaTreeOptionsDialog::Initialize( const Reference< XFrame >& _xFrame )
if ( !lcl_isOptionHidden( SID_SC_EDITOPTIONS, aOptionsDlgOpt ) )
{
ResStringArray& rCalcArray = aDlgResource.GetCalcArray();
- SfxModule* pScMod = *reinterpret_cast<SfxModule**>(GetAppData( SHL_CALC ));
+ SfxModule* pScMod = SfxApplication::GetModule( SfxToolsModule::Calc );
setGroupName( "Calc", rCalcArray.GetString(0) );
nGroup = AddGroup( rCalcArray.GetString( 0 ), pScMod, pScMod, SID_SC_EDITOPTIONS );
const sal_uInt16 nCount = static_cast< const sal_uInt16 >( rCalcArray.Count() );
@@ -1652,7 +1651,7 @@ void OfaTreeOptionsDialog::Initialize( const Reference< XFrame >& _xFrame )
}
// Impress options
- SfxModule* pSdMod = *reinterpret_cast<SfxModule**>(GetAppData( SHL_DRAW ));
+ SfxModule* pSdMod = SfxApplication::GetModule( SfxToolsModule::Draw );
if ( aModuleOpt.IsModuleInstalled( SvtModuleOptions::EModule::IMPRESS ) )
{
if ( aFactory == "com.sun.star.presentation.PresentationDocument" )
@@ -1706,7 +1705,7 @@ void OfaTreeOptionsDialog::Initialize( const Reference< XFrame >& _xFrame )
if ( !lcl_isOptionHidden( SID_SM_EDITOPTIONS, aOptionsDlgOpt ) )
{
ResStringArray& rStarMathArray = aDlgResource.GetStarMathArray();
- SfxModule* pSmMod = *reinterpret_cast<SfxModule**>(GetAppData(SHL_SM));
+ SfxModule* pSmMod = SfxApplication::GetModule(SfxToolsModule::Math);
setGroupName( "Math", rStarMathArray.GetString(0) );
nGroup = AddGroup(rStarMathArray.GetString(0), pSmMod, pSmMod, SID_SM_EDITOPTIONS );
for ( i = 1; i < rStarMathArray.Count(); ++i )
diff --git a/cui/source/tabpages/autocdlg.cxx b/cui/source/tabpages/autocdlg.cxx
index fed51d356d7c..f44230610441 100644
--- a/cui/source/tabpages/autocdlg.cxx
+++ b/cui/source/tabpages/autocdlg.cxx
@@ -25,7 +25,6 @@
#include <vcl/settings.hxx>
#include <sot/exchange.hxx>
#include <svtools/transfer.hxx>
-#include <tools/shl.hxx>
#include <unotools/syslocale.hxx>
#include <sfx2/objsh.hxx>
#include <sfx2/viewsh.hxx>
@@ -882,7 +881,7 @@ OfaAutocorrReplacePage::OfaAutocorrReplacePage( vcl::Window* pParent,
get(m_pReplaceTLB, "tabview");
m_pReplaceTLB->set_height_request(16 * GetTextHeight());
- SfxModule *pMod = *reinterpret_cast<SfxModule**>(GetAppData(SHL_WRITER));
+ SfxModule *pMod = SfxApplication::GetModule(SfxToolsModule::Writer);
bSWriter = pMod == SfxModule::GetActiveModule();
LanguageTag aLanguageTag( eLastDialogLanguage );
diff --git a/include/sfx2/app.hxx b/include/sfx2/app.hxx
index 2b02ed1356a7..afeb50110fc2 100644
--- a/include/sfx2/app.hxx
+++ b/include/sfx2/app.hxx
@@ -88,6 +88,16 @@ namespace sfx2
}
}
+enum class SfxToolsModule
+{
+ Math = 0,
+ Calc = 1,
+ Draw = 2,
+ Writer = 3,
+ Basic = 4,
+ LAST = Basic
+};
+
class SfxLinkItem : public SfxPoolItem
{
Link<SfxPoolItem*, void> aLink;
@@ -224,6 +234,9 @@ public:
SAL_DLLPRIVATE SfxSlotPool& GetAppSlotPool_Impl() const;
SAL_DLLPRIVATE SfxModule* GetModule_Impl();
+ static void SetModule(SfxToolsModule nSharedLib, std::unique_ptr<SfxModule> pModule);
+ static SfxModule* GetModule(SfxToolsModule nSharedLib);
+
static bool loadBrandSvg(const char *pName, BitmapEx &rBitmap, int nWidth);
/** loads the application logo as used in the impress slideshow pause screen */
diff --git a/include/sfx2/module.hxx b/include/sfx2/module.hxx
index 2761cce2e1e9..12967402dd59 100644
--- a/include/sfx2/module.hxx
+++ b/include/sfx2/module.hxx
@@ -96,8 +96,6 @@ public:
static FieldUnit GetModuleFieldUnit( css::uno::Reference< css::frame::XFrame > const & i_frame );
FieldUnit GetFieldUnit() const;
- SAL_DLLPRIVATE static std::vector<SfxModule*>& GetModules_Impl();
- SAL_DLLPRIVATE static void DestroyModules_Impl();
SAL_DLLPRIVATE SfxTbxCtrlFactArr_Impl* GetTbxCtrlFactories_Impl() const;
SAL_DLLPRIVATE SfxStbCtrlFactArr_Impl* GetStbCtrlFactories_Impl() const;
SAL_DLLPRIVATE SfxChildWinFactArr_Impl* GetChildWinFactories_Impl() const;
diff --git a/include/tools/shl.hxx b/include/tools/shl.hxx
deleted file mode 100644
index 85a42429ca90..000000000000
--- a/include/tools/shl.hxx
+++ /dev/null
@@ -1,87 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#ifndef INCLUDED_TOOLS_SHL_HXX
-#define INCLUDED_TOOLS_SHL_HXX
-
-#include <tools/toolsdllapi.h>
-
-// GetAppData()
-
-// 0 (SHL_SHL1) removed
-// 1 (SHL_SHL2) removed
-// 2 (SHL_SHL3) removed
-// 3 (SHL_APP1) removed
-// 4 (SHL_APP2) removed
-// 5 (SHL_APP3) removed
-// 6 (SHL_TOOLS) removed
-// 7 (SHL_SV) removed
-// 8 (SHL_SVT) removed
-// 9 (SHL_SVDDE) removed
-// 10 (SHL_ERR) removed
-//11 (SHL_IPC) removed
-//12 (SHL_SVX) removed
-//13 (SHL_ITEM) removed
-//14 (SHL_SVD) removed
-//15 (SHL_SI) removed
-//16 (SHL_SFC) removed
-//17 (SHL_SFX) removed
-//18 (SHL_SO2) removed
-//19 (SHL_IDL) removed
-//20 (SHL_IDE) removed
-//21 (SHL_EDIT) removed
-//22 (SHL_VCED) removed
-//23 (SHL_BASIC) removed
-//24 (SHL_HELP) removed
-//25 (SHL_LNKCCH) removed
-//26 (SHL_CHANNEL) removed
-//27 (SHL_SBX) removed
-//28 (SHL_SBC) removed
-//29 (SHL_SDB) removed
-//30 (SHL_SBA) removed
-//31 (SHL_SBA2) removed
-//32 (SHL_SCH) removed
-//33 (SHL_SIM) removed
-#define SHL_SM 34
-//35 (SHL_SGA) removed
-//36 (SHL_DOCMGR) removed
-//37 removed
-//38 (SHL_MAIL) removed
-//39 (SHL_NEWS) removed
-//40 (SHL_OFFAPP) removed
-//41 (SHL_INET) removed
-//43 (SHL_CHAOS) removed
-//43 (SHL_HISTORY) removed
-//44 (SHL_SJ) removed
-#define SHL_CALC 45
-#define SHL_DRAW 46
-#define SHL_WRITER 47
-//48 (SHL_MONEY) removed
-//49 (SHL_HBCI) removed
-//50 (SHL_BASE3D) removed
-//51 (SHL_BRUSHITEM) removed
-//52 (SHL_SFONTITEM) removed
-
-#define SHL_COUNT 53
-
-TOOLS_DLLPUBLIC void** GetAppData( sal_uInt16 nSharedLib );
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/inc/scmod.hxx b/sc/inc/scmod.hxx
index c80b0ba43b3f..e6fa35247cc8 100644
--- a/sc/inc/scmod.hxx
+++ b/sc/inc/scmod.hxx
@@ -28,7 +28,6 @@
#include "global.hxx"
#include "shellids.hxx"
#include <unotools/options.hxx>
-#include <tools/shl.hxx>
#include <map>
#include <list>
@@ -255,7 +254,7 @@ public:
SC_DLLPUBLIC vcl::Window * Find1RefWindow( sal_uInt16 nSlotId, vcl::Window *pWndAncestor );
};
-#define SC_MOD() ( *reinterpret_cast<ScModule**>(GetAppData(SHL_CALC)) )
+#define SC_MOD() ( static_cast<ScModule*>(SfxApplication::GetModule(SfxToolsModule::Calc)) )
void global_InitAppOptions();
diff --git a/sc/source/ui/app/scdll.cxx b/sc/source/ui/app/scdll.cxx
index 9a14c78ee23f..2e3ba3a9474a 100644
--- a/sc/source/ui/app/scdll.cxx
+++ b/sc/source/ui/app/scdll.cxx
@@ -102,6 +102,7 @@
#include "dwfunctr.hxx"
#include "acredlin.hxx"
+#include <o3tl/make_unique.hxx>
ScResId::ScResId( sal_uInt16 nId ) :
ResId( nId, *SC_MOD()->GetResMgr() )
@@ -110,14 +111,14 @@ ScResId::ScResId( sal_uInt16 nId ) :
void ScDLL::Init()
{
- ScModule **ppShlPtr = reinterpret_cast<ScModule**>(GetAppData(SHL_CALC));
- if ( *ppShlPtr )
+ if ( SfxApplication::GetModule(SfxToolsModule::Calc) ) // Module already active
return;
ScDocumentPool::InitVersionMaps(); // Is needed in the ScModule ctor
- ScModule* pMod = new ScModule( &ScDocShell::Factory() );
- (*ppShlPtr) = pMod;
+ auto pUniqueModule = o3tl::make_unique<ScModule>(&ScDocShell::Factory());
+ ScModule* pMod = pUniqueModule.get();
+ SfxApplication::SetModule(SfxToolsModule::Calc, std::move(pUniqueModule));
ScDocShell::Factory().SetDocumentServiceName( "com.sun.star.sheet.SpreadsheetDocument" );
diff --git a/sd/inc/sddll.hxx b/sd/inc/sddll.hxx
index 6f8a04957f4f..8b05dc5270c4 100644
--- a/sd/inc/sddll.hxx
+++ b/sd/inc/sddll.hxx
@@ -23,6 +23,8 @@
#include <sfx2/module.hxx>
#include "sddllapi.h"
+class SdModule;
+
/*************************************************************************
|*
|* This class is a wrapper for a Load-On-Demand-DLL. One instance
@@ -40,8 +42,8 @@ protected:
static void RegisterRemotes();
#endif
static void RegisterFactorys();
- static void RegisterInterfaces();
- static void RegisterControllers();
+ static void RegisterInterfaces(SdModule* pMod);
+ static void RegisterControllers(SdModule* pMod);
public:
// Ctor/Dtor must be linked to the application
diff --git a/sd/inc/sdmod.hxx b/sd/inc/sdmod.hxx
index 7293b65f3061..cb5f2c3adbaa 100644
--- a/sd/inc/sdmod.hxx
+++ b/sd/inc/sdmod.hxx
@@ -24,7 +24,6 @@
#include "pres.hxx"
#include <sot/storage.hxx>
-#include <tools/shl.hxx>
#include "sddllapi.h"
#include <svl/itemprop.hxx>
#include <svl/lstner.hxx>
@@ -192,7 +191,7 @@ private:
};
-#define SD_MOD() ( *reinterpret_cast<SdModule**>(GetAppData(SHL_DRAW)) )
+#define SD_MOD() ( static_cast<SdModule*>(SfxApplication::GetModule(SfxToolsModule::Draw)) )
#endif // INCLUDED_SD_INC_SDMOD_HXX
diff --git a/sd/qa/unit/misc-tests.cxx b/sd/qa/unit/misc-tests.cxx
index bc73b5f33a21..c25abc6ac6c4 100644
--- a/sd/qa/unit/misc-tests.cxx
+++ b/sd/qa/unit/misc-tests.cxx
@@ -23,7 +23,6 @@
#include <osl/thread.hxx>
#include <FactoryIds.hxx>
#include <sdmod.hxx>
-#include <tools/shl.hxx>
#include <svx/sdr/table/tablecontroller.hxx>
#include <sfx2/request.hxx>
#include <svx/svxids.hrc>
diff --git a/sd/source/core/drawdoc4.cxx b/sd/source/core/drawdoc4.cxx
index c19c67013d02..ed0c55bdf306 100644
--- a/sd/source/core/drawdoc4.cxx
+++ b/sd/source/core/drawdoc4.cxx
@@ -85,7 +85,6 @@
#include <svx/svditer.hxx>
#include <svx/svdogrp.hxx>
#include <svx/svdlayer.hxx>
-#include <tools/shl.hxx>
#include <editeng/numitem.hxx>
#include <editeng/editeng.hxx>
#include <editeng/unolingu.hxx>
diff --git a/sd/source/ui/app/sddll.cxx b/sd/source/ui/app/sddll.cxx
index 957639119e20..6a2758308c43 100644
--- a/sd/source/ui/app/sddll.cxx
+++ b/sd/source/ui/app/sddll.cxx
@@ -94,6 +94,7 @@
#include <sfx2/sidebar/SidebarChildWindow.hxx>
#include <vcl/FilterConfigItem.hxx>
#include <comphelper/processfactory.hxx>
+#include <o3tl/make_unique.hxx>
using namespace ::com::sun::star;
@@ -119,10 +120,9 @@ void SdDLL::RegisterFactorys()
// Register all Interfaces
-void SdDLL::RegisterInterfaces()
+void SdDLL::RegisterInterfaces(SdModule* pMod)
{
// Module
- SfxModule* pMod = SD_MOD();
SdModule::RegisterInterface(pMod);
// View shell base.
@@ -157,10 +157,8 @@ void SdDLL::RegisterInterfaces()
// Register all Controllers
-void SdDLL::RegisterControllers()
+void SdDLL::RegisterControllers(SdModule* pMod)
{
- SfxModule* pMod = SD_MOD();
-
SdTbxCtlDiaPages::RegisterControl( SID_PAGES_PER_ROW, pMod );
SdTbxCtlGlueEscDir::RegisterControl( SID_GLUE_ESCDIR, pMod );
@@ -244,7 +242,7 @@ void SdDLL::RegisterControllers()
void SdDLL::Init()
{
- if ( SD_MOD() )
+ if ( SfxApplication::GetModule(SfxToolsModule::Draw) ) // Module already active
return;
SfxObjectFactory* pDrawFact = nullptr;
@@ -256,20 +254,9 @@ void SdDLL::Init()
if (!utl::ConfigManager::IsAvoidConfig() && SvtModuleOptions().IsDraw())
pDrawFact = &::sd::GraphicDocShell::Factory();
- // the SdModule must be created
- SdModule** ppShlPtr = reinterpret_cast<SdModule**>(GetAppData(SHL_DRAW));
-
- // #i46427#
- // The SfxModule::SfxModule stops when the first given factory
- // is 0, so we must not give a 0 as first factory
- if( pImpressFact )
- {
- (*ppShlPtr) = new SdModule( pImpressFact, pDrawFact );
- }
- else
- {
- (*ppShlPtr) = new SdModule( pDrawFact, pImpressFact );
- }
+ auto pUniqueModule = o3tl::make_unique<SdModule>(pImpressFact, pDrawFact);
+ SdModule* pModule = pUniqueModule.get();
+ SfxApplication::SetModule(SfxToolsModule::Draw, std::move(pUniqueModule));
if (!utl::ConfigManager::IsAvoidConfig() && SvtModuleOptions().IsImpress())
{
@@ -287,10 +274,10 @@ void SdDLL::Init()
RegisterFactorys();
// register your shell-interfaces here
- RegisterInterfaces();
+ RegisterInterfaces(pModule);
// register your controllers here
- RegisterControllers();
+ RegisterControllers(pModule);
// register SvDraw-Fields
SdrRegisterFieldClasses();
diff --git a/sd/source/ui/app/sdmod.cxx b/sd/source/ui/app/sdmod.cxx
index 1f821f0b652f..f665d7f5960a 100644
--- a/sd/source/ui/app/sdmod.cxx
+++ b/sd/source/ui/app/sdmod.cxx
@@ -110,11 +110,6 @@ SdModule::~SdModule()
mpResourceContainer.reset();
- // Mark the module in the global AppData structure as deleted.
- SdModule** ppShellPointer = reinterpret_cast<SdModule**>(GetAppData(SHL_DRAW));
- if (ppShellPointer != nullptr)
- (*ppShellPointer) = nullptr;
-
delete mpErrorHdl;
mpVirtualRefDevice.disposeAndClear();
}
diff --git a/sfx2/source/appl/app.cxx b/sfx2/source/appl/app.cxx
index 6dab36f4b8c1..f5c5725b658c 100644
--- a/sfx2/source/appl/app.cxx
+++ b/sfx2/source/appl/app.cxx
@@ -128,6 +128,20 @@ SfxApplication* SfxApplication::Get()
return g_pSfxApplication;
}
+void SfxApplication::SetModule(SfxToolsModule nSharedLib, std::unique_ptr<SfxModule> pModule)
+{
+ assert(g_pSfxApplication != nullptr);
+
+ g_pSfxApplication->pImpl->aModules[nSharedLib] = std::move(pModule);
+}
+
+SfxModule* SfxApplication::GetModule(SfxToolsModule nSharedLib)
+{
+ if (!g_pSfxApplication) // It is possible GetModule is called before SfxApplication is initialised via GetOrCreate()
+ return nullptr;
+ return g_pSfxApplication->pImpl->aModules[nSharedLib].get();
+}
+
SfxApplication* SfxApplication::GetOrCreate()
{
// SFX on demand
@@ -207,7 +221,8 @@ SfxApplication::~SfxApplication()
Broadcast( SfxSimpleHint(SFX_HINT_DYING) );
- SfxModule::DestroyModules_Impl();
+ for (auto &module : pImpl->aModules) // Clear modules
+ module.reset();
#if HAVE_FEATURE_DESKTOP
delete pSfxHelp;
diff --git a/sfx2/source/appl/module.cxx b/sfx2/source/appl/module.cxx
index 7ea9e345cfd7..a6465c5967f2 100644
--- a/sfx2/source/appl/module.cxx
+++ b/sfx2/source/appl/module.cxx
@@ -42,8 +42,6 @@
#include "childwinimpl.hxx"
#include <ctrlfactoryimpl.hxx>
-static std::vector<SfxModule*>* pModules=nullptr;
-
class SfxModule_Impl
{
public:
@@ -117,8 +115,6 @@ SfxModule::SfxModule( ResMgr* pMgrP, std::initializer_list<SfxObjectFactory*> pF
void SfxModule::Construct_Impl()
{
SfxApplication *pApp = SfxGetpApp();
- std::vector<SfxModule*> &rArr = GetModules_Impl();
- rArr.push_back( this );
pImpl = new SfxModule_Impl;
pImpl->pSlotPool = new SfxSlotPool(&pApp->GetAppSlotPool_Impl());
@@ -134,21 +130,6 @@ void SfxModule::Construct_Impl()
SfxModule::~SfxModule()
{
- if ( SfxGetpApp()->Get_Impl() )
- {
- // The module will be destroyed before the Deinitialize,
- // so remove from the array
- std::vector<SfxModule*>& rArr = GetModules_Impl();
- for( sal_uInt16 nPos = rArr.size(); nPos--; )
- {
- if( rArr[ nPos ] == this )
- {
- rArr.erase( rArr.begin() + nPos );
- break;
- }
- }
- }
-
delete pImpl;
delete pResMgr;
}
@@ -249,27 +230,6 @@ VclPtr<SfxTabPage> SfxModule::CreateTabPage( sal_uInt16, vcl::Window*, const Sfx
return VclPtr<SfxTabPage>();
}
-std::vector<SfxModule*>& SfxModule::GetModules_Impl()
-{
- if( !pModules )
- pModules = new std::vector<SfxModule*>;
- return *pModules;
-};
-
-void SfxModule::DestroyModules_Impl()
-{
- if ( pModules )
- {
- for( sal_uInt16 nPos = pModules->size(); nPos--; )
- {
- SfxModule* pMod = (*pModules)[nPos];
- delete pMod;
- }
- delete pModules;
- pModules = nullptr;
- }
-}
-
void SfxModule::Invalidate( sal_uInt16 nId )
{
for( SfxViewFrame* pFrame = SfxViewFrame::GetFirst(); pFrame; pFrame = SfxViewFrame::GetNext( *pFrame ) )
diff --git a/sfx2/source/inc/appdata.hxx b/sfx2/source/inc/appdata.hxx
index 71fabc3e47b4..bc98e985dcb3 100644
--- a/sfx2/source/inc/appdata.hxx
+++ b/sfx2/source/inc/appdata.hxx
@@ -27,7 +27,7 @@
#include <svtools/ehdl.hxx>
#include <vcl/timer.hxx>
#include <sfx2/app.hxx>
-
+#include <o3tl/enumarray.hxx>
#include <com/sun/star/frame/XModel.hpp>
#include "bitset.hxx"
@@ -133,6 +133,8 @@ public:
SfxDocumentTemplates* GetDocumentTemplates();
void DeInitDDE();
+ o3tl::enumarray<SfxToolsModule, std::unique_ptr<SfxModule>> aModules;
+
/** called when the Application's BasicManager has been created. This can happen
explicitly in SfxApplication::GetBasicManager, or implicitly if a document's
BasicManager is created before the application's BasicManager exists.
diff --git a/starmath/inc/smmod.hxx b/starmath/inc/smmod.hxx
index 6810c19252a4..fe6020716152 100644
--- a/starmath/inc/smmod.hxx
+++ b/starmath/inc/smmod.hxx
@@ -24,7 +24,6 @@
#include <svl/lstner.hxx>
#include <svtools/colorcfg.hxx>
-#include <tools/shl.hxx>
#include "tools/rc.hxx"
#include <sfx2/module.hxx>
@@ -125,7 +124,7 @@ public:
virtual VclPtr<SfxTabPage> CreateTabPage( sal_uInt16 nId, vcl::Window* pParent, const SfxItemSet& rSet ) override;
};
-#define SM_MOD() ( *reinterpret_cast<SmModule**>(GetAppData(SHL_SM)) )
+#define SM_MOD() ( static_cast<SmModule*>(SfxApplication::GetModule(SfxToolsModule::Math)) )
#endif // INCLUDED_STARMATH_INC_SMMOD_HXX
diff --git a/starmath/source/smdll.cxx b/starmath/source/smdll.cxx
index 738a6c51abbc..64e16de81ec6 100644
--- a/starmath/source/smdll.cxx
+++ b/starmath/source/smdll.cxx
@@ -38,6 +38,7 @@
#include <starmath.hrc>
#include <svx/xmlsecctrl.hxx>
+#include <o3tl/make_unique.hxx>
namespace
{
@@ -50,13 +51,14 @@ namespace
SmDLL::SmDLL()
{
- SmModule** ppShlPtr = reinterpret_cast<SmModule**>(GetAppData(SHL_SM));
- if ( *ppShlPtr )
+ if ( SfxApplication::GetModule(SfxToolsModule::Math) ) // Module already active
return;
SfxObjectFactory& rFactory = SmDocShell::Factory();
- SmModule *pModule = new SmModule( &rFactory );
- *ppShlPtr = pModule;
+
+ auto pUniqueModule = o3tl::make_unique<SmModule>(&rFactory);
+ SmModule* pModule = pUniqueModule.get();
+ SfxApplication::SetModule(SfxToolsModule::Math, std::move(pUniqueModule));
rFactory.SetDocumentServiceName( "com.sun.star.formula.FormulaProperties" );
@@ -79,13 +81,6 @@ namespace
SmDLL::~SmDLL()
{
-#if 0
- // the SdModule must be destroyed
- SmModule** ppShlPtr = (SmModule**) GetAppData(SHL_SM);
- delete (*ppShlPtr);
- (*ppShlPtr) = NULL;
- *GetAppData(SHL_SM) = 0;
-#endif
}
struct theSmDLLInstance : public rtl::Static<SmDLL, theSmDLLInstance> {};
diff --git a/sw/CppunitTest_sw_htmlexport.mk b/sw/CppunitTest_sw_htmlexport.mk
index a0dc5c118f43..7a9e07696a71 100644
--- a/sw/CppunitTest_sw_htmlexport.mk
+++ b/sw/CppunitTest_sw_htmlexport.mk
@@ -21,6 +21,7 @@ $(eval $(call gb_CppunitTest_use_libraries,sw_htmlexport, \
cppuhelper \
i18nlangtag \
sal \
+ sfx \
sw \
test \
tl \
diff --git a/sw/inc/swmodule.hxx b/sw/inc/swmodule.hxx
index eb5607e8d709..2d088022fe1e 100644
--- a/sw/inc/swmodule.hxx
+++ b/sw/inc/swmodule.hxx
@@ -23,7 +23,6 @@
#include <unotools/options.hxx>
#include <sfx2/module.hxx>
-#include <tools/shl.hxx>
#include "swdllapi.h"
#include "shellid.hxx"
#include <fldupde.hxx>
@@ -248,7 +247,7 @@ inline const css::uno::Reference< css::linguistic2::XLinguServiceEventListener >
// Access to SwModule, the View and the shell.
-#define SW_MOD() ( *reinterpret_cast<SwModule**>(GetAppData(SHL_WRITER)))
+#define SW_MOD() ( static_cast<SwModule*>(SfxApplication::GetModule(SfxToolsModule::Writer)))
SW_DLLPUBLIC SwView* GetActiveView();
SW_DLLPUBLIC SwWrtShell* GetActiveWrtShell();
diff --git a/sw/qa/extras/htmlexport/htmlexport.cxx b/sw/qa/extras/htmlexport/htmlexport.cxx
index 69b6b7db6c54..d6453aa81af3 100644
--- a/sw/qa/extras/htmlexport/htmlexport.cxx
+++ b/sw/qa/extras/htmlexport/htmlexport.cxx
@@ -50,7 +50,6 @@ private:
if (OString(filename) == "charborder.odt")
{
-
// FIXME if padding-top gets exported as inches, not cms, we get rounding errors.
SwGlobals::ensure(); // make sure that SW_MOD() is not 0
std::unique_ptr<Resetter> pResetter(new Resetter(
diff --git a/sw/source/uibase/app/swdll.cxx b/sw/source/uibase/app/swdll.cxx
index 803c2b8cc376..e9fa7f196e31 100644
--- a/sw/source/uibase/app/swdll.cxx
+++ b/sw/source/uibase/app/swdll.cxx
@@ -48,7 +48,7 @@
#include <unomid.h>
#include "swdllimpl.hxx"
-
+#include <o3tl/make_unique.hxx>
using namespace com::sun::star;
namespace
@@ -81,9 +81,7 @@ namespace SwGlobals
SwDLL::SwDLL()
{
- // the SdModule must be created
- SwModule** ppShlPtr = reinterpret_cast<SwModule**>(GetAppData(SHL_WRITER));
- if ( *ppShlPtr )
+ if ( SfxApplication::GetModule(SfxToolsModule::Writer) ) // Module already active
return;
std::unique_ptr<SvtModuleOptions> xOpt;
@@ -99,8 +97,9 @@ SwDLL::SwDLL()
SfxObjectFactory* pWDocFact = &SwWebDocShell::Factory();
- SwModule* pModule = new SwModule( pWDocFact, pDocFact, pGlobDocFact );
- *ppShlPtr = pModule;
+ auto pUniqueModule = o3tl::make_unique<SwModule>(pWDocFact, pDocFact, pGlobDocFact);
+ SwModule* pModule = pUniqueModule.get();
+ SfxApplication::SetModule(SfxToolsModule::Writer, std::move(pUniqueModule));
pWDocFact->SetDocumentServiceName("com.sun.star.text.WebDocument");
diff --git a/tools/Library_tl.mk b/tools/Library_tl.mk
index 2916ad3becf4..6ebf57ef40b5 100644
--- a/tools/Library_tl.mk
+++ b/tools/Library_tl.mk
@@ -71,7 +71,6 @@ $(eval $(call gb_Library_add_exception_objects,tl,\
tools/source/misc/cpuid \
tools/source/misc/extendapplicationenvironment \
tools/source/misc/getprocessworkingdir \
- tools/source/misc/toolsdll \
tools/source/rc/rc \
tools/source/rc/resary \
tools/source/rc/resmgr \
diff --git a/tools/source/misc/toolsdll.cxx b/tools/source/misc/toolsdll.cxx
deleted file mode 100644
index 414c7d23ca44..000000000000
--- a/tools/source/misc/toolsdll.cxx
+++ /dev/null
@@ -1,33 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include <tools/shl.hxx>
-
-static void* aAppData[SHL_COUNT];
-
-/*
- * Query data for other libraries
- */
-
-void** GetAppData( sal_uInt16 nSharedLib )
-{
- return &(aAppData[nSharedLib]);
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */