#include "XNServiceManager.h" #include "XNServiceManager_p.h" #include "XNServiceObject.h" XNServiceManager::XNServiceManager() : XNBaseFrameObject(new XNServiceManagerPrivate()) { SetUniqueId(4); SetObjectName("XNServiceManager"); T_D(); d->ServiceIDAssigned.resize(10000, false); } XNServiceManager::~XNServiceManager() { } XNServiceManager::XNServiceManager(PrivateType *p) : XNBaseFrameObject(p) { } bool XNServiceManager::Initialize() { T_D(); LOG_INFO("XNServiceManager Initialize Success!"); d->_status = XNFrameObjectStatus::Initialized; return true; } bool XNServiceManager::PrepareForExecute() { T_D(); for (auto &service : d->ServiceList) { service.second->PrepareForExecute(); } d->_status = XNFrameObjectStatus::Ready; LOG_INFO("XNServiceManager is prepared!"); return true; } void XNServiceManager::LoadService(const std::string &servicePath, const std::string &serviceName, const std::string &serviceVersion, uint32_t initialType) { T_D(); void *handle = dlopen(servicePath.c_str(), RTLD_LAZY); if (handle) { typedef XNServiceObjectPtr (*InitialServiceFunc)(); std::string initialServiceName = "Initial" + serviceName; InitialServiceFunc initialService = (InitialServiceFunc)dlsym(handle, initialServiceName.c_str()); if (initialService) { XNServiceObjectPtr service = initialService(); if (service) { uint32_t serviceID = RegisterService(); if (serviceID == 0) { LOG_WARNING("0x2174 Assign Service ID Failed, Service ID is used up!"); dlclose(handle); return; } service->SetUniqueId(serviceID); service->SetObjectName(serviceName); service->SetFramework(GetFramework()); if (initialType == 0) { // 使用std::filesystem处理路径 std::filesystem::path configPath = std::filesystem::path(servicePath).parent_path() / (serviceName + "_V" + serviceVersion + ".scfg"); service->SetXmlPath(configPath.string()); } else if (initialType == 1) { LOG_INFO("0x2176 加载服务: %1", serviceName + "," + serviceVersion); service->SetXmlPath(serviceName + "," + serviceVersion); } else { LOG_WARNING("0x2175 InitialType Error, InitialType: %d", initialType); dlclose(handle); return; } // 注册服务到管理器 d->ServiceList[serviceID] = service; service->SetInitializeType(initialType); // 初始化服务 LOG_INFO("0x2176 初始化服务: %1", serviceName); service->Initialize(); } else { LOG_WARNING("0x2173 Service %s Not found in dynamic link library %s!", serviceName.c_str(), servicePath.c_str()); dlclose(handle); return; } } else { LOG_WARNING( "0x2177 Service %s Initialization Failed, Function InitialService Not Found!", serviceName.c_str()); dlclose(handle); return; } } else { LOG_WARNING("0x2172 Service %s Dynamic link library loading failed! Error: %s", serviceName.c_str(), dlerror()); } } XNServiceObjectPtr XNServiceManager::GetService(uint32_t serviceID) { T_D(); if (d->ServiceIDAssigned[serviceID - 20000] && d->ServiceList.find(serviceID) != d->ServiceList.end()) { return d->ServiceList[serviceID]; } else { return nullptr; } } uint32_t XNServiceManager::RegisterService() { T_D(); // 从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; }