diff options
Diffstat (limited to 'src/loginrpc.cpp')
-rw-r--r-- | src/loginrpc.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/loginrpc.cpp b/src/loginrpc.cpp new file mode 100644 index 0000000..4ced53e --- /dev/null +++ b/src/loginrpc.cpp @@ -0,0 +1,45 @@ +#include "loginrpc.h" + +#include <QtNetwork/QTcpServer> +#include <QtNetwork/QTcpSocket> +#include <QDebug> + +LoginRpc::LoginRpc(int port, QObject *parent) + : QObject(parent) +{ + QTcpServer *srv = new QTcpServer(this); + srv->listen(QHostAddress::Any, port); + connect(srv, &QTcpServer::newConnection, [=] { + while (srv->hasPendingConnections()) { + QTcpSocket *sock = srv->nextPendingConnection(); + handleIncoming(sock); + } + }); +} + +void LoginRpc::handleIncoming(QTcpSocket *sock) { + connect(sock, &QTcpSocket::readyRead, [=] { + QByteArray ba = sock->readAll(); // XXX We assume everything arrives in one packet + if (ba.length() < 2) { + sock->deleteLater(); + return; + } + int vers = (ba[0] << 8) + ba[1]; + ba = ba.mid(2); + ba = QByteArray::fromBase64(ba); + if (vers == 1) { + handleCommandV1(QString::fromUtf8(ba)); + } else { + qDebug() << "Ignoring unknown Login RPC version" << vers; + } + }); +} + +void LoginRpc::handleCommandV1(const QString &command) +{ + QStringList lines = command.split('\n'); + while (lines.count() < 3) { + lines.append(QString()); + } + emit loginRequest(lines[0], lines[1], lines[2]); +} |