From cb86ab4b9ba29d716a10d12ec98b0cc8ed3b7ee9 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Fri, 24 Dec 2021 12:06:38 -0600 Subject: [PATCH] Default ValidateMessage implementation --- wxdata/include/scwx/wsr88d/message.hpp | 4 +- .../scwx/wsr88d/rda/level2_message.hpp | 4 +- .../wsr88d/rpg/product_description_block.hpp | 6 ++- wxdata/source/scwx/wsr88d/message.cpp | 43 +++++++++++++++++++ .../source/scwx/wsr88d/rda/level2_message.cpp | 39 +---------------- .../wsr88d/rpg/product_description_block.cpp | 11 +++-- 6 files changed, 59 insertions(+), 48 deletions(-) diff --git a/wxdata/include/scwx/wsr88d/message.hpp b/wxdata/include/scwx/wsr88d/message.hpp index b30570cf..b8883f62 100644 --- a/wxdata/include/scwx/wsr88d/message.hpp +++ b/wxdata/include/scwx/wsr88d/message.hpp @@ -30,11 +30,13 @@ protected: Message(Message&&) noexcept; Message& operator=(Message&&) noexcept; - virtual bool ValidateMessage(std::istream& is, size_t bytesRead) const = 0; + virtual bool ValidateMessage(std::istream& is, size_t bytesRead) const; public: virtual ~Message(); + virtual size_t data_size() const = 0; + virtual bool Parse(std::istream& is) = 0; static void ReadBoolean(std::istream& is, bool& value) diff --git a/wxdata/include/scwx/wsr88d/rda/level2_message.hpp b/wxdata/include/scwx/wsr88d/rda/level2_message.hpp index e7996138..87a8de47 100644 --- a/wxdata/include/scwx/wsr88d/rda/level2_message.hpp +++ b/wxdata/include/scwx/wsr88d/rda/level2_message.hpp @@ -29,11 +29,11 @@ protected: Level2Message(Level2Message&&) noexcept; Level2Message& operator=(Level2Message&&) noexcept; - bool ValidateMessage(std::istream& is, size_t bytesRead) const override; - public: virtual ~Level2Message(); + size_t data_size() const override; + const Level2MessageHeader& header() const; void set_header(Level2MessageHeader&& header); diff --git a/wxdata/include/scwx/wsr88d/rpg/product_description_block.hpp b/wxdata/include/scwx/wsr88d/rpg/product_description_block.hpp index 2b9c57d8..42fae57c 100644 --- a/wxdata/include/scwx/wsr88d/rpg/product_description_block.hpp +++ b/wxdata/include/scwx/wsr88d/rpg/product_description_block.hpp @@ -48,9 +48,11 @@ public: bool IsCompressionEnabled() const; - bool Parse(std::istream& is); + size_t data_size() const override; - static const size_t SIZE = 102u; + bool Parse(std::istream& is) override; + + static constexpr size_t SIZE = 102u; private: std::unique_ptr p; diff --git a/wxdata/source/scwx/wsr88d/message.cpp b/wxdata/source/scwx/wsr88d/message.cpp index f178951a..9d26ed8a 100644 --- a/wxdata/source/scwx/wsr88d/message.cpp +++ b/wxdata/source/scwx/wsr88d/message.cpp @@ -1,5 +1,7 @@ #include +#include + namespace scwx { namespace wsr88d @@ -20,5 +22,46 @@ Message::~Message() = default; Message::Message(Message&&) noexcept = default; Message& Message::operator=(Message&&) noexcept = default; +bool Message::ValidateMessage(std::istream& is, size_t bytesRead) const +{ + bool messageValid = true; + + const size_t dataSize = data_size(); + + if (is.eof()) + { + BOOST_LOG_TRIVIAL(warning) << logPrefix_ << "Reached end of data stream"; + messageValid = false; + } + else if (is.fail()) + { + BOOST_LOG_TRIVIAL(warning) + << logPrefix_ << "Could not read from input stream"; + messageValid = false; + } + else if (bytesRead != dataSize) + { + is.seekg(static_cast(dataSize) - + static_cast(bytesRead), + std::ios_base::cur); + + if (bytesRead < dataSize) + { + BOOST_LOG_TRIVIAL(trace) + << logPrefix_ << "Message contents smaller than size: " << bytesRead + << " < " << dataSize << " bytes"; + } + if (bytesRead > dataSize) + { + BOOST_LOG_TRIVIAL(warning) + << logPrefix_ << "Message contents larger than size: " << bytesRead + << " > " << dataSize << " bytes"; + messageValid = false; + } + } + + return messageValid; +} + } // namespace wsr88d } // namespace scwx diff --git a/wxdata/source/scwx/wsr88d/rda/level2_message.cpp b/wxdata/source/scwx/wsr88d/rda/level2_message.cpp index 4baeab0f..6336a1c5 100644 --- a/wxdata/source/scwx/wsr88d/rda/level2_message.cpp +++ b/wxdata/source/scwx/wsr88d/rda/level2_message.cpp @@ -29,44 +29,9 @@ Level2Message::~Level2Message() = default; Level2Message::Level2Message(Level2Message&&) noexcept = default; Level2Message& Level2Message::operator=(Level2Message&&) noexcept = default; -bool Level2Message::ValidateMessage(std::istream& is, size_t bytesRead) const +size_t Level2Message::data_size() const { - bool messageValid = true; - size_t dataSize = header().message_size() * 2 - header().SIZE; - - if (is.eof()) - { - BOOST_LOG_TRIVIAL(warning) << logPrefix_ << "Reached end of data stream"; - messageValid = false; - } - else if (is.fail()) - { - BOOST_LOG_TRIVIAL(warning) - << logPrefix_ << "Could not read from input stream"; - messageValid = false; - } - else if (bytesRead != dataSize) - { - is.seekg(static_cast(dataSize) - - static_cast(bytesRead), - std::ios_base::cur); - - if (bytesRead < dataSize) - { - BOOST_LOG_TRIVIAL(trace) - << logPrefix_ << "Message contents smaller than size: " << bytesRead - << " < " << dataSize << " bytes"; - } - if (bytesRead > dataSize) - { - BOOST_LOG_TRIVIAL(warning) - << logPrefix_ << "Message contents larger than size: " << bytesRead - << " > " << dataSize << " bytes"; - messageValid = false; - } - } - - return messageValid; + return (header().message_size() * 2 - header().SIZE); } const Level2MessageHeader& Level2Message::header() const diff --git a/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp b/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp index 7c1e8e6a..afd70106 100644 --- a/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp +++ b/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp @@ -7,12 +7,6 @@ #include -#ifdef WIN32 -# include -#else -# include -#endif - namespace scwx { namespace wsr88d @@ -209,6 +203,11 @@ bool ProductDescriptionBlock::IsCompressionEnabled() const return isCompressed; } +size_t ProductDescriptionBlock::data_size() const +{ + return SIZE; +} + bool ProductDescriptionBlock::Parse(std::istream& is) { bool blockValid = true;