XNSim/XNCore/XNServiceManager.cpp

113 lines
2.8 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("XNServiceManager Initialize Success!");
d->_status = XNFrameObjectStatus::Initialized;
return true;
}
bool XNServiceManager::PrepareForExecute()
{
T_D();
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();
// 从2000029999的编号中分配ID
for (int i = 0; i < 10000; i++) {
if (d->ServiceIDAssigned[i])
continue;
else {
d->ServiceIDAssigned[i] = true;
return i + 20000;
}
}
return 0;
}