//----------------------------------------------------------------------------------------- int precomp(XmlElement& xf, ostream& outf) { int depth(1); XmlElement::XmlSet fldlist; xf.find("fix/fields/field", fldlist); XmlElement::XmlSet comlist; xf.find("fix/components/component", comlist); Components components; load_components(comlist, components); XmlElement::XmlSet msglist; xf.find("fix/messages/message", msglist); outf << doctype << endl; outf << '<' << xf.GetTag(); output_attributes(xf, outf); outf << '>' << endl; const XmlElement *header(xf.find("fix/header")); if (header) process_messages(*header, components, "header", 0, outf); const XmlElement *trailer(xf.find("fix/trailer")); if (trailer) process_messages(*trailer, components, "trailer", 0, outf); outf << string(depth * 2, ' ') << "<messages>" << endl; for(auto const *pp : msglist) process_messages(*pp, components, "message", depth, outf); outf << string(depth * 2, ' ') << "</messages>" << endl; process_fields(fldlist, depth, outf); dump_components(components, outf); outf << "</" << xf.GetTag() << '>' << endl; return 0; }
//----------------------------------------------------------------------------------------- int precompfixt(XmlElement& xft, XmlElement& xf, ostream& outf, bool nounique) { int depth(1); XmlElement::XmlSet fldlist; xft.find("fix/fields/field", fldlist); xf.find("fix/fields/field", fldlist); if (!nounique) filter_unique(fldlist); XmlElement::XmlSet comlist, comlistfixt; Components components, componentsfixt; xft.find("fix/components/component", comlistfixt); xf.find("fix/components/component", comlist); load_components(comlistfixt, componentsfixt); load_components(comlist, components); outf << doctype << endl; outf << '<' << xft.GetTag(); output_attributes(xft, outf); outf << '>' << endl; const XmlElement *header(xft.find("fix/header")); if (header) process_messages(*header, componentsfixt, "header", 0, outf); const XmlElement *trailer(xft.find("fix/trailer")); if (trailer) process_messages(*trailer, componentsfixt, "trailer", 0, outf); outf << string(depth * 2, ' ') << "<messages>" << endl; XmlElement::XmlSet msglist; xft.find("fix/messages/message", msglist); for(XmlElement::XmlSet::const_iterator itr(msglist.begin()); itr != msglist.end(); ++itr) process_messages(**itr, componentsfixt, "message", depth, outf); msglist.clear(); xf.find("fix/messages/message", msglist); for(XmlElement::XmlSet::const_iterator itr(msglist.begin()); itr != msglist.end(); ++itr) process_messages(**itr, components, "message", depth, outf); outf << string(depth * 2, ' ') << "</messages>" << endl; process_fields(fldlist, depth, outf, false); dump_components(components, outf); outf << "</" << xft.GetTag() << '>' << endl; return 0; }
/*! Load a repeating group into a supplied map. \param tag the tag to find \param map_name the target map \param is_session if true, special case for session map \return the number of elements inserted */ unsigned load_map(const std::string& tag, ConfigMap& map_name, const bool is_session=false) { XmlElement::XmlSet slist; if (_root->find(tag, slist)) { for(XmlElement::XmlSet::const_iterator itr(slist.begin()); itr != slist.end(); ++itr) { std::string name; if ((*itr)->GetAttr("name", name) && is_session ? (*itr)->FindAttr("active", false) : true) { map_name.insert(ConfigMap::value_type(name, *itr)); if (is_session) _allsessions.push_back(*itr); } } } return map_name.size(); }
//----------------------------------------------------------------------------------------- int load_fix_version (XmlElement& xf, Ctxt& ctxt) { const XmlElement *fix(xf.find("fix")); if (!fix) { cerr << "No fix header element found in " << shortName << endl; return -1; } string major, minor, revision("0"), type("FIX"); if (!fix->GetAttr("major", major) || !fix->GetAttr("minor", minor)) { cerr << "Missing required attributes (major/minor) from fix header in " << shortName << endl; return -1; } if (!fix->GetAttr("revision", revision)) fix->GetAttr("servicepack", revision); fix->GetAttr("type", type); // fix version: <Major:1><Minor:1><Revision:2> eg. 4.2r10 is 4210 ctxt._version = get_value<int>(major) * 1000 + get_value<int>(minor) * 100 + get_value<int>(revision); if (type == "FIX" && ctxt._version < 4000) { cerr << "Unsupported FIX version " << ctxt._version << " from fix header in " << shortName << endl; return -1; } ostringstream ostr; ostr << type << ctxt._version; ctxt._systemns = ostr.str(); if (ctxt._fixns.empty()) ctxt._fixns = ctxt._systemns; ctxt._clname = prefix; ostr.str(""); ostr << type << '.' << major << '.' << minor; ctxt._beginstr = ostr.str(); return 0; }