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.cpp101
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;
}