X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/34138703c3997ce676a1e713d9ff9eb020640da7..0b822969a677939811d9fb966177031fb5fc625b:/include/wx/module.h diff --git a/include/wx/module.h b/include/wx/module.h index c91f0e126a..c620974f52 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: @@ -9,41 +9,112 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifndef _WX_MODULEH__ -#define _WX_MODULEH__ - -#ifdef __GNUG__ -#pragma interface "module.h" -#endif +#ifndef _WX_MODULE_H_ +#define _WX_MODULE_H_ #include "wx/object.h" #include "wx/list.h" -#include "wx/setup.h" +#include "wx/arrstr.h" +#include "wx/dynarray.h" + +// declare a linked list of modules +class WXDLLIMPEXP_FWD_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); -class WXDLLEXPORT wxModule: public wxObject + +// 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 WXDLLIMPEXP_BASE wxModule : public wxObject { public: - wxModule(void) {} - ~wxModule(void) {} + wxModule() {} + virtual ~wxModule() {} + + // if module init routine returns false the application + // will fail to startup - // If returns FALSE, quits the application immediately. - bool Init(void) { return OnInit(); } - void Exit(void) { OnExit(); } + bool Init() { return OnInit(); } + void Exit() { OnExit(); } // Override both of these - virtual bool OnInit(void) = 0; - virtual void OnExit(void) = 0; - static void RegisterModule(wxModule* module); - static bool RegisterModules(void); - static bool InitializeModules(void); - static void CleanUpModules(void); + // 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 void RegisterModules(); + static bool InitializeModules(); + static void CleanUpModules() { DoCleanUpModules(m_modules); } + + // used by wxObjectLoader when unloading shared libs's + + static void UnregisterModule(wxModule *module); protected: - static wxList m_modules; + static wxModuleList m_modules; -DECLARE_CLASS(wxModule) -}; + // 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") ); -#endif + m_dependencies.Add(dep); + } + + // same as the version above except it will look up wxClassInfo by name on + // its own + void AddDependency(const char *className) + { + m_namedDependencies.Add(className); + } + + +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); + + // resolve all named dependencies and add them to the normal m_dependencies + bool ResolveNamedDependencies(); + + + // module dependencies: contains wxClassInfo pointers for all modules which + // must be initialized before this one + wxArrayClassInfo m_dependencies; + + // and the named dependencies: those will be resolved during run-time and + // added to m_dependencies + wxArrayString m_namedDependencies; + + // used internally while initializing/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_