diff --git a/src/network/core/packet.cpp b/src/network/core/packet.cpp index 01803948b0..13601fa9a7 100644 --- a/src/network/core/packet.cpp +++ b/src/network/core/packet.cpp @@ -198,3 +198,12 @@ size_t Packet::RemainingBytesToTransfer() const return this->Size() - this->pos; } +bool SubPacketDeserialiser::CanDeserialiseBytes(size_t bytes_to_read, bool raise_error) +{ + if (this->pos + bytes_to_read > this->size) { + if (raise_error) this->cs->NetworkSocketHandler::MarkClosed(); + return false; + } + + return true; +} diff --git a/src/network/core/packet.h b/src/network/core/packet.h index 5b8cca594c..37780c92d4 100644 --- a/src/network/core/packet.h +++ b/src/network/core/packet.h @@ -187,6 +187,23 @@ public: if (bytes > 0) this->pos += bytes; return bytes; } + + NetworkSocketHandler *GetParentSocket() { return this->cs; } +}; + +struct SubPacketDeserialiser : public BufferDeserialisationHelper { + NetworkSocketHandler *cs; + const byte *data; + size_t size; + PacketSize pos; + + SubPacketDeserialiser(Packet *p, const byte *data, size_t size, PacketSize pos = 0) : cs(p->GetParentSocket()), data(data), size(size), pos(pos) {} + SubPacketDeserialiser(Packet *p, const std::vector &buffer, PacketSize pos = 0) : cs(p->GetParentSocket()), data(buffer.data()), size(buffer.size()), pos(pos) {} + + const byte *GetDeserialisationBuffer() const { return this->data; } + size_t GetDeserialisationBufferSize() const { return this->size; } + PacketSize &GetDeserialisationPosition() { return this->pos; } + bool CanDeserialiseBytes(size_t bytes_to_read, bool raise_error); }; #endif /* NETWORK_CORE_PACKET_H */