diff options
Diffstat (limited to 'examples/network/network-chat/connection.cpp')
-rw-r--r-- | examples/network/network-chat/connection.cpp | 57 |
1 files changed, 38 insertions, 19 deletions
diff --git a/examples/network/network-chat/connection.cpp b/examples/network/network-chat/connection.cpp index d89266a53c..0f59cc91ed 100644 --- a/examples/network/network-chat/connection.cpp +++ b/examples/network/network-chat/connection.cpp @@ -4,7 +4,7 @@ #include "connection.h" -#include <QtNetwork> +#include <QTimerEvent> static const int TransferTimeout = 30 * 1000; static const int PongTimeout = 60 * 1000; @@ -21,18 +21,12 @@ static const int PingInterval = 5 * 1000; * plaintext = { 0 => text } * ping = { 1 => null } * pong = { 2 => null } - * greeting = { 3 => text } + * greeting = { 3 => { text, bytes } } */ Connection::Connection(QObject *parent) : QTcpSocket(parent), writer(this) { - greetingMessage = tr("undefined"); - username = tr("unknown"); - state = WaitingForGreeting; - currentDataType = Undefined; - transferTimerId = -1; - isGreetingMessageSent = false; pingTimer.setInterval(PingInterval); connect(this, &QTcpSocket::readyRead, this, @@ -54,7 +48,7 @@ Connection::Connection(qintptr socketDescriptor, QObject *parent) Connection::~Connection() { - if (isGreetingMessageSent) { + if (isGreetingMessageSent && QAbstractSocket::state() != QAbstractSocket::UnconnectedState) { // Indicate clean shutdown. writer.endArray(); waitForBytesWritten(2000); @@ -66,9 +60,15 @@ QString Connection::name() const return username; } -void Connection::setGreetingMessage(const QString &message) +void Connection::setGreetingMessage(const QString &message, const QByteArray &uniqueId) { greetingMessage = message; + localUniqueId = uniqueId; +} + +QByteArray Connection::uniqueId() const +{ + return peerUniqueId; } bool Connection::sendMessage(const QString &message) @@ -124,7 +124,29 @@ void Connection::processReadyRead() reader.next(); } else { // Current state: read command payload - if (reader.isString()) { + if (currentDataType == Greeting) { + if (state == ReadingGreeting) { + if (!reader.isContainer() || !reader.isLengthKnown() || reader.length() != 2) + break; // protocol error + state = ProcessingGreeting; + reader.enterContainer(); + } + if (state != ProcessingGreeting) + break; // protocol error + if (reader.isString()) { + auto r = reader.readString(); + buffer += r.data; + } else if (reader.isByteArray()) { + auto r = reader.readByteArray(); + peerUniqueId += r.data; + if (r.status == QCborStreamReader::EndOfString) { + reader.leaveContainer(); + processGreeting(); + } + } + if (state == ProcessingGreeting) + continue; + } else if (reader.isString()) { auto r = reader.readString(); buffer += r.data; if (r.status != QCborStreamReader::EndOfString) @@ -132,7 +154,7 @@ void Connection::processReadyRead() } else if (reader.isNull()) { reader.next(); } else { - break; // protocol error + break; // protocol error } // Next state: no command read @@ -142,13 +164,7 @@ void Connection::processReadyRead() transferTimerId = -1; } - if (state == ReadingGreeting) { - if (currentDataType != Greeting) - break; // protocol error - processGreeting(); - } else { - processData(); - } + processData(); } } @@ -178,7 +194,10 @@ void Connection::sendGreetingMessage() writer.startMap(1); writer.append(Greeting); + writer.startArray(2); writer.append(greetingMessage); + writer.append(localUniqueId); + writer.endArray(); writer.endMap(); isGreetingMessageSent = true; |