2025-04-28 12:25:20 +08:00
|
|
|
#include "XNServiceObject.h"
|
|
|
|
#include "XNServiceObject_p.h"
|
2025-05-20 15:39:40 +08:00
|
|
|
#include "XNEventManager.h"
|
|
|
|
#include "XNFramework.h"
|
2025-04-28 12:25:20 +08:00
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
XNServiceObject::XNServiceObject() : XNObject(new XNServiceObjectPrivate())
|
2025-04-28 12:25:20 +08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
XNServiceObject::~XNServiceObject()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
XNServiceObject::XNServiceObject(PrivateType *p) : XNObject(p)
|
2025-04-28 12:25:20 +08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
const std::string &XNServiceObject::GetVersion()
|
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
|
|
|
return d->_sVersion;
|
|
|
|
}
|
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
const std::string &XNServiceObject::GetDescription()
|
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
|
|
|
return d->_sDescription;
|
|
|
|
}
|
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
const std::string &XNServiceObject::GetAuthor()
|
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
|
|
|
return d->_sAuthor;
|
|
|
|
}
|
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
const std::string &XNServiceObject::GetXmlPath()
|
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
|
|
|
return d->_sXmlPath;
|
|
|
|
}
|
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
const XNTimePoint &XNServiceObject::GetCreateTime()
|
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
|
|
|
return d->_cCreateTime;
|
|
|
|
}
|
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
const XNTimePoint &XNServiceObject::GetChangeTime()
|
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
|
|
|
return d->_cChangeTime;
|
|
|
|
}
|
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
void XNServiceObject::SetVersion(const std::string &version)
|
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
|
|
|
d->_sVersion = version;
|
|
|
|
}
|
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
void XNServiceObject::SetDescription(const std::string &sDescription)
|
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
|
|
|
d->_sDescription = sDescription;
|
|
|
|
}
|
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
void XNServiceObject::SetAuthor(const std::string &sAuthor)
|
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
|
|
|
d->_sAuthor = sAuthor;
|
|
|
|
}
|
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
void XNServiceObject::SetXmlPath(const std::string &sXmlPath)
|
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
|
|
|
d->_sXmlPath = sXmlPath;
|
|
|
|
}
|
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
void XNServiceObject::SetCreateTime(const XNTimePoint &cTime)
|
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
|
|
|
d->_cCreateTime = cTime;
|
|
|
|
}
|
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
void XNServiceObject::SetChangeTime(const XNTimePoint &cTime)
|
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
|
|
|
d->_cChangeTime = cTime;
|
|
|
|
}
|
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
int XNServiceObject::RegisterEventHandler(const std::string &eventName, XNEventCallback callback,
|
2025-04-28 12:25:20 +08:00
|
|
|
bool async, XNEvent::Priority priority)
|
|
|
|
{
|
|
|
|
// 注册事件处理器
|
2025-05-20 15:39:40 +08:00
|
|
|
T_D();
|
|
|
|
auto framework = GetFramework();
|
|
|
|
if (framework) {
|
|
|
|
auto eventManager = framework->GetEventManager();
|
|
|
|
if (eventManager) {
|
|
|
|
return eventManager->RegisterEventHandler(eventName, callback, GetUniqueId(), async,
|
2025-04-28 12:25:20 +08:00
|
|
|
priority);
|
2025-05-20 15:39:40 +08:00
|
|
|
}
|
2025-04-28 12:25:20 +08:00
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
void XNServiceObject::TriggerEvent(const std::string &eventName, const std::any &eventData,
|
2025-04-28 12:25:20 +08:00
|
|
|
bool forceAsync, XNEvent::Priority priority)
|
|
|
|
{
|
|
|
|
// 触发事件
|
2025-05-20 15:39:40 +08:00
|
|
|
T_D();
|
|
|
|
auto framework = GetFramework();
|
|
|
|
if (framework) {
|
|
|
|
auto eventManager = framework->GetEventManager();
|
|
|
|
if (eventManager) {
|
|
|
|
eventManager->TriggerEvent(eventName, eventData, forceAsync, priority);
|
|
|
|
}
|
2025-04-28 12:25:20 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
int XNServiceObject::RegisterRTEventHandler(const std::string &eventName, XNEventCallback callback)
|
2025-04-28 12:25:20 +08:00
|
|
|
{
|
|
|
|
return RegisterEventHandler(eventName, callback, true, XNEvent::Priority::RealTime);
|
|
|
|
}
|
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
void XNServiceObject::TriggerRTEvent(const std::string &eventName, const std::any &eventData)
|
2025-04-28 12:25:20 +08:00
|
|
|
{
|
|
|
|
TriggerEvent(eventName, eventData, true, XNEvent::Priority::RealTime);
|
|
|
|
}
|
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
void XNServiceObject::Initialize(uint32_t initialType)
|
|
|
|
{
|
|
|
|
T_D();
|
|
|
|
if (initialType == 0) {
|
|
|
|
tinyxml2::XMLDocument doc;
|
|
|
|
if (doc.LoadFile(GetXmlPath().c_str()) != tinyxml2::XML_SUCCESS) {
|
|
|
|
LOG_WARNING("Failed to open the service configuration file: %1!", GetXmlPath());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
tinyxml2::XMLElement *rootNode = doc.RootElement();
|
|
|
|
if (!rootNode) {
|
|
|
|
LOG_WARNING("Invalid XML file format: %1!", GetXmlPath());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const char *serviceName = rootNode->FirstChildElement("Name")->GetText();
|
|
|
|
if (serviceName != GetObjectName()) {
|
|
|
|
LOG_WARNING(
|
|
|
|
"The service name in the configuration file of service %1 is not consistent "
|
|
|
|
"with the service name in the configuration file of service %2!",
|
|
|
|
GetObjectName(), serviceName);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
d->_sDescription = rootNode->FirstChildElement("Description")->GetText();
|
|
|
|
d->_sAuthor = rootNode->FirstChildElement("Author")->GetText();
|
|
|
|
d->_sVersion = rootNode->FirstChildElement("Version")->GetText();
|
|
|
|
|
|
|
|
// 解析时间
|
|
|
|
const char *createTimeStr = rootNode->FirstChildElement("CreateTime")->GetText();
|
|
|
|
const char *changeTimeStr = rootNode->FirstChildElement("ChangeTime")->GetText();
|
|
|
|
d->_cCreateTime = parseISOTime(createTimeStr);
|
|
|
|
d->_cChangeTime = parseISOTime(changeTimeStr);
|
|
|
|
|
|
|
|
tinyxml2::XMLElement *nodeCmds = rootNode->FirstChildElement("CommandList");
|
|
|
|
if (nodeCmds) {
|
|
|
|
for (tinyxml2::XMLElement *nodeCmd = nodeCmds->FirstChildElement("Command");
|
|
|
|
nodeCmd != nullptr; nodeCmd = nodeCmd->NextSiblingElement("Command")) {
|
|
|
|
const char *cmdName = nodeCmd->Attribute("Name");
|
|
|
|
const char *cmdDescription = nodeCmd->Attribute("Description");
|
|
|
|
const char *cmdCall = nodeCmd->Attribute("Call");
|
|
|
|
// TODO: 处理命令信息
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
2025-04-28 12:25:20 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
void XNServiceObject::PrepareForExecute()
|
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
|
|
|
RegisterDDSParticipant();
|
|
|
|
}
|
|
|
|
|
|
|
|
void XNServiceObject::RegisterDDSParticipant()
|
|
|
|
{
|
2025-05-20 15:39:40 +08:00
|
|
|
T_D();
|
2025-04-28 12:25:20 +08:00
|
|
|
//TODO 注册服务状态主题参与者
|
|
|
|
}
|
|
|
|
|
2025-05-20 15:39:40 +08:00
|
|
|
XNFrameworkPtr XNServiceObject::GetFramework() const
|
|
|
|
{
|
|
|
|
T_D();
|
|
|
|
return d->pFramework;
|
|
|
|
}
|
|
|
|
|
|
|
|
void XNServiceObject::SetFramework(XNFrameworkPtr framework)
|
2025-04-28 12:25:20 +08:00
|
|
|
{
|
2025-05-20 15:39:40 +08:00
|
|
|
T_D();
|
|
|
|
d->pFramework = framework;
|
2025-04-28 12:25:20 +08:00
|
|
|
}
|