From c6268483934eb2bfdcb76ae621a0be40f76209f5 Mon Sep 17 00:00:00 2001 From: Mattes D Date: Sun, 22 Mar 2015 19:46:08 +0100 Subject: Unified cPacketizer across all protocols. --- src/Protocol/Packetizer.cpp | 102 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 src/Protocol/Packetizer.cpp (limited to 'src/Protocol/Packetizer.cpp') diff --git a/src/Protocol/Packetizer.cpp b/src/Protocol/Packetizer.cpp new file mode 100644 index 000000000..2b27f7b2f --- /dev/null +++ b/src/Protocol/Packetizer.cpp @@ -0,0 +1,102 @@ + +// Packetizer.cpp + +// Implements the cPacketizer class representing a wrapper for sending a single packet over a protocol. + +#include "Globals.h" +#include "Packetizer.h" + + + + + +/** Converts the hex digit character to its value. */ +static UInt8 HexDigitValue(char a_Character) +{ + switch (a_Character) + { + case '0': return 0; + case '1': return 1; + case '2': return 2; + case '3': return 3; + case '4': return 4; + case '5': return 5; + case '6': return 6; + case '7': return 7; + case '8': return 8; + case '9': return 9; + case 'a': return 10; + case 'b': return 11; + case 'c': return 12; + case 'd': return 13; + case 'e': return 14; + case 'f': return 15; + case 'A': return 10; + case 'B': return 11; + case 'C': return 12; + case 'D': return 13; + case 'E': return 14; + case 'F': return 15; + default: + { + LOGWARNING("Bad hex digit: %c", a_Character); + ASSERT(!"Bad hex digit"); + return 0; + } + } +} + + + + + +//////////////////////////////////////////////////////////////////////////////// +// cPacketizer: + +cPacketizer::~cPacketizer() +{ + m_Protocol.SendPacket(*this); +} + + + + + +void cPacketizer::WriteByteAngle(double a_Angle) +{ + WriteChar(static_cast(255 * a_Angle / 360)); +} + + + + + +void cPacketizer::WriteFPInt(double a_Value) +{ + Int32 Value = static_cast(a_Value * 32); + WriteInt(Value); +} + + + + + +void cPacketizer::WriteUUID(const AString & a_UUID) +{ + if (a_UUID.length() != 32) + { + LOGWARNING("%s: Attempt to send a bad uuid (length isn't 32): %s", __FUNCTION__, a_UUID.c_str()); + ASSERT(!"Wrong uuid length!"); + return; + } + + for (size_t i = 0; i < 32; i += 2) + { + auto val = static_cast(HexDigitValue(a_UUID[i]) << 4 | HexDigitValue(a_UUID[i + 1])); + VERIFY(m_Out.WriteBEUInt8(val)); + } +} + + + + -- cgit v1.2.3