diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index cc0ed52e4..d45e97fe9 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -420,12 +420,39 @@ static void WebGetArg(const char* arg, char* out, size_t max) // out[max-1] = '\0'; // Ensure terminating NUL } -String AddWebCommand(const char* command, const char* webarg, const char* dflt) { - char arg[100]; // Allow parameter with lenght up to 99 characters - WebGetArg(webarg, arg, sizeof(arg)); - char cmnd[120]; - snprintf_P(cmnd, sizeof(cmnd), PSTR(";%s %s"), command, (!strlen(arg)) ? dflt : (StrCaseStr_P(command, PSTR("Password")) && (strlen(arg) < 5)) ? "" : arg); +String AddWebCommand(const char* command, const char* arg, const char* dflt) { + // OK but fixed max argument + char param[200]; // Allow parameter with lenght up to 199 characters + WebGetArg(arg, param, sizeof(param)); + uint32_t len = strlen(param); + char cmnd[232]; + snprintf_P(cmnd, sizeof(cmnd), PSTR(";%s %s"), command, (0 == len) ? dflt : (StrCaseStr_P(command, PSTR("Password")) && (len < 5)) ? "" : param); return String(cmnd); + +/* + // Any argument size (within stack space) +48 bytes + String param = Webserver->arg((const __FlashStringHelper *)arg); + uint32_t len = param.length(); +// char cmnd[len + strlen_P(command) + strlen_P(dflt) + 4]; + char cmnd[64 + len]; + snprintf_P(cmnd, sizeof(cmnd), PSTR(";%s %s"), command, (0 == len) ? dflt : (StrCaseStr_P(command, PSTR("Password")) && (len < 5)) ? "" : param.c_str()); + return String(cmnd); +*/ +/* + // Exception (3) +24 bytes + String result = F(";"); + result += command; + result += F(" "); + String param = Webserver->arg((const __FlashStringHelper *)arg); + uint32_t len = param.length(); + if (0 == len) { + result += dflt; + } + else if (!(StrCaseStr_P(command, PSTR("Password")) && (len < 5))) { + result += param; + } + return result; +*/ } static bool WifiIsInManagerMode(){ diff --git a/tasmota/xdrv_07_domoticz.ino b/tasmota/xdrv_07_domoticz.ino index f2289aa68..b7ae440cc 100644 --- a/tasmota/xdrv_07_domoticz.ino +++ b/tasmota/xdrv_07_domoticz.ino @@ -602,31 +602,27 @@ void HandleDomoticzConfiguration(void) { } void DomoticzSaveSettings(void) { - char tmp1[CMDSZ]; - WebGetArg(PSTR("ut"), tmp1, sizeof(tmp1)); - char command[500]; - snprintf_P(command, sizeof(command), PSTR(D_CMND_BACKLOG "0 " D_PRFX_DOMOTICZ D_CMND_UPDATETIMER " %s"), - (!strlen(tmp1)) ? STR(DOMOTICZ_UPDATE_TIMER) : tmp1); - char arg_idx[8]; - char tmp2[CMDSZ]; - char tmp3[CMDSZ]; + String cmnd = F(D_CMND_BACKLOG "0 "); + cmnd += AddWebCommand(PSTR(D_PRFX_DOMOTICZ D_CMND_UPDATETIMER), PSTR("ut"), STR(DOMOTICZ_UPDATE_TIMER)); + char arg_idx[5]; + char cmnd2[24]; for (uint32_t i = 1; i <= MAX_DOMOTICZ_IDX; i++) { + snprintf_P(cmnd2, sizeof(cmnd2), PSTR(D_PRFX_DOMOTICZ D_CMND_IDX "%d"), i); snprintf_P(arg_idx, sizeof(arg_idx), PSTR("r%d"), i -1); - WebGetArg(arg_idx, tmp1, sizeof(tmp1)); + cmnd += AddWebCommand(cmnd2, arg_idx, PSTR("0")); + snprintf_P(cmnd2, sizeof(cmnd2), PSTR(D_PRFX_DOMOTICZ D_CMND_KEYIDX "%d"), i); arg_idx[0] = 'k'; - WebGetArg(arg_idx, tmp2, sizeof(tmp2)); + cmnd += AddWebCommand(cmnd2, arg_idx, PSTR("0")); + snprintf_P(cmnd2, sizeof(cmnd2), PSTR(D_PRFX_DOMOTICZ D_CMND_SWITCHIDX "%d"), i); arg_idx[0] = 's'; - WebGetArg(arg_idx, tmp3, sizeof(tmp3)); - snprintf_P(command, sizeof(command),PSTR("%s;" D_PRFX_DOMOTICZ D_CMND_IDX "%d %s;" D_PRFX_DOMOTICZ D_CMND_KEYIDX "%d %s;" D_PRFX_DOMOTICZ D_CMND_SWITCHIDX "%d %s"), - command, i, (!strlen(tmp1)) ? "0" : tmp1, i, (!strlen(tmp2)) ? "0" : tmp2, i, (!strlen(tmp3)) ? "0" : tmp3); + cmnd += AddWebCommand(cmnd2, arg_idx, PSTR("0")); } for (uint32_t i = 1; i <= DZ_MAX_SENSORS; i++) { + snprintf_P(cmnd2, sizeof(cmnd2), PSTR(D_PRFX_DOMOTICZ D_CMND_SENSORIDX "%d"), i); snprintf_P(arg_idx, sizeof(arg_idx), PSTR("l%d"), i -1); - WebGetArg(arg_idx, tmp1, sizeof(tmp1)); - snprintf_P(command, sizeof(command),PSTR("%s;" D_PRFX_DOMOTICZ D_CMND_SENSORIDX "%d %s"), - command, i, (!strlen(tmp1)) ? "0" : tmp1); + cmnd += AddWebCommand(cmnd2, arg_idx, PSTR("0")); } - ExecuteWebCommand(command); // Note: beware of max number of commands in backlog currently 30 (MAX_BACKLOG) + ExecuteWebCommand((char*)cmnd.c_str()); // Note: beware of max number of commands in backlog currently 30 (MAX_BACKLOG) } #endif // USE_WEBSERVER