diff options
Diffstat (limited to 'signet/protocol/Packet.cpp')
-rw-r--r-- | signet/protocol/Packet.cpp | 91 |
1 files changed, 36 insertions, 55 deletions
diff --git a/signet/protocol/Packet.cpp b/signet/protocol/Packet.cpp index e4d5eef5..74c785e6 100644 --- a/signet/protocol/Packet.cpp +++ b/signet/protocol/Packet.cpp @@ -23,59 +23,19 @@ #include <QtCore/QBuffer> #include <QtCore/QIODevice> -Signet::Protocol::Packet::Packet(const Type type) : +Signet::Protocol::Packet::Packet(const qint16 type) : m_type(type) { } -bool Signet::Protocol::Packet::determineType() +qint16 Signet::Protocol::Packet::type() const { - QByteArray temp = m_rawData; - QBuffer buffer(&temp); - int size = m_rawData.size(); - union - { - char packetType_raw[2]; - qint16 packetType; - }; - union - { - char dataSize_raw[8]; - qint64 dataSize; - }; - if ((m_type == Invalid) && (10 <= size)) - { - buffer.read(packetType_raw, 2); - buffer.read(dataSize_raw, 8); - packetType = qFromBigEndian(packetType); - dataSize = qFromBigEndian(dataSize); - switch (packetType) - { - case RawData: - m_type = RawData; - break; - case Acceptance: - m_type = Acceptance; - break; - case Denial: - m_type = Denial; - break; - case Challenge: - m_type = Challenge; - break; - default: - m_type = Invalid; - break; - } - } - if (m_type == Invalid) - return false; - // TODO: verify the size + return m_type; } -qint16 Signet::Protocol::Packet::type() const +QStringList Signet::Protocol::Packet::receivers() const { - return m_type; + return m_receivers; } bool Signet::Protocol::Packet::isValid() const @@ -83,6 +43,16 @@ bool Signet::Protocol::Packet::isValid() const return m_type == Invalid; } +void Signet::Protocol::Packet::addReceiver(const QString& receiver) +{ + m_receivers << receiver; +} + +void Signet::Protocol::Packet::addReceivers(const QStringList& receivers) +{ + m_receivers << receivers; +} + void Signet::Protocol::Packet::write(const QByteArray& data) { if ((m_type == RawData) || (m_type == Invalid)) @@ -103,16 +73,27 @@ void Signet::Protocol::Packet::dump(QIODevice* device) const } union { - char header[10]; - struct - { - qint16 type; - qint64 size; - }headerParts; + char raw[4]; + qint16 type; + qint32 size; }; - QByteArray data = m_rawData; - headerParts.type = qToBigEndian(m_type); - headerParts.size = qToBigEndian(m_rawData.size()); - data.prepend(header); + QByteArray data; + QBuffer buffer(&data); + type = qToBigEndian(m_type); + buffer.write(raw, 2); + foreach (const QString& receiver, m_receivers) + { + QByteArray utf8Data = receiver.toUtf8(); + size = receiver.size(); + size = qToBigEndian(size); + buffer.putChar('\0'); + buffer.write(raw, 4); + buffer.write(utf8Data.constData(), utf8Data.size()); + } + size = m_rawData.size(); + size = qToBigEndian(size); + buffer.putChar('\x1'); + buffer.write(raw, 4); + buffer.write(m_rawData); device->write(data); } |