void FieldInstructionGroup::decodeNop( Codecs::DataSource & source, Codecs::PresenceMap & pmap, Codecs::Decoder & decoder, Messages::ValueMessageBuilder & messageBuilder) const { bool present = true; if(! isMandatory()) { present = pmap.checkNextField(); } if(present) { if(!segmentBody_) { decoder.reportFatal("[ERR U08}", "Segment not defined for Group instruction."); } if(messageBuilder.getApplicationType() != segmentBody_->getApplicationType()) { // std::cout << "Decoding group into new segment: " << segmentBody_->getApplicationType() << std::endl; Messages::ValueMessageBuilder & groupBuilder( messageBuilder.startGroup( identity_, segmentBody_->getApplicationType(), segmentBody_->getApplicationTypeNamespace(), segmentBody_->fieldCount())); decoder.decodeGroup(source, segmentBody_, groupBuilder); messageBuilder.endGroup( identity_, groupBuilder); } else { // std::cout << "Folding group into parent segment: " << segmentBody_->getApplicationType() << std::endl; // Because the application types match, // the group fields are decoded directly into to the current // field set. As a result the group "disappears" completely // from the application message. This is a good thing. Groups // are an artifact of the template used to encode the message // rather than being an attribute of the actual message being // encoded. In fact, the same message encoded with different // templates could be transmitted with different sets of fields // in groups. decoder.decodeGroup(source, segmentBody_, messageBuilder); } } }
void FieldInstructionStaticTemplateRef::decodeNop( Codecs::DataSource & source, Codecs::PresenceMap & pmap, Codecs::Decoder & decoder, Messages::ValueMessageBuilder & messageBuilder) const { TemplateCPtr target; if(!decoder.findTemplate(templateName_, templateNamespace_, target)) { decoder.reportFatal("[ERR D9]", "Unknown template name for static templateref.", *identity_); } if(messageBuilder.getApplicationType() != target->getApplicationType()) { Messages::ValueMessageBuilder & groupBuilder( messageBuilder.startGroup( identity_, target->getApplicationType(), target->getApplicationTypeNamespace(), target->fieldCount())); decoder.decodeSegmentBody(source, pmap, target, groupBuilder); messageBuilder.endGroup( identity_, groupBuilder); } else { // Because the application types match, // the templateRef fields are decoded directly into to the current // field set. As a result the templateRef "disappears" completely // from the application message. This is a good thing. // The same message encoded with different // templates could be transmitted with different sets of fields defined // by templateRefs, but the underlying application type should not reflect // the technique used to encode/decode it. decoder.decodeSegmentBody(source, pmap, target, messageBuilder); } }