#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("D01124001:服务管理器初始化成功!"); 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("D01124002:服务管理器准备就绪!"); 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("B01123003:分配服务ID失败, 服务ID已用完, 服务无法注册!"); 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 { service->SetXmlPath(serviceName + "," + serviceVersion); } // 注册服务到管理器 d->ServiceList[serviceID] = service; service->SetInitializeType(initialType); // 初始化服务 service->Initialize(); } else { LOG_WARNING("B01123004:动态链接库 %1 中未找到服务 %2!", servicePath, serviceName); dlclose(handle); return; } } else { LOG_WARNING("B01123005:动态链接库 %1 中未找到函数 %2!", servicePath, initialServiceName); dlclose(handle); return; } } else { LOG_WARNING("C01123006:动态链接库 %1 加载失败! 错误: %2", servicePath, dlerror()); } } XNServiceObjectPtr XNServiceManager::GetService(uint32_t serviceID) { T_D(); if (serviceID >= 20000 && serviceID < 30000) { if (d->ServiceIDAssigned[serviceID - 20000]) { if (d->ServiceList.find(serviceID) != d->ServiceList.end()) { return d->ServiceList[serviceID]; } else { LOG_WARNING("B01123007:服务ID %1 对应的模型不存在!", serviceID); return nullptr; } } LOG_WARNING("B01123008:服务ID %1 未注册!", serviceID); return nullptr; } LOG_WARNING("B01123009:服务ID %1 不合法!", serviceID); 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; }