void Decoder::decodeNestedTemplate( DataSource & source, Messages::ValueMessageBuilder & messageBuilder, Messages::FieldIdentityCPtr & identity) { Codecs::PresenceMap pmap(getTemplateRegistry()->presenceMapBits()); if(this->verboseOut_) { pmap.setVerbose(verboseOut_); } static const std::string pmp("PMAP"); source.beginField(pmp); pmap.decode(source); static const std::string tid("templateID"); source.beginField(tid); if(pmap.checkNextField()) { template_id_t id; FieldInstruction::decodeUnsignedInteger(source, *this, id, tid); setTemplateId(id); } if(verboseOut_) { (*verboseOut_) << "Nested Template ID: " << getTemplateId() << std::endl; } Codecs::TemplateCPtr templatePtr; if(getTemplateRegistry()->getTemplate(getTemplateId(), templatePtr)) { if(templatePtr->getReset()) { reset(false); } Messages::ValueMessageBuilder & groupBuilder( messageBuilder.startGroup( identity, templatePtr->getApplicationType(), templatePtr->getApplicationTypeNamespace(), templatePtr->fieldCount())); decodeSegmentBody(source, pmap, templatePtr, groupBuilder); messageBuilder.endGroup(identity, groupBuilder); } else { std::string error = "Unknown template ID:"; error += boost::lexical_cast<std::string>(getTemplateId()); reportError("[ERR D9]", error); } return; }
void Encoder::encodeSegment( DataDestination & destination, template_id_t templateId, const Messages::MessageAccessor & accessor) { Codecs::TemplateCPtr templatePtr; if(getTemplateRegistry()->getTemplate(templateId, templatePtr)) { if(templatePtr->getReset()) { reset(true); } Codecs::PresenceMap pmap(templatePtr->presenceMapBitCount()); DataDestination::BufferHandle header = destination.startBuffer(); destination.startBuffer(); // can we "copy" the template ID? if(templateId == templateId_) { pmap.setNextField(false); } else { pmap.setNextField(true); FieldInstruction::encodeUnsignedInteger(destination, getWorkingBuffer(), templateId); templateId_ = templateId; } encodeSegmentBody(destination, pmap, templatePtr, accessor); DataDestination::BufferHandle savedBuffer = destination.getBuffer(); destination.selectBuffer(header); static Messages::FieldIdentity pmapIdentity("PMAP", "Message"); destination.startField(pmapIdentity); pmap.encode(destination); destination.endField(pmapIdentity); destination.selectBuffer(savedBuffer); } else { throw EncodingError("[ERR D9] Unknown template ID."); } }