XNSim/XNCore/XNServiceManager.cpp

126 lines
3.4 KiB
C++
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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();
// 从2000029999的编号中分配ID
for (int i = 0; i < 10000; i++) {
if (d->ServiceIDAssigned[i])
continue;
else {
d->ServiceIDAssigned[i] = true;
return i + 20000;
}
}
return 0;
}