//------------------------------------------------------------------------------------------------- // copy all fields from this message to 'to' where the field is legal for 'to' and it is not // already present in 'to'; includes repeating groups; // if force, copy all fields regardless, replacing any existing, adding any new unsigned MessageBase::copy_legal(MessageBase *to, bool force) const { unsigned copied(0); for (Presence::const_iterator itr(_fp.get_presence().begin()); itr != _fp.get_presence().end(); ++itr) { if (itr->_field_traits & FieldTrait::present && (force || (to->_fp.has(itr->_fnum) && !to->_fp.get(itr->_fnum)))) { if (itr->_field_traits & FieldTrait::group) { GroupBase *gb(find_group(itr->_fnum)), *gb1(to->find_group(itr->_fnum)); for (GroupElement::const_iterator gitr(gb->_msgs.begin()); gitr != gb->_msgs.end(); ++gitr) { MessageBase *grc(gb1->create_group()); (*gitr)->copy_legal(grc, force); *gb1 += grc; } } BaseField *nf(get_field(itr->_fnum)->copy()); #if defined POPULATE_METADATA to->check_set_rlm(nf); #endif Presence::const_iterator fpitr(_fp.get_presence().end()); if (force && to->_fp.get(itr->_fnum, fpitr, FieldTrait::present)) delete to->replace(itr->_fnum, fpitr, nf); else to->add_field(nf); ++copied; } } return copied; }
//------------------------------------------------------------------------------------------------- unsigned MessageBase::encode(ostream& to) const { const std::ios::pos_type where(to.tellp()); for (Positions::const_iterator itr(_pos.begin()); itr != _pos.end(); ++itr) { #if defined POPULATE_METADATA check_set_rlm(itr->second); #endif Presence::const_iterator fpitr(_fp.get_presence().end()); if (!_fp.get(itr->second->_fnum, fpitr, FieldTrait::suppress)) // some fields are not encoded until unsuppressed (eg. checksum) { itr->second->encode(to); if (_fp.get(itr->second->_fnum, fpitr, FieldTrait::group)) encode_group(itr->second->_fnum, to); } } return to.tellp() - where; }
//------------------------------------------------------------------------------------------------- size_t MessageBase::encode(char *to) const { const char *where(to); for (Positions::const_iterator itr(_pos.begin()); itr != _pos.end(); ++itr) { #if defined POPULATE_METADATA check_set_rlm(itr->second); #endif Presence::const_iterator fpitr(_fp.get_presence().end()); if (!_fp.get(itr->second->_fnum, fpitr, FieldTrait::suppress)) // some fields are not encoded until unsuppressed (eg. checksum) { to += itr->second->encode(to); if (_fp.get(itr->second->_fnum, fpitr, FieldTrait::group)) to += encode_group(itr->second->_fnum, to); } } return to - where; }