From 00eaab0522a3680ea3fd9c5be3c44f4db027faa6 Mon Sep 17 00:00:00 2001 From: wmayer Date: Fri, 29 Apr 2016 17:43:07 +0200 Subject: [PATCH] + add new class ParameterSerializer to load and save parameter files --- src/App/Application.cpp | 40 ++++++++++++++++------ src/Base/Parameter.cpp | 68 ++++++++++++++++++++++++++++++++++++- src/Base/Parameter.h | 41 ++++++++++++++++++++-- src/Gui/DlgParameterImp.cpp | 26 ++++++++------ src/Gui/DlgParameterImp.h | 2 ++ 5 files changed, 151 insertions(+), 26 deletions(-) diff --git a/src/App/Application.cpp b/src/App/Application.cpp index 57da57783e..23e19f2f03 100644 --- a/src/App/Application.cpp +++ b/src/App/Application.cpp @@ -904,15 +904,31 @@ void Application::destruct(void) { // saving system parameter Console().Log("Saving system parameter...\n"); - _pcSysParamMngr->SaveDocument(mConfig["SystemParameter"].c_str()); + _pcSysParamMngr->SaveDocument(); // saving the User parameter Console().Log("Saving system parameter...done\n"); Console().Log("Saving user parameter...\n"); - _pcUserParamMngr->SaveDocument(mConfig["UserParameter"].c_str()); + _pcUserParamMngr->SaveDocument(); Console().Log("Saving user parameter...done\n"); - // clean up - delete _pcSysParamMngr; - delete _pcUserParamMngr; + + // now save all other parameter files + std::map& paramMgr = _pcSingleton->mpcPramManager; + for (std::map::iterator it = paramMgr.begin(); it != paramMgr.end(); ++it) { + if ((it->second != _pcSysParamMngr) && (it->second != _pcUserParamMngr)) { + if (it->second->HasSerializer()) { + Console().Log("Saving %s...\n", it->first.c_str()); + it->second->SaveDocument(); + Console().Log("Saving %s...done\n", it->first.c_str()); + } + } + + // clean up + delete it->second; + } + + paramMgr.clear(); + _pcSysParamMngr = 0; + _pcUserParamMngr = 0; // not initialized or doubel destruct! assert(_pcSingleton); @@ -1455,10 +1471,6 @@ void Application::logStatus() void Application::LoadParameters(void) { - // create standard parameter sets - _pcSysParamMngr = new ParameterManager(); - _pcUserParamMngr = new ParameterManager(); - // Init parameter sets =========================================================== // if (mConfig.find("UserParameter") == mConfig.end()) @@ -1466,9 +1478,15 @@ void Application::LoadParameters(void) if (mConfig.find("SystemParameter") == mConfig.end()) mConfig["SystemParameter"] = mConfig["UserAppData"] + "system.cfg"; + // create standard parameter sets + _pcSysParamMngr = new ParameterManager(); + _pcSysParamMngr->SetSerializer(new ParameterSerializer(mConfig["SystemParameter"])); + + _pcUserParamMngr = new ParameterManager(); + _pcUserParamMngr->SetSerializer(new ParameterSerializer(mConfig["UserParameter"])); try { - if (_pcSysParamMngr->LoadOrCreateDocument(mConfig["SystemParameter"].c_str()) && !(mConfig["Verbose"] == "Strict")) { + if (_pcSysParamMngr->LoadOrCreateDocument() && !(mConfig["Verbose"] == "Strict")) { // Configuration file optional when using as Python module if (!Py_IsInitialized()) { Console().Warning(" Parameter does not exist, writing initial one\n"); @@ -1487,7 +1505,7 @@ void Application::LoadParameters(void) } try { - if (_pcUserParamMngr->LoadOrCreateDocument(mConfig["UserParameter"].c_str()) && !(mConfig["Verbose"] == "Strict")) { + if (_pcUserParamMngr->LoadOrCreateDocument() && !(mConfig["Verbose"] == "Strict")) { // The user parameter file doesn't exist. When an alternative parameter file is offered // this will be used. std::map::iterator it = mConfig.find("UserParameterTemplate"); diff --git a/src/Base/Parameter.cpp b/src/Base/Parameter.cpp index 4644cb6ae8..1b29478004 100644 --- a/src/Base/Parameter.cpp +++ b/src/Base/Parameter.cpp @@ -957,6 +957,34 @@ void ParameterGrp::NotifyAll() Notify(It5->first.c_str()); } +//************************************************************************** +//************************************************************************** +// ParameterSerializer +//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +ParameterSerializer::ParameterSerializer(const std::string& fn) + : filename(fn) +{ +} + +ParameterSerializer::~ParameterSerializer() +{ +} + +void ParameterSerializer::SaveDocument(const ParameterManager& mgr) +{ + mgr.SaveDocument(filename.c_str()); +} + +int ParameterSerializer::LoadDocument(ParameterManager& mgr) +{ + return mgr.LoadDocument(filename.c_str()); +} + +bool ParameterSerializer::LoadOrCreateDocument(ParameterManager& mgr) +{ + return mgr.LoadOrCreateDocument(filename.c_str()); +} + //************************************************************************** //************************************************************************** // ParameterManager @@ -970,7 +998,7 @@ static XercesDOMParser::ValSchemes gValScheme = XercesDOMParser::Val_Au /** Default construction */ ParameterManager::ParameterManager() - : ParameterGrp(), _pDocument(0) + : ParameterGrp(), _pDocument(0), paramSerializer(0) { // initialize the XML system Init(); @@ -1036,6 +1064,7 @@ ParameterManager::ParameterManager() ParameterManager::~ParameterManager() { delete _pDocument; + delete paramSerializer; } void ParameterManager::Init(void) @@ -1069,6 +1098,43 @@ void ParameterManager::Terminate(void) XMLPlatformUtils::Terminate(); } +//************************************************************************** +// Serializer handling + +void ParameterManager::SetSerializer(ParameterSerializer* ps) +{ + if (paramSerializer != ps) + delete paramSerializer; + paramSerializer = ps; +} + +bool ParameterManager::HasSerializer() const +{ + return (paramSerializer != 0); +} + +int ParameterManager::LoadDocument() +{ + if (paramSerializer) + return paramSerializer->LoadDocument(*this); + else + return -1; +} + +bool ParameterManager::LoadOrCreateDocument() +{ + if (paramSerializer) + return paramSerializer->LoadOrCreateDocument(*this); + else + return false; +} + +void ParameterManager::SaveDocument() const +{ + if (paramSerializer) + paramSerializer->SaveDocument(*this); +} + //************************************************************************** // Document handling diff --git a/src/Base/Parameter.h b/src/Base/Parameter.h index b6599d65e1..e2444a1992 100644 --- a/src/Base/Parameter.h +++ b/src/Base/Parameter.h @@ -25,7 +25,7 @@ #ifndef BASE__PARAMETER_H #define BASE__PARAMETER_H - + // (re-)defined in pyconfig.h #if defined (_POSIX_C_SOURCE) # undef _POSIX_C_SOURCE @@ -264,13 +264,33 @@ protected: }; +/** The parameter serializer class + * This is a helper class to serialize a parameter XML document. + * Does loading and saving the DOM document from and to files. + * In sub-classes the load and saving of XML documents can be + * customized. + * @see ParameterManager + */ +class BaseExport ParameterSerializer +{ +public: + ParameterSerializer(const std::string& fn); + virtual ~ParameterSerializer(); + + virtual void SaveDocument(const ParameterManager&); + virtual int LoadDocument(ParameterManager&); + virtual bool LoadOrCreateDocument(ParameterManager&); + +protected: + std::string filename; +}; /** The parameter manager class * This class manages a parameter XML document. - * Does loding, saving and handling the DOM document. + * Does loading, saving and handling the DOM document. * @see ParameterGrp */ -class BaseExport ParameterManager : public ParameterGrp +class BaseExport ParameterManager : public ParameterGrp { public: ParameterManager(); @@ -286,9 +306,24 @@ public: void CreateDocument(void); void CheckDocument() const; + /** @name Parameter serialization */ + //@{ + /// Sets a serializer. The ParameterManager takes ownership of the serializer. + void SetSerializer(ParameterSerializer*); + /// Returns true if a serializer is set, otherwise false is returned. + bool HasSerializer() const; + /// Loads an XML document by calling the serializer's load method. + int LoadDocument(); + /// Loads or creates an XML document by calling the serializer's load method. + bool LoadOrCreateDocument(); + /// Saves an XML document by calling the serializer's save method. + void SaveDocument() const; + //@} + private: XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *_pDocument; + ParameterSerializer * paramSerializer; bool gDoNamespaces ; bool gDoSchema ; diff --git a/src/Gui/DlgParameterImp.cpp b/src/Gui/DlgParameterImp.cpp index 923eda9fb0..6ae45c3684 100644 --- a/src/Gui/DlgParameterImp.cpp +++ b/src/Gui/DlgParameterImp.cpp @@ -237,6 +237,16 @@ void DlgParameterImp::onGroupSelected( QTreeWidgetItem * item ) } } +/** Switches the type of parameters with name @a config. */ +void DlgParameterImp::activateParameterSet(const char* config) +{ + int index = ui->parameterSet->findData(QByteArray(config)); + if (index != -1) { + ui->parameterSet->setCurrentIndex(index); + onChangeParameterSet(index); + } +} + /** Switches the type of parameters either to user or system parameters. */ void DlgParameterImp::onChangeParameterSet(int index) { @@ -244,12 +254,7 @@ void DlgParameterImp::onChangeParameterSet(int index) if (!rcParMngr) return; - if (rcParMngr == App::GetApplication().GetParameterSet("System parameter")) - ui->buttonSaveToDisk->setEnabled(true); - else if (rcParMngr == App::GetApplication().GetParameterSet("User parameter")) - ui->buttonSaveToDisk->setEnabled(true); - else - ui->buttonSaveToDisk->setEnabled(false); + ui->buttonSaveToDisk->setEnabled(rcParMngr->HasSerializer()); // remove all labels paramGroup->clear(); @@ -302,11 +307,10 @@ void DlgParameterImp::on_buttonSaveToDisk_clicked() { int index = ui->parameterSet->currentIndex(); ParameterManager* parmgr = App::GetApplication().GetParameterSet(ui->parameterSet->itemData(index).toByteArray()); - if (!parmgr) return; - if (parmgr == App::GetApplication().GetParameterSet("System parameter")) - parmgr->SaveDocument(App::Application::Config()["SystemParameter"].c_str()); - else if (parmgr == App::GetApplication().GetParameterSet("User parameter")) - parmgr->SaveDocument(App::Application::Config()["UserParameter"].c_str()); + if (!parmgr) + return; + + parmgr->SaveDocument(); } namespace Gui { diff --git a/src/Gui/DlgParameterImp.h b/src/Gui/DlgParameterImp.h index 47ca391378..8725c152f5 100644 --- a/src/Gui/DlgParameterImp.h +++ b/src/Gui/DlgParameterImp.h @@ -49,6 +49,8 @@ public: void accept(); void reject(); + void activateParameterSet(const char*); + protected Q_SLOTS: void onChangeParameterSet(int); void on_buttonSaveToDisk_clicked();