Base protocol codec for comm::Engine. Supported retransmissions
[anna.git] / source / diameter.comm / Engine.cpp
index fd5f8c8..4028991 100644 (file)
@@ -37,8 +37,9 @@ using namespace std;
 using namespace anna::diameter::comm;
 
 
-Engine::Engine() :
-  anna::app::Component(getClassName()),
+Engine::Engine(const char *className, codec::Engine *baseProtocolCodecEngine) :
+  anna::app::Component(className),
+  a_baseProtocolCodecEngine(baseProtocolCodecEngine),
   a_autoBind(true),
   a_availableForEntities(false),
   a_availableForLocalServers(false),
@@ -48,8 +49,7 @@ Engine::Engine() :
 //      a_dwa(true),
   a_watchdogPeriod(ClientSession::DefaultWatchdogPeriod),
   a_maxConnectionDelay(anna::comm::ClientSocket::DefaultMaxConnectionDelay /* 200 ms*/),
-  a_numberOfClientSessionsPerServer(1),
-  a_freezeEndToEndOnSending(false) {
+  a_numberOfClientSessionsPerServer(1) {
   anna::diameter::sccs::activate();
   a_realm = anna::functions::getDomainname();
   a_host = anna::functions::getHostname();
@@ -261,7 +261,7 @@ throw(anna::RuntimeException) {
   result->setWatchdogPeriod(a_watchdogPeriod);
   result->a_parent = server;
   result->a_socketId = socketId;
-  result->initializeSequences(); // después de asignar el server y el socketId (*)
+  result->initializeSequences(); // despus de asignar el server y el socketId (*)
   // (*) Las secuencias se basan en la semilla:    srand(::time(NULL) + anna::functions::exclusiveHash(anna::functions::asString("%s:%d|%d", getAddress().c_str(), getPort(), a_socketId)));
   result->a_engine = this;
   clientSession_key key = ClientSession::getKey(server->getAddress(), server->getPort(), socketId);
@@ -940,10 +940,10 @@ void Engine::readDPA(anna::DataBlock &dpa, const anna::DataBlock & dpr) throw()
   //        [Error-Message].................................(281,0)
   //       *[Failed-AVP]....................................(279,0)
   try {
-    anna::diameter::codec::Message diameterDPA;
-    anna::diameter::codec::Avp avpRC;
-    anna::diameter::codec::Avp avpOH;
-    anna::diameter::codec::Avp avpOR;
+    anna::diameter::codec::Message diameterDPA(getBaseProtocolCodecEngine());
+    anna::diameter::codec::Avp avpRC(getBaseProtocolCodecEngine());
+    anna::diameter::codec::Avp avpOH(getBaseProtocolCodecEngine());
+    anna::diameter::codec::Avp avpOR(getBaseProtocolCodecEngine());
     // Message header
     diameterDPA.setId(anna::diameter::helpers::base::COMMANDID__Disconnect_Peer_Answer);
     diameterDPA.setVersion(1);
@@ -968,7 +968,10 @@ void Engine::readDPA(anna::DataBlock &dpa, const anna::DataBlock & dpr) throw()
     // Encode
     dpa = diameterDPA.code();
   } catch(anna::RuntimeException &ex) {
-    ex.trace();
+    std::string msg = ex.getText();
+    msg += " | Use diameter::comm::Engine::setBaseProtocolCodecEngine() to allow internal base protocol messages encoding (unable to answer with DPA)";
+    anna::Logger::error(msg, ANNA_FILE_LOCATION);
+    //throw anna::RuntimeException(msg, ANNA_FILE_LOCATION);
   }
 }
 
@@ -994,10 +997,10 @@ void Engine::readCEA(anna::DataBlock &cea, const anna::DataBlock & cer) throw()
   //        [Firmware-Revision].............................(267,0)
   //       *[AVP]...........................................(0,0)
   try {
-    anna::diameter::codec::Message diameterCEA;
-    anna::diameter::codec::Avp avpRC;
-    anna::diameter::codec::Avp avpOH;
-    anna::diameter::codec::Avp avpOR;
+    anna::diameter::codec::Message diameterCEA(getBaseProtocolCodecEngine());
+    anna::diameter::codec::Avp avpRC(getBaseProtocolCodecEngine());
+    anna::diameter::codec::Avp avpOH(getBaseProtocolCodecEngine());
+    anna::diameter::codec::Avp avpOR(getBaseProtocolCodecEngine());
     // Message header
     diameterCEA.setId(anna::diameter::helpers::base::COMMANDID__Capabilities_Exchange_Answer);
     diameterCEA.setVersion(1);
@@ -1031,7 +1034,10 @@ void Engine::readCEA(anna::DataBlock &cea, const anna::DataBlock & cer) throw()
     // Encode
     cea = diameterCEA.code();
   } catch(anna::RuntimeException &ex) {
-    ex.trace();
+    std::string msg = ex.getText();
+    msg += " | Use diameter::comm::Engine::setBaseProtocolCodecEngine() to allow internal base protocol messages encoding (unable to answer with CEA)";
+    anna::Logger::error(msg, ANNA_FILE_LOCATION);
+    //throw anna::RuntimeException(msg, ANNA_FILE_LOCATION);
   }
 }
 
@@ -1047,10 +1053,10 @@ void Engine::readDWA(anna::DataBlock &dwa, const anna::DataBlock & dwr) throw()
   //       *[Failed-AVP]....................................(279,0)
   //        [Origin-State-Id]...............................(278,0)
   try {
-    anna::diameter::codec::Message diameterDWA;
-    anna::diameter::codec::Avp avpRC;
-    anna::diameter::codec::Avp avpOH;
-    anna::diameter::codec::Avp avpOR;
+    anna::diameter::codec::Message diameterDWA(getBaseProtocolCodecEngine());
+    anna::diameter::codec::Avp avpRC(getBaseProtocolCodecEngine());
+    anna::diameter::codec::Avp avpOH(getBaseProtocolCodecEngine());
+    anna::diameter::codec::Avp avpOR(getBaseProtocolCodecEngine());
     // Message header
     diameterDWA.setId(anna::diameter::helpers::base::COMMANDID__Device_Watchdog_Answer);
     diameterDWA.setVersion(1);
@@ -1075,7 +1081,10 @@ void Engine::readDWA(anna::DataBlock &dwa, const anna::DataBlock & dwr) throw()
     // Encode
     dwa = diameterDWA.code();
   } catch(anna::RuntimeException &ex) {
-    ex.trace();
+    std::string msg = ex.getText();
+    msg += " | Use diameter::comm::Engine::setBaseProtocolCodecEngine() to allow internal base protocol messages encoding (unable to answer with DWA)";
+    anna::Logger::error(msg, ANNA_FILE_LOCATION);
+    //throw anna::RuntimeException(msg, ANNA_FILE_LOCATION);
   }
 }