From bfd688c346d9876c3369b4a950ef57bbcf67354e Mon Sep 17 00:00:00 2001 From: Mathieu Carbou Date: Wed, 23 Oct 2024 14:49:28 +0200 Subject: [PATCH] Code cleanup around virtual destructor's hierarchy --- src/AsyncEventSource.h | 1 + src/AsyncJson.h | 1 + src/AsyncMessagePack.h | 1 + src/AsyncWebSocket.h | 1 + src/WebResponseImpl.h | 10 ++++++++-- src/WebResponses.cpp | 5 +---- 6 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/AsyncEventSource.h b/src/AsyncEventSource.h index 35ae319..9baa04c 100644 --- a/src/AsyncEventSource.h +++ b/src/AsyncEventSource.h @@ -154,6 +154,7 @@ class AsyncEventSourceResponse : public AsyncWebServerResponse { public: AsyncEventSourceResponse(AsyncEventSource* server); + virtual ~AsyncEventSourceResponse() {}; void _respond(AsyncWebServerRequest* request); size_t _ack(AsyncWebServerRequest* request, size_t len, uint32_t time); bool _sourceValid() const { return true; } diff --git a/src/AsyncJson.h b/src/AsyncJson.h index a3db8b6..198ac4b 100644 --- a/src/AsyncJson.h +++ b/src/AsyncJson.h @@ -74,6 +74,7 @@ class AsyncJsonResponse : public AsyncAbstractResponse { #else AsyncJsonResponse(bool isArray = false); #endif + virtual ~AsyncJsonResponse() {} JsonVariant& getRoot() { return _root; } bool _sourceValid() const { return _isValid; } size_t setLength(); diff --git a/src/AsyncMessagePack.h b/src/AsyncMessagePack.h index 210e0a6..7548f1d 100644 --- a/src/AsyncMessagePack.h +++ b/src/AsyncMessagePack.h @@ -58,6 +58,7 @@ class AsyncMessagePackResponse : public AsyncAbstractResponse { #else AsyncMessagePackResponse(bool isArray = false); #endif + virtual ~AsyncMessagePackResponse() {} JsonVariant& getRoot() { return _root; } bool _sourceValid() const { return _isValid; } size_t setLength(); diff --git a/src/AsyncWebSocket.h b/src/AsyncWebSocket.h index 5f134b9..8a7f7b3 100644 --- a/src/AsyncWebSocket.h +++ b/src/AsyncWebSocket.h @@ -368,6 +368,7 @@ class AsyncWebSocketResponse : public AsyncWebServerResponse { public: AsyncWebSocketResponse(const String& key, AsyncWebSocket* server); + virtual ~AsyncWebSocketResponse() {} void _respond(AsyncWebServerRequest* request); size_t _ack(AsyncWebServerRequest* request, size_t len, uint32_t time); bool _sourceValid() const { return true; } diff --git a/src/WebResponseImpl.h b/src/WebResponseImpl.h index a6f71bb..d8b9135 100644 --- a/src/WebResponseImpl.h +++ b/src/WebResponseImpl.h @@ -38,6 +38,7 @@ class AsyncBasicResponse : public AsyncWebServerResponse { public: explicit AsyncBasicResponse(int code, const char* contentType = asyncsrv::empty, const char* content = asyncsrv::empty); + virtual ~AsyncBasicResponse() {} AsyncBasicResponse(int code, const String& contentType, const String& content = emptyString) : AsyncBasicResponse(code, contentType.c_str(), content.c_str()) {} void _respond(AsyncWebServerRequest* request); size_t _ack(AsyncWebServerRequest* request, size_t len, uint32_t time); @@ -60,6 +61,7 @@ class AsyncAbstractResponse : public AsyncWebServerResponse { public: AsyncAbstractResponse(AwsTemplateProcessor callback = nullptr); + virtual ~AsyncAbstractResponse() {} void _respond(AsyncWebServerRequest* request); size_t _ack(AsyncWebServerRequest* request, size_t len, uint32_t time); bool _sourceValid() const { return false; } @@ -85,7 +87,7 @@ class AsyncFileResponse : public AsyncAbstractResponse { AsyncFileResponse(FS& fs, const String& path, const String& contentType, bool download = false, AwsTemplateProcessor callback = nullptr) : AsyncFileResponse(fs, path, contentType.c_str(), download, callback) {} AsyncFileResponse(File content, const String& path, const char* contentType = asyncsrv::empty, bool download = false, AwsTemplateProcessor callback = nullptr); AsyncFileResponse(File content, const String& path, const String& contentType, bool download = false, AwsTemplateProcessor callack = nullptr) : AsyncFileResponse(content, path, contentType.c_str(), download, callack) {} - ~AsyncFileResponse(); + virtual ~AsyncFileResponse(); bool _sourceValid() const { return !!(_content); } virtual size_t _fillBuffer(uint8_t* buf, size_t maxLen) override; }; @@ -97,6 +99,7 @@ class AsyncStreamResponse : public AsyncAbstractResponse { public: AsyncStreamResponse(Stream& stream, const char* contentType, size_t len, AwsTemplateProcessor callback = nullptr); AsyncStreamResponse(Stream& stream, const String& contentType, size_t len, AwsTemplateProcessor callback = nullptr) : AsyncStreamResponse(stream, contentType.c_str(), len, callback) {} + virtual ~AsyncStreamResponse() {} bool _sourceValid() const { return !!(_content); } virtual size_t _fillBuffer(uint8_t* buf, size_t maxLen) override; }; @@ -109,6 +112,7 @@ class AsyncCallbackResponse : public AsyncAbstractResponse { public: AsyncCallbackResponse(const char* contentType, size_t len, AwsResponseFiller callback, AwsTemplateProcessor templateCallback = nullptr); AsyncCallbackResponse(const String& contentType, size_t len, AwsResponseFiller callback, AwsTemplateProcessor templateCallback = nullptr) : AsyncCallbackResponse(contentType.c_str(), len, callback, templateCallback) {} + virtual ~AsyncCallbackResponse() {} bool _sourceValid() const { return !!(_content); } virtual size_t _fillBuffer(uint8_t* buf, size_t maxLen) override; }; @@ -121,6 +125,7 @@ class AsyncChunkedResponse : public AsyncAbstractResponse { public: AsyncChunkedResponse(const char* contentType, AwsResponseFiller callback, AwsTemplateProcessor templateCallback = nullptr); AsyncChunkedResponse(const String& contentType, AwsResponseFiller callback, AwsTemplateProcessor templateCallback = nullptr) : AsyncChunkedResponse(contentType.c_str(), callback, templateCallback) {} + virtual ~AsyncChunkedResponse() {} bool _sourceValid() const { return !!(_content); } virtual size_t _fillBuffer(uint8_t* buf, size_t maxLen) override; }; @@ -133,6 +138,7 @@ class AsyncProgmemResponse : public AsyncAbstractResponse { public: AsyncProgmemResponse(int code, const char* contentType, const uint8_t* content, size_t len, AwsTemplateProcessor callback = nullptr); AsyncProgmemResponse(int code, const String& contentType, const uint8_t* content, size_t len, AwsTemplateProcessor callback = nullptr) : AsyncProgmemResponse(code, contentType.c_str(), content, len, callback) {} + virtual ~AsyncProgmemResponse() {} bool _sourceValid() const { return true; } virtual size_t _fillBuffer(uint8_t* buf, size_t maxLen) override; }; @@ -146,7 +152,7 @@ class AsyncResponseStream : public AsyncAbstractResponse, public Print { public: AsyncResponseStream(const char* contentType, size_t bufferSize); AsyncResponseStream(const String& contentType, size_t bufferSize) : AsyncResponseStream(contentType.c_str(), bufferSize) {} - ~AsyncResponseStream(); + virtual ~AsyncResponseStream() {} bool _sourceValid() const { return (_state < RESPONSE_END); } virtual size_t _fillBuffer(uint8_t* buf, size_t maxLen) override; size_t write(const uint8_t* data, size_t len); diff --git a/src/WebResponses.cpp b/src/WebResponses.cpp index e683176..23f929a 100644 --- a/src/WebResponses.cpp +++ b/src/WebResponses.cpp @@ -647,8 +647,7 @@ size_t AsyncAbstractResponse::_fillBufferAndProcessTemplates(uint8_t* data, size * */ AsyncFileResponse::~AsyncFileResponse() { - if (_content) - _content.close(); + _content.close(); } void AsyncFileResponse::_setContentTypeFromPath(const String& path) { @@ -869,8 +868,6 @@ AsyncResponseStream::AsyncResponseStream(const char* contentType, size_t bufferS _content = std::unique_ptr(new cbuf(bufferSize)); // std::make_unique(bufferSize); } -AsyncResponseStream::~AsyncResponseStream() {}; - size_t AsyncResponseStream::_fillBuffer(uint8_t* buf, size_t maxLen) { return _content->read((char*)buf, maxLen); }