133 lines
3.6 KiB
C++
133 lines
3.6 KiB
C++
|
#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;
|
|||
|
}
|