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-06-26 15:26:26 +08:00
|
|
|
|
LOG_INFO("D01124001:服务管理器初始化成功!");
|
2025-04-28 12:25:20 +08:00
|
|
|
|
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();
|
2025-05-21 12:17:50 +08:00
|
|
|
|
for (auto &service : d->ServiceList) {
|
|
|
|
|
service.second->PrepareForExecute();
|
|
|
|
|
}
|
2025-04-28 12:25:20 +08:00
|
|
|
|
d->_status = XNFrameObjectStatus::Ready;
|
2025-06-26 15:26:26 +08:00
|
|
|
|
LOG_INFO("D01124002:服务管理器准备就绪!");
|
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,
|
2025-05-27 15:16:11 +08:00
|
|
|
|
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) {
|
2025-06-26 15:26:26 +08:00
|
|
|
|
LOG_WARNING("B01123003:分配服务ID失败, 服务ID已用完, 服务无法注册!");
|
2025-05-20 15:39:40 +08:00
|
|
|
|
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());
|
2025-05-27 15:16:11 +08:00
|
|
|
|
if (initialType == 0) {
|
|
|
|
|
// 使用std::filesystem处理路径
|
|
|
|
|
std::filesystem::path configPath =
|
|
|
|
|
std::filesystem::path(servicePath).parent_path()
|
|
|
|
|
/ (serviceName + "_V" + serviceVersion + ".scfg");
|
|
|
|
|
service->SetXmlPath(configPath.string());
|
|
|
|
|
} else {
|
2025-06-26 15:26:26 +08:00
|
|
|
|
service->SetXmlPath(serviceName + "," + serviceVersion);
|
2025-05-27 15:16:11 +08:00
|
|
|
|
}
|
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
|
|
|
|
// 初始化服务
|
2025-05-22 16:22:48 +08:00
|
|
|
|
service->Initialize();
|
2025-04-28 12:25:20 +08:00
|
|
|
|
} else {
|
2025-06-26 15:26:26 +08:00
|
|
|
|
LOG_WARNING("B01123004:动态链接库 %1 中未找到服务 %2!", servicePath, serviceName);
|
2025-05-20 15:39:40 +08:00
|
|
|
|
dlclose(handle);
|
2025-04-28 12:25:20 +08:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
2025-06-26 15:26:26 +08:00
|
|
|
|
LOG_WARNING("B01123005:动态链接库 %1 中未找到函数 %2!", servicePath,
|
|
|
|
|
initialServiceName);
|
2025-05-20 15:39:40 +08:00
|
|
|
|
dlclose(handle);
|
2025-04-28 12:25:20 +08:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
2025-06-26 15:26:26 +08:00
|
|
|
|
LOG_WARNING("C01123006:动态链接库 %1 加载失败! 错误: %2", servicePath, 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();
|
2025-06-26 15:26:26 +08:00
|
|
|
|
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);
|
2025-04-28 12:25:20 +08:00
|
|
|
|
return nullptr;
|
2025-05-20 15:39:40 +08:00
|
|
|
|
}
|
2025-06-26 15:26:26 +08:00
|
|
|
|
LOG_WARNING("B01123009:服务ID %1 不合法!", serviceID);
|
|
|
|
|
return nullptr;
|
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
|
|
|
|
// 从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;
|
|
|
|
|
}
|