115 lines
2.4 KiB
C++
Raw Normal View History

2019-02-13 13:03:40 +03:00
#include "server.h"
#include "quasarapp.h"
#include <QTcpSocket>
namespace ClientProtocol {
bool Server::parsePackage(const Package &pkg, QTcpSocket* sender) {
if (!pkg.isValid()) {
QuasarAppUtils::Params::verboseLog("incomming package is not valid!");
return false;
}
if (!sender->isValid()) {
QuasarAppUtils::Params::verboseLog("incomming package is not valid!");
return false;
}
switch (pkg.hdr.command) {
2019-02-15 23:36:59 +03:00
case Ping: {
2019-02-13 13:03:40 +03:00
if (pkg.hdr.type != Responke) {
return false;
}
Package resp;
2019-02-15 23:36:59 +03:00
resp.hdr.command = Ping;
2019-02-13 13:03:40 +03:00
auto bytes = resp.toBytes();
if (bytes.size() != sender->write(bytes)) {
QuasarAppUtils::Params::verboseLog("!responce not sendet!");
}
break;
}
2019-02-15 23:36:59 +03:00
case Item:
case PlayerData:
case Login:{
if (pkg.hdr.type != Responke) {
return false;
}
QVariantMap data;
if (!pkg.parse(data)) {
return false;
}
emit incomingReques (data, sender);
break;
}
2019-02-13 13:03:40 +03:00
default:{
QuasarAppUtils::Params::verboseLog("!responce not sendet!");
return false;
}
}
return true;
}
void Server::avelableBytes() {
auto client = dynamic_cast<QTcpSocket*>(sender());
if (!client) {
return;
}
auto array = client->readAll();
if (_downloadPackage.hdr.isValid()) {
_downloadPackage.data.append(array);
} else {
memcpy(&_downloadPackage.hdr,
2019-02-14 14:09:17 +03:00
array.data(), sizeof(Header));
_downloadPackage.data.append(array.mid(sizeof(Header)));
2019-02-13 13:03:40 +03:00
}
if (_downloadPackage.isValid()) {
parsePackage(_downloadPackage, client);
_downloadPackage.reset();
return;
}
}
void Server::handleIncommingConnection() {
while (hasPendingConnections()) {
auto socket = nextPendingConnection();
connect(socket, &QTcpSocket::readyRead, this, &Server::avelableBytes);
}
}
Server::Server(QObject *ptr) :
QTcpServer (ptr) {
connect(this, &Server::newConnection, this, &Server::handleIncommingConnection);
}
Server::~Server() {
}
bool Server::run(const QString &ip, unsigned short port) {
if (!listen(QHostAddress(ip), port) ) {
QuasarAppUtils::Params::verboseLog("listing fail " + this->errorString());
return false;
}
return true;
}
}