X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=source%2Fdiameter%2Fcodec%2FAvp.cpp;h=7b075cf21c21df5ce690b17c6eee3ed674dc7049;hb=398d53cb90e9f25dc89a46396225eef981f0ab24;hp=a956aaef45f9881b65499ae07e24c4c0e814f3fb;hpb=2e74c6e46b97d10eaa7ad547718540436a945ee4;p=anna.git diff --git a/source/diameter/codec/Avp.cpp b/source/diameter/codec/Avp.cpp index a956aae..7b075cf 100644 --- a/source/diameter/codec/Avp.cpp +++ b/source/diameter/codec/Avp.cpp @@ -1374,20 +1374,28 @@ void Avp::fromXML(const anna::xml::Node* avpNode) throw(anna::RuntimeException) // Check attributes exclusiveness if(name) { // compact mode - bool allowFlagsField = ( stackAvp->getVbit() == anna::diameter::stack::Avp::FlagRule::may || stackAvp->getVbit() == anna::diameter::stack::Avp::FlagRule::shouldnot + + if(code || vendorCode) { + std::string msg = "Error processing avp getValue(); + msg += "'>: avp attributes <'code' + 'vendorCode'> are not allowed if <'name'> is provided"; + throw anna::RuntimeException(msg, ANNA_FILE_LOCATION); + } + + // flags uncertainty: + bool flagsUncertainty = ( stackAvp->getVbit() == anna::diameter::stack::Avp::FlagRule::may || stackAvp->getVbit() == anna::diameter::stack::Avp::FlagRule::shouldnot || stackAvp->getMbit() == anna::diameter::stack::Avp::FlagRule::may || stackAvp->getMbit() == anna::diameter::stack::Avp::FlagRule::shouldnot /* umm, perhaps we could omit for bit P, whic is deprecated ... */ /* || stackAvp->getPbit() == anna::diameter::stack::Avp::FlagRule::may || stackAvp->getPbit() == anna::diameter::stack::Avp::FlagRule::shouldnot*/ ); - if(code || (flags && !allowFlagsField) || vendorCode) { - std::string msg = "Error processing avp getValue(); - if (flags) msg += "'>: avp attributes <'code' + 'flags' + 'vendorCode'> are not allowed if <'name'> is provided (also flags is not permitted: no may, no shouldnot)"; - else msg += "'>: avp attributes <'code' + 'vendorCode'> are not allowed if <'name'> is provided"; - throw anna::RuntimeException(msg, ANNA_FILE_LOCATION); + if(flags && !flagsUncertainty) { + std::string msg = "Be careful processing avp getValue(); + msg += "'> together with avp 'flags' attribute, because may/shouldnot uncertainty was not specified"; + LOGINFORMATION(Logger::information(msg, ANNA_FILE_LOCATION)); } setId(stackAvp->getId()); - if (flags && allowFlagsField) { + //if (flags && flagsUncertainty) { + if (flags) { // Flags check int i_aux = flags->getIntegerValue(); @@ -1417,9 +1425,11 @@ void Avp::fromXML(const anna::xml::Node* avpNode) throw(anna::RuntimeException) int i_aux = code->getIntegerValue(); if(i_aux < 0) { - std::string msg = "Error processing avp getValue(); - msg += "': negative values are not allowed"; - throw anna::RuntimeException(msg, ANNA_FILE_LOCATION); + LOGWARNING( + std::string msg = "Error processing avp getValue(); + msg += "': negative value read from xml"; + anna::Logger::warning(msg, ANNA_FILE_LOCATION); + ); } U24 u_code = i_aux;