diff --git a/src/App/Application.cpp b/src/App/Application.cpp index 1a5517d34e..c0c7733cb5 100644 --- a/src/App/Application.cpp +++ b/src/App/Application.cpp @@ -1233,7 +1233,7 @@ void Application::AddParameterSet(const char* sName) auto it = mpcPramManager.find(sName); if ( it != mpcPramManager.end() ) return; - mpcPramManager[sName] = new ParameterManager(); + mpcPramManager[sName] = ParameterManager::Create(); } void Application::RemoveParameterSet(const char* sName) @@ -2870,10 +2870,10 @@ void Application::LoadParameters() mConfig["SystemParameter"] = mConfig["UserConfigPath"] + "system.cfg"; // create standard parameter sets - _pcSysParamMngr = new ParameterManager(); + _pcSysParamMngr = ParameterManager::Create(); _pcSysParamMngr->SetSerializer(new ParameterSerializer(mConfig["SystemParameter"])); - _pcUserParamMngr = new ParameterManager(); + _pcUserParamMngr = ParameterManager::Create(); _pcUserParamMngr->SetSerializer(new ParameterSerializer(mConfig["UserParameter"])); try { diff --git a/src/Base/Parameter.cpp b/src/Base/Parameter.cpp index 5435ddee9c..93d45a9ca9 100644 --- a/src/Base/Parameter.cpp +++ b/src/Base/Parameter.cpp @@ -261,53 +261,44 @@ void ParameterGrp::insertTo(Base::Reference Grp) void ParameterGrp::exportTo(const char* FileName) { - ParameterManager Mngr; + auto Mngr = ParameterManager::Create(); - Mngr.CreateDocument(); - - Mngr.ref(); + Mngr->CreateDocument(); // copy all into the new document - insertTo(&Mngr); + insertTo(Base::Reference(Mngr)); - Mngr.SaveDocument(FileName); - Mngr.unrefNoDelete(); + Mngr->SaveDocument(FileName); } void ParameterGrp::importFrom(const char* FileName) { - ParameterManager Mngr; + auto Mngr = ParameterManager::Create(); - if (Mngr.LoadDocument(FileName) != 1) + if (Mngr->LoadDocument(FileName) != 1) throw FileException("ParameterGrp::import() cannot load document", FileName); - ref(); - Mngr.copyTo(Base::Reference(this)); - unrefNoDelete(); + Mngr->copyTo(Base::Reference(this)); } void ParameterGrp::insert(const char* FileName) { - ParameterManager Mngr; + auto Mngr = ParameterManager::Create(); - if (Mngr.LoadDocument(FileName) != 1) + if (Mngr->LoadDocument(FileName) != 1) throw FileException("ParameterGrp::import() cannot load document", FileName); - ref(); - Mngr.insertTo(Base::Reference(this)); - unrefNoDelete(); + Mngr->insertTo(Base::Reference(this)); } void ParameterGrp::revert(const char* FileName) { - ParameterManager Mngr; + auto Mngr = ParameterManager::Create(); - if (Mngr.LoadDocument(FileName) != 1) + if (Mngr->LoadDocument(FileName) != 1) throw FileException("ParameterGrp::revert() cannot load document", FileName); - Mngr.ref(); - revert(Base::Reference(&Mngr)); - Mngr.unrefNoDelete(); + revert(Base::Reference(Mngr)); } void ParameterGrp::revert(Base::Reference Grp) @@ -1526,6 +1517,11 @@ ParameterManager::~ParameterManager() delete paramSerializer; } +Base::Reference ParameterManager::Create() +{ + return Base::Reference(new ParameterManager()); +} + void ParameterManager::Init() { static bool Init = false; diff --git a/src/Base/Parameter.h b/src/Base/Parameter.h index 0d138e696b..72a2391d4f 100644 --- a/src/Base/Parameter.h +++ b/src/Base/Parameter.h @@ -356,8 +356,8 @@ protected: class BaseExport ParameterManager : public ParameterGrp { public: - ParameterManager(); - ~ParameterManager() override; + /// Create a reference counted ParameterManager + static Base::Reference Create(); static void Init(); static void Terminate(); @@ -431,6 +431,9 @@ private: bool gUseFilter ; bool gFormatPrettyPrint ; +private: + ParameterManager(); + ~ParameterManager() override; }; /** python wrapper function diff --git a/src/Gui/DlgRevertToBackupConfigImp.cpp b/src/Gui/DlgRevertToBackupConfigImp.cpp index 8afa5c766e..4cbb3f76ff 100644 --- a/src/Gui/DlgRevertToBackupConfigImp.cpp +++ b/src/Gui/DlgRevertToBackupConfigImp.cpp @@ -98,10 +98,10 @@ void DlgRevertToBackupConfigImp::accept() auto item = items[0]; auto path = item->data(Qt::UserRole).toString().toStdString(); if (fs::exists(path)) { - ParameterManager newParameters; - newParameters.LoadDocument(path.c_str()); + auto newParameters = ParameterManager::Create(); + newParameters->LoadDocument(path.c_str()); auto baseAppGroup = App::GetApplication().GetUserParameter().GetGroup("BaseApp"); - newParameters.GetGroup("BaseApp")->copyTo(baseAppGroup); + newParameters->GetGroup("BaseApp")->copyTo(baseAppGroup); } else { Base::Console().Error("Preference Pack Internal Error: Invalid backup file location"); diff --git a/src/Gui/PreferencePackManager.cpp b/src/Gui/PreferencePackManager.cpp index 638085670e..ab2145fd3c 100644 --- a/src/Gui/PreferencePackManager.cpp +++ b/src/Gui/PreferencePackManager.cpp @@ -123,10 +123,10 @@ void PreferencePack::applyConfigChanges() const { auto configFile = _path / (_metadata.name() + ".cfg"); if (fs::exists(configFile)) { - ParameterManager newParameters; - newParameters.LoadDocument(configFile.string().c_str()); + auto newParameters = ParameterManager::Create(); + newParameters->LoadDocument(configFile.string().c_str()); auto baseAppGroup = App::GetApplication().GetUserParameter().GetGroup("BaseApp"); - newParameters.GetGroup("BaseApp")->insertTo(baseAppGroup); + newParameters->GetGroup("BaseApp")->insertTo(baseAppGroup); } } @@ -434,17 +434,17 @@ void PreferencePackManager::save(const std::string& name, const std::vectorCreateDocument(); for (const auto& t : templates) { - ParameterManager templateParameterManager; - templateParameterManager.LoadDocument(t.path.string().c_str()); - copyTemplateParameters(templateParameterManager, outputParameterManager); + auto templateParameterManager = ParameterManager::Create(); + templateParameterManager->LoadDocument(t.path.string().c_str()); + copyTemplateParameters(*templateParameterManager, *outputParameterManager); } auto savedPreferencePacksDirectory = fs::path(App::Application::getUserAppDataDir()) / "SavedPreferencePacks"; auto cfgFilename = savedPreferencePacksDirectory / name / (name + ".cfg"); - outputParameterManager.SaveDocument(cfgFilename.string().c_str()); + outputParameterManager->SaveDocument(cfgFilename.string().c_str()); } // Needed until we support only C++20 and above and can use std::string's built-in ends_with() @@ -573,4 +573,4 @@ std::vector Gui::PreferencePackManager::configBackups() } } return results; -} \ No newline at end of file +}