diff --git a/libraries/SSLClient/src/SSLClient.cpp b/libraries/SSLClient/src/SSLClient.cpp index 6b1c67754..b68036c98 100644 --- a/libraries/SSLClient/src/SSLClient.cpp +++ b/libraries/SSLClient/src/SSLClient.cpp @@ -85,6 +85,7 @@ SSLClient::SSLClient(Client* client, String ca_path) SSLClient::~SSLClient() { stop(); + delete sslclient->client; delete sslclient; } diff --git a/libraries/SSLClient/src/SSLClient.h b/libraries/SSLClient/src/SSLClient.h index ce73e7b0c..a9c95f8d6 100644 --- a/libraries/SSLClient/src/SSLClient.h +++ b/libraries/SSLClient/src/SSLClient.h @@ -46,7 +46,7 @@ class SSLClient : public Client SSLClient(); SSLClient(Client* client); SSLClient(Client* client, String ca_path); - ~SSLClient(); + virtual ~SSLClient(); void setClient(Client& client); diff --git a/libraries/lwIpWrapper/src/lwipClient.cpp b/libraries/lwIpWrapper/src/lwipClient.cpp index 8facb2525..199c2cefb 100644 --- a/libraries/lwIpWrapper/src/lwipClient.cpp +++ b/libraries/lwIpWrapper/src/lwipClient.cpp @@ -8,7 +8,7 @@ extern "C" { /* -------------------------------------------------------------------------- */ lwipClient::lwipClient() - : _tcp_client(NULL) + : _tcp_client(NULL), _provided_tcp_client(false) { } /* -------------------------------------------------------------------------- */ @@ -17,16 +17,47 @@ lwipClient::lwipClient() sketches but sock is ignored. */ /* -------------------------------------------------------------------------- */ lwipClient::lwipClient(uint8_t sock) - : _tcp_client(NULL) + : _tcp_client(NULL), _provided_tcp_client(false) + { } /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ lwipClient::lwipClient(struct tcp_struct* tcpClient) + : _tcp_client(tcpClient), _provided_tcp_client(true) + { - _tcp_client = tcpClient; } + +/* -------------------------------------------------------------------------- */ +lwipClient::lwipClient(lwipClient&& c) noexcept + :_tcp_client(std::move(c._tcp_client)), _provided_tcp_client(c._provided_tcp_client), _timeout(c._timeout) +{ + +} +/* -------------------------------------------------------------------------- */ + +/* -------------------------------------------------------------------------- */ +lwipClient::~lwipClient() +{ + stop(); + + if(!_provided_tcp_client) { + mem_free(_tcp_client); + } +} +/* -------------------------------------------------------------------------- */ + +/* -------------------------------------------------------------------------- */ +lwipClient& lwipClient::operator=(lwipClient&& c) { + this->_tcp_client = std::move(c._tcp_client); + this->_provided_tcp_client = c._provided_tcp_client; + this->_timeout = c._timeout; + + return *this; +} + /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ @@ -158,9 +189,13 @@ int lwipClient::read() uint8_t b; if ((_tcp_client != NULL) && (_tcp_client->data.p != NULL)) { __disable_irq(); - pbuffer_get_data(&(_tcp_client->data), &b, 1); + int rv = pbuffer_get_data(&(_tcp_client->data), &b, 1); __enable_irq(); - return b; + if(rv == 1) { + return b; + } else { + return -1; + } } // No data available return -1; @@ -224,7 +259,7 @@ uint8_t lwipClient::connected() { /* -------------------------------------------------------------------------- */ uint8_t s = status(); - return ((available() && (s == TCP_CLOSING)) || (s == TCP_CONNECTED) || (s == TCP_ACCEPTED)); + return s != TCP_DISCONNECTED && ((available() && (s == TCP_CLOSING)) || (s == TCP_CONNECTED) || (s == TCP_ACCEPTED)); } /* -------------------------------------------------------------------------- */ @@ -253,6 +288,13 @@ bool lwipClient::operator==(const lwipClient& rhs) return _tcp_client == rhs._tcp_client && _tcp_client->pcb == rhs._tcp_client->pcb; } +/* -------------------------------------------------------------------------- */ +bool lwipClient::operator!=(const lwipClient& rhs) +{ + /* -------------------------------------------------------------------------- */ + return _tcp_client != rhs._tcp_client || _tcp_client->pcb != rhs._tcp_client->pcb; +} + /* This function is not a function defined by Arduino. This is a function specific to the W5100 architecture. To keep the compatibility we leave it and returns always 0. */ diff --git a/libraries/lwIpWrapper/src/lwipClient.h b/libraries/lwIpWrapper/src/lwipClient.h index b3ffe270d..85d36a847 100644 --- a/libraries/lwIpWrapper/src/lwipClient.h +++ b/libraries/lwIpWrapper/src/lwipClient.h @@ -16,6 +16,10 @@ class lwipClient : public Client { lwipClient(); lwipClient(uint8_t sock); lwipClient(struct tcp_struct* tcpClient); + lwipClient(lwipClient&& c); + virtual ~lwipClient(); + + lwipClient& operator=(lwipClient&& c); uint8_t status(); virtual int connect(IPAddress ip, uint16_t port); @@ -39,10 +43,7 @@ class lwipClient : public Client { return bool() != value; } virtual bool operator==(const lwipClient&); - virtual bool operator!=(const lwipClient& rhs) - { - return !this->operator==(rhs); - }; + virtual bool operator!=(const lwipClient& rhs); uint8_t getSocketNumber(); virtual uint16_t localPort() { @@ -68,6 +69,8 @@ class lwipClient : public Client { private: struct tcp_struct* _tcp_client; uint16_t _timeout = 10000; + + bool _provided_tcp_client; }; #endif diff --git a/libraries/lwIpWrapper/src/lwipTypes.h b/libraries/lwIpWrapper/src/lwipTypes.h index c108e15c7..3ce6b7678 100644 --- a/libraries/lwIpWrapper/src/lwipTypes.h +++ b/libraries/lwIpWrapper/src/lwipTypes.h @@ -14,6 +14,7 @@ typedef enum { TCP_SENT, TCP_ACCEPTED, TCP_CLOSING, + TCP_DISCONNECTED, } tcp_client_states; /* Struct to store received data */