XNSim/XNCore/XNServiceManager.cpp

133 lines
3.6 KiB
C++
Raw Normal View History

2025-04-28 12:25:20 +08:00
#include "XNServiceManager.h"
#include "XNServiceManager_p.h"
#include "XNServiceObject.h"
#include <QLibrary>
#include <QMetaType>
#include <QObject>
XNServiceManager::XNServiceManager(QObject *parent)
: XNBaseFrameObject(*new XNServiceManagerPrivate(this), parent)
{
setUniqueId(4);
setObjectName("XNServiceManager");
Q_D(XNServiceManager);
d->ServiceIDAssigned.resize(10000, false);
}
XNServiceManager::~XNServiceManager()
{
}
XNServiceManager::XNServiceManager(XNServiceManagerPrivate &dd, QObject *parent)
: XNBaseFrameObject(dd, parent)
{
}
void XNServiceManager::OnInitialize()
{
Q_D(XNServiceManager);
LOG_INFO("XNServiceManager Initialize Success!");
d->_status = XNFrameObjectStatus::Initialized;
emit Initialize();
}
void XNServiceManager::OnPrepareForExecute()
{
Q_D(XNServiceManager);
d->_status = XNFrameObjectStatus::Ready;
LOG_INFO("XNServiceManager is prepared!");
emit PrepareForExecute();
}
void XNServiceManager::OnLoadService(const QString &servicePath, const QString &serviceName)
{
Q_D(XNServiceManager);
QLibrary lib(servicePath);
if (lib.load()) {
typedef void (*InitialServiceFunc)();
QString initialServiceName = "Initial" + serviceName;
InitialServiceFunc initialService =
(InitialServiceFunc)lib.resolve(initialServiceName.toUtf8().constData());
if (initialService) {
initialService();
QMetaType metaType = QMetaType::fromName(serviceName.toUtf8().constData());
if (metaType.isValid()) {
QObject *obj = static_cast<QObject *>(metaType.create());
if (obj) {
XNServiceObject *service = qobject_cast<XNServiceObject *>(obj);
if (service) {
quint32 serviceID = RegisterService();
if (serviceID == 0) {
LOG_WARNING("0x2174 Assign Service ID Failed, Service ID is used up!");
delete obj;
return;
}
service->setParent(this);
service->setObjectName(serviceName);
service->setUniqueId(serviceID);
QString configFilePath =
QFileInfo(servicePath).absolutePath() + "/" + serviceName + ".scfg";
service->SetXmlPath(configFilePath);
connect(this, &XNServiceManager::PrepareForExecute, service,
&XNServiceObject::OnPrepareForExecute);
service->OnInitialize();
} else {
LOG_WARNING("0x2175 Service %1 Instantiation Failed, Not a subclass of "
"XNServiceObject!",
serviceName);
delete obj;
return;
}
} else {
LOG_WARNING(
"0x2176 Service %1 Instantiation Failed, Not a subclass of QObject!",
serviceName);
delete obj;
return;
}
} else {
LOG_WARNING("0x2173 Service %1 Not found in dynamic link library %2!", serviceName,
servicePath);
return;
}
} else {
LOG_WARNING("0x2177 Service %1 Initialization Failed, Function InitialService Not "
"Found!",
serviceName);
return;
}
} else {
LOG_WARNING("0x2172 Service %1 Dynamic link library loading failed! Error: %2", serviceName,
lib.errorString());
}
}
XNServiceObject *XNServiceManager::GetService(quint32 serviceID)
{
Q_D(XNServiceManager);
if (d->ServiceIDAssigned[serviceID - 20000]) {
QList<XNServiceObject *> serviceList = findChildren<XNServiceObject *>();
for (auto &service : serviceList) {
if (service->getUniqueId() == serviceID)
return service;
}
return nullptr;
} else
return nullptr;
}
quint32 XNServiceManager::RegisterService()
{
Q_D(XNServiceManager);
// 从2000029999的编号中分配ID
for (int i = 0; i < 10000; i++) {
if (d->ServiceIDAssigned[i])
continue;
else {
d->ServiceIDAssigned[i] = true;
return i + 20000;
}
}
return 0;
}