diff options
Diffstat (limited to 'signet/protocol/PacketMaker.cpp')
-rw-r--r-- | signet/protocol/PacketMaker.cpp | 85 |
1 files changed, 84 insertions, 1 deletions
diff --git a/signet/protocol/PacketMaker.cpp b/signet/protocol/PacketMaker.cpp index 3eb3e0b2..f608fa18 100644 --- a/signet/protocol/PacketMaker.cpp +++ b/signet/protocol/PacketMaker.cpp @@ -18,19 +18,102 @@ // Header include #include "PacketMaker.h" +// Qt includes +#include <QtCore/QtEndian> +#include <QtCore/QBuffer> +#include <QtCore/QIODevice> + +bool readIntoBuffer(QIODevice* dest, QIODevice* src, const int size) +{ + char* tbuffer = new char[size]; + int totalRead = 0; + while ((totalRead < size) && src->waitForReadyRead(30000)) + { + int read = src->read(tbuffer + totalRead, 10 - totalRead); + int written = 0; + if (read < 0) + { + delete [] tbuffer; + return false; + } + while (written < read) + { + int writtenThisTime = dest->write(tbuffer + written, read - written); + if (writtenThisTime < 0) + { + delete [] tbuffer; + return false; + } + written += writtenThisTime; + } + totalRead += read; + } + delete [] tbuffer; + return true; +} + void Signet::Protocol::PacketMaker::deny(QIODevice* device) { + Packet packet(Packet::Denial); + packet.dump(device); } void Signet::Protocol::PacketMaker::accept(QIODevice* device) { + Packet packet(Packet::Acceptance); + packet.dump(device); } -void Signet::Protocol::PacketMaker::challengePacket(QIODevice* device) +void Signet::Protocol::PacketMaker::challenge(QIODevice* device, const QByteArray& id) { + Packet packet(Packet::Challenge); + packet.write(id); + packet.dump(device); } Signet::Protocol::Packet Signet::Protocol::PacketMaker::unwrap(QIODevice* device) { + QByteArray temp; + QBuffer buffer(&temp); + union + { + char expectedType_raw[2]; + qint16 expectedType; + }; + union + { + char expectedSize_raw[8]; + qint64 expectedSize; + }; + if (!readIntoBuffer(&buffer, device, 10)) + return Packet(); + buffer.write(expectedType_raw, 2); + expectedType = qFromBigEndian(expectedType); + buffer.write(expectedSize_raw, 8); + expectedSize = qFromBigEndian(expectedSize); Packet packet; + switch (expectedType) + { + case Packet::RawData: + packet = Packet(Packet::RawData); + if (readIntoBuffer(&buffer, device, expectedSize)) + packet.write(buffer.buffer()); + break; + case Packet::Acceptance: + if (!expectedSize) + packet = Packet(Packet::Acceptance); + break; + case Packet::Denial: + if (!expectedSize) + packet = Packet(Packet::Denial); + break; + case Packet::Challenge: + packet = Packet(Packet::Challenge); + if (readIntoBuffer(&buffer, device, expectedSize)) + packet.write(buffer.buffer()); + break; + default: + break; + } + return packet; } |