/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ /* * SAD_DetectedServer holds information about SPIT Server detected by ServerAutoDetection (SAD). * File: SAD_DetectedServer.cpp * Author: Hagi * * Created on 4. Mai 2019, 13:51 */ #include "SAD_DetectedServer.hpp" #include "esp_log.h" static const char * TAG = "SpitSrv"; unordered_map SAD_DetectedServer::s_DetectedServers; SAD_DetectedServer::~SAD_DetectedServer() { } //----- Detected Server ----- SAD_DetectedServer::SAD_DetectedServer() { m_ID = ""; m_Name = ""; m_ComputerName = ""; m_ClientIP = ""; m_Port = ""; m_Additions = ""; m_IPIsIP4 = false; } void SAD_DetectedServer::cycleStart() { for (auto i = s_DetectedServers.begin(); i != s_DetectedServers.end(); i++) { i->second->startCycleSAD(); } } void SAD_DetectedServer::cycleEnd(I_SAD_Client& sADClientInterface) { list o_LostServers; list o_NewServers; SAD_DetectedServer* ptrDetectedServer; { for (auto i = s_DetectedServers.begin(); i != s_DetectedServers.end(); i++) { ptrDetectedServer = i->second; if (ptrDetectedServer->getFoundAgain() == false) { o_LostServers.push_back(ptrDetectedServer); ptrDetectedServer->endCycleSAD(); } else if (ptrDetectedServer->getNew()) { o_NewServers.push_back(ptrDetectedServer); ptrDetectedServer->setNew(false); ptrDetectedServer->endCycleSAD(); } else if (ptrDetectedServer->getChanged()) { ptrDetectedServer->endCycleSAD(); } else { ptrDetectedServer->endCycleSAD(); } } } //Notify client interface about lost servers for (auto i = o_LostServers.begin(); i != o_LostServers.end(); i++) { ptrDetectedServer = *i; sADClientInterface.eventServerLost(ptrDetectedServer->getID(), ptrDetectedServer->getName(), ptrDetectedServer->getComputerName(), ptrDetectedServer->getIP(), ptrDetectedServer->getPort(), ptrDetectedServer->getAdditions(), ptrDetectedServer->getClientIP(), ptrDetectedServer->getIpIsIP4()); } //Remove lost servers for (auto i = o_LostServers.begin(); i != o_LostServers.end(); i++) { ptrDetectedServer = *i; removeDetectedServer(ptrDetectedServer); } o_LostServers.clear(); for (auto i = o_NewServers.begin(); i != o_NewServers.end(); i++) { ptrDetectedServer = *i; sADClientInterface.eventServerDetected(ptrDetectedServer->getID(), ptrDetectedServer->getName(), ptrDetectedServer->getComputerName(), ptrDetectedServer->getIP(), ptrDetectedServer->getPort(), ptrDetectedServer->getAdditions(), ptrDetectedServer->getClientIP(), ptrDetectedServer->getIpIsIP4()); } o_NewServers.clear(); } /** * Used by SAD_Client to add a found SPITServer - don't use this manually * @param p_IsIP4 true = the server is reached via a IP4 address
false = the server is reahed via a IP6 address * @param p_ServerID the id of the server, every instance of a SPITServer has an own id * @param p_ServerParams the server's parameter */ void SAD_DetectedServer::addDetectedServer(bool p_IsIP4, string p_ServerID, string p_ServerParams[]) { SAD_DetectedServer* ptrDetectedServer; { auto i = s_DetectedServers.find(p_ServerID); if (i != s_DetectedServers.end()) { ptrDetectedServer = i->second; } else { ptrDetectedServer = new SAD_DetectedServer(); ptrDetectedServer->setID(p_ServerParams[PARAMINDEX_ID]); ptrDetectedServer->setNew(true); } ptrDetectedServer->setFoundAgain(); //second prefer IP4 if (p_IsIP4 == true) { ptrDetectedServer->setIP(p_ServerParams[PARAMINDEX_IP]); ptrDetectedServer->setIPIsIP4(true); ptrDetectedServer->setClientIP(p_ServerParams[PARAMINDEX_CLIENTIP]); } else if (ptrDetectedServer->getIpIsIP4() == false){ ptrDetectedServer->setIP(p_ServerParams[PARAMINDEX_IP]); ptrDetectedServer->setClientIP(p_ServerParams[PARAMINDEX_CLIENTIP]); } ptrDetectedServer->setName(p_ServerParams[PARAMINDEX_NAME]); ptrDetectedServer->setComputerName(p_ServerParams[PARAMINDEX_COMPUTERNAME]); ptrDetectedServer->setPort(p_ServerParams[PARAMINDEX_PORT]); ptrDetectedServer->setAdditions(p_ServerParams[PARAMINDEX_ADDITIONS]); s_DetectedServers[ptrDetectedServer->getID()] = ptrDetectedServer; } } /** * Used by SAD_Client to remove a SPITServer - don't use this manually * @param p_DetectedServer */ void SAD_DetectedServer::removeDetectedServer(SAD_DetectedServer* p_DetectedServer) { SAD_DetectedServer* o_DetectedServer; { auto i = s_DetectedServers.find(p_DetectedServer->getID()); if (i != s_DetectedServers.end()) { o_DetectedServer = i->second; i = s_DetectedServers.erase(i); delete o_DetectedServer; } } } /** * Used by SAD_Client to clear all found SPITServers - don't use this manually */ void SAD_DetectedServer::clearDetectedServers() { SAD_DetectedServer* ptrDetectedServer; { for (auto i = s_DetectedServers.begin(); i != s_DetectedServers.end(); i++) { ptrDetectedServer = i->second; i = s_DetectedServers.erase(i); delete ptrDetectedServer; if (i == s_DetectedServers.end()) { break; } } } }