X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/446e5259d796ee4428ed90b5943c76df032095be..c4ec0ce8205de4659f1e52d16480b5c025ebc41e:/include/wx/module.h diff --git a/include/wx/module.h b/include/wx/module.h index b67e426401..1e39f0e003 100644 --- a/include/wx/module.h +++ b/include/wx/module.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: module.h +// Name: wx/module.h // Purpose: Modules handling // Author: Wolfram Gloger/adapted by Guilhem Lavaux // Modified by: @@ -12,17 +12,19 @@ #ifndef _WX_MODULE_H_ #define _WX_MODULE_H_ -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma interface "module.h" -#endif - #include "wx/object.h" #include "wx/list.h" +#include "wx/dynarray.h" // declare a linked list of modules class WXDLLIMPEXP_BASE wxModule; WX_DECLARE_USER_EXPORTED_LIST(wxModule, wxModuleList, WXDLLIMPEXP_BASE); +// and an array of class info objects +WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxClassInfo *, wxArrayClassInfo, + class WXDLLIMPEXP_BASE); + + // 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) @@ -52,7 +54,7 @@ public: static void RegisterModule(wxModule *module); static void RegisterModules(); static bool InitializeModules(); - static void CleanUpModules(); + static void CleanUpModules() { DoCleanUpModules(m_modules); } // used by wxObjectLoader when unloading shared libs's @@ -61,8 +63,41 @@ public: protected: static wxModuleList m_modules; + // the function to call from constructor of a deriving class add module + // dependency which will be initialized before the module and unloaded + // after that + void AddDependency(wxClassInfo *dep) + { + wxCHECK_RET( dep, _T("NULL module dependency") ); + + m_dependencies.Add(dep); + } + +private: + // initialize module and Append it to initializedModules list recursively + // calling itself to satisfy module dependencies if needed + static bool + DoInitializeModule(wxModule *module, wxModuleList &initializedModules); + + // cleanup the modules in the specified list (which may not contain all + // modules if we're called during initialization because not all modules + // could be initialized) and also empty m_modules itself + static void DoCleanUpModules(const wxModuleList& modules); + + + // module dependencies: contains + wxArrayClassInfo m_dependencies; + + // used internally while initiliazing/cleaning up modules + enum + { + State_Registered, // module registered but not initialized yet + State_Initializing, // we're initializing this module but not done yet + State_Initialized // module initialized successfully + } m_state; + + DECLARE_CLASS(wxModule) }; #endif // _WX_MODULE_H_ -