Integrate UGC class into Text Product Message, support multi-line UGC

This commit is contained in:
Dan Paulat 2022-10-14 23:33:58 -05:00
parent d3b3ac6be6
commit 8fe7d5da6e
2 changed files with 23 additions and 4 deletions

View file

@ -2,8 +2,9 @@
#include <scwx/awips/coded_location.hpp> #include <scwx/awips/coded_location.hpp>
#include <scwx/awips/coded_time_motion_location.hpp> #include <scwx/awips/coded_time_motion_location.hpp>
#include <scwx/awips/pvtec.hpp>
#include <scwx/awips/message.hpp> #include <scwx/awips/message.hpp>
#include <scwx/awips/pvtec.hpp>
#include <scwx/awips/ugc.hpp>
#include <scwx/awips/wmo_header.hpp> #include <scwx/awips/wmo_header.hpp>
#include <cstdint> #include <cstdint>
@ -31,13 +32,18 @@ struct Vtec
struct SegmentHeader struct SegmentHeader
{ {
std::string ugcString_; std::vector<std::string> ugcString_;
Ugc ugc_;
std::vector<Vtec> vtecString_; std::vector<Vtec> vtecString_;
std::vector<std::string> ugcNames_; std::vector<std::string> ugcNames_;
std::string issuanceDateTime_; std::string issuanceDateTime_;
SegmentHeader() : SegmentHeader() :
ugcString_ {}, vtecString_ {}, ugcNames_ {}, issuanceDateTime_ {} ugcString_ {},
ugc_ {},
vtecString_ {},
ugcNames_ {},
issuanceDateTime_ {}
{ {
} }

View file

@ -333,7 +333,9 @@ std::optional<SegmentHeader> TryParseSegmentHeader(std::istream& is)
{ {
// UGC takes the form SSFNNN-NNN>NNN-SSFNNN-DDHHMM- (NWSI 10-1702) // UGC takes the form SSFNNN-NNN>NNN-SSFNNN-DDHHMM- (NWSI 10-1702)
// Look for SSF(NNN)?[->] to key the UGC string // Look for SSF(NNN)?[->] to key the UGC string
// Look for DDHHMM- to end the UGC string
static const std::regex reUgcString {"^[A-Z]{2}[CZ]([0-9]{3})?[->]"}; static const std::regex reUgcString {"^[A-Z]{2}[CZ]([0-9]{3})?[->]"};
static const std::regex reUgcExpiration {"[0-9]{6}-$"};
std::optional<SegmentHeader> header = std::nullopt; std::optional<SegmentHeader> header = std::nullopt;
std::string line; std::string line;
@ -344,7 +346,18 @@ std::optional<SegmentHeader> TryParseSegmentHeader(std::istream& is)
if (std::regex_search(line, reUgcString)) if (std::regex_search(line, reUgcString))
{ {
header = SegmentHeader(); header = SegmentHeader();
header->ugcString_.swap(line); header->ugcString_.push_back(line);
// If UGC is multi-line, continue parsing
while (!is.eof() && is.peek() != '\r' &&
!std::regex_search(line, reUgcExpiration))
{
util::getline(is, line);
header->ugcString_.push_back(line);
}
// Parse UGC
header->ugc_.Parse(header->ugcString_);
} }
if (header.has_value()) if (header.has_value())