XNSim/XNCore/XNServiceManager.cpp

127 lines
3.4 KiB
C++
Raw Normal View History

2025-04-28 12:25:20 +08:00
#include "XNServiceManager.h"
#include "XNServiceManager_p.h"
#include "XNServiceObject.h"
2025-05-20 15:39:40 +08:00
XNServiceManager::XNServiceManager() : XNBaseFrameObject(new XNServiceManagerPrivate())
2025-04-28 12:25:20 +08:00
{
2025-05-20 15:39:40 +08:00
SetUniqueId(4);
SetObjectName("XNServiceManager");
T_D();
2025-04-28 12:25:20 +08:00
d->ServiceIDAssigned.resize(10000, false);
}
XNServiceManager::~XNServiceManager()
{
}
2025-05-20 15:39:40 +08:00
XNServiceManager::XNServiceManager(PrivateType *p) : XNBaseFrameObject(p)
2025-04-28 12:25:20 +08:00
{
}
2025-05-20 15:39:40 +08:00
bool XNServiceManager::Initialize()
2025-04-28 12:25:20 +08:00
{
2025-05-20 15:39:40 +08:00
T_D();
2025-04-28 12:25:20 +08:00
LOG_INFO("XNServiceManager Initialize Success!");
d->_status = XNFrameObjectStatus::Initialized;
2025-05-20 15:39:40 +08:00
return true;
2025-04-28 12:25:20 +08:00
}
2025-05-20 15:39:40 +08:00
bool XNServiceManager::PrepareForExecute()
2025-04-28 12:25:20 +08:00
{
2025-05-20 15:39:40 +08:00
T_D();
for (auto &service : d->ServiceList) {
service.second->PrepareForExecute();
}
2025-04-28 12:25:20 +08:00
d->_status = XNFrameObjectStatus::Ready;
LOG_INFO("XNServiceManager is prepared!");
2025-05-20 15:39:40 +08:00
return true;
2025-04-28 12:25:20 +08:00
}
2025-05-20 15:39:40 +08:00
void XNServiceManager::LoadService(const std::string &servicePath, const std::string &serviceName,
const std::string &serviceVersion, uint32_t initialType)
2025-04-28 12:25:20 +08:00
{
2025-05-20 15:39:40 +08:00
T_D();
void *handle = dlopen(servicePath.c_str(), RTLD_LAZY);
if (handle) {
typedef XNServiceObjectPtr (*InitialServiceFunc)();
std::string initialServiceName = "Initial" + serviceName;
2025-04-28 12:25:20 +08:00
InitialServiceFunc initialService =
2025-05-20 15:39:40 +08:00
(InitialServiceFunc)dlsym(handle, initialServiceName.c_str());
2025-04-28 12:25:20 +08:00
if (initialService) {
2025-05-20 15:39:40 +08:00
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);
2025-04-28 12:25:20 +08:00
return;
}
2025-05-20 15:39:40 +08:00
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;
}
2025-05-20 15:39:40 +08:00
// 注册服务到管理器
d->ServiceList[serviceID] = service;
2025-05-22 16:22:48 +08:00
service->SetInitializeType(initialType);
2025-05-20 15:39:40 +08:00
// 初始化服务
LOG_INFO("0x2176 初始化服务: %1", serviceName);
2025-05-22 16:22:48 +08:00
service->Initialize();
2025-04-28 12:25:20 +08:00
} else {
2025-05-20 15:39:40 +08:00
LOG_WARNING("0x2173 Service %s Not found in dynamic link library %s!",
serviceName.c_str(), servicePath.c_str());
dlclose(handle);
2025-04-28 12:25:20 +08:00
return;
}
} else {
2025-05-20 15:39:40 +08:00
LOG_WARNING(
"0x2177 Service %s Initialization Failed, Function InitialService Not Found!",
serviceName.c_str());
dlclose(handle);
2025-04-28 12:25:20 +08:00
return;
}
} else {
2025-05-20 15:39:40 +08:00
LOG_WARNING("0x2172 Service %s Dynamic link library loading failed! Error: %s",
serviceName.c_str(), dlerror());
2025-04-28 12:25:20 +08:00
}
}
2025-05-20 15:39:40 +08:00
XNServiceObjectPtr XNServiceManager::GetService(uint32_t serviceID)
2025-04-28 12:25:20 +08:00
{
2025-05-20 15:39:40 +08:00
T_D();
if (d->ServiceIDAssigned[serviceID - 20000]
&& d->ServiceList.find(serviceID) != d->ServiceList.end()) {
return d->ServiceList[serviceID];
} else {
2025-04-28 12:25:20 +08:00
return nullptr;
2025-05-20 15:39:40 +08:00
}
2025-04-28 12:25:20 +08:00
}
2025-05-20 15:39:40 +08:00
uint32_t XNServiceManager::RegisterService()
2025-04-28 12:25:20 +08:00
{
2025-05-20 15:39:40 +08:00
T_D();
2025-04-28 12:25:20 +08:00
// 从2000029999的编号中分配ID
for (int i = 0; i < 10000; i++) {
if (d->ServiceIDAssigned[i])
continue;
else {
d->ServiceIDAssigned[i] = true;
return i + 20000;
}
}
return 0;
}