diff --git a/wxdata/include/scwx/wsr88d/rpg/scit_data_packet.hpp b/wxdata/include/scwx/wsr88d/rpg/scit_data_packet.hpp index 37aac08a..d051ed36 100644 --- a/wxdata/include/scwx/wsr88d/rpg/scit_data_packet.hpp +++ b/wxdata/include/scwx/wsr88d/rpg/scit_data_packet.hpp @@ -24,7 +24,7 @@ public: ScitDataPacket(ScitDataPacket&&) noexcept; ScitDataPacket& operator=(ScitDataPacket&&) noexcept; - const std::vector& data() const; + std::vector> packet_list() const; std::size_t RecordCount() const override; diff --git a/wxdata/source/scwx/wsr88d/rpg/scit_data_packet.cpp b/wxdata/source/scwx/wsr88d/rpg/scit_data_packet.cpp index 74327c81..e63aa188 100644 --- a/wxdata/source/scwx/wsr88d/rpg/scit_data_packet.cpp +++ b/wxdata/source/scwx/wsr88d/rpg/scit_data_packet.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -20,11 +21,10 @@ static const std::set packetCodes_ = {23, 24}; class ScitDataPacket::Impl { public: - explicit Impl() : data_ {}, recordCount_ {0} {} + explicit Impl() {} ~Impl() = default; - std::vector data_; - size_t recordCount_; + std::vector> packetList_ {}; }; ScitDataPacket::ScitDataPacket() : p(std::make_unique()) {} @@ -33,14 +33,14 @@ ScitDataPacket::~ScitDataPacket() = default; ScitDataPacket::ScitDataPacket(ScitDataPacket&&) noexcept = default; ScitDataPacket& ScitDataPacket::operator=(ScitDataPacket&&) noexcept = default; -const std::vector& ScitDataPacket::data() const +std::vector> ScitDataPacket::packet_list() const { - return p->data_; + return p->packetList_; } size_t ScitDataPacket::RecordCount() const { - return p->recordCount_; + return p->packetList_.size(); } bool ScitDataPacket::ParseData(std::istream& is) @@ -55,9 +55,42 @@ bool ScitDataPacket::ParseData(std::istream& is) if (blockValid) { - p->recordCount_ = length_of_block(); - p->data_.resize(p->recordCount_); - is.read(reinterpret_cast(p->data_.data()), p->recordCount_); + std::uint32_t bytesRead = 0; + std::uint32_t lengthOfBlock = length_of_block(); + std::streampos dataStart = is.tellg(); + std::streampos dataEnd = + dataStart + static_cast(lengthOfBlock); + + while (bytesRead < lengthOfBlock) + { + std::shared_ptr packet = PacketFactory::Create(is); + if (packet != nullptr) + { + p->packetList_.push_back(packet); + bytesRead += static_cast(packet->data_size()); + } + else + { + break; + } + } + + if (bytesRead < lengthOfBlock) + { + logger_->trace("Block bytes read smaller than size: {} < {} bytes", + bytesRead, + lengthOfBlock); + blockValid = false; + is.seekg(dataEnd, std::ios_base::beg); + } + if (bytesRead > lengthOfBlock) + { + logger_->warn("Block bytes read larger than size: {} > {} bytes", + bytesRead, + lengthOfBlock); + blockValid = false; + is.seekg(dataEnd, std::ios_base::beg); + } } return blockValid;