mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-11-01 04:30:05 +00:00
Support zlib compressed level 3 files
This commit is contained in:
parent
b2687c2258
commit
01d24d70b8
6 changed files with 377 additions and 13 deletions
209
wxdata/source/scwx/wsr88d/rpg/ccb_header.cpp
Normal file
209
wxdata/source/scwx/wsr88d/rpg/ccb_header.cpp
Normal file
|
|
@ -0,0 +1,209 @@
|
|||
#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
|
||||
Loading…
Add table
Add a link
Reference in a new issue