mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 04:40:06 +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
 | 
