mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 20:20:06 +00:00
161 lines
6.4 KiB
C++
161 lines
6.4 KiB
C++
#include <scwx/wsr88d/rpg/level3_message_factory.hpp>
|
|
|
|
#include <scwx/util/logger.hpp>
|
|
#include <scwx/util/vectorbuf.hpp>
|
|
#include <scwx/wsr88d/rpg/general_status_message.hpp>
|
|
#include <scwx/wsr88d/rpg/graphic_product_message.hpp>
|
|
#include <scwx/wsr88d/rpg/radar_coded_message.hpp>
|
|
#include <scwx/wsr88d/rpg/storm_tracking_information_message.hpp>
|
|
#include <scwx/wsr88d/rpg/tabular_product_message.hpp>
|
|
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
|
|
namespace scwx
|
|
{
|
|
namespace wsr88d
|
|
{
|
|
namespace rpg
|
|
{
|
|
|
|
static const std::string logPrefix_ =
|
|
"scwx::wsr88d::rpg::level3_message_factory";
|
|
static const auto logger_ = util::Logger::Create(logPrefix_);
|
|
|
|
typedef std::function<std::shared_ptr<Level3Message>(Level3MessageHeader&&,
|
|
std::istream&)>
|
|
CreateLevel3MessageFunction;
|
|
|
|
static const std::unordered_map<int, CreateLevel3MessageFunction> //
|
|
create_ {{2, GeneralStatusMessage::Create},
|
|
{19, GraphicProductMessage::Create},
|
|
{20, GraphicProductMessage::Create},
|
|
{27, GraphicProductMessage::Create},
|
|
{30, GraphicProductMessage::Create},
|
|
{31, GraphicProductMessage::Create},
|
|
{32, GraphicProductMessage::Create},
|
|
{33, GraphicProductMessage::Create},
|
|
{34, GraphicProductMessage::Create},
|
|
{37, GraphicProductMessage::Create},
|
|
{38, GraphicProductMessage::Create},
|
|
{41, GraphicProductMessage::Create},
|
|
{48, GraphicProductMessage::Create},
|
|
{49, GraphicProductMessage::Create},
|
|
{50, GraphicProductMessage::Create},
|
|
{51, GraphicProductMessage::Create},
|
|
{56, GraphicProductMessage::Create},
|
|
{57, GraphicProductMessage::Create},
|
|
{58, StormTrackingInformationMessage::Create},
|
|
{59, GraphicProductMessage::Create},
|
|
{61, GraphicProductMessage::Create},
|
|
{62, TabularProductMessage::Create},
|
|
{65, GraphicProductMessage::Create},
|
|
{66, GraphicProductMessage::Create},
|
|
{67, GraphicProductMessage::Create},
|
|
{74, RadarCodedMessage::Create},
|
|
{77, TabularProductMessage::Create},
|
|
{78, GraphicProductMessage::Create},
|
|
{79, GraphicProductMessage::Create},
|
|
{80, GraphicProductMessage::Create},
|
|
{81, GraphicProductMessage::Create},
|
|
{82, TabularProductMessage::Create},
|
|
{84, GraphicProductMessage::Create},
|
|
{86, GraphicProductMessage::Create},
|
|
{90, GraphicProductMessage::Create},
|
|
{93, GraphicProductMessage::Create},
|
|
{94, GraphicProductMessage::Create},
|
|
{97, GraphicProductMessage::Create},
|
|
{98, GraphicProductMessage::Create},
|
|
{99, GraphicProductMessage::Create},
|
|
{100, GraphicProductMessage::Create},
|
|
{101, GraphicProductMessage::Create},
|
|
{102, GraphicProductMessage::Create},
|
|
{104, GraphicProductMessage::Create},
|
|
{105, GraphicProductMessage::Create},
|
|
{107, GraphicProductMessage::Create},
|
|
{108, GraphicProductMessage::Create},
|
|
{109, GraphicProductMessage::Create},
|
|
{110, GraphicProductMessage::Create},
|
|
{111, GraphicProductMessage::Create},
|
|
{132, GraphicProductMessage::Create},
|
|
{133, GraphicProductMessage::Create},
|
|
{134, GraphicProductMessage::Create},
|
|
{135, GraphicProductMessage::Create},
|
|
{137, GraphicProductMessage::Create},
|
|
{138, GraphicProductMessage::Create},
|
|
{140, GraphicProductMessage::Create},
|
|
{141, GraphicProductMessage::Create},
|
|
{143, GraphicProductMessage::Create},
|
|
{144, GraphicProductMessage::Create},
|
|
{145, GraphicProductMessage::Create},
|
|
{146, GraphicProductMessage::Create},
|
|
{147, GraphicProductMessage::Create},
|
|
{149, GraphicProductMessage::Create},
|
|
{150, GraphicProductMessage::Create},
|
|
{151, GraphicProductMessage::Create},
|
|
{152, GraphicProductMessage::Create},
|
|
{153, GraphicProductMessage::Create},
|
|
{154, GraphicProductMessage::Create},
|
|
{155, GraphicProductMessage::Create},
|
|
{159, GraphicProductMessage::Create},
|
|
{161, GraphicProductMessage::Create},
|
|
{163, GraphicProductMessage::Create},
|
|
{165, GraphicProductMessage::Create},
|
|
{166, GraphicProductMessage::Create},
|
|
{167, GraphicProductMessage::Create},
|
|
{168, GraphicProductMessage::Create},
|
|
{169, GraphicProductMessage::Create},
|
|
{170, GraphicProductMessage::Create},
|
|
{171, GraphicProductMessage::Create},
|
|
{172, GraphicProductMessage::Create},
|
|
{173, GraphicProductMessage::Create},
|
|
{174, GraphicProductMessage::Create},
|
|
{175, GraphicProductMessage::Create},
|
|
{176, GraphicProductMessage::Create},
|
|
{177, GraphicProductMessage::Create},
|
|
{178, GraphicProductMessage::Create},
|
|
{179, GraphicProductMessage::Create},
|
|
{180, GraphicProductMessage::Create},
|
|
{182, GraphicProductMessage::Create},
|
|
{184, GraphicProductMessage::Create},
|
|
{186, GraphicProductMessage::Create},
|
|
{193, GraphicProductMessage::Create},
|
|
{195, GraphicProductMessage::Create},
|
|
{196, GraphicProductMessage::Create},
|
|
{202, GraphicProductMessage::Create}};
|
|
|
|
std::shared_ptr<Level3Message> Level3MessageFactory::Create(std::istream& is)
|
|
{
|
|
Level3MessageHeader header;
|
|
std::shared_ptr<Level3Message> message;
|
|
|
|
bool headerValid = header.Parse(is);
|
|
bool messageValid = headerValid;
|
|
|
|
if (headerValid && create_.find(header.message_code()) == create_.end())
|
|
{
|
|
logger_->warn("Unknown message type: {}", header.message_code());
|
|
messageValid = false;
|
|
}
|
|
|
|
if (messageValid)
|
|
{
|
|
int16_t messageCode = header.message_code();
|
|
|
|
logger_->debug("Found Message {}", messageCode);
|
|
|
|
message = create_.at(messageCode)(std::move(header), is);
|
|
}
|
|
else if (headerValid)
|
|
{
|
|
// Seek to the end of the current message
|
|
is.seekg(header.length_of_message() - Level3MessageHeader::SIZE,
|
|
std::ios_base::cur);
|
|
}
|
|
|
|
return message;
|
|
}
|
|
|
|
} // namespace rpg
|
|
} // namespace wsr88d
|
|
} // namespace scwx
|