#include #include #include #include #include #include #ifdef WIN32 # include #else # include #endif namespace scwx { namespace wsr88d { namespace rpg { static const std::string logPrefix_ = "[scwx::wsr88d::rpg::ccb_header] "; class CcbHeaderImpl { public: explicit CcbHeaderImpl() : ff_ {0}, ccbLength_ {0}, mode_ {0}, submode_ {0}, precedence_ {0}, classification_ {0}, messageOriginator_ {}, category_ {0}, subcategory_ {0}, userDefined_ {0}, year_ {0}, month_ {0}, torDay_ {0}, torHour_ {0}, torMinute_ {0}, numberOfDestinations_ {0}, messageDestination_ {} { } ~CcbHeaderImpl() = default; uint16_t ff_; uint16_t ccbLength_; uint8_t mode_; uint8_t submode_; char precedence_; char classification_; std::string messageOriginator_; uint8_t category_; uint8_t subcategory_; uint16_t userDefined_; uint8_t year_; uint8_t month_; uint8_t torDay_; uint8_t torHour_; uint8_t torMinute_; uint8_t numberOfDestinations_; std::vector messageDestination_; }; CcbHeader::CcbHeader() : p(std::make_unique()) {} CcbHeader::~CcbHeader() = default; CcbHeader::CcbHeader(CcbHeader&&) noexcept = default; CcbHeader& CcbHeader::operator=(CcbHeader&&) noexcept = default; uint16_t CcbHeader::ff() const { return p->ff_; } uint16_t CcbHeader::ccb_length() const { return p->ccbLength_; } uint8_t CcbHeader::mode() const { return p->mode_; } uint8_t CcbHeader::submode() const { return p->submode_; } char CcbHeader::precedence() const { return p->precedence_; } char CcbHeader::classification() const { return p->classification_; } std::string CcbHeader::message_originator() const { return p->messageOriginator_; } uint8_t CcbHeader::category() const { return p->category_; } uint8_t CcbHeader::subcategory() const { return p->subcategory_; } uint16_t CcbHeader::user_defined() const { return p->userDefined_; } uint8_t CcbHeader::year() const { return p->year_; } uint8_t CcbHeader::month() const { return p->month_; } uint8_t CcbHeader::tor_day() const { return p->torDay_; } uint8_t CcbHeader::tor_hour() const { return p->torHour_; } uint8_t CcbHeader::tor_minute() const { return p->torMinute_; } uint8_t CcbHeader::number_of_destinations() const { return p->numberOfDestinations_; } std::string CcbHeader::message_destination(uint8_t i) const { return p->messageDestination_[i]; } bool CcbHeader::Parse(std::istream& is) { bool headerValid = true; is.read(reinterpret_cast(&p->ccbLength_), 2); p->ccbLength_ = ntohs(p->ccbLength_); p->ff_ = p->ccbLength_ >> 14; p->ccbLength_ = p->ccbLength_ & 0x3fff; p->messageOriginator_.resize(4); is.read(reinterpret_cast(&p->mode_), 1); is.read(reinterpret_cast(&p->submode_), 1); is.read(&p->precedence_, 1); is.read(&p->classification_, 1); is.read(p->messageOriginator_.data(), 4); is.read(reinterpret_cast(&p->category_), 1); is.read(reinterpret_cast(&p->subcategory_), 1); is.read(reinterpret_cast(&p->userDefined_), 2); is.read(reinterpret_cast(&p->year_), 1); is.read(reinterpret_cast(&p->month_), 1); is.read(reinterpret_cast(&p->torDay_), 1); is.read(reinterpret_cast(&p->torHour_), 1); is.read(reinterpret_cast(&p->torMinute_), 1); is.read(reinterpret_cast(&p->numberOfDestinations_), 1); p->userDefined_ = ntohs(p->userDefined_); p->messageDestination_.resize(p->numberOfDestinations_); for (uint8_t d = 0; d < p->numberOfDestinations_; d++) { p->messageDestination_[d].resize(4); is.read(p->messageDestination_[d].data(), 4); } if (is.eof()) { BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "Reached end of file"; headerValid = false; } return headerValid; } } // namespace rpg } // namespace wsr88d } // namespace scwx