diff --git a/antispamconfig.cpp b/antispamconfig.cpp index d155b2de1..71cb23a21 100644 --- a/antispamconfig.cpp +++ b/antispamconfig.cpp @@ -34,25 +34,36 @@ #include "antispamconfig.h" #include - -#include #include #include +#include + #include using namespace KMail; -AntiSpamConfig * AntiSpamConfig::sSelf = 0; -static K3StaticDeleter antispamconfig_sd; -AntiSpamConfig * AntiSpamConfig::instance() { - if ( !sSelf ) { - antispamconfig_sd.setObject( sSelf, new AntiSpamConfig() ); - sSelf->readConfig(); +namespace KMail { + class AntiSpamConfigSingletonProvider + { + public: + AntiSpamConfig instance; + }; +} + +K_GLOBAL_STATIC( AntiSpamConfigSingletonProvider, theAntiSpamConfigSingletonProvider ) + +AntiSpamConfig * AntiSpamConfig::instance() +{ + // better safe than sorry; check whether the global static has already been destroyed + if ( theAntiSpamConfigSingletonProvider.isDestroyed() ) + { + return 0; } - return sSelf; + return &theAntiSpamConfigSingletonProvider->instance; } + void AntiSpamConfig::readConfig() { mAgents.clear(); diff --git a/antispamconfig.h b/antispamconfig.h index 0fb4350b1..297d862d4 100644 --- a/antispamconfig.h +++ b/antispamconfig.h @@ -77,6 +77,8 @@ namespace KMail { typedef QList SpamAgents; typedef QList::Iterator SpamAgentsIterator; + class AntiSpamConfigSingletonProvider; + /** @short Singleton to manage loading the kmail.antispamrc file. @author Patrick Audley @@ -87,9 +89,8 @@ namespace KMail { public member functions. */ class AntiSpamConfig { + friend class AntiSpamConfigSingletonProvider; private: - static AntiSpamConfig * sSelf; - AntiSpamConfig() {} public: diff --git a/kmmainwidget.cpp b/kmmainwidget.cpp index 132317bad..603dc93bc 100644 --- a/kmmainwidget.cpp +++ b/kmmainwidget.cpp @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -65,7 +66,6 @@ #include #include #include -#include #include #include @@ -150,8 +150,7 @@ using KMail::TemplateParser; #include "kmmainwidget.moc" -QList* KMMainWidget::s_mainWidgetList = 0; -static K3StaticDeleter > mwlsd; +K_GLOBAL_STATIC( KMMainWidget::PtrList, theMainWidgetList ) static const int defaultMinimumWidth = 400; static const int defaultMinimumHeight = 300; @@ -206,9 +205,7 @@ KMMainWidget::KMMainWidget( QWidget *parent, KXMLGUIClient *aGUIClient, mMessageTagToolbarActionSeparator = new QAction( this ); mMessageTagToolbarActionSeparator->setSeparator( true ); - if( !s_mainWidgetList ) - mwlsd.setObject( s_mainWidgetList, new QList() ); - s_mainWidgetList->append( this ); + theMainWidgetList->append( this ); setMinimumSize( defaultMinimumWidth, defaultMinimumHeight ); @@ -274,7 +271,7 @@ KMMainWidget::KMMainWidget( QWidget *parent, KXMLGUIClient *aGUIClient, //perform all cleanup that requires the kernel in destruct() KMMainWidget::~KMMainWidget() { - s_mainWidgetList->removeAll( this ); + theMainWidgetList->removeAll( this ); qDeleteAll( mFilterCommands ); destruct(); } @@ -4162,6 +4159,17 @@ void KMMainWidget::setAccelsEnabled( bool enabled ) mAccel->setEnabled( enabled ); } +//----------------------------------------------------------------------------- +const KMMainWidget::PtrList * KMMainWidget::mainWidgetList() +{ + // better safe than sorry; check whether the global static has already been destroyed + if ( theMainWidgetList.isDestroyed() ) + { + return 0; + } + return theMainWidgetList; +} + //----------------------------------------------------------------------------- KMSystemTray *KMMainWidget::systray() const { diff --git a/kmmainwidget.h b/kmmainwidget.h index 0911f7ad0..65fcfbd78 100644 --- a/kmmainwidget.h +++ b/kmmainwidget.h @@ -89,6 +89,8 @@ class KMAIL_EXPORT KMMainWidget : public QWidget Q_OBJECT public: + typedef QList PtrList; + KMMainWidget(QWidget *parent, KXMLGUIClient *aGUIClient, KActionCollection *actionCollection, KConfig *config = KMKernel::config() ); @@ -156,7 +158,7 @@ class KMAIL_EXPORT KMMainWidget : public QWidget Returns a list of all KMMainWidgets. Warning, the list itself can be 0. @return the list of all main widgets, or 0 if it is not yet initialized */ - static const QList* mainWidgetList() { return s_mainWidgetList; } + static const PtrList *mainWidgetList(); KMSystemTray *systray() const; @@ -597,7 +599,6 @@ class KMAIL_EXPORT KMMainWidget : public QWidget KMail::MessageActions *mMsgActions; - static QList *s_mainWidgetList; bool mOpenedImapFolder; Q3Accel *mAccel; diff --git a/kmmsgdict.cpp b/kmmsgdict.cpp index e4bb3bdf0..d30e14d28 100644 --- a/kmmsgdict.cpp +++ b/kmmsgdict.cpp @@ -10,7 +10,7 @@ #include #include -#include +#include #include #include @@ -141,8 +141,13 @@ public: }; -static K3StaticDeleter msgDict_sd; -KMMsgDict * KMMsgDict::m_self = 0; +class KMMsgDictSingletonProvider +{ + public: + KMMsgDict instance; +}; + +K_GLOBAL_STATIC( KMMsgDictSingletonProvider, theKMMsgDictSingletonProvider ) //----------------------------------------------------------------------------- @@ -153,7 +158,6 @@ KMMsgDict::KMMsgDict() GlobalSettings::self()->setMsgDictSizeHint( 0 ); dict = new KMDict( lastSizeOfDict ); nextMsgSerNum = 1; - m_self = this; } //----------------------------------------------------------------------------- @@ -167,18 +171,22 @@ KMMsgDict::~KMMsgDict() const KMMsgDict* KMMsgDict::instance() { - if ( !m_self ) { - msgDict_sd.setObject( m_self, new KMMsgDict() ); + // better safe than sorry; check whether the global static has already been destroyed + if ( theKMMsgDictSingletonProvider.isDestroyed() ) + { + return 0; } - return m_self; + return &theKMMsgDictSingletonProvider->instance; } KMMsgDict* KMMsgDict::mutableInstance() { - if ( !m_self ) { - msgDict_sd.setObject( m_self, new KMMsgDict() ); + // better safe than sorry; check whether the global static has already been destroyed + if ( theKMMsgDictSingletonProvider.isDestroyed() ) + { + return 0; } - return m_self; + return &theKMMsgDictSingletonProvider->instance; } //----------------------------------------------------------------------------- diff --git a/kmmsgdict.h b/kmmsgdict.h index 304dd595a..d5b5bcb22 100644 --- a/kmmsgdict.h +++ b/kmmsgdict.h @@ -30,6 +30,8 @@ class KMDict; class QString; class FolderStorage; +class KMMsgDictSingletonProvider; + /** * @short KMail message dictionary. Keeps location information for every * message. The message serial number is the key for the dictionary. @@ -49,7 +51,7 @@ class FolderStorage; */ class KMMsgDict { - template friend class K3StaticDeleter; + friend class KMMsgDictSingletonProvider; public: /** Access the globally unique MessageDict */ static const KMMsgDict* instance(); @@ -158,9 +160,6 @@ private: /** The dictionary. */ KMDict *dict; - - /** The singleton instance */ - static KMMsgDict *m_self; }; #endif /* __KMMSGDICT */