diff --git a/extra_script.py b/extra_script.py index 7947b0f..5838f24 100644 --- a/extra_script.py +++ b/extra_script.py @@ -132,7 +132,7 @@ def generateCfg(inFile,outFile,addDirs=[]): raise Exception("%s: config names must be max 15 caracters"%n) data+=' const String %s=F("%s");\n'%(n,n) data+=' protected:\n' - data+=' GwConfigItem *configs[%d]={\n'%(l) + data+=' GwConfigInterface *configs[%d]={\n'%(l) first=True for item in config: if not first: @@ -141,7 +141,7 @@ def generateCfg(inFile,outFile,addDirs=[]): secret="false"; if item.get('type') == 'password': secret="true" - data+=" new GwConfigItem(%s,\"%s\",%s)"%(item.get('name'),item.get('default'),secret) + data+=" new GwConfigInterface(%s,\"%s\",%s)"%(item.get('name'),item.get('default'),secret) data+='};\n' data+='};\n' writeFileIfChanged(outFile,data) diff --git a/lib/config/GWConfig.cpp b/lib/config/GWConfig.cpp index 7fe451e..c6b4af8 100644 --- a/lib/config/GWConfig.cpp +++ b/lib/config/GWConfig.cpp @@ -8,13 +8,9 @@ bool isTrue(const char * value){ return (strcasecmp(value,"true") == 0); } -class DummyConfig : public GwConfigItem{ +class DummyConfig : public GwConfigInterface{ public: - DummyConfig():GwConfigItem("dummy",""){} - virtual void fromString(const String v){ - }; - virtual void reset(){ - } + DummyConfig():GwConfigInterface("dummy",""){} }; DummyConfig dummyConfig; @@ -46,13 +42,7 @@ String GwConfigHandler::toJson() const{ logger->logString("configJson: %s",rt.c_str()); return rt; } -GwConfigItem * GwConfigHandler::findConfig(const String name, bool dummy){ - for (int i=0;igetName() == name) return configs[i]; - } - if (!dummy) return NULL; - return &dummyConfig; -} + GwConfigInterface * GwConfigHandler::getConfigItem(const String name, bool dummy) const{ for (int i=0;igetName() == name) return configs[i]; @@ -68,7 +58,7 @@ bool GwConfigHandler::loadConfig(){ prefs.begin(PREF_NAME,true); for (int i=0;igetName().c_str(),configs[i]->getDefault()); - configs[i]->fromString(v); + configs[i]->value=v; } prefs.end(); return true; @@ -76,8 +66,13 @@ bool GwConfigHandler::loadConfig(){ bool GwConfigHandler::saveConfig(){ prefs.begin(PREF_NAME,false); for (int i=0;ilogString("saving %s=%s",configs[i]->getName().c_str(),configs[i]->asCString()); - prefs.putString(configs[i]->getName().c_str(),configs[i]->asString()); + String val=configs[i]->asString(); + auto it=changedValues.find(configs[i]->getName()); + if (it != changedValues.end()){ + val=it->second; + } + logger->logString("saving %s=%s",configs[i]->getName().c_str(),val.c_str()); + prefs.putString(configs[i]->getName().c_str(),val); } prefs.end(); logger->logString("saved config"); @@ -85,21 +80,21 @@ bool GwConfigHandler::saveConfig(){ } bool GwConfigHandler::updateValue(String name, String value){ - GwConfigItem *i=findConfig(name); + GwConfigInterface *i=getConfigItem(name); if (i == NULL) return false; if (i->isSecret() && value.isEmpty()){ LOG_DEBUG(GwLog::LOG,"skip empty password %s",name.c_str()); } else{ LOG_DEBUG(GwLog::LOG,"update config %s=>%s",name.c_str(),i->isSecret()?"***":value.c_str()); - i->fromString(value); + changedValues[name]=value; } return true; } bool GwConfigHandler::reset(bool save){ logger->logString("reset config"); for (int i=0;ireset(); + changedValues[configs[i]->getName()]=configs[i]->getDefault(); } if (!save) return true; return saveConfig(); diff --git a/lib/config/GWConfig.h b/lib/config/GWConfig.h index bf91963..3de56b0 100644 --- a/lib/config/GWConfig.h +++ b/lib/config/GWConfig.h @@ -5,12 +5,15 @@ #include "GwLog.h" #include "GwConfigItem.h" #include "GwConfigDefinitions.h" +#include class GwConfigHandler: public GwConfigDefinitions{ private: Preferences prefs; GwLog *logger; + typedef std::map StringMap; + StringMap changedValues; public: public: GwConfigHandler(GwLog *logger); @@ -23,7 +26,6 @@ class GwConfigHandler: public GwConfigDefinitions{ String getString(const String name,const String defaultv="") const; bool getBool(const String name,bool defaultv=false) const ; int getInt(const String name,int defaultv=0) const; - GwConfigItem * findConfig(const String name, bool dummy=false); GwConfigInterface * getConfigItem(const String name, bool dummy=false) const; private: }; diff --git a/lib/config/GwConfigItem.h b/lib/config/GwConfigItem.h index a9e24cf..cef920a 100644 --- a/lib/config/GwConfigItem.h +++ b/lib/config/GwConfigItem.h @@ -2,22 +2,16 @@ #define _GWCONFIGITEM_H #include "WString.h" #include + +class GwConfigHandler; class GwConfigInterface{ - public: - virtual String asString() const=0; - virtual const char * asCString() const =0; - virtual bool asBoolean() const = 0; - virtual int asInt() const = 0; - virtual bool isSecret() const =0; -}; -class GwConfigItem: public GwConfigInterface{ private: String name; String initialValue; String value; bool secret=false; public: - GwConfigItem(const String &name, const String initialValue, bool secret=false){ + GwConfigInterface(const String &name, const String initialValue, bool secret=false){ this->name=name; this->initialValue=initialValue; this->value=initialValue; @@ -29,9 +23,6 @@ class GwConfigItem: public GwConfigInterface{ virtual const char * asCString() const{ return value.c_str(); }; - virtual void fromString(const String v){ - value=v; - }; virtual bool asBoolean() const{ return strcasecmp(value.c_str(),"true") == 0; } @@ -41,9 +32,6 @@ class GwConfigItem: public GwConfigInterface{ String getName() const{ return name; } - virtual void reset(){ - value=initialValue; - } virtual bool isSecret() const{ return secret; } @@ -53,6 +41,7 @@ class GwConfigItem: public GwConfigInterface{ String getDefault() const { return initialValue; } + friend class GwConfigHandler; }; class GwNmeaFilter{ diff --git a/src/main.cpp b/src/main.cpp index 2fa0ec9..d2d41c7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -894,7 +894,8 @@ void setup() { GWSYNCHRONIZED(&mainLock); userCodeHandler.startUserTasks(MIN_USER_TASK); } - + logger.logDebug(GwLog::ERROR,"wifi AP pass: %s",config.getString(config.apPassword).c_str()); + logger.logDebug(GwLog::ERROR,"admin pass: %s",config.getString(config.adminPassword).c_str()); logger.logDebug(GwLog::LOG,"setup done"); } //*****************************************************************************