Improve flags uncertainty. Warning when provided with name attribute
authorEduardo Ramos Testillano <eduardo.ramos.testillano@ericsson.com>
Tue, 1 Aug 2017 21:23:15 +0000 (23:23 +0200)
committerEduardo Ramos Testillano <eduardo.ramos.testillano@ericsson.com>
Tue, 1 Aug 2017 21:23:15 +0000 (23:23 +0200)
source/diameter/codec/Avp.cpp

index a956aae..be51349 100644 (file)
@@ -1374,20 +1374,28 @@ void Avp::fromXML(const anna::xml::Node* avpNode) throw(anna::RuntimeException)
 
   // Check attributes exclusiveness
   if(name) {  // compact mode
 
   // 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 <name '"; msg += name->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*/ );
                              || 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 <name '"; msg += name->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 <name '"; msg += name->getValue();
+      msg += "'> together with avp 'flags' attribute, because may/shouldnot uncertainty was not specified";
+      LOGINFORMATION(Logger::information(msg, ANNA_FILE_LOCATION));
     }
 
     setId(stackAvp->getId());
 
     }
 
     setId(stackAvp->getId());
 
-    if (flags && allowFlagsField) {
+    //if (flags && flagsUncertainty) {
+    if (flags) {
       // Flags check
       int i_aux = flags->getIntegerValue();
 
       // Flags check
       int i_aux = flags->getIntegerValue();