summaryrefslogtreecommitdiffstats
path: root/src/loginrpc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/loginrpc.cpp')
-rw-r--r--src/loginrpc.cpp45
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]);
+}