13 #ifndef hifi_ReceivedMessage_h
14 #define hifi_ReceivedMessage_h
18 #include <QtCore/QSharedPointer>
22 #include "NLPacketList.h"
24 class ReceivedMessage :
public QObject {
27 ReceivedMessage(
const NLPacketList& packetList);
28 ReceivedMessage(NLPacket& packet);
29 ReceivedMessage(QByteArray byteArray, PacketType packetType, PacketVersion packetVersion,
30 const SockAddr& senderSockAddr, NLPacket::LocalID sourceID = NLPacket::NULL_LOCAL_ID);
32 QByteArray getMessage()
const {
return _data; }
33 const char* getRawMessage()
const {
return _data.constData(); }
35 PacketType getType()
const {
return _packetType; }
36 PacketVersion getVersion()
const {
return _packetVersion; }
40 void appendPacket(NLPacket& packet);
42 bool failed()
const {
return _failed; }
43 bool isComplete()
const {
return _isComplete; }
45 NLPacket::LocalID getSourceID()
const {
return _sourceID; }
46 const SockAddr& getSenderSockAddr() {
return _senderSockAddr; }
48 qint64 getPosition()
const {
return _position; }
51 qint64 getNumPackets()
const {
return _numPackets; }
53 qint64 getFirstPacketReceiveTime()
const {
return _firstPacketReceiveTime; }
55 qint64 getSize()
const {
return _data.size(); }
57 qint64 getBytesLeftToRead()
const {
return _data.size() - _position; }
59 void seek(qint64 position) { _position = position; }
61 qint64 peek(
char* data, qint64 size);
62 qint64 read(
char* data, qint64 size);
66 qint64 readHead(
char* data, qint64 size);
68 QByteArray peek(qint64 size);
69 QByteArray read(qint64 size);
74 QByteArray readHead(qint64 size);
79 QByteArray readWithoutCopy(qint64 size);
81 template<
typename T> qint64 peekPrimitive(T* data);
82 template<
typename T> qint64 readPrimitive(T* data);
84 template<
typename T> qint64 readHeadPrimitive(T* data);
87 void progress(qint64 size);
97 std::atomic<qint64> _position { 0 };
98 std::atomic<qint64> _numPackets { 0 };
99 std::atomic<quint64> _firstPacketReceiveTime { 0 };
101 NLPacket::LocalID _sourceID { NLPacket::NULL_LOCAL_ID };
102 PacketType _packetType;
103 PacketVersion _packetVersion;
104 SockAddr _senderSockAddr;
106 std::atomic<bool> _isComplete {
true };
107 std::atomic<bool> _failed {
false };
110 Q_DECLARE_METATYPE(ReceivedMessage*)
111 Q_DECLARE_METATYPE(QSharedPointer<ReceivedMessage>)
113 template<
typename T> qint64 ReceivedMessage::peekPrimitive(T* data) {
114 return peek(
reinterpret_cast<char*
>(data),
sizeof(T));
117 template<
typename T> qint64 ReceivedMessage::readPrimitive(T* data) {
118 return read(
reinterpret_cast<char*
>(data),
sizeof(T));
121 template<
typename T> qint64 ReceivedMessage::readHeadPrimitive(T* data) {
122 return readHead(
reinterpret_cast<char*
>(data),
sizeof(T));