122 lines
3.9 KiB
C++
122 lines
3.9 KiB
C++
|
#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();
|
|||
|
// 从20000~29999的编号中分配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
|