summaryrefslogtreecommitdiffstats
path: root/signet/protocol/PacketMaker.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'signet/protocol/PacketMaker.cpp')
-rw-r--r--signet/protocol/PacketMaker.cpp85
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;
}