X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/af266e5bf7e064ba818c1b1619325eb8c5b874f7..fc32630a5e03e60a67d4ef53fc59985ea087b451:/src/common/module.cpp?ds=inline diff --git a/src/common/module.cpp b/src/common/module.cpp index 9167848b89..230b8aa577 100644 --- a/src/common/module.cpp +++ b/src/common/module.cpp @@ -50,23 +50,20 @@ void wxModule::UnregisterModule(wxModule* module) // and register them. void wxModule::RegisterModules() { - wxHashTable::compatibility_iterator node; - wxClassInfo* classInfo; - - wxClassInfo::sm_classTable->BeginFind(); - node = wxClassInfo::sm_classTable->Next(); - while (node) + for (wxClassInfo::const_iterator it = wxClassInfo::begin_classinfo(), + end = wxClassInfo::end_classinfo(); + it != end; ++it) { - classInfo = (wxClassInfo *)node->GetData(); + const wxClassInfo* classInfo = *it; + if ( classInfo->IsKindOf(CLASSINFO(wxModule)) && - (classInfo != (& (wxModule::ms_classInfo))) ) + (classInfo != (& (wxModule::ms_classInfo))) ) { wxLogTrace(TRACE_MODULE, wxT("Registering module %s"), classInfo->GetClassName()); wxModule* module = (wxModule *)classInfo->CreateObject(); - RegisterModule(module); + wxModule::RegisterModule(module); } - node = wxClassInfo::sm_classTable->Next(); } } @@ -82,6 +79,10 @@ bool wxModule::DoInitializeModule(wxModule *module, module->m_state = State_Initializing; + // translate named dependencies to the normal ones first + if ( !module->ResolveNamedDependencies() ) + return false; + const wxArrayClassInfo& dependencies = module->m_dependencies; // satisfy module dependencies by loading them before the current module @@ -200,3 +201,25 @@ void wxModule::DoCleanUpModules(const wxModuleList& modules) // clear all modules, even the non-initialized ones WX_CLEAR_LIST(wxModuleList, m_modules); } + +bool wxModule::ResolveNamedDependencies() +{ + // first resolve required dependencies + for ( size_t i = 0; i < m_namedDependencies.size(); ++i ) + { + wxClassInfo *info = wxClassInfo::FindClass(m_namedDependencies[i]); + + if ( !info ) + { + // required dependency not found + return false; + } + + // add it even if it is not derived from wxModule because + // DoInitializeModule() will make sure a module with the same class + // info exists and fail if it doesn't + m_dependencies.Add(info); + } + + return true; +}