void DataDictionary::addXMLGroup( DOMDocument* pDoc, DOMNode* pNode, const std::string& msgtype, DataDictionary& DD, bool groupRequired ) { DOMAttributesPtr attrs = pNode->getAttributes(); std::string name; if(!attrs->get("name", name)) throw ConfigError("No name given to group"); int group = lookupXMLFieldNumber( pDoc, name ); int delim = 0; int field = 0; DataDictionary groupDD; DOMNodePtr node = pNode->getFirstChildNode(); while(node.get()) { if( node->getName() == "field" ) { field = lookupXMLFieldNumber( pDoc, node.get() ); groupDD.addField( field ); DOMAttributesPtr attrs = node->getAttributes(); std::string required; if( attrs->get("required", required) && ( required == "Y" || required =="y" ) && groupRequired ) { groupDD.addRequiredField(msgtype, field); } } else if( node->getName() == "component" ) { field = addXMLComponentFields( pDoc, node.get(), msgtype, groupDD, false ); } else if( node->getName() == "group" ) { field = lookupXMLFieldNumber( pDoc, node.get() ); groupDD.addField( field ); DOMAttributesPtr attrs = node->getAttributes(); std::string required; if( attrs->get("required", required ) && ( required == "Y" || required =="y" ) && groupRequired) { groupDD.addRequiredField(msgtype, field); } bool isRequired = false; if( attrs->get("required", required) ) isRequired = (required == "Y" || required == "y"); addXMLGroup( pDoc, node.get(), msgtype, groupDD, isRequired ); } if( delim == 0 ) delim = field; RESET_AUTO_PTR(node, node->getNextSiblingNode()); } if( delim ) DD.addGroup( msgtype, group, delim, groupDD ); }
int DataDictionary::addXMLComponentFields( DOMDocument* pDoc, DOMNode* pNode, const std::string& msgtype, DataDictionary& DD, bool componentRequired ) { int firstField = 0; DOMAttributesPtr attrs = pNode->getAttributes(); std::string name; if(!attrs->get("name", name)) throw ConfigError("No name given to component"); DOMNodePtr pComponentNode = pDoc->getNode("/fix/components/component[@name='" + name + "']"); if(pComponentNode.get() == 0) throw ConfigError("Component not found: " + name); DOMNodePtr pComponentFieldNode = pComponentNode->getFirstChildNode(); while(pComponentFieldNode.get()) { if(pComponentFieldNode->getName() == "field" || pComponentFieldNode->getName() == "group") { DOMAttributesPtr attrs = pComponentFieldNode->getAttributes(); std::string name; if(!attrs->get("name", name)) throw ConfigError("No name given to field"); int field = lookupXMLFieldNumber(pDoc, name); if( firstField == 0 ) firstField = field; std::string required; if(attrs->get("required", required) && (required == "Y" || required =="y") && componentRequired) { addRequiredField(msgtype, field); } DD.addField(field); DD.addMsgField(msgtype, field); } if(pComponentFieldNode->getName() == "component") { DOMAttributesPtr attrs = pComponentFieldNode->getAttributes(); std::string required; attrs->get("required", required); bool isRequired = (required == "Y" || required == "y"); addXMLComponentFields(pDoc, pComponentFieldNode.get(), msgtype, DD, isRequired); } if(pComponentFieldNode->getName() == "group") { DOMAttributesPtr attrs = pComponentFieldNode->getAttributes(); std::string required; attrs->get("required", required); bool isRequired = (required == "Y" || required == "y"); addXMLGroup(pDoc, pComponentFieldNode.get(), msgtype, DD, isRequired); } RESET_AUTO_PTR(pComponentFieldNode, pComponentFieldNode->getNextSiblingNode()); } return firstField; }