diff --git a/CHANGELOG.md b/CHANGELOG.md index 446d7375b..d851be1b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. - Berry f-strings now support ':' in expression (#23618) - Universal display driver for ZJY169S0800TG01 ST7789 280x240 (#23638) - Commands `LoRaWanDecoder "` and `LoRaWanName "` to clear name (#23394) +- Internal function 'WSContentSendRaw_P' (#23641) ### Breaking Changed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 905489462..fd8efc539 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -116,7 +116,8 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ## Changelog v15.0.1.1 ### Added -- Commands `LoRaWanDecoder "` and `LoRaWanName "` to clear name (#23394)[#23394](https://github.com/arendst/Tasmota/issues/23394) +- Commands `LoRaWanDecoder "` and `LoRaWanName "` to clear name [#23394](https://github.com/arendst/Tasmota/issues/23394) +- Internal function 'WSContentSendRaw_P' [#23641](https://github.com/arendst/Tasmota/issues/23641) - Universal display driver for ZJY169S0800TG01 ST7789 280x240 [#23638](https://github.com/arendst/Tasmota/issues/23638) - NeoPool add Redox tank alarm [#19811](https://github.com/arendst/Tasmota/issues/19811) - I2S additions [#23543](https://github.com/arendst/Tasmota/issues/23543) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino index dac97866e..aeb18ab11 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino @@ -881,29 +881,39 @@ void WSContentFlush(void) { /*-------------------------------------------------------------------------------------------*/ -void _WSContentSendBufferChunk(const char* content) { - int len = strlen(content); +void _WSContentSendBufferChunk_P(const char* content) { + int len = strlen_P(content); if (len < CHUNKED_BUFFER_SIZE) { // Append chunk buffer with small content - Web.chunk_buffer += content; + Web.chunk_buffer += (const __FlashStringHelper *)content; len = Web.chunk_buffer.length(); } if (len >= CHUNKED_BUFFER_SIZE) { // Either content or chunk buffer is oversize WSContentFlush(); // Send chunk buffer before possible content oversize } - if (strlen(content) >= CHUNKED_BUFFER_SIZE) { // Content is oversize - _WSContentSend(content); // Send content + len = strlen_P(content); + if (len >= CHUNKED_BUFFER_SIZE) { // Content is oversize + _WSContentSend(content, len); // Send content } } /*-------------------------------------------------------------------------------------------*/ +void WSContentSendRaw_P(const char* content) { // Content sent without formatting + if (nullptr == content || !strlen_P(content)) { return; } + + WSContentSeparator(2); // Print separator on next WSContentSeparator(1) + _WSContentSendBufferChunk_P(content); +} + +/*-------------------------------------------------------------------------------------------*/ + void WSContentSend(const char* content, size_t size) { // To speed up transmission use chunked buffer if possible if (size < CHUNKED_BUFFER_SIZE) { // Terminate non-terminated content char buffer[size +1]; strlcpy(buffer, content, sizeof(buffer)); // Terminate with '\0' - _WSContentSendBufferChunk(buffer); + _WSContentSendBufferChunk_P(buffer); } else { WSContentFlush(); // Flush chunk buffer _WSContentSend(content, size); @@ -917,10 +927,6 @@ void _WSContentSendBuffer(bool decimal, const char * formatP, va_list arg) { if (content == nullptr) { return; } // Avoid crash int len = strlen(content); - if (0 == len) { return; } // No content - - WSContentSeparator(2); // Print separator on next WSContentSeparator(1) - if (decimal && (D_DECIMAL_SEPARATOR[0] != '.')) { for (uint32_t i = 0; i < len; i++) { if ('.' == content[i]) { @@ -929,7 +935,7 @@ void _WSContentSendBuffer(bool decimal, const char * formatP, va_list arg) { } } - _WSContentSendBufferChunk(content); + WSContentSendRaw_P(content); free(content); } @@ -1009,14 +1015,14 @@ void WSContentSendStyle_P(const char* formatP, ...) { WebColor(COL_CONSOLE_TEXT) // --c_csltxt ); - WSContentSend_P(PSTR("%s"), HTTP_HEAD_STYLE1); - WSContentSend_P(PSTR("%s"), HTTP_HEAD_STYLE2); - + WSContentSendRaw_P(HTTP_HEAD_STYLE1); + WSContentSendRaw_P(HTTP_HEAD_STYLE2); + #ifdef USE_WEB_STATUS_LINE_WIFI - WSContentSend_P(PSTR("%s"), HTTP_HEAD_STYLE_WIFI); + WSContentSendRaw_P(HTTP_HEAD_STYLE_WIFI); #endif #if defined(USE_ZIGBEE) || defined(USE_LORAWAN_BRIDGE) - WSContentSend_P(HTTP_HEAD_STYLE_ZIGBEE); + WSContentSendRaw_P(HTTP_HEAD_STYLE_ZIGBEE); #endif // USE_ZIGBEE if (formatP != nullptr) { // This uses char strings. Be aware of sending %% if % is needed diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_5_map.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_5_map.ino index 7320f71e2..efffe2889 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_5_map.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_5_map.ino @@ -159,7 +159,7 @@ void Z_Mapper::dumpInternals(void) const { const char *fname = device.friendlyName; if (fname != nullptr) { - WSContentSend_P(PSTR("%s"), EscapeJSONString(fname).c_str()); + WSContentSendRaw_P( EscapeJSONString(fname).c_str()); } else { WSContentSend_P(PSTR("0x%04X"), device.shortaddr); } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino b/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino index ff911f63e..fcd70c2cd 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino @@ -1773,7 +1773,7 @@ void UfsEditor(void) { AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_UFS "UfsEditor: read=%d"), l); if (l < 0) { break; } buf[l] = '\0'; - WSContentSend_P(PSTR("%s"), HtmlEscape((char*)buf).c_str()); + WSContentSendRaw_P( HtmlEscape((char*)buf).c_str()); filelen -= l; } fp.close(); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino index 0cd9c964c..3f43826ce 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino @@ -800,7 +800,7 @@ extern "C" { const char *msg = be_tostring(vm, 2); be_pop(vm, top); // avoid Error be_top is non zero message #ifdef USE_WEBSERVER - WSContentSend_P(PSTR("%s"), msg); + WSContentSendRaw_P( msg); #endif // USE_WEBSERVER be_return_nil(vm); // Return nil when something goes wrong } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webserver.ino index 0853eb75a..c2b8202e1 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webserver.ino @@ -249,7 +249,7 @@ extern "C" { } else { html = (const char*) be_tocomptr(vm, 1); } - WSContentSend_P(PSTR("%s"), html); + WSContentSendRaw_P( html); be_return_nil(vm); } be_raise(vm, kTypeError, nullptr);