#include "dispatch.h" using namespace dispatch; using namespace Inlet; Dispatch* Dispatch::_unique_inst = new Dispatch(); Dispatch* dispatch::Dispatch::unique() { return _unique_inst; } void dispatch::Dispatch::loadOutput(std::shared_ptr out_ins) { this->_output_list << out_ins; } QList Dispatch::allCmds() const { return _cmds_map.keys(); } void Dispatch::registerCmd(quint64 addr, IRunbase* unit) { auto alias = QString("CMD_%1").arg(addr); _cmds_map[addr] = std::make_pair(alias, unit); } void dispatch::Dispatch::setCmdAlias(quint64 addr, const QString& alias) { if (_cmds_map.contains(addr)) { auto tuple = _cmds_map[addr]; _cmds_map[addr] = std::make_pair(alias, tuple.second); } } void dispatch::Dispatch::setCmdValidator(quint64 addr, validate::IValidatorTemplet* inst) { _cmds_validators[addr] = inst; } QString Dispatch::getCmdAlias(quint64 addr) const { return _cmds_map[addr].first; } QString Dispatch::getCmdDefault(quint64 addr) const { return ""; } #include "validate_depict.h" void Dispatch::runWith(IRunbase* unit) { depict::ValidateDocObject obj; auto addrs = unit->address(); auto alias_name = _cmds_map[addrs].first; if (_cmds_validators.contains(addrs) && !_cmds_validators[addrs]->doValidate(unit)) { unit->saveTo(obj); obj.setString(u8"CmdAlias", alias_name); auto args_content = obj.toText(); std::for_each(_output_list.begin(), _output_list.end(), [&](std::shared_ptr ins) { ins->write(u8"命令校验", u8"命令执行参数校验失败", args_content); ins->flush(true); }); return; } unit->run(); unit->saveTo(obj); obj.setString(u8"CmdAlias", alias_name); auto args_content = obj.toText(); std::for_each(_output_list.begin(), _output_list.end(), [&](std::shared_ptr ins) { ins->write(u8"命令执行", u8"命令执行上下文", args_content); ins->flush(); }); } void dispatch::Dispatch::getValidateDepict(datas::IDataObject& object) const { for (auto key : _cmds_validators.keys()) { if (_cmds_map.contains(key)) { auto alias = _cmds_map[key].first; auto vdesc = object.newObject(); _cmds_validators[key]->getDepict(*vdesc); object.setChild(alias, vdesc); } } } QList dispatch::Dispatch::allEvents() const { return _events_map.keys(); } void dispatch::Dispatch::registerEvent(quint64 addr, Inlet::IRunbase* unit) { auto alias = QString("Event_%1").arg(addr); _events_map[addr] = std::make_pair(alias, unit); } void dispatch::Dispatch::setEventAlias(quint64 addr, const QString& alias) { if (_events_map.contains(addr)) { auto tuple = _events_map[addr]; _events_map[addr] = std::make_pair(alias, tuple.second); } } QString dispatch::Dispatch::getEventAlias(quint64 addr) const { return _events_map[addr].first; } QString dispatch::Dispatch::getEventDefault(quint64 addr) const { return QString(); } void dispatch::Dispatch::notifyWith(Inlet::IRunbase* unit) { }