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>
diff --git a/basctl/source/basicide/basicmod.hxx b/basctl/source/basicide/basicmod.hxx
index 3bed4f2..ffc960c 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 19d5961..2ea8a29 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 3b3e52c..d61a661 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 fed51d3..f442306 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 2b02ed1..afeb501 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 2761cce..1296740 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 85a4242..0000000
--- 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 c80b0ba..e6fa352 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 9a14c78..2e3ba3a 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 6f8a049..8b05dc5 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 7293b65..cb5f2c3 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 bc73b5f..c25abc6 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 c19c670..ed0c55b 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 9576391..6a27583 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 1f821f0..f665d7f 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 6dab36f..f5c5725 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 7ea9e34..a6465c5 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 71fabc3..bc98e98 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 6810c19..fe60207 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 738a6c5..64e16de 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 a0dc5c1..7a9e076 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 eb5607e..2d08802 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 69b6b7d..d6453aa 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 803c2b8..e9fa7f1 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 2916ad3..6ebf57e 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 414c7d2..0000000
--- 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: */