XNSim/XNCore/XNServiceManager.cpp
2025-04-28 12:25:20 +08:00

133 lines
3.6 KiB
C++
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}