From 059f96173bcf5571770f13f42bb6a589668a3d78 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Wed, 14 Oct 2020 14:36:29 -0400 Subject: [PATCH] Some factoring of ModuleManager::Initialize --- src/ModuleManager.cpp | 48 ++++++++++++++++++++++++++----------------- src/ModuleManager.h | 5 +++++ 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/src/ModuleManager.cpp b/src/ModuleManager.cpp index 01fe1ca3d..1bdc984f9 100755 --- a/src/ModuleManager.cpp +++ b/src/ModuleManager.cpp @@ -237,22 +237,20 @@ ModuleManager::~ModuleManager() builtinModuleList().clear(); } -// static -void ModuleManager::Initialize() +// static +void ModuleManager::FindModules(FilePaths &files) { const auto &audacityPathList = FileNames::AudacityPathList(); FilePaths pathList; - FilePaths files; wxString pathVar; - size_t i; // Code from LoadLadspa that might be useful in load modules. pathVar = wxGetenv(wxT("AUDACITY_MODULES_PATH")); if (!pathVar.empty()) FileNames::AddMultiPathsToPathList(pathVar, pathList); - for (i = 0; i < audacityPathList.size(); i++) { - wxString prefix = audacityPathList[i] + wxFILE_SEP_PATH; + for (const auto &path : audacityPathList) { + wxString prefix = path + wxFILE_SEP_PATH; FileNames::AddUniquePathToPathList(prefix + wxT("modules"), pathList); if (files.size()) { @@ -265,25 +263,29 @@ void ModuleManager::Initialize() #else FileNames::FindFilesInPathList(wxT("*.so"), pathList, files); #endif +} +void ModuleManager::TryLoadModules(const FilePaths &files) +{ FilePaths checked; wxString saveOldCWD = ::wxGetCwd(); - for (i = 0; i < files.size(); i++) { + auto cleanup = finally([&]{ ::wxSetWorkingDirectory(saveOldCWD); }); + for (const auto &file : files) { // As a courtesy to some modules that might be bridges to // open other modules, we set the current working // directory to be the module's directory. - auto prefix = ::wxPathOnly(files[i]); + auto prefix = ::wxPathOnly(file); ::wxSetWorkingDirectory(prefix); // Only process the first module encountered in the // defined search sequence. - wxString ShortName = wxFileName( files[i] ).GetName(); + wxString ShortName = wxFileName( file ).GetName(); if( checked.Index( ShortName, false ) != wxNOT_FOUND ) continue; checked.Add( ShortName ); #ifdef EXPERIMENTAL_MODULE_PREFS - int iModuleStatus = ModulePrefs::GetModuleStatus( files[i] ); + int iModuleStatus = ModulePrefs::GetModuleStatus( file ); if( iModuleStatus == kModuleDisabled ) continue; if( iModuleStatus == kModuleFailed ) @@ -292,7 +294,7 @@ void ModuleManager::Initialize() if( iModuleStatus == kModuleNew ){ // To ensure it is noted in config file and so // appears on modules page. - ModulePrefs::SetModuleStatus( files[i], kModuleNew); + ModulePrefs::SetModuleStatus( file, kModuleNew); continue; } @@ -311,13 +313,13 @@ void ModuleManager::Initialize() action = ShowMultiDialog(msg, XO("Audacity Module Loader"), buttons, "", - XO("Try and load this module?"), + XO("Try and load this module?"), false); #ifdef EXPERIMENTAL_MODULE_PREFS // If we're not prompting always, accept the answer permanently if( iModuleStatus == kModuleNew ){ iModuleStatus = (action==1)?kModuleDisabled : kModuleEnabled; - ModulePrefs::SetModuleStatus( files[i], iModuleStatus ); + ModulePrefs::SetModuleStatus( file, iModuleStatus ); } #endif if(action == 1){ // "No" @@ -327,11 +329,11 @@ void ModuleManager::Initialize() #ifdef EXPERIMENTAL_MODULE_PREFS // Before attempting to load, we set the state to bad. // That way, if we crash, we won't try again. - ModulePrefs::SetModuleStatus( files[i], kModuleFailed ); + ModulePrefs::SetModuleStatus( file, kModuleFailed ); #endif wxString Error; - auto umodule = std::make_unique(files[i]); + auto umodule = std::make_unique(file); if (umodule->Load(Error)) // it will get rejected if there are version problems { auto module = umodule.get(); @@ -356,11 +358,11 @@ void ModuleManager::Initialize() if (!module->HasDispatch() && !scriptFn && !pPanelHijack) { - auto ShortName = wxFileName(files[i]).GetName(); + auto ShortName = wxFileName(file).GetName(); AudacityMessageBox( XO("The module \"%s\" does not provide any of the required functions.\n\nIt will not be loaded.").Format(ShortName), XO("Module Unsuitable")); - wxLogMessage(wxT("The module \"%s\" does not provide any of the required functions. It will not be loaded."), files[i]); + wxLogMessage(wxT("The module \"%s\" does not provide any of the required functions. It will not be loaded."), file); module->Unload(); } else @@ -369,7 +371,7 @@ void ModuleManager::Initialize() #ifdef EXPERIMENTAL_MODULE_PREFS // Loaded successfully, restore the status. - ModulePrefs::SetModuleStatus(files[i], iModuleStatus); + ModulePrefs::SetModuleStatus(file, iModuleStatus); #endif } } @@ -377,7 +379,15 @@ void ModuleManager::Initialize() umodule->ShowLoadFailureError(Error); } } - ::wxSetWorkingDirectory(saveOldCWD); +} + +// static +void ModuleManager::Initialize() +{ + FilePaths files; + FindModules(files); + + TryLoadModules(files); // After loading all the modules, we may have a registered scripting function. if(scriptFn) diff --git a/src/ModuleManager.h b/src/ModuleManager.h index cfce59e34..75957fc11 100644 --- a/src/ModuleManager.h +++ b/src/ModuleManager.h @@ -75,7 +75,12 @@ public: // ------------------------------------------------------------------------- static ModuleManager & Get(); + +private: + static void FindModules(FilePaths &files); + static void TryLoadModules(const FilePaths &files); +public: void Initialize(); int Dispatch(ModuleDispatchTypes type);