133 lines
3.6 KiB
C++
Executable File
133 lines
3.6 KiB
C++
Executable File
#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);
|
||
// 从20000~29999的编号中分配ID
|
||
for (int i = 0; i < 10000; i++) {
|
||
if (d->ServiceIDAssigned[i])
|
||
continue;
|
||
else {
|
||
d->ServiceIDAssigned[i] = true;
|
||
return i + 20000;
|
||
}
|
||
}
|
||
return 0;
|
||
}
|