#include "XNServiceObject.h" #include "XNServiceObject_p.h" #include "XNEventManager.h" #include "XNFramework.h" XNServiceObject::XNServiceObject() : XNObject(new XNServiceObjectPrivate()) { T_D(); d->_initialType = 0; } XNServiceObject::~XNServiceObject() { } XNServiceObject::XNServiceObject(PrivateType *p) : XNObject(p) { } const std::string &XNServiceObject::GetVersion() { T_D(); return d->_sVersion; } const std::string &XNServiceObject::GetDescription() { T_D(); return d->_sDescription; } const std::string &XNServiceObject::GetAuthor() { T_D(); return d->_sAuthor; } const std::string &XNServiceObject::GetXmlPath() { T_D(); return d->_sXmlPath; } const XNTimePoint &XNServiceObject::GetCreateTime() { T_D(); return d->_cCreateTime; } const XNTimePoint &XNServiceObject::GetChangeTime() { T_D(); return d->_cChangeTime; } void XNServiceObject::SetVersion(const std::string &version) { T_D(); d->_sVersion = version; } void XNServiceObject::SetDescription(const std::string &sDescription) { T_D(); d->_sDescription = sDescription; } void XNServiceObject::SetAuthor(const std::string &sAuthor) { T_D(); d->_sAuthor = sAuthor; } void XNServiceObject::SetXmlPath(const std::string &sXmlPath) { T_D(); d->_sXmlPath = sXmlPath; } void XNServiceObject::SetCreateTime(const XNTimePoint &cTime) { T_D(); d->_cCreateTime = cTime; } void XNServiceObject::SetChangeTime(const XNTimePoint &cTime) { T_D(); d->_cChangeTime = cTime; } int XNServiceObject::RegisterEventHandler(const std::string &eventName, XNEventCallback callback, bool async, XNEvent::Priority priority) { // 注册事件处理器 T_D(); auto framework = GetFramework(); if (framework) { auto eventManager = framework->GetEventManager(); if (eventManager) { return eventManager->RegisterEventHandler(eventName, callback, GetUniqueId(), async, priority); } } return -1; } void XNServiceObject::TriggerEvent(const std::string &eventName, const std::any &eventData, bool forceAsync, XNEvent::Priority priority) { // 触发事件 T_D(); auto framework = GetFramework(); if (framework) { auto eventManager = framework->GetEventManager(); if (eventManager) { eventManager->TriggerEvent(eventName, eventData, forceAsync, priority); } } } int XNServiceObject::RegisterRTEventHandler(const std::string &eventName, XNEventCallback callback) { return RegisterEventHandler(eventName, callback, true, XNEvent::Priority::RealTime); } void XNServiceObject::TriggerRTEvent(const std::string &eventName, const std::any &eventData) { TriggerEvent(eventName, eventData, true, XNEvent::Priority::RealTime); } void XNServiceObject::SetInitializeType(uint32_t initialType) { T_D(); d->_initialType = initialType; } void XNServiceObject::Initialize() { T_D(); if (d->_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 { } } void XNServiceObject::PrepareForExecute() { T_D(); RegisterDDSParticipant(); } void XNServiceObject::RegisterDDSParticipant() { T_D(); //TODO 注册服务状态主题参与者 } XNFrameworkPtr XNServiceObject::GetFramework() const { T_D(); return d->pFramework; } void XNServiceObject::SetFramework(XNFrameworkPtr framework) { T_D(); d->pFramework = framework; }