diff options
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; } |