#include "server.h" #include #include #include #include #include #include #include "serverutils.h" #include "serverprotocol.h" #include "server.h" namespace ServerProtocol { void Server::parsePackage(const Package& pkg) { if (!pkg.isValid()) { return; } switch (pkg.hdr.command) { case Ping: { if (pkg.hdr.type != Request) { return; } Package resp; resp.hdr.command = Ping; resp.hdr.type = Responke; QVariantMap data; data["res"] = "Pong"; resp.fromMap(data); if (!sendPackage(resp)) { QuasarAppUtils::Params::verboseLog("!responce not sendet!"); } break; } default: { QVariantMap res; QDataStream stream(pkg.data); stream >> res; res["command"] = pkg.hdr.command; emit incomingRequest(res); }; } } bool Server::sendPackage(Package &pkg) { if (!pkg.isValid()) { return false; } if (!_client->isValid()) { qCritical() << "destination server not valid!"; return false; } if (!_client->waitForConnected()) { qCritical() << "no connected to server! " << _client->errorString(); return false; } auto bytes = pkg.toBytes(); bool sendet = bytes.size() == _client->write(bytes); return sendet; } void Server::avelableBytes() { auto array = _client->readAll(); if (_downloadPackage.hdr.isValid()) { _downloadPackage.data.append(array); } else { memcpy(&_downloadPackage.hdr, array.data(), sizeof(Header)); _downloadPackage.data.append(array.mid(sizeof(Header))); } if (_downloadPackage.isValid()) { parsePackage(_downloadPackage); _downloadPackage.reset(); return; } } void Server::incomingConnection(quintptr socketDescriptor) { _client->setSocketDescriptor(static_cast(socketDescriptor)); if (!_client->isValid()) { QuasarAppUtils::Params::verboseLog("incomingConnection not valid!"); return; } if (!_client->isOpen() && !_client->open()) { QuasarAppUtils::Params::verboseLog("incomingConnection not opened!"); return; } } Server::Server(QObject *ptr): QLocalServer (ptr) { _client = new QLocalSocket(this); connect(_client, &QLocalSocket::readyRead, this, &Server::avelableBytes); } Server::~Server() { close(); } bool Server::run(const QString &name, bool force) { if (force) { QFile::remove("/tmp/" + name); } if (!listen(name)) { QuasarAppUtils::Params::verboseLog("listing fail " + this->errorString()); return false; } return true; } bool Server::sendResponce(QVariantMap res, Command command) { Package pck; pck.hdr.type = ServerProtocol::Responke; pck.hdr.command = static_cast(command); if (res.isEmpty()) { res["Error"] = "command not supported!"; } pck.fromMap(res); pck.hdr.size = static_cast(pck.data.size()); return sendPackage(pck); } }