#include "XNServiceManager.h" #include "XNServiceManager_p.h" #include "XNServiceObject/XNServiceObject.h" namespace XNSim { XNServiceManager::XNServiceManager() : XNBaseFrameObject(new XNServiceManagerPrivate()) { SetUniqueId(enumValue(XNCoreObjectID::ServiceManager)); SetObjectName("XNServiceManager"); T_D(); d->ServiceIDAssigned.resize(XN_SERVICE_ID_SIZE, 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; } XN_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 XN_STRING &servicePath, const XN_STRING &serviceName, const XN_STRING &serviceVersion, XN_UINT32 initialType) { T_D(); XN_HANDLE handle = loadLibrary(servicePath); if (handle) { typedef XNServiceObjectPtr (*InitialServiceFunc)(); XN_STRING initialServiceName = "Initial" + serviceName; InitialServiceFunc initialService = (InitialServiceFunc)getSymbol(handle, initialServiceName); if (initialService) { XNServiceObjectPtr service = initialService(); if (service) { XN_UINT32 serviceID = RegisterService(); if (serviceID == 0) { LOG_WARNING( "0x2174 Assign Service ID Failed, Service ID is used up!"); closeLibrary(handle); return; } service->SetUniqueId(serviceID); service->SetObjectName(serviceName); service->SetFramework(GetFramework()); if (initialType == 0) { // 使用std::filesystem处理路径 XN_PATH configPath = XN_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); closeLibrary(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, servicePath); closeLibrary(handle); return; } } else { LOG_WARNING("0x2177 Service %s Initialization Failed, Function " "InitialService Not Found!", serviceName); closeLibrary(handle); return; } } else { LOG_WARNING( "0x2172 Service %s Dynamic link library loading failed! Error: %s", serviceName, LoadError()); } } XNServiceObjectPtr XNServiceManager::GetService(XN_UINT32 serviceID) { T_D(); if (d->ServiceIDAssigned[serviceID - XN_SERVICE_ID_START] && d->ServiceList.find(serviceID) != d->ServiceList.end()) { return d->ServiceList[serviceID]; } else { return nullptr; } } XN_UINT32 XNServiceManager::RegisterService() { T_D(); // 从20000~29999的编号中分配ID for (XN_UINT32 i = 0; i < XN_SERVICE_ID_SIZE; i++) { if (d->ServiceIDAssigned[i]) continue; else { d->ServiceIDAssigned[i] = true; return i + XN_SERVICE_ID_START; } } return 0; } } // namespace XNSim