diff options
| author | Ben Boeckel <MathStuf@gmail.com> | 2008-11-02 01:44:43 +0000 |
|---|---|---|
| committer | Ben Boeckel <MathStuf@gmail.com> | 2008-11-02 01:44:43 +0000 |
| commit | 7fb827cb9b76990e0c00d9681e7d7411bfde871c (patch) | |
| tree | a929797513322d388a79f1f8416150687211179e /signet/protocol/PacketMaker.cpp | |
| parent | 1f94903f6f0d4eb86c6752d31b8e6cb1956794f7 (diff) | |
| download | sigen-7fb827cb9b76990e0c00d9681e7d7411bfde871c.tar.gz sigen-7fb827cb9b76990e0c00d9681e7d7411bfde871c.tar.xz sigen-7fb827cb9b76990e0c00d9681e7d7411bfde871c.zip | |
[FIX] Working on Packet structure yet
git-svn-id: https://pokegen.svn.sourceforge.net/svnroot/pokegen/trunk@294 6ecfd1a5-f3ed-3746-8530-beee90d26b22
Diffstat (limited to 'signet/protocol/PacketMaker.cpp')
| -rw-r--r-- | signet/protocol/PacketMaker.cpp | 101 |
1 files changed, 44 insertions, 57 deletions
diff --git a/signet/protocol/PacketMaker.cpp b/signet/protocol/PacketMaker.cpp index 2435942d..3c398ffe 100644 --- a/signet/protocol/PacketMaker.cpp +++ b/signet/protocol/PacketMaker.cpp @@ -23,104 +23,91 @@ #include <QtCore/QBuffer> #include <QtCore/QIODevice> -bool readIntoBuffer(QIODevice* dest, QIODevice* src, const int size) +bool readFromBuffer(char* 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; + int read = src->read(dest + totalRead, size - totalRead); 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::rawData(QIODevice* device, const QByteArray& data) +void Signet::Protocol::PacketMaker::rawData(QIODevice* device, const QByteArray& data, const QStringList& receivers) { Packet packet(Packet::RawData); + packet.addReceivers(receivers); packet.write(data); packet.dump(device); } -void Signet::Protocol::PacketMaker::deny(QIODevice* device) +void Signet::Protocol::PacketMaker::deny(QIODevice* device, const QStringList& receivers) { Packet packet(Packet::Denial); + packet.addReceivers(receivers); packet.dump(device); } -void Signet::Protocol::PacketMaker::accept(QIODevice* device) +void Signet::Protocol::PacketMaker::accept(QIODevice* device, const QStringList& receivers) { Packet packet(Packet::Acceptance); + packet.addReceivers(receivers); packet.dump(device); } -void Signet::Protocol::PacketMaker::challenge(QIODevice* device, const QByteArray& id) +void Signet::Protocol::PacketMaker::challenge(QIODevice* device, const QByteArray& id, const QStringList& receivers) { Packet packet(Packet::Challenge); + packet.addReceivers(receivers); 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; + char raw[4]; + qint32 sectionSize; + qint16 packetType; + qint8 sectionType; }; - union + if (!readFromBuffer(raw, device, 2)) + return Packet(); + packetType = qFromBigEndian(packetType); + Packet packet(packetType); + if (!readFromBuffer(raw, device, 1)) + return Packet(); + while (sectionType == Packet::Receiver) { - char expectedSize_raw[8]; - qint64 expectedSize; - }; - if (!readIntoBuffer(&buffer, device, 10)) + if (!readFromBuffer(raw, device, 4)) + return Packet(); + char* buffer = new char[sectionSize + 1]; + buffer[sectionSize] = '\0'; + sectionSize = qFromBigEndian(sectionSize); + if (!readFromBuffer(buffer, device, sectionSize)) + { + delete [] buffer; + return Packet(); + } + packet.addReceiver(QString::fromUtf8(buffer)); + delete [] buffer; + if (!readFromBuffer(raw, device, 1)) + return Packet(); + } + if ((sectionType != Packet::Payload) || !readFromBuffer(raw, device, 4)) return Packet(); - buffer.write(expectedType_raw, 2); - expectedType = qFromBigEndian(expectedType); - buffer.write(expectedSize_raw, 8); - expectedSize = qFromBigEndian(expectedSize); - Packet packet; - switch (expectedType) + char* buffer = new char[sectionSize]; + sectionSize = qFromBigEndian(sectionSize); + if (!readFromBuffer(buffer, device, sectionSize)) { - 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; + delete [] buffer; + return Packet(); } + packet.write(QByteArray(buffer, sectionSize)); + delete [] buffer; return packet; } |
