Added setPacketType to Packet class

This commit is contained in:
Atlante45 2015-07-07 15:43:16 -07:00
parent 11c58ebc9e
commit b4ab6828bb
2 changed files with 26 additions and 14 deletions

View file

@ -62,11 +62,11 @@ Packet::Packet(PacketType::Value type, qint64 size) :
Q_ASSERT(size <= maxPayloadSize(type)); Q_ASSERT(size <= maxPayloadSize(type));
// copy packet type and version in header // copy packet type and version in header
setPacketTypeAndVersion(type); writePacketTypeAndVersion(type);
// Set control bit and sequence number to 0 if necessary // Set control bit and sequence number to 0 if necessary
if (SEQUENCE_NUMBERED_PACKETS.contains(type)) { if (SEQUENCE_NUMBERED_PACKETS.contains(type)) {
setSequenceNumber(0); writeSequenceNumber(0);
} }
} }
@ -103,15 +103,24 @@ Packet& Packet::operator=(Packet&& other) {
return *this; return *this;
} }
PacketType::Value Packet::getPacketType() const { void Packet::setPacketType(PacketType::Value type) {
auto currentHeaderSize = totalHeadersSize();
_type = type;
writePacketTypeAndVersion(_type);
// Setting new packet type with a different header size not currently supported
Q_ASSERT(currentHeaderSize == totalHeadersSize());
}
PacketType::Value Packet::readPacketType() const {
return (PacketType::Value)arithmeticCodingValueFromBuffer(_packet.get()); return (PacketType::Value)arithmeticCodingValueFromBuffer(_packet.get());
} }
PacketVersion Packet::getPacketTypeVersion() const { PacketVersion Packet::readPacketTypeVersion() const {
return *reinterpret_cast<PacketVersion*>(_packet.get() + numBytesForArithmeticCodedPacketType(_type)); return *reinterpret_cast<PacketVersion*>(_packet.get() + numBytesForArithmeticCodedPacketType(_type));
} }
Packet::SequenceNumber Packet::getSequenceNumber() const { Packet::SequenceNumber Packet::readSequenceNumber() const {
if (SEQUENCE_NUMBERED_PACKETS.contains(_type)) { if (SEQUENCE_NUMBERED_PACKETS.contains(_type)) {
SequenceNumber seqNum = *reinterpret_cast<SequenceNumber*>(_packet.get() + SequenceNumber seqNum = *reinterpret_cast<SequenceNumber*>(_packet.get() +
numBytesForArithmeticCodedPacketType(_type) + numBytesForArithmeticCodedPacketType(_type) +
@ -121,7 +130,7 @@ Packet::SequenceNumber Packet::getSequenceNumber() const {
return -1; return -1;
} }
bool Packet::isControlPacket() const { bool Packet::readIsControlPacket() const {
if (SEQUENCE_NUMBERED_PACKETS.contains(_type)) { if (SEQUENCE_NUMBERED_PACKETS.contains(_type)) {
SequenceNumber seqNum = *reinterpret_cast<SequenceNumber*>(_packet.get() + SequenceNumber seqNum = *reinterpret_cast<SequenceNumber*>(_packet.get() +
numBytesForArithmeticCodedPacketType(_type) + numBytesForArithmeticCodedPacketType(_type) +
@ -131,7 +140,7 @@ bool Packet::isControlPacket() const {
return false; return false;
} }
void Packet::setPacketTypeAndVersion(PacketType::Value type) { void Packet::writePacketTypeAndVersion(PacketType::Value type) {
// Pack the packet type // Pack the packet type
auto offset = packArithmeticallyCodedValue(type, _packet.get()); auto offset = packArithmeticallyCodedValue(type, _packet.get());
@ -140,7 +149,7 @@ void Packet::setPacketTypeAndVersion(PacketType::Value type) {
memcpy(_packet.get() + offset, &version, sizeof(version)); memcpy(_packet.get() + offset, &version, sizeof(version));
} }
void Packet::setSequenceNumber(SequenceNumber seqNum) { void Packet::writeSequenceNumber(SequenceNumber seqNum) {
// Here we are overriding the control bit to 0. // Here we are overriding the control bit to 0.
// But that is not an issue since we should only ever set the seqNum // But that is not an issue since we should only ever set the seqNum
// for data packets going out // for data packets going out

View file

@ -40,15 +40,18 @@ public:
char* getData() { return _packet.get(); } char* getData() { return _packet.get(); }
const char* getData() const { return _packet.get(); } const char* getData() const { return _packet.get(); }
PacketType::Value getPacketType() const { return _type; }
void setPacketType(PacketType::Value type);
qint64 getSizeWithHeader() const { return localHeaderSize() + getSizeUsed(); } qint64 getSizeWithHeader() const { return localHeaderSize() + getSizeUsed(); }
qint64 getSizeUsed() const { return _sizeUsed; } qint64 getSizeUsed() const { return _sizeUsed; }
void setSizeUsed(qint64 sizeUsed) { _sizeUsed = sizeUsed; } void setSizeUsed(qint64 sizeUsed) { _sizeUsed = sizeUsed; }
// Header readers // Header readers
PacketType::Value getPacketType() const; PacketType::Value readPacketType() const;
PacketVersion getPacketTypeVersion() const; PacketVersion readPacketTypeVersion() const;
SequenceNumber getSequenceNumber() const; SequenceNumber readSequenceNumber() const;
bool isControlPacket() const; bool readIsControlPacket() const;
// QIODevice virtual functions // QIODevice virtual functions
// WARNING: Those methods all refer to the payload ONLY and NOT the entire packet // WARNING: Those methods all refer to the payload ONLY and NOT the entire packet
@ -64,8 +67,8 @@ protected:
virtual qint64 readData(char* data, qint64 maxSize); virtual qint64 readData(char* data, qint64 maxSize);
// Header writers // Header writers
void setPacketTypeAndVersion(PacketType::Value type); void writePacketTypeAndVersion(PacketType::Value type);
void setSequenceNumber(SequenceNumber seqNum); void writeSequenceNumber(SequenceNumber seqNum);
PacketType::Value _type; // Packet type PacketType::Value _type; // Packet type