Stack selection by application-id (configurable), and minor fixes
[anna.git] / source / diameter / codec / Avp.cpp
index 1a4378d..3a2c9b0 100644 (file)
@@ -50,6 +50,7 @@
 #include <anna/diameter/stack/Engine.hpp>
 #include <anna/diameter/codec/Engine.hpp>
 #include <anna/core/functions.hpp>
+#include <anna/core/util/RegularExpression.hpp>
 
 #include <anna/core/tracing/Logger.hpp>
 #include <anna/core/functions.hpp>
@@ -686,7 +687,6 @@ void Avp::decodeDataPart(const char * buffer, int size, const parent_t & parent,
     int avpPos = 0;
     Avp* avp;
     anna::DataBlock db;
-
     // Me as parent:
     parent_t me = parent;
     me.addAvp(a_id);
@@ -785,13 +785,12 @@ void Avp::decode(const anna::DataBlock &db, const parent_t & parent, Message *an
   //   a Diameter client, server, proxy, or translation agent and either the AVP or its value is unrecognized, the message MUST be rejected.
   //   Diameter Relay and redirect agents MUST NOT reject messages with unrecognized AVPs.
   if(!getStackAvp() && mandatoryBit()) {
+    if(answer) {
+      answer->setResultCode(helpers::base::AVPVALUES__Result_Code::DIAMETER_AVP_UNSUPPORTED);
+      answer->setFailedAvp(parent, a_id);
+    }
 
-       if(answer) {
-         answer->setResultCode(helpers::base::AVPVALUES__Result_Code::DIAMETER_AVP_UNSUPPORTED);
-         answer->setFailedAvp(parent, a_id);
-       }
-
-       unknownAvpWithMandatoryBit();
+    unknownAvpWithMandatoryBit();
   }
 
   // Avp Length
@@ -1313,6 +1312,16 @@ std::string Avp::getXMLdata(bool & isHex, const stack::Format *stackFormat) cons
 }
 
 
+//------------------------------------------------------------------------------
+//---------------------------------------------------------------- Avp::decode()
+//------------------------------------------------------------------------------
+void Avp::decode(const anna::DataBlock &db) throw(anna::RuntimeException) {
+  parent_t parent;
+  parent.setMessage(CommandId(0, false), "No-Parent");
+  decode(db, parent, NULL);
+}
+
+
 //------------------------------------------------------------------------------
 //--------------------------------------------------------------- Avp::fromXML()
 //------------------------------------------------------------------------------
@@ -1585,6 +1594,7 @@ anna::xml::Node* Avp::asXML(anna::xml::Node* parent) const throw() {
   return result;
 }
 
+
 //------------------------------------------------------------------------------
 //----------------------------------------------------------- Avp::asXMLString()
 //------------------------------------------------------------------------------
@@ -1593,3 +1603,11 @@ std::string Avp::asXMLString() const throw() {
   return anna::xml::Compiler().apply(asXML(&root));
 }
 
+
+//------------------------------------------------------------------------------
+//---------------------------------------------------------------- Avp::isLike()
+//------------------------------------------------------------------------------
+bool Avp::isLike(const std::string &pattern) const throw() {
+  anna::RegularExpression re(pattern);
+  return re.isLike(asXMLString());
+}