mirror of
https://github.com/overte-org/overte.git
synced 2025-04-25 17:35:45 +02:00
Add message part to Packet
This commit is contained in:
parent
8cecb95bf2
commit
c3fc6f4f79
5 changed files with 51 additions and 40 deletions
|
@ -15,7 +15,7 @@ using namespace udt;
|
||||||
|
|
||||||
int Packet::localHeaderSize(bool isPartOfMessage) {
|
int Packet::localHeaderSize(bool isPartOfMessage) {
|
||||||
return sizeof(Packet::SequenceNumberAndBitField) +
|
return sizeof(Packet::SequenceNumberAndBitField) +
|
||||||
(isPartOfMessage ? sizeof(Packet::MessageNumberAndBitField) : 0);
|
(isPartOfMessage ? sizeof(Packet::MessageNumberAndBitField) + sizeof(MessagePart) : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Packet::totalHeaderSize(bool isPartOfMessage) {
|
int Packet::totalHeaderSize(bool isPartOfMessage) {
|
||||||
|
@ -109,9 +109,11 @@ Packet& Packet::operator=(Packet&& other) {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Packet::writeMessageNumber(MessageNumber messageNumber) {
|
void Packet::writeMessageNumber(MessageNumber messageNumber, PacketPosition position, MessagePart messagePart) {
|
||||||
_isPartOfMessage = true;
|
_isPartOfMessage = true;
|
||||||
_messageNumber = messageNumber;
|
_messageNumber = messageNumber;
|
||||||
|
_packetPosition = position;
|
||||||
|
_messagePart = messagePart;
|
||||||
writeHeader();
|
writeHeader();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,6 +143,9 @@ void Packet::readHeader() const {
|
||||||
MessageNumberAndBitField* messageNumberAndBitField = seqNumBitField + 1;
|
MessageNumberAndBitField* messageNumberAndBitField = seqNumBitField + 1;
|
||||||
_messageNumber = *messageNumberAndBitField & MESSAGE_NUMBER_MASK;
|
_messageNumber = *messageNumberAndBitField & MESSAGE_NUMBER_MASK;
|
||||||
_packetPosition = static_cast<PacketPosition>(*messageNumberAndBitField >> PACKET_POSITION_OFFSET);
|
_packetPosition = static_cast<PacketPosition>(*messageNumberAndBitField >> PACKET_POSITION_OFFSET);
|
||||||
|
|
||||||
|
MessagePart* messagePart = messageNumberAndBitField + 1;
|
||||||
|
_messagePart = *messagePart;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,5 +171,8 @@ void Packet::writeHeader() const {
|
||||||
MessageNumberAndBitField* messageNumberAndBitField = seqNumBitField + 1;
|
MessageNumberAndBitField* messageNumberAndBitField = seqNumBitField + 1;
|
||||||
*messageNumberAndBitField = _messageNumber;
|
*messageNumberAndBitField = _messageNumber;
|
||||||
*messageNumberAndBitField |= _packetPosition << PACKET_POSITION_OFFSET;
|
*messageNumberAndBitField |= _packetPosition << PACKET_POSITION_OFFSET;
|
||||||
|
|
||||||
|
MessagePart* messagePart = messageNumberAndBitField + 1;
|
||||||
|
*messagePart = _messagePart;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@ public:
|
||||||
// NOTE: The MessageNumber is only actually 30 bits to leave room for a bit field
|
// NOTE: The MessageNumber is only actually 30 bits to leave room for a bit field
|
||||||
using MessageNumber = uint32_t;
|
using MessageNumber = uint32_t;
|
||||||
using MessageNumberAndBitField = uint32_t;
|
using MessageNumberAndBitField = uint32_t;
|
||||||
|
using MessagePart = uint32_t;
|
||||||
|
|
||||||
// Use same size as MessageNumberAndBitField so we can use the enum with bitwise operations
|
// Use same size as MessageNumberAndBitField so we can use the enum with bitwise operations
|
||||||
enum PacketPosition : MessageNumberAndBitField {
|
enum PacketPosition : MessageNumberAndBitField {
|
||||||
|
@ -55,14 +56,13 @@ public:
|
||||||
|
|
||||||
bool isPartOfMessage() const { return _isPartOfMessage; }
|
bool isPartOfMessage() const { return _isPartOfMessage; }
|
||||||
bool isReliable() const { return _isReliable; }
|
bool isReliable() const { return _isReliable; }
|
||||||
SequenceNumber getSequenceNumber() const { return _sequenceNumber; }
|
|
||||||
|
|
||||||
MessageNumber getMessageNumber() const { return _messageNumber; }
|
|
||||||
|
|
||||||
void setPacketPosition(PacketPosition position) { _packetPosition = position; }
|
|
||||||
PacketPosition getPacketPosition() const { return _packetPosition; }
|
|
||||||
|
|
||||||
void writeMessageNumber(MessageNumber messageNumber);
|
SequenceNumber getSequenceNumber() const { return _sequenceNumber; }
|
||||||
|
MessageNumber getMessageNumber() const { return _messageNumber; }
|
||||||
|
PacketPosition getPacketPosition() const { return _packetPosition; }
|
||||||
|
MessagePart getMessagePart() const { return _messagePart; }
|
||||||
|
|
||||||
|
void writeMessageNumber(MessageNumber messageNumber, PacketPosition position, MessagePart messagePart);
|
||||||
void writeSequenceNumber(SequenceNumber sequenceNumber) const;
|
void writeSequenceNumber(SequenceNumber sequenceNumber) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -84,8 +84,9 @@ private:
|
||||||
mutable bool _isReliable { false };
|
mutable bool _isReliable { false };
|
||||||
mutable bool _isPartOfMessage { false };
|
mutable bool _isPartOfMessage { false };
|
||||||
mutable SequenceNumber _sequenceNumber { 0 };
|
mutable SequenceNumber _sequenceNumber { 0 };
|
||||||
mutable PacketPosition _packetPosition { PacketPosition::ONLY };
|
|
||||||
mutable MessageNumber _messageNumber { 0 };
|
mutable MessageNumber _messageNumber { 0 };
|
||||||
|
mutable PacketPosition _packetPosition { PacketPosition::ONLY };
|
||||||
|
mutable MessagePart _messagePart { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace udt
|
} // namespace udt
|
||||||
|
|
|
@ -132,6 +132,24 @@ QByteArray PacketList::getMessage() {
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PacketList::preparePackets(MessageNumber messageNumber) {
|
||||||
|
Q_ASSERT(_packets.size() > 0);
|
||||||
|
|
||||||
|
if (_packets.size() == 1) {
|
||||||
|
_packets.front()->writeMessageNumber(messageNumber, Packet::PacketPosition::ONLY, 0);
|
||||||
|
} else {
|
||||||
|
const auto second = ++_packets.begin();
|
||||||
|
const auto last = --_packets.end();
|
||||||
|
Packet::MessagePart messagePart = 0;
|
||||||
|
std::for_each(second, last, [&](const PacketPointer& packet) {
|
||||||
|
packet->writeMessageNumber(messageNumber, Packet::PacketPosition::MIDDLE, ++messagePart);
|
||||||
|
});
|
||||||
|
|
||||||
|
_packets.front()->writeMessageNumber(messageNumber, Packet::PacketPosition::FIRST, 0);
|
||||||
|
_packets.back()->writeMessageNumber(messageNumber, Packet::PacketPosition::LAST, ++messagePart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
qint64 PacketList::writeData(const char* data, qint64 maxSize) {
|
qint64 PacketList::writeData(const char* data, qint64 maxSize) {
|
||||||
auto sizeRemaining = maxSize;
|
auto sizeRemaining = maxSize;
|
||||||
|
|
||||||
|
|
|
@ -28,28 +28,29 @@ class Packet;
|
||||||
class PacketList : public QIODevice {
|
class PacketList : public QIODevice {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
using MessageNumber = uint32_t;
|
||||||
|
using PacketPointer = std::unique_ptr<Packet>;
|
||||||
|
|
||||||
static std::unique_ptr<PacketList> create(PacketType packetType, QByteArray extendedHeader = QByteArray(),
|
static std::unique_ptr<PacketList> create(PacketType packetType, QByteArray extendedHeader = QByteArray(),
|
||||||
bool isReliable = false, bool isOrdered = false);
|
bool isReliable = false, bool isOrdered = false);
|
||||||
static std::unique_ptr<PacketList> fromReceivedPackets(std::list<std::unique_ptr<Packet>>&& packets);
|
static std::unique_ptr<PacketList> fromReceivedPackets(std::list<std::unique_ptr<Packet>>&& packets);
|
||||||
|
|
||||||
|
PacketType getType() const { return _packetType; }
|
||||||
bool isReliable() const { return _isReliable; }
|
bool isReliable() const { return _isReliable; }
|
||||||
bool isOrdered() const { return _isOrdered; }
|
bool isOrdered() const { return _isOrdered; }
|
||||||
|
|
||||||
|
int getNumPackets() const { return _packets.size() + (_currentPacket ? 1 : 0); }
|
||||||
|
size_t getDataSize() const;
|
||||||
|
size_t getMessageSize() const;
|
||||||
|
QByteArray getMessage();
|
||||||
|
|
||||||
|
QByteArray getExtendedHeader() const { return _extendedHeader; }
|
||||||
|
|
||||||
void startSegment();
|
void startSegment();
|
||||||
void endSegment();
|
void endSegment();
|
||||||
|
|
||||||
PacketType getType() const { return _packetType; }
|
|
||||||
int getNumPackets() const { return _packets.size() + (_currentPacket ? 1 : 0); }
|
|
||||||
|
|
||||||
QByteArray getExtendedHeader() const { return _extendedHeader; }
|
|
||||||
|
|
||||||
size_t getDataSize() const;
|
|
||||||
size_t getMessageSize() const;
|
|
||||||
|
|
||||||
void closeCurrentPacket(bool shouldSendEmpty = false);
|
void closeCurrentPacket(bool shouldSendEmpty = false);
|
||||||
|
|
||||||
QByteArray getMessage();
|
|
||||||
|
|
||||||
// QIODevice virtual functions
|
// QIODevice virtual functions
|
||||||
virtual bool isSequential() const { return false; }
|
virtual bool isSequential() const { return false; }
|
||||||
virtual qint64 size() const { return getDataSize(); }
|
virtual qint64 size() const { return getDataSize(); }
|
||||||
|
@ -60,6 +61,8 @@ public:
|
||||||
protected:
|
protected:
|
||||||
PacketList(PacketType packetType, QByteArray extendedHeader = QByteArray(), bool isReliable = false, bool isOrdered = false);
|
PacketList(PacketType packetType, QByteArray extendedHeader = QByteArray(), bool isReliable = false, bool isOrdered = false);
|
||||||
PacketList(PacketList&& other);
|
PacketList(PacketList&& other);
|
||||||
|
|
||||||
|
void preparePackets(MessageNumber messageNumber);
|
||||||
|
|
||||||
virtual qint64 writeData(const char* data, qint64 maxSize);
|
virtual qint64 writeData(const char* data, qint64 maxSize);
|
||||||
// Not implemented, added an assert so that it doesn't get used by accident
|
// Not implemented, added an assert so that it doesn't get used by accident
|
||||||
|
|
|
@ -45,26 +45,7 @@ void PacketQueue::queuePacket(PacketPointer packet) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void PacketQueue::queuePacketList(PacketListPointer packetList) {
|
void PacketQueue::queuePacketList(PacketListPointer packetList) {
|
||||||
Q_ASSERT(packetList->_packets.size() > 0);
|
packetList->preparePackets(getNextMessageNumber());
|
||||||
|
|
||||||
auto messageNumber = getNextMessageNumber();
|
|
||||||
auto markPacket = [&messageNumber](const PacketPointer& packet, Packet::PacketPosition position) {
|
|
||||||
packet->setPacketPosition(position);
|
|
||||||
packet->writeMessageNumber(messageNumber);
|
|
||||||
};
|
|
||||||
|
|
||||||
if (packetList->_packets.size() == 1) {
|
|
||||||
markPacket(packetList->_packets.front(), Packet::PacketPosition::ONLY);
|
|
||||||
} else {
|
|
||||||
const auto second = ++packetList->_packets.begin();
|
|
||||||
const auto last = --packetList->_packets.end();
|
|
||||||
std::for_each(second, last, [&](const PacketPointer& packet) {
|
|
||||||
markPacket(packet, Packet::PacketPosition::MIDDLE);
|
|
||||||
});
|
|
||||||
|
|
||||||
markPacket(packetList->_packets.front(), Packet::PacketPosition::FIRST);
|
|
||||||
markPacket(packetList->_packets.back(), Packet::PacketPosition::LAST);
|
|
||||||
}
|
|
||||||
|
|
||||||
LockGuard locker(_packetsLock);
|
LockGuard locker(_packetsLock);
|
||||||
_packets.splice(_packets.end(), packetList->_packets);
|
_packets.splice(_packets.end(), packetList->_packets);
|
||||||
|
|
Loading…
Reference in a new issue