#include #include #include #include #include "items/item.h" #include "service.h" #include "tcpserver.h" TcpServer::TcpServer(QObject* parent): Service(parent), server(this) { connect(&server, &QTcpServer::newConnection, this, &TcpServer::incomingConnection); } void TcpServer::sendJson(const QJsonObject& json) { for(auto client: clients) { QByteArray jsonData = QJsonDocument(json).toJson(); client.socket->write(QString("MSG JSON LEN " + QString::number(jsonData.size()) + "\n").toLatin1() + jsonData); } } void TcpServer::processIncomeingJson(const QByteArray& jsonbytes) { QJsonDocument doc = QJsonDocument::fromJson(jsonbytes); QJsonObject json = doc.object(); QString type = json["MessageType"].toString(); if(type == "ItemUpdate") { qDebug()<<"Got Items"; QJsonArray data = json["Data"].toArray(); bool FullList = json["FullList"].toBool(false); std::vector> items; for(QJsonValueRef itemjson : data) { QJsonObject jsonobject = itemjson.toObject(); std::shared_ptr item = Item::loadItem(jsonobject); item->setLoaded(FullList); if(item) items.push_back(item); } if(FullList && !items.empty()) { requestReplaceItems(items); sigRequestSave(); } else if(!items.empty()) { gotItems(items, false); } } else { Service::processIncomeingJson(jsonbytes); } } bool TcpServer::launch(const QHostAddress &address, quint16 port) { return server.listen(address, port); } void TcpServer::incomingConnection() { while(server.hasPendingConnections()) { QTcpSocket* client = server.nextPendingConnection(); qDebug()<<"Got new client from"<peerAddress().toString(); if(client) { clients.push_back({client}); connect(client, &QTcpSocket::errorOccurred, this, &TcpServer::socketError); connect(client, &QTcpSocket::disconnected, this, &TcpServer::socketDisconnect); connect(client, &QTcpSocket::readyRead, this, &TcpServer::socketReadyRead); } } } void TcpServer::socketError(QAbstractSocket::SocketError socketError) { (void)socketError; for(size_t i = 0; i < clients.size(); i++) { if(clients[i].socket == TcpServer::sender()) { clients.erase(clients.begin()+i); --i; } } } void TcpServer::socketDisconnect() { for(size_t i = 0; i < clients.size(); i++) { if(clients[i].socket == TcpServer::sender()) { clients.erase(clients.begin()+i); --i; } } } void TcpServer::processComand(const QByteArray& command, Client& client) { if(command.startsWith("MSG JSON LEN ")) { client.state = STATE_RECV_JSON; client.recievebytes = command.mid(13).toLongLong(); qDebug()<<"Got command:"<readAll(); clients[i].buffer += newChars; bool remianing = true; while(remianing) { qDebug()<