mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 19:00:05 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			111 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <scwx/wsr88d/rpg/radar_coded_message.hpp>
 | |
| #include <scwx/util/logger.hpp>
 | |
| 
 | |
| #include <istream>
 | |
| #include <string>
 | |
| 
 | |
| namespace scwx
 | |
| {
 | |
| namespace wsr88d
 | |
| {
 | |
| namespace rpg
 | |
| {
 | |
| 
 | |
| static const std::string logPrefix_ = "scwx::wsr88d::rpg::radar_coded_message";
 | |
| static const auto        logger_    = util::Logger::Create(logPrefix_);
 | |
| 
 | |
| class RadarCodedMessageImpl
 | |
| {
 | |
| public:
 | |
|    explicit RadarCodedMessageImpl() :
 | |
|        descriptionBlock_ {0},
 | |
|        pupSiteIdentifier_ {},
 | |
|        productCategory_ {},
 | |
|        rdaSiteIdentifier_ {}
 | |
|    {
 | |
|    }
 | |
|    ~RadarCodedMessageImpl() = default;
 | |
| 
 | |
|    bool LoadBlocks(std::istream& is);
 | |
| 
 | |
|    std::shared_ptr<ProductDescriptionBlock> descriptionBlock_;
 | |
| 
 | |
|    std::string pupSiteIdentifier_;
 | |
|    std::string productCategory_;
 | |
|    std::string rdaSiteIdentifier_;
 | |
| };
 | |
| 
 | |
| RadarCodedMessage::RadarCodedMessage() :
 | |
|     p(std::make_unique<RadarCodedMessageImpl>())
 | |
| {
 | |
| }
 | |
| RadarCodedMessage::~RadarCodedMessage() = default;
 | |
| 
 | |
| RadarCodedMessage::RadarCodedMessage(RadarCodedMessage&&) noexcept = default;
 | |
| RadarCodedMessage&
 | |
| RadarCodedMessage::operator=(RadarCodedMessage&&) noexcept = default;
 | |
| 
 | |
| std::shared_ptr<ProductDescriptionBlock>
 | |
| RadarCodedMessage::description_block() const
 | |
| {
 | |
|    return p->descriptionBlock_;
 | |
| }
 | |
| 
 | |
| bool RadarCodedMessage::Parse(std::istream& is)
 | |
| {
 | |
|    bool dataValid = true;
 | |
| 
 | |
|    const std::streampos dataStart = is.tellg();
 | |
| 
 | |
|    p->descriptionBlock_ = std::make_shared<ProductDescriptionBlock>();
 | |
|    dataValid            = p->descriptionBlock_->Parse(is);
 | |
| 
 | |
|    if (dataValid)
 | |
|    {
 | |
|       dataValid = p->LoadBlocks(is);
 | |
|    }
 | |
| 
 | |
|    const std::streampos dataEnd = is.tellg();
 | |
|    if (!ValidateMessage(is, dataEnd - dataStart))
 | |
|    {
 | |
|       dataValid = false;
 | |
|    }
 | |
| 
 | |
|    return dataValid;
 | |
| }
 | |
| 
 | |
| bool RadarCodedMessageImpl::LoadBlocks(std::istream& is)
 | |
| {
 | |
|    logger_->debug("Loading Blocks");
 | |
| 
 | |
|    pupSiteIdentifier_.resize(4);
 | |
|    productCategory_.resize(5);
 | |
|    rdaSiteIdentifier_.resize(4);
 | |
| 
 | |
|    is.read(pupSiteIdentifier_.data(), 4);
 | |
|    is.seekg(1, std::ios_base::cur);
 | |
|    is.read(productCategory_.data(), 5);
 | |
|    is.seekg(1, std::ios_base::cur);
 | |
|    is.read(rdaSiteIdentifier_.data(), 4);
 | |
| 
 | |
|    return !is.eof();
 | |
| }
 | |
| 
 | |
| std::shared_ptr<RadarCodedMessage>
 | |
| RadarCodedMessage::Create(Level3MessageHeader&& header, std::istream& is)
 | |
| {
 | |
|    std::shared_ptr<RadarCodedMessage> message =
 | |
|       std::make_shared<RadarCodedMessage>();
 | |
|    message->set_header(std::move(header));
 | |
| 
 | |
|    if (!message->Parse(is))
 | |
|    {
 | |
|       message.reset();
 | |
|    }
 | |
| 
 | |
|    return message;
 | |
| }
 | |
| 
 | |
| } // namespace rpg
 | |
| } // namespace wsr88d
 | |
| } // namespace scwx
 | 
