#include "XNServiceManager.h" #include "XNServiceManager_p.h" #include "XNServiceObject.h" #include #include #include 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(metaType.create()); if (obj) { XNServiceObject *service = qobject_cast(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 serviceList = findChildren(); 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; }