XNSim/XNCore_Win/XNServiceManager/XNServiceManager.cpp

122 lines
3.9 KiB
C++
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/XNServiceObject.h"
namespace XNSim {
XNServiceManager::XNServiceManager()
: XNBaseFrameObject(new XNServiceManagerPrivate()) {
SetUniqueId(enumValue(XNCoreObjectID::ServiceManager));
SetObjectName("XNServiceManager");
T_D();
d->ServiceIDAssigned.resize(XN_SERVICE_ID_SIZE, 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;
}
XN_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 XN_STRING &servicePath,
const XN_STRING &serviceName,
const XN_STRING &serviceVersion,
XN_UINT32 initialType) {
T_D();
XN_HANDLE handle = loadLibrary(servicePath);
if (handle) {
typedef XNServiceObjectPtr (*InitialServiceFunc)();
XN_STRING initialServiceName = "Initial" + serviceName;
InitialServiceFunc initialService =
(InitialServiceFunc)getSymbol(handle, initialServiceName);
if (initialService) {
XNServiceObjectPtr service = initialService();
if (service) {
XN_UINT32 serviceID = RegisterService();
if (serviceID == 0) {
LOG_WARNING(
"0x2174 Assign Service ID Failed, Service ID is used up!");
closeLibrary(handle);
return;
}
service->SetUniqueId(serviceID);
service->SetObjectName(serviceName);
service->SetFramework(GetFramework());
if (initialType == 0) {
// 使用std::filesystem处理路径
XN_PATH configPath = XN_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);
closeLibrary(handle);
return;
}
// 注册服务到管理器
d->ServiceList[serviceID] = service;
service->SetInitializeType(initialType);
// 初始化服务
LOG_INFO("0x2176 初始化服务: %1", serviceName);
service->Initialize();
} else {
LOG_WARNING("0x2173 Service %s Not found in dynamic link library %s!",
serviceName, servicePath);
closeLibrary(handle);
return;
}
} else {
LOG_WARNING("0x2177 Service %s Initialization Failed, Function "
"InitialService Not Found!",
serviceName);
closeLibrary(handle);
return;
}
} else {
LOG_WARNING(
"0x2172 Service %s Dynamic link library loading failed! Error: %s",
serviceName, LoadError());
}
}
XNServiceObjectPtr XNServiceManager::GetService(XN_UINT32 serviceID) {
T_D();
if (d->ServiceIDAssigned[serviceID - XN_SERVICE_ID_START] &&
d->ServiceList.find(serviceID) != d->ServiceList.end()) {
return d->ServiceList[serviceID];
} else {
return nullptr;
}
}
XN_UINT32 XNServiceManager::RegisterService() {
T_D();
// 从2000029999的编号中分配ID
for (XN_UINT32 i = 0; i < XN_SERVICE_ID_SIZE; i++) {
if (d->ServiceIDAssigned[i])
continue;
else {
d->ServiceIDAssigned[i] = true;
return i + XN_SERVICE_ID_START;
}
}
return 0;
}
} // namespace XNSim