#include "NetServer.h" #include #include "DataModel.h" void NetServer::Stop() { net::ServerInterface::Stop(); LOG(INFO) << "[SERVER] Stopped Server"; serverRunning = false; } bool NetServer::Start() { if(serverRunning){ LOG(WARNING) << "[SERVER] tried to start ip tcp server, but it is already running"; return true; } bool res = net::ServerInterface::Start(); if(res){ LOG(INFO) << "[SERVER] Started Server"; serverRunning = true; return res; } LOG(ERROR) << "[SERVER] Couldn't start Server"; serverRunning = false; return res; } bool NetServer::OnClientConnect(std::shared_ptr> client) { //Decide whether to accept or deny connection (always accept in this case) net::Message msg; msg.header.id = net::MessageTypes::ServerAccept; client->Send(msg); return true; } // Called when a client appears to have disconnected void NetServer::OnClientDisconnect(std::shared_ptr> client) { LOG(INFO) << "Removing client [" << client->GetID() << "]"; } // Called when a message arrives void NetServer::OnMessage(std::shared_ptr> client, net::Message& msgRcv) { net::Message msgSend; std::stringstream body; switch (msgRcv.header.id) { case net::MessageTypes::ServerData: LOG(INFO) << "[Client " << client->GetID() << "]: Request Server Data"; msgSend.header.id = net::MessageTypes::ServerData; getBodyData(body); msgSend << body.str(); client->Send(msgSend); break; case net::MessageTypes::ServerCondition: LOG(INFO) << "[Client " << client->GetID() << "]: Request temporary Condition Data"; msgSend.header.id = net::MessageTypes::ServerCondition; getBodyCondition(body); msgSend << body.str(); client->Send(msgSend); break; case net::MessageTypes::ServerAlert: LOG(INFO) << "[Client " << client->GetID() << "]: Request Alert Data"; msgSend.header.id = net::MessageTypes::ServerAlert; client->Send(msgSend); break; case net::MessageTypes::ServerLog: LOG(INFO) << "[Client " << client->GetID() << "]: Request Log Files"; msgSend.header.id = net::MessageTypes::ServerLog; getBodyLog(body, msgRcv); msgSend << body.str(); client->Send(msgSend); break; case net::MessageTypes::ServerCloseConnection: LOG(INFO) << "[Client " << client->GetID() << "]: Request disconnection"; client->Disconnect(); break; default: LOG(ERROR) << "[Client " << client->GetID() << "]: Invaild reuqest code"; break; } } void NetServer::notifyAllConnections(net::Message &message) { LOG(INFO) << "Sent broadcast to "; unsigned int counter = 0; //Send message to all listed active connections for(auto &connection: m_deqConnections){ connection->Send(message); counter++; } LOG(INFO) << "Sent broadcast to " << counter << " devices"; } std::stringstream& NetServer::getBodyData(std::stringstream& buffer) { DataModel::Instance()->readAllDataFiles(buffer); DataModel::Instance()->readPermanentData(buffer, false); return buffer; } std::stringstream& NetServer::getBodyLog(std::stringstream& buffer, net::Message msgRcv) { unsigned long long fromTime; if (msgRcv.header.size == 0) fromTime = 0; else msgRcv >> fromTime; DataModel::Instance()->readLogFile(buffer, fromTime); return buffer; } std::stringstream& NetServer::getBodyCondition(std::stringstream& buffer) { DataModel::Instance()->readTemporaryData(buffer); return buffer; }