From 1c57b3408cfdc2956d3c11307b79e2e0055db038 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Sun, 4 Apr 2021 11:31:45 +0200 Subject: [PATCH] fix WiFiClient::write(from flash or iram) (#7951) * fix WiFiClient::write(flash or iram) * fix emulation on host --- libraries/ESP8266WiFi/src/WiFiClient.cpp | 15 +++++++++---- .../ESP8266WiFi/src/include/ClientContext.h | 21 ++----------------- 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/libraries/ESP8266WiFi/src/WiFiClient.cpp b/libraries/ESP8266WiFi/src/WiFiClient.cpp index 7a1c39e12..78df4bf85 100644 --- a/libraries/ESP8266WiFi/src/WiFiClient.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClient.cpp @@ -40,6 +40,7 @@ extern "C" #include "lwip/netif.h" #include #include "c_types.h" +#include uint16_t WiFiClient::_localPort = 0; @@ -212,7 +213,8 @@ size_t WiFiClient::write(const uint8_t *buf, size_t size) return 0; } _client->setTimeout(_timeout); - return _client->write(buf, size); + StreamConstPtr ptr(buf, size); + return _client->write(ptr); } size_t WiFiClient::write(Stream& stream, size_t unused) @@ -227,8 +229,12 @@ size_t WiFiClient::write(Stream& stream) { return 0; } - _client->setTimeout(_timeout); - return _client->write(stream); + if (stream.hasPeekBufferAPI()) + { + _client->setTimeout(_timeout); + return _client->write(stream); + } + return stream.sendAvailable(this); } size_t WiFiClient::write_P(PGM_P buf, size_t size) @@ -238,7 +244,8 @@ size_t WiFiClient::write_P(PGM_P buf, size_t size) return 0; } _client->setTimeout(_timeout); - return _client->write_P(buf, size); + StreamConstPtr nopeek(buf, size); + return nopeek.sendAll(this); } int WiFiClient::available() diff --git a/libraries/ESP8266WiFi/src/include/ClientContext.h b/libraries/ESP8266WiFi/src/include/ClientContext.h index 9eb81ec29..43ce731de 100644 --- a/libraries/ESP8266WiFi/src/include/ClientContext.h +++ b/libraries/ESP8266WiFi/src/include/ClientContext.h @@ -31,6 +31,7 @@ extern "C" void esp_schedule(); #include #include +#include bool getDefaultPrivateGlobalSyncValue (); @@ -372,32 +373,15 @@ public: return _pcb->state; } - size_t write(const uint8_t* data, size_t size) - { - if (!_pcb) { - return 0; - } - StreamConstPtr ptr(data, size); - return _write_from_source(&ptr); - } - size_t write(Stream& stream) { if (!_pcb) { return 0; } + assert(stream.hasPeekBufferAPI()); return _write_from_source(&stream); } - size_t write_P(PGM_P buf, size_t size) - { - if (!_pcb) { - return 0; - } - StreamConstPtr ptr(buf, size); - return _write_from_source(&ptr); - } - void keepAlive (uint16_t idle_sec = TCP_DEFAULT_KEEPALIVE_IDLE_SEC, uint16_t intv_sec = TCP_DEFAULT_KEEPALIVE_INTERVAL_SEC, uint8_t count = TCP_DEFAULT_KEEPALIVE_COUNT) { if (idle_sec && intv_sec && count) { @@ -504,7 +488,6 @@ protected: // Give scheduled functions a chance to run (e.g. Ethernet uses recurrent) delay(1); // will resume on timeout or when _write_some_from_cb or _notify_error fires - } _send_waiting = false; } while(true);