From 465507d6b5d1cdd5048b2cc4101bcf4c5b7c3262 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sun, 16 Oct 2022 23:30:39 -0500 Subject: [PATCH] Handle raw message content when istream is EOF --- .../scwx/awips/text_product_message.cpp | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/wxdata/source/scwx/awips/text_product_message.cpp b/wxdata/source/scwx/awips/text_product_message.cpp index f03d3bce..2c49077b 100644 --- a/wxdata/source/scwx/awips/text_product_message.cpp +++ b/wxdata/source/scwx/awips/text_product_message.cpp @@ -164,16 +164,33 @@ bool TextProductMessage::Parse(std::istream& is) if (dataValid) { // Store raw message content - std::streampos messageEnd = is.tellg(); - std::streamsize messageSize = messageEnd - messageStart; - p->messageContent_.resize(messageEnd - messageStart); - is.seekg(messageStart); - if (is.peek() == common::Characters::SOH) + if (is.good()) { - is.seekg(std::streamoff {1}, std::ios_base::cur); - messageSize--; + // Read content equal to the message size + std::streampos messageEnd = is.tellg(); + std::streamsize messageSize = messageEnd - messageStart; + p->messageContent_.resize(messageEnd - messageStart); + is.seekg(messageStart); + if (is.peek() == common::Characters::SOH) + { + is.seekg(std::streamoff {1}, std::ios_base::cur); + messageSize--; + } + is.read(p->messageContent_.data(), messageSize); + } + else + { + // Read remaining content in the input stream + is.clear(); + is.seekg(messageStart); + if (is.peek() == common::Characters::SOH) + { + is.seekg(std::streamoff {1}, std::ios_base::cur); + } + + constexpr std::istreambuf_iterator eos; + p->messageContent_ = {std::istreambuf_iterator(is), eos}; } - is.read(p->messageContent_.data(), messageSize); // Trim extra characters from raw message while (p->messageContent_.size() > 0 &&