summaryrefslogtreecommitdiffstats
path: root/signet/protocol/PacketMaker.cpp
diff options
context:
space:
mode:
authorBen Boeckel <MathStuf@gmail.com>2008-11-01 17:01:26 +0000
committerBen Boeckel <MathStuf@gmail.com>2008-11-01 17:01:26 +0000
commite41f087652cf102c04df1a78ac7a2c72724e740c (patch)
tree8913943b66f388bdd132e998bb3174175184898f /signet/protocol/PacketMaker.cpp
parenta286bb188d7654d644e2f26b71e8ddeaf4490a9d (diff)
downloadsigen-e41f087652cf102c04df1a78ac7a2c72724e740c.tar.gz
sigen-e41f087652cf102c04df1a78ac7a2c72724e740c.tar.xz
sigen-e41f087652cf102c04df1a78ac7a2c72724e740c.zip
[FIX] Challenge login can fail due to unknown user
[FIX] PacketMaker makes Packets (Packets only hold information) git-svn-id: https://pokegen.svn.sourceforge.net/svnroot/pokegen/trunk@292 6ecfd1a5-f3ed-3746-8530-beee90d26b22
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;
}