From: Vadim Zeitlin Date: Sun, 17 Jan 1999 22:44:04 +0000 (+0000) Subject: OnExit() is called for modules which were initialized even if the init of X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/8aa4edd248534c4c1879c93d363d1b7fb8e8c5c6 OnExit() is called for modules which were initialized even if the init of the subsequent modules fails git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1422 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/module.h b/include/wx/module.h index c91f0e126a..e15b4de06b 100644 --- a/include/wx/module.h +++ b/include/wx/module.h @@ -13,37 +13,46 @@ #define _WX_MODULEH__ #ifdef __GNUG__ -#pragma interface "module.h" + #pragma interface "module.h" #endif #include "wx/object.h" #include "wx/list.h" -#include "wx/setup.h" -class WXDLLEXPORT wxModule: public wxObject +// declare a linked list of modules +class wxModule; +WX_DECLARE_LIST(wxModule, wxModuleList); + +// declaring a class derived from wxModule will automatically create an +// instance of this class on program startup, call its OnInit() method and call +// OnExit() on program termination (but only if OnInit() succeeded) +class WXDLLEXPORT wxModule : public wxObject { public: - wxModule(void) {} - ~wxModule(void) {} + wxModule() {} + virtual ~wxModule() {} - // If returns FALSE, quits the application immediately. - bool Init(void) { return OnInit(); } - void Exit(void) { OnExit(); } + // if module init routine returns FALSE application will fail to startup + bool Init() { return OnInit(); } + void Exit() { OnExit(); } // Override both of these - virtual bool OnInit(void) = 0; - virtual void OnExit(void) = 0; + // called on program startup + virtual bool OnInit() = 0; + // called just before program termination, but only if OnInit() + // succeeded + virtual void OnExit() = 0; static void RegisterModule(wxModule* module); - static bool RegisterModules(void); - static bool InitializeModules(void); - static void CleanUpModules(void); + static void RegisterModules(); + static bool InitializeModules(); + static void CleanUpModules(); protected: - static wxList m_modules; + static wxModuleList m_modules; -DECLARE_CLASS(wxModule) + DECLARE_CLASS(wxModule) }; -#endif +#endif // _WX_MODULEH__ diff --git a/src/common/module.cpp b/src/common/module.cpp index b18af89b14..5a65c70b94 100644 --- a/src/common/module.cpp +++ b/src/common/module.cpp @@ -22,19 +22,22 @@ #include "wx/module.h" #include "wx/hash.h" +#include "wx/listimpl.cpp" + +WX_DEFINE_LIST(wxModuleList); IMPLEMENT_CLASS(wxModule, wxObject) -wxList wxModule::m_modules; +wxModuleList wxModule::m_modules; void wxModule::RegisterModule(wxModule* module) { - m_modules.Append(module); + m_modules.Append(module); } // Collect up all module-derived classes, create an instance of each, // and register them. -bool wxModule::RegisterModules(void) +void wxModule::RegisterModules() { wxNode *node; wxClassInfo* classInfo; @@ -44,36 +47,48 @@ bool wxModule::RegisterModules(void) while (node) { classInfo = (wxClassInfo *)node->Data(); - if ((classInfo != (& (wxModule::sm_classwxModule))) && - classInfo->IsKindOf(CLASSINFO(wxModule))) + if ( classInfo->IsKindOf(CLASSINFO(wxModule)) && + (classInfo != (& (wxModule::sm_classwxModule))) ) { - wxModule* module = (wxModule*) classInfo->CreateObject(); + wxModule* module = (wxModule *)classInfo->CreateObject(); RegisterModule(module); } node = wxClassInfo::sm_classTable->Next(); } - return TRUE; } -bool wxModule::InitializeModules(void) +bool wxModule::InitializeModules() { - // Initialize user-defined modules - for (wxNode *node = m_modules.First(); node; node = node->Next()) + // Initialize user-defined modules + wxModuleList::Node *node; + for ( node = m_modules.GetFirst(); node; node = node->GetNext() ) { - if (!((wxModule*)(node->Data()))->Init()) - return FALSE; + if ( !node->GetData()->Init() ) + { + // clean up already initialized modules - process in reverse order + wxModuleList::Node *n; + for ( n = node->GetPrevious(); n; n = n->GetPrevious() ) + { + n->GetData()->OnExit(); + } + + return FALSE; + } } + return TRUE; } -void wxModule::CleanUpModules(void) +void wxModule::CleanUpModules() { - // Cleanup user-defined modules - for(wxNode* node = m_modules.Last(); node; node = node->Previous()) + // Cleanup user-defined modules + wxModuleList::Node *node; + for ( node = m_modules.GetFirst(); node; node = node->GetNext() ) { - ((wxModule*)(node->Data()))->Exit(); - delete (wxModule*)(node->Data()); + node->GetData()->Exit(); } + + m_modules.DeleteContents(TRUE); m_modules.Clear(); }