#include #include #include #include #include namespace scwx { namespace wsr88d { namespace rpg { static const std::string logPrefix_ = "scwx::wsr88d::rpg::scit_data_packet"; static const auto logger_ = util::Logger::Create(logPrefix_); static const std::set packetCodes_ = {23, 24}; class ScitDataPacket::Impl { public: explicit Impl() : data_ {}, recordCount_ {0} {} ~Impl() = default; std::vector data_; size_t recordCount_; }; ScitDataPacket::ScitDataPacket() : p(std::make_unique()) {} ScitDataPacket::~ScitDataPacket() = default; ScitDataPacket::ScitDataPacket(ScitDataPacket&&) noexcept = default; ScitDataPacket& ScitDataPacket::operator=(ScitDataPacket&&) noexcept = default; const std::vector& ScitDataPacket::data() const { return p->data_; } size_t ScitDataPacket::RecordCount() const { return p->recordCount_; } bool ScitDataPacket::ParseData(std::istream& is) { bool blockValid = true; if (!packetCodes_.contains(packet_code())) { logger_->warn("Invalid packet code: {}", packet_code()); blockValid = false; } if (blockValid) { p->recordCount_ = length_of_block(); p->data_.resize(p->recordCount_); is.read(reinterpret_cast(p->data_.data()), p->recordCount_); } return blockValid; } std::shared_ptr ScitDataPacket::Create(std::istream& is) { std::shared_ptr packet = std::make_shared(); if (!packet->Parse(is)) { packet.reset(); } return packet; } } // namespace rpg } // namespace wsr88d } // namespace scwx