mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 18:40:05 +00:00
209 lines
4.4 KiB
C++
209 lines
4.4 KiB
C++
#include <scwx/wsr88d/rpg/ccb_header.hpp>
|
|
#include <scwx/util/streams.hpp>
|
|
|
|
#include <istream>
|
|
#include <sstream>
|
|
#include <string>
|
|
|
|
#include <boost/log/trivial.hpp>
|
|
|
|
#ifdef WIN32
|
|
# include <WinSock2.h>
|
|
#else
|
|
# include <arpa/inet.h>
|
|
#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<std::string> messageDestination_;
|
|
};
|
|
|
|
CcbHeader::CcbHeader() : p(std::make_unique<CcbHeaderImpl>()) {}
|
|
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<char*>(&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<char*>(&p->mode_), 1);
|
|
is.read(reinterpret_cast<char*>(&p->submode_), 1);
|
|
is.read(&p->precedence_, 1);
|
|
is.read(&p->classification_, 1);
|
|
is.read(p->messageOriginator_.data(), 4);
|
|
is.read(reinterpret_cast<char*>(&p->category_), 1);
|
|
is.read(reinterpret_cast<char*>(&p->subcategory_), 1);
|
|
is.read(reinterpret_cast<char*>(&p->userDefined_), 2);
|
|
is.read(reinterpret_cast<char*>(&p->year_), 1);
|
|
is.read(reinterpret_cast<char*>(&p->month_), 1);
|
|
is.read(reinterpret_cast<char*>(&p->torDay_), 1);
|
|
is.read(reinterpret_cast<char*>(&p->torHour_), 1);
|
|
is.read(reinterpret_cast<char*>(&p->torMinute_), 1);
|
|
is.read(reinterpret_cast<char*>(&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
|