18 #include <QtCore/QIODevice>
20 #include "BasePacket.h"
21 #include "PacketHeaders.h"
22 #include "SequenceNumber.h"
26 class Packet :
public BasePacket {
49 using SequenceNumberAndBitField = uint32_t;
52 using MessageNumber = uint32_t;
53 using MessageNumberAndBitField = uint32_t;
54 using MessagePartNumber = uint32_t;
57 enum PacketPosition : MessageNumberAndBitField {
65 enum ObfuscationLevel : SequenceNumberAndBitField {
72 static std::unique_ptr<Packet> create(qint64 size = -1,
bool isReliable =
false,
bool isPartOfMessage =
false);
73 static std::unique_ptr<Packet> fromReceivedPacket(std::unique_ptr<
char[]> data, qint64 size,
const SockAddr& senderSockAddr);
76 static std::unique_ptr<Packet> createCopy(
const Packet& other);
79 static int localHeaderSize(
bool isPartOfMessage =
false);
81 static int totalHeaderSize(
bool isPartOfMessage =
false);
83 static int maxPayloadSize(
bool isPartOfMessage =
false);
85 bool isPartOfMessage()
const {
return _isPartOfMessage; }
86 bool isReliable()
const {
return _isReliable; }
87 void setReliable(
bool reliable) { _isReliable = reliable; }
89 ObfuscationLevel getObfuscationLevel()
const {
return _obfuscationLevel; }
90 SequenceNumber getSequenceNumber()
const {
return _sequenceNumber; }
91 MessageNumber getMessageNumber()
const {
return _messageNumber; }
92 PacketPosition getPacketPosition()
const {
return _packetPosition; }
93 MessagePartNumber getMessagePartNumber()
const {
return _messagePartNumber; }
95 void writeMessageNumber(MessageNumber messageNumber, PacketPosition position, MessagePartNumber messagePartNumber);
96 void writeSequenceNumber(SequenceNumber sequenceNumber)
const;
97 void obfuscate(ObfuscationLevel level);
100 Packet(qint64 size,
bool isReliable =
false,
bool isPartOfMessage =
false);
101 Packet(std::unique_ptr<
char[]> data, qint64 size,
const SockAddr& senderSockAddr);
103 Packet(
const Packet& other);
104 Packet(Packet&& other);
106 Packet& operator=(
const Packet& other);
107 Packet& operator=(Packet&& other);
110 void copyMembers(
const Packet& other);
113 void readHeader()
const;
114 void writeHeader()
const;
117 mutable bool _isReliable {
false };
118 mutable bool _isPartOfMessage {
false };
119 mutable ObfuscationLevel _obfuscationLevel { NoObfuscation };
120 mutable SequenceNumber _sequenceNumber { 0 };
121 mutable MessageNumber _messageNumber { 0 };
122 mutable PacketPosition _packetPosition { PacketPosition::ONLY };
123 mutable MessagePartNumber _messagePartNumber { 0 };
128 Q_DECLARE_METATYPE(udt::Packet*);