#include "PrtCnvInjectionThread.hpp" #include "PrtCnvInjectionSocket.hpp" #include #include #include #include namespace PrtCnv { PrtCnvInjectionThread::PrtCnvInjectionThread(PrtCnvThreadStarter* a_parent) : PrtCnvThread(a_parent, "PrtCnvInjectionThread") , m_Port(46666) , m_Enabled(false) , m_Server(nullptr) , m_CentralListMutex(nullptr) , m_RadioListMutex(nullptr) { m_Name = QStringLiteral("Injection"); } PrtCnvInjectionThread::~PrtCnvInjectionThread() { delete m_CentralListMutex; delete m_RadioListMutex; } int32_t PrtCnvInjectionThread::create(NGL::Settings *settings) { INFO_LOG(m_logger) << "create"; PrtCnvThread::create(settings); m_CentralListMutex = new QMutex; m_RadioListMutex = new QMutex; m_Enabled = m_Config->getBoolean(getName(), QStringLiteral("Enable"), false); if (m_Enabled) { m_Server = new QTcpServer(this); if (m_Server) connect(m_Server, &QTcpServer::newConnection, this, &PrtCnvInjectionThread::connectClient, Qt::QueuedConnection); } return 0; } int32_t PrtCnvInjectionThread::init() { INFO_LOG(m_logger) << "init"; PrtCnvThread::init(); m_Port = m_Config->getInteger(getName(), QStringLiteral("Port"), 46666); return 0; } int32_t PrtCnvInjectionThread::start() { INFO_LOG(m_logger) << "Start"; PrtCnvThread::start(); if (m_Enabled) { m_Server->setMaxPendingConnections(1); m_Server->listen(QHostAddress::Any, m_Port); INFO_LOG(m_logger) << "Injection-Server is listening on port " << m_Port; } return 0; } void PrtCnvInjectionThread::connectClient() { INFO_LOG(m_logger) << "A client has connected to the injection-server"; PrtCnvInjectionSocket* injectSocket = new PrtCnvInjectionSocket; m_SocketList.insert(injectSocket); INFO_LOG(m_logger) << "Now are " << m_SocketList.size() << " injection-client(s) connected"; injectSocket->setSocket(m_Server->nextPendingConnection(), this); } void PrtCnvInjectionThread::disconnectClient(PrtCnvInjectionSocket *a_injectionSocket) { auto it = m_SocketList.find(a_injectionSocket); if (it != m_SocketList.end()) m_SocketList.erase(it); INFO_LOG(m_logger) << "Now are " << m_SocketList.size() << " injection-client(s) connected"; delete a_injectionSocket; } N_CoPrtCnv::CoPrtCnvCentralTelegram *PrtCnvInjectionThread::getNextCentralInjectionTelegram() { QMutexLocker l(m_CentralListMutex); if (m_CentralTelegramList.empty()) return nullptr; auto centralTelegram = m_CentralTelegramList.front(); m_CentralTelegramList.pop(); return centralTelegram; } N_CoPrtCnv::CoPrtCnvCentralTelegram *PrtCnvInjectionThread::getNextRadioInjectionTelegram() { QMutexLocker l(m_RadioListMutex); if (m_RadioTelegramList.empty()) return nullptr; auto radioTelegram = m_RadioTelegramList.front(); m_RadioTelegramList.pop(); return radioTelegram; } void PrtCnvInjectionThread::addToCentralList(N_CoPrtCnv::CoPrtCnvCentralTelegram *a_telegram) { QMutexLocker l(m_CentralListMutex); m_CentralTelegramList.push(a_telegram); } void PrtCnvInjectionThread::addToRadioList(N_CoPrtCnv::CoPrtCnvCentralTelegram *a_telegram) { QMutexLocker l(m_RadioListMutex); m_RadioTelegramList.push(a_telegram); } }