summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/unotools/moduleoptions.hxx13
-rw-r--r--unotools/source/config/moduleoptions.cxx89
2 files changed, 40 insertions, 62 deletions
diff --git a/include/unotools/moduleoptions.hxx b/include/unotools/moduleoptions.hxx
index b2a7160ad7ad..3dfb4aaa8104 100644
--- a/include/unotools/moduleoptions.hxx
+++ b/include/unotools/moduleoptions.hxx
@@ -28,6 +28,7 @@
#include <sal/types.h>
#include <osl/mutex.hxx>
#include <unotools/options.hxx>
+#include <memory>
/*-************************************************************************************************************
@short forward declaration to our private date container implementation
@@ -86,7 +87,6 @@ class SAL_WARN_UNUSED UNOTOOLS_DLLPUBLIC SvtModuleOptions : public utl::detail::
};
public:
-
SvtModuleOptions();
virtual ~SvtModuleOptions();
@@ -169,16 +169,7 @@ class SAL_WARN_UNUSED UNOTOOLS_DLLPUBLIC SvtModuleOptions : public utl::detail::
private:
UNOTOOLS_DLLPRIVATE static ::osl::Mutex& impl_GetOwnStaticMutex();
- /*Attention
-
- Don't initialize these static members in these headers!
- a) Double defined symbols will be detected ...
- b) and unresolved externals exist at linking time.
- Do it in your source only.
- */
-
- static SvtModuleOptions_Impl* m_pDataContainer;
- static sal_Int32 m_nRefCount;
+ std::shared_ptr<SvtModuleOptions_Impl> m_pImpl;
}; // class SvtModuleOptions
diff --git a/unotools/source/config/moduleoptions.cxx b/unotools/source/config/moduleoptions.cxx
index 47f742ea72da..fa9d97de00ba 100644
--- a/unotools/source/config/moduleoptions.cxx
+++ b/unotools/source/config/moduleoptions.cxx
@@ -263,16 +263,6 @@ struct FactoryInfo
css::uno::Reference< css::util::XStringSubstitution > xSubstVars;
};
-/*-************************************************************************************************************
- @short IMPL data container for wrapper class SvtModulOptions!
- @descr These class is used as a static data container of class SvtModuleOptions. The hold it by using
- a refcount and make it threadsafe by using an osl mutex. So we don't must do anything for that.
- We can implement pure functionality to read/write configuration data only.
- @base ConfigItem
-
- @devstatus ready to use
- @threadsafe no
-*//*-*************************************************************************************************************/
class SvtModuleOptions_Impl : public ::utl::ConfigItem
{
@@ -815,12 +805,10 @@ void SvtModuleOptions_Impl::MakeReadonlyStatesAvailable()
m_bReadOnlyStatesWellKnown = true;
}
-// initialize static member
-// DON'T DO IT IN YOUR HEADER!
-// see definition for further information
-
-SvtModuleOptions_Impl* SvtModuleOptions::m_pDataContainer = nullptr;
-sal_Int32 SvtModuleOptions::m_nRefCount = 0;
+namespace {
+ //global
+ std::weak_ptr<SvtModuleOptions_Impl> g_pModuleOptions;
+}
/*-************************************************************************************************************
@short standard constructor and destructor
@@ -832,25 +820,24 @@ sal_Int32 SvtModuleOptions::m_nRefCount = 0;
*//*-*************************************************************************************************************/
SvtModuleOptions::SvtModuleOptions()
{
+ // Global access, must be guarded (multithreading!)
::osl::MutexGuard aGuard( impl_GetOwnStaticMutex() );
- ++m_nRefCount;
- if( m_nRefCount == 1 )
- {
- m_pDataContainer = new SvtModuleOptions_Impl();
+ m_pImpl = g_pModuleOptions.lock();
+ if( !m_pImpl )
+ {
+ m_pImpl = std::make_shared<SvtModuleOptions_Impl>();
+ g_pModuleOptions = m_pImpl;
ItemHolder1::holdConfigItem(E_MODULEOPTIONS);
}
}
SvtModuleOptions::~SvtModuleOptions()
{
+ // Global access, must be guarded (multithreading!)
::osl::MutexGuard aGuard( impl_GetOwnStaticMutex() );
- --m_nRefCount;
- if( m_nRefCount == 0 )
- {
- delete m_pDataContainer;
- m_pDataContainer = nullptr;
- }
+
+ m_pImpl.reset();
}
/*-************************************************************************************************************
@@ -864,19 +851,19 @@ SvtModuleOptions::~SvtModuleOptions()
bool SvtModuleOptions::IsModuleInstalled( EModule eModule ) const
{
::osl::MutexGuard aGuard( impl_GetOwnStaticMutex() );
- return m_pDataContainer->IsModuleInstalled( eModule );
+ return m_pImpl->IsModuleInstalled( eModule );
}
OUString SvtModuleOptions::GetFactoryName( EFactory eFactory ) const
{
::osl::MutexGuard aGuard( impl_GetOwnStaticMutex() );
- return m_pDataContainer->GetFactoryName( eFactory );
+ return m_pImpl->GetFactoryName( eFactory );
}
OUString SvtModuleOptions::GetFactoryStandardTemplate( EFactory eFactory ) const
{
::osl::MutexGuard aGuard( impl_GetOwnStaticMutex() );
- return m_pDataContainer->GetFactoryStandardTemplate( eFactory );
+ return m_pImpl->GetFactoryStandardTemplate( eFactory );
}
OUString SvtModuleOptions::GetFactoryEmptyDocumentURL( EFactory eFactory ) const
@@ -888,20 +875,20 @@ OUString SvtModuleOptions::GetFactoryEmptyDocumentURL( EFactory eFactory ) const
OUString SvtModuleOptions::GetFactoryDefaultFilter( EFactory eFactory ) const
{
::osl::MutexGuard aGuard( impl_GetOwnStaticMutex() );
- return m_pDataContainer->GetFactoryDefaultFilter( eFactory );
+ return m_pImpl->GetFactoryDefaultFilter( eFactory );
}
bool SvtModuleOptions::IsDefaultFilterReadonly( EFactory eFactory ) const
{
::osl::MutexGuard aGuard( impl_GetOwnStaticMutex() );
- m_pDataContainer->MakeReadonlyStatesAvailable();
- return m_pDataContainer->IsDefaultFilterReadonly( eFactory );
+ m_pImpl->MakeReadonlyStatesAvailable();
+ return m_pImpl->IsDefaultFilterReadonly( eFactory );
}
sal_Int32 SvtModuleOptions::GetFactoryIcon( EFactory eFactory ) const
{
::osl::MutexGuard aGuard( impl_GetOwnStaticMutex() );
- return m_pDataContainer->GetFactoryIcon( eFactory );
+ return m_pImpl->GetFactoryIcon( eFactory );
}
bool SvtModuleOptions::ClassifyFactoryByName( const OUString& sName ,
@@ -915,56 +902,56 @@ void SvtModuleOptions::SetFactoryStandardTemplate( EFactory eFacto
const OUString& sTemplate )
{
::osl::MutexGuard aGuard( impl_GetOwnStaticMutex() );
- m_pDataContainer->SetFactoryStandardTemplate( eFactory, sTemplate );
+ m_pImpl->SetFactoryStandardTemplate( eFactory, sTemplate );
}
void SvtModuleOptions::SetFactoryDefaultFilter( EFactory eFactory,
const OUString& sFilter )
{
::osl::MutexGuard aGuard( impl_GetOwnStaticMutex() );
- m_pDataContainer->SetFactoryDefaultFilter( eFactory, sFilter );
+ m_pImpl->SetFactoryDefaultFilter( eFactory, sFilter );
}
bool SvtModuleOptions::IsMath() const
{
::osl::MutexGuard aGuard( impl_GetOwnStaticMutex() );
- return m_pDataContainer->IsModuleInstalled( EModule::MATH );
+ return m_pImpl->IsModuleInstalled( EModule::MATH );
}
bool SvtModuleOptions::IsChart() const
{
::osl::MutexGuard aGuard( impl_GetOwnStaticMutex() );
- return m_pDataContainer->IsModuleInstalled( EModule::CHART );
+ return m_pImpl->IsModuleInstalled( EModule::CHART );
}
bool SvtModuleOptions::IsCalc() const
{
::osl::MutexGuard aGuard( impl_GetOwnStaticMutex() );
- return m_pDataContainer->IsModuleInstalled( EModule::CALC );
+ return m_pImpl->IsModuleInstalled( EModule::CALC );
}
bool SvtModuleOptions::IsDraw() const
{
::osl::MutexGuard aGuard( impl_GetOwnStaticMutex() );
- return m_pDataContainer->IsModuleInstalled( EModule::DRAW );
+ return m_pImpl->IsModuleInstalled( EModule::DRAW );
}
bool SvtModuleOptions::IsWriter() const
{
::osl::MutexGuard aGuard( impl_GetOwnStaticMutex() );
- return m_pDataContainer->IsModuleInstalled( EModule::WRITER );
+ return m_pImpl->IsModuleInstalled( EModule::WRITER );
}
bool SvtModuleOptions::IsImpress() const
{
::osl::MutexGuard aGuard( impl_GetOwnStaticMutex() );
- return m_pDataContainer->IsModuleInstalled( EModule::IMPRESS );
+ return m_pImpl->IsModuleInstalled( EModule::IMPRESS );
}
bool SvtModuleOptions::IsDataBase() const
{
::osl::MutexGuard aGuard( impl_GetOwnStaticMutex() );
- return m_pDataContainer->IsModuleInstalled( EModule::DATABASE );
+ return m_pImpl->IsModuleInstalled( EModule::DATABASE );
}
namespace
@@ -1157,27 +1144,27 @@ SvtModuleOptions::EFactory SvtModuleOptions::ClassifyFactoryByModel(const css::u
css::uno::Sequence < OUString > SvtModuleOptions::GetAllServiceNames()
{
::osl::MutexGuard aGuard( impl_GetOwnStaticMutex() );
- return m_pDataContainer->GetAllServiceNames();
+ return m_pImpl->GetAllServiceNames();
}
OUString SvtModuleOptions::GetDefaultModuleName()
{
OUString aModule;
- if (m_pDataContainer->IsModuleInstalled(SvtModuleOptions::EModule::WRITER))
+ if (m_pImpl->IsModuleInstalled(SvtModuleOptions::EModule::WRITER))
aModule = GetFactoryShortName(SvtModuleOptions::EFactory::WRITER);
- else if (m_pDataContainer->IsModuleInstalled(SvtModuleOptions::EModule::CALC))
+ else if (m_pImpl->IsModuleInstalled(SvtModuleOptions::EModule::CALC))
aModule = GetFactoryShortName(SvtModuleOptions::EFactory::CALC);
- else if (m_pDataContainer->IsModuleInstalled(SvtModuleOptions::EModule::IMPRESS))
+ else if (m_pImpl->IsModuleInstalled(SvtModuleOptions::EModule::IMPRESS))
aModule = GetFactoryShortName(SvtModuleOptions::EFactory::IMPRESS);
- else if (m_pDataContainer->IsModuleInstalled(SvtModuleOptions::EModule::DATABASE))
+ else if (m_pImpl->IsModuleInstalled(SvtModuleOptions::EModule::DATABASE))
aModule = GetFactoryShortName(SvtModuleOptions::EFactory::DATABASE);
- else if (m_pDataContainer->IsModuleInstalled(SvtModuleOptions::EModule::DRAW))
+ else if (m_pImpl->IsModuleInstalled(SvtModuleOptions::EModule::DRAW))
aModule = GetFactoryShortName(SvtModuleOptions::EFactory::DRAW);
- else if (m_pDataContainer->IsModuleInstalled(SvtModuleOptions::EModule::WEB))
+ else if (m_pImpl->IsModuleInstalled(SvtModuleOptions::EModule::WEB))
aModule = GetFactoryShortName(SvtModuleOptions::EFactory::WRITERWEB);
- else if (m_pDataContainer->IsModuleInstalled(SvtModuleOptions::EModule::GLOBAL))
+ else if (m_pImpl->IsModuleInstalled(SvtModuleOptions::EModule::GLOBAL))
aModule = GetFactoryShortName(SvtModuleOptions::EFactory::WRITERGLOBAL);
- else if (m_pDataContainer->IsModuleInstalled(SvtModuleOptions::EModule::MATH))
+ else if (m_pImpl->IsModuleInstalled(SvtModuleOptions::EModule::MATH))
aModule = GetFactoryShortName(SvtModuleOptions::EFactory::MATH);
return aModule;
}