116 lines
2.9 KiB
C++
Executable File
116 lines
2.9 KiB
C++
Executable File
#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("XNServiceManager Initialize Success!");
|
||
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("XNServiceManager is prepared!");
|
||
return true;
|
||
}
|
||
|
||
void XNServiceManager::LoadService(const std::string &servicePath, const std::string &serviceName,
|
||
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("0x2174 Assign Service ID Failed, Service ID is used up!");
|
||
dlclose(handle);
|
||
return;
|
||
}
|
||
service->SetUniqueId(serviceID);
|
||
service->SetObjectName(serviceName);
|
||
service->SetFramework(GetFramework());
|
||
// 使用std::filesystem处理路径
|
||
std::filesystem::path configPath =
|
||
std::filesystem::path(servicePath).parent_path() / (serviceName + ".scfg");
|
||
service->SetXmlPath(configPath.string());
|
||
|
||
// 注册服务到管理器
|
||
d->ServiceList[serviceID] = service;
|
||
|
||
// 初始化服务
|
||
service->Initialize(initialType);
|
||
} else {
|
||
LOG_WARNING("0x2173 Service %s Not found in dynamic link library %s!",
|
||
serviceName.c_str(), servicePath.c_str());
|
||
dlclose(handle);
|
||
return;
|
||
}
|
||
} else {
|
||
LOG_WARNING(
|
||
"0x2177 Service %s Initialization Failed, Function InitialService Not Found!",
|
||
serviceName.c_str());
|
||
dlclose(handle);
|
||
return;
|
||
}
|
||
} else {
|
||
LOG_WARNING("0x2172 Service %s Dynamic link library loading failed! Error: %s",
|
||
serviceName.c_str(), dlerror());
|
||
}
|
||
}
|
||
|
||
XNServiceObjectPtr XNServiceManager::GetService(uint32_t serviceID)
|
||
{
|
||
T_D();
|
||
if (d->ServiceIDAssigned[serviceID - 20000]
|
||
&& d->ServiceList.find(serviceID) != d->ServiceList.end()) {
|
||
return d->ServiceList[serviceID];
|
||
} else {
|
||
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;
|
||
}
|