void Serialiser::deserialise_point(OrderedTask& data) { tstring type; if (!m_node.get_attribute(_T("type"),type)) { assert(1); return; } DataNode* wp_node = m_node.get_child_by_name(_T("Waypoint")); if (wp_node==NULL) return; Serialiser wser(*wp_node); Waypoint *wp = wser.deserialise_waypoint(); if (wp==NULL) { delete wp_node; return; } DataNode* oz_node = m_node.get_child_by_name(_T("ObservationZone")); if (oz_node==NULL) { delete wp_node; delete wp; return; } Serialiser oser(*oz_node); AbstractTaskFactory& fact = data.get_factory(); ObservationZonePoint* oz = NULL; OrderedTaskPoint *pt = NULL; if (_tcscmp(type.c_str(), _T("Start")) == 0) { if ((oz = oser.deserialise_oz(*wp, false)) != NULL) { pt = fact.createStart(oz, *wp); } } else if (_tcscmp(type.c_str(), _T("Turn")) == 0) { if ((oz = oser.deserialise_oz(*wp, true)) != NULL) { pt = fact.createAST(oz, *wp); } } else if (_tcscmp(type.c_str(), _T("Area")) == 0) { if ((oz = oser.deserialise_oz(*wp, true)) != NULL) { pt = fact.createAAT(oz, *wp); } } else if (_tcscmp(type.c_str(), _T("Finish")) == 0) { if ((oz = oser.deserialise_oz(*wp, false)) != NULL) { pt = fact.createFinish(oz, *wp); } } if (pt != NULL) { fact.append(pt,false); } delete wp; delete wp_node; delete oz_node; }
void Serialiser::Serialise(const OrderedTaskPoint &data, const TCHAR* name) { // do nothing std::unique_ptr<DataNode> child(node.AppendChild(_T("Point"))); child->SetAttribute(_T("type"), name); std::unique_ptr<DataNode> wchild(child->AppendChild(_T("Waypoint"))); Serialiser wser(*wchild); wser.Serialise(data.GetWaypoint()); std::unique_ptr<DataNode> ochild(child->AppendChild(_T("ObservationZone"))); Serialiser oser(*ochild); oser.Serialise(data.GetObservationZone()); }
DataNode* Serialiser::serialise(const OrderedTaskPoint& data, const TCHAR* name) { // do nothing DataNode* child = m_node.add_child(_T("Point")); child->set_attribute(_T("type"), name); DataNode* wchild = child->add_child(_T("Waypoint")); Serialiser wser(*wchild); wser.serialise(data.get_waypoint()); delete wchild; DataNode* ochild = child->add_child(_T("ObservationZone")); Serialiser oser(*ochild); oser.serialise(*data.get_oz()); delete ochild; return child; }
void Deserialiser::DeserialiseTaskpoint(OrderedTask &data) { const TCHAR *type = node.GetAttribute(_T("type")); if (type == nullptr) return; std::unique_ptr<DataNode> wp_node(node.GetChildNamed(_T("Waypoint"))); if (!wp_node) return; Deserialiser wser(*wp_node, waypoints); std::unique_ptr<Waypoint> wp(wser.DeserialiseWaypoint()); if (!wp) return; std::unique_ptr<DataNode> oz_node(node.GetChildNamed(_T("ObservationZone"))); AbstractTaskFactory &fact = data.GetFactory(); ObservationZonePoint* oz = nullptr; std::unique_ptr<OrderedTaskPoint> pt; if (oz_node) { bool is_turnpoint = StringIsEqual(type, _T("Turn")) || StringIsEqual(type, _T("Area")); Deserialiser oser(*oz_node, waypoints); oz = oser.DeserialiseOZ(*wp, is_turnpoint); } if (StringIsEqual(type, _T("Start"))) { pt.reset(oz != nullptr ? fact.CreateStart(oz, *wp) : fact.CreateStart(*wp)); } else if (StringIsEqual(type, _T("OptionalStart"))) { pt.reset(oz != nullptr ? fact.CreateStart(oz, *wp) : fact.CreateStart(*wp)); fact.AppendOptionalStart(*pt); // don't let generic code below add it pt.reset(); } else if (StringIsEqual(type, _T("Turn"))) { pt.reset(oz != nullptr ? fact.CreateASTPoint(oz, *wp) : fact.CreateIntermediate(*wp)); } else if (StringIsEqual(type, _T("Area"))) { pt.reset(oz != nullptr ? fact.CreateAATPoint(oz, *wp) : fact.CreateIntermediate(*wp)); } else if (StringIsEqual(type, _T("Finish"))) { pt.reset(oz != nullptr ? fact.CreateFinish(oz, *wp) : fact.CreateFinish(*wp)); } if (!pt) return; if (pt->GetType() == TaskPointType::AST) { ASTPoint &ast = (ASTPoint &)*pt; bool score_exit = false; if (node.GetAttribute(_T("score_exit"), score_exit)) ast.SetScoreExit(score_exit); } fact.Append(*pt, false); }