13 #ifndef hifi_PacketList_h
14 #define hifi_PacketList_h
18 #include "../ExtendedIODevice.h"
20 #include "PacketHeaders.h"
22 class LimitedNodeList;
28 class PacketList :
public ExtendedIODevice {
31 using MessageNumber = uint32_t;
32 using PacketPointer = std::unique_ptr<Packet>;
34 static std::unique_ptr<PacketList> create(PacketType packetType, QByteArray extendedHeader = QByteArray(),
35 bool isReliable =
false,
bool isOrdered =
false);
36 static std::unique_ptr<PacketList> fromReceivedPackets(std::list<std::unique_ptr<Packet>>&& packets);
38 PacketType getType()
const {
return _packetType; }
39 bool isReliable()
const {
return _isReliable; }
40 bool isOrdered()
const {
return _isOrdered; }
42 size_t getNumPackets()
const {
return _packets.size() + (_currentPacket ? 1 : 0); }
43 size_t getDataSize()
const;
44 size_t getMessageSize()
const;
45 QByteArray getMessage()
const;
47 QByteArray getExtendedHeader()
const {
return _extendedHeader; }
52 virtual qint64 getMaxSegmentSize()
const {
return Packet::maxPayloadSize(_isOrdered); }
54 SockAddr getSenderSockAddr()
const;
56 void closeCurrentPacket(
bool shouldSendEmpty =
false);
59 virtual bool isSequential()
const override {
return false; }
60 virtual qint64 size()
const override {
return getDataSize(); }
62 qint64 writeString(
const QString&
string);
64 p_high_resolution_clock::time_point getFirstPacketReceiveTime()
const;
68 PacketList(PacketType packetType, QByteArray extendedHeader = QByteArray(),
bool isReliable =
false,
bool isOrdered =
false);
69 PacketList(PacketList&& other);
71 void preparePackets(MessageNumber messageNumber);
73 virtual qint64 writeData(
const char* data, qint64 maxSize)
override;
75 virtual qint64 readData(
char* data, qint64 maxSize)
override { Q_ASSERT(
false);
return 0; }
77 PacketType _packetType;
78 std::list<std::unique_ptr<Packet>> _packets;
80 bool _isOrdered =
false;
83 friend class ::LimitedNodeList;
84 friend class PacketQueue;
85 friend class SendQueue;
88 Q_DISABLE_COPY(PacketList)
91 template<
typename T> std::unique_ptr<T> takeFront();
94 virtual std::unique_ptr<Packet> createPacket();
95 std::unique_ptr<Packet> createPacketWithExtendedHeader();
97 Packet::MessageNumber _messageNumber;
98 bool _isReliable =
false;
100 std::unique_ptr<Packet> _currentPacket;
102 int _segmentStartIndex = -1;
104 QByteArray _extendedHeader;
107 template<
typename T> std::unique_ptr<T> PacketList::takeFront() {
108 static_assert(std::is_base_of<Packet, T>::value,
"T must derive from Packet.");
110 auto packet = std::move(_packets.front());
111 _packets.pop_front();
112 return std::unique_ptr<T>(
dynamic_cast<T*
>(packet.release()));
117 Q_DECLARE_METATYPE(udt::PacketList*);