15 #ifndef hifi_BasePacket_h
16 #define hifi_BasePacket_h
20 #include <PortableHighResolutionClock.h>
22 #include "../SockAddr.h"
23 #include "Constants.h"
24 #include "../ExtendedIODevice.h"
28 class BasePacket :
public ExtendedIODevice {
31 static const qint64 PACKET_WRITE_ERROR;
33 static std::unique_ptr<BasePacket> create(qint64 size = -1);
34 static std::unique_ptr<BasePacket> fromReceivedPacket(std::unique_ptr<
char[]> data, qint64 size,
35 const SockAddr& senderSockAddr);
38 static int localHeaderSize();
40 static int totalHeaderSize();
42 static int maxPayloadSize();
45 char* getPayload() {
return _payloadStart; }
46 const char* getPayload()
const {
return _payloadStart; }
49 char* getData() {
return _packet.get(); }
50 const char* getData()
const {
return _packet.get(); }
53 qint64 getDataSize()
const {
return (_payloadStart - _packet.get()) + _payloadSize; }
56 qint64 getWireSize()
const {
return getDataSize() + UDP_IPV4_HEADER_SIZE; }
59 qint64 getPayloadSize()
const {
return _payloadSize; }
62 void setPayloadSize(qint64 payloadSize);
65 qint64 getPayloadCapacity()
const {
return _payloadCapacity; }
67 qint64 bytesLeftToRead()
const {
return _payloadSize - pos(); }
68 qint64 bytesAvailableForWrite()
const {
return _payloadCapacity - pos(); }
70 SockAddr& getSenderSockAddr() {
return _senderSockAddr; }
71 const SockAddr& getSenderSockAddr()
const {
return _senderSockAddr; }
75 virtual bool isSequential()
const override {
return false; }
76 virtual bool reset()
override;
77 virtual qint64 size()
const override {
return _payloadCapacity; }
79 using QIODevice::read;
80 QByteArray read(qint64 maxSize);
81 QByteArray readWithoutCopy(qint64 maxSize);
83 qint64 writeString(
const QString&
string);
86 void setReceiveTime(p_high_resolution_clock::time_point receiveTime) { _receiveTime = receiveTime; }
87 p_high_resolution_clock::time_point getReceiveTime()
const {
return _receiveTime; }
90 BasePacket(qint64 size);
91 BasePacket(std::unique_ptr<
char[]> data, qint64 size,
const SockAddr& senderSockAddr);
92 BasePacket(
const BasePacket& other) : ExtendedIODevice() { *
this = other; }
93 BasePacket& operator=(
const BasePacket& other);
94 BasePacket(BasePacket&& other);
95 BasePacket& operator=(BasePacket&& other);
98 virtual qint64 writeData(
const char* data, qint64 maxSize)
override;
99 virtual qint64 readData(
char* data, qint64 maxSize)
override;
101 void adjustPayloadStartAndCapacity(qint64 headerSize,
bool shouldDecreasePayloadSize =
false);
103 qint64 _packetSize = 0;
104 std::unique_ptr<char[]> _packet;
106 char* _payloadStart =
nullptr;
107 qint64 _payloadCapacity = 0;
109 qint64 _payloadSize = 0;
111 SockAddr _senderSockAddr;
113 p_high_resolution_clock::time_point _receiveTime;