Adds initial intermediate qt6 porting state

This commit is contained in:
torsten committed 2026-08-17 17:54:56 +02:00
1 parent 99136e9460
commit d176b5e0d7
11247 files changed
+1891537

No files matched your search

@@ -0,0 +1,209 @@
#include "tcpserver.h"
#include "tcpserver_logger.h"
#include "workerbase.h"
#include <QtNetwork/QTcpSocket>
#include <QtCore/QCoreApplication>
#include <QtCore/QThread>
#include <QtCore/QTimer>
#include <NGLLogger/NGLLoggerBootstrap.h>
NGL::INGLLogger &getTcpServerLogger()
{
static NGL::INGLLogger *tcpserver_logger_ptr = nullptr;
if (!tcpserver_logger_ptr)
tcpserver_logger_ptr = &NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("tcpserver");
return *tcpserver_logger_ptr;
}
typedef QHash< unsigned short, TcpServer::CommandInterfaceList > CommandFactory;
class TcpServer::Private
{
public:
explicit Private(unsigned short port_)
: mUserData(nullptr)
, port(port_)
, bUseThreads(false)
{}
~Private()
{
const auto copy(workers);
for (WorkerInstance *worker : copy)
{
QThread *workerThread = worker->thread();
if (workerThread != qApp->thread())
{
QTimer::singleShot(0, worker, &WorkerInstance::deleteLater);
workerThread->wait();
}
else
delete worker;
}
workers.clear();
}
QVector<WorkerInstance *> workers;
void *mUserData;
unsigned short port;
bool bUseThreads;
static QHash<int, TcpServer *> s_servers;
static CommandFactory s_cbFactory;
};
QHash<int, TcpServer *> TcpServer::Private::s_servers;
CommandFactory TcpServer::Private::s_cbFactory;
TcpServer::TcpServer(unsigned short port)
: QTcpServer()
, d(new Private(port))
{
TCPSERVER_TRACE2("Port: " << port);
}
TcpServer::~TcpServer()
{
TCPSERVER_TRACE
Private::s_servers.remove(d->port);
delete d;
}
TcpServer *TcpServer::instance(unsigned short port)
{
if (!Private::s_servers.contains(port))
Private::s_servers.insert(port, new TcpServer(port));
return Private::s_servers[ port ];
}
bool TcpServer::listen(const QHostAddress &address)
{
TCPSERVER_TRACE2("address: " << address);
return QTcpServer::listen(address, d->port);
}
void TcpServer::setUseWorkerThreads(bool bEnable)
{
TCPSERVER_TRACE2("bEnable: " << bEnable);
d->bUseThreads = bEnable;
}
bool TcpServer::useWorkerThreads() const
{
return d->bUseThreads;
}
QVector<WorkerInstance *> TcpServer::workers() const
{
return d->workers;
}
unsigned short TcpServer::getListenPort() const
{
return d->port;
}
bool TcpServer::registerCommand(unsigned short port, CommandInterface * (*factory)(unsigned short))
{
CommandInterfaceList &factoryList = Private::s_cbFactory[port];
if (factoryList.contains(factory))
{
TCPSERVER_ERROR("Factory " << (void *)factory << " already registered!")
return false;
}
factoryList.append(factory);
TCPSERVER_DEBUG("Added Factory " << (void *)factory << " for port " << port)
return true;
}
bool TcpServer::unregisterCommand(unsigned short port, CommandInterface * (*factory)(unsigned short))
{
CommandInterfaceList &factoryList = Private::s_cbFactory[port];
if (!factoryList.contains(factory))
{
TCPSERVER_WARN("Trying to unregister factory " << (void *)factory << " for port " << port << " which is not registered!")
return false;
}
TCPSERVER_INFO("Removed Factory " << (void *)factory << " for port " << port)
factoryList.removeAll(factory);
return true;
}
TcpServer::CommandInterfaceList TcpServer::registeredCommands(unsigned short port)
{
return Private::s_cbFactory[port];
}
void TcpServer::incomingConnection(qintptr socketDescriptor)
{
WorkerInstance *worker = new WorkerInstance(socketDescriptor, d->port);
connect(worker, &WorkerInstance::finished, this, &TcpServer::workerFinished);
d->workers += worker;
if (d->bUseThreads)
{
QThread *workerThread = new QThread(this);
connect(workerThread, &QThread::started, worker, &WorkerInstance::doWork);
connect(workerThread, &QThread::finished, worker, &WorkerInstance::quit);
worker->moveToThread(workerThread);
workerThread->start();
connect(workerThread, &QThread::finished, workerThread, &QThread::deleteLater);
TCPSERVER_DEBUG("Created new WorkerThread " << worker)
}
else
{
QTimer::singleShot(0, worker, &WorkerInstance::doWork);
TCPSERVER_DEBUG("Created new WorkerInstance " << worker)
}
}
void TcpServer::workerFinished()
{
WorkerInstance *wi = qobject_cast<WorkerInstance *>(sender());
if (wi)
{
if (!d->workers.removeAll(wi))
TCPSERVER_WARN("Got a signal that a worker exited, but could not find it in our list!")
wi->deleteLater();
}
else
{
TCPSERVER_WARN("Got a signal that a worker exited, but it's neither a WorkerInstance nor WorkerThread!")
}
}
void TcpServer::shutdownRequest()
{
emit aboutToQuit(d->port);
for (WorkerBase *worker : std::as_const(d->workers))
{
WorkerInstance *wi = dynamic_cast<WorkerInstance *>(worker);
if (wi)
{
wi->quit();
while (!wi->isFinished())
QCoreApplication::processEvents();
}
}
close();
deleteLater();
}
void TcpServer::setUserData(void *userData)
{
d->mUserData = userData;
}
void *TcpServer::userData() const
{
return d->mUserData;
}