Ejemplo n.º 1
0
void
Decoder::decodeMessage(
   DataSource & source,
   Messages::ValueMessageBuilder & messageBuilder)
{
  PROFILE_POINT("decode");
  source.beginMessage();

  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_) << "Template ID: " << getTemplateId() << std::endl;
  }
  Codecs::TemplateCPtr templatePtr;
  if(getTemplateRegistry()->getTemplate(templateId_, templatePtr))
  {
    if(templatePtr->getReset())
    {
      reset(false);
    }
    Messages::ValueMessageBuilder & bodyBuilder(
      messageBuilder.startMessage(
        templatePtr->getApplicationType(),
        templatePtr->getApplicationTypeNamespace(),
        templatePtr->fieldCount()));

    decodeSegmentBody(source, pmap, templatePtr, bodyBuilder);
    if(templatePtr->getIgnore())
    {
      messageBuilder.ignoreMessage(bodyBuilder);
    }
    else
    {
      messageBuilder.endMessage(bodyBuilder);
    }
  }
  else if(templateId_ == SCPResetTemplateId)
  {
    reset(false);
  }
  else
  {
    std::string error =  "Unknown template ID:";
    error += boost::lexical_cast<std::string>(getTemplateId());
    reportError("[ERR D9]", error);
  }
  return;
}