Testing library separation: now not in launcher but isolated
[anna.git] / source / diameter.comm / Engine.cpp
index 489a093..56aa1b6 100644 (file)
@@ -16,7 +16,6 @@
 #include <anna/comm/Network.hpp>
 #include <anna/comm/Host.hpp>
 #include <anna/comm/ClientSocket.hpp>
-
 #include <anna/diameter.comm/Transport.hpp>
 #include <anna/diameter.comm/Engine.hpp>
 #include <anna/diameter.comm/Entity.hpp>
@@ -63,8 +62,9 @@ comm::Engine::Engine(const char *className, const stack::Dictionary *baseProtoco
   a_baseProtocolCodecEngine((std::string("baseProtocolCodecEngine_for_") + std::string(className)).c_str(), baseProtocolDictionary)
 {
   anna::diameter::sccs::activate();
-  a_realm = anna::functions::getDomainname();
-  a_host = anna::functions::getHostname();
+  a_originRealm = anna::functions::getDomainname();
+  a_originHost = anna::functions::getHostname();
+  a_ceaPathfile = "";
 
   // Internal base protocol codec engine:
   a_baseProtocolCodecEngine.setValidationMode(anna::diameter::codec::Engine::ValidationMode::Always); // default was: after decoding
@@ -116,8 +116,8 @@ void comm::Engine::setClientCERandDWR(const std::string & cer, const std::string
   //           * [Acct-Application-Id]  259 Unsigned32
   anna::diameter::codec::Message diameterCER(getBaseProtocolCodecEngine());
   int applicationId = 0 /*anna::diameter::helpers::APPID__3GPP_Rx*/; // Unsigned32
-  std::string OH = getHost();
-  std::string OR = getRealm();
+  std::string OH = getOriginHostName();
+  std::string OR = getOriginRealmName();
   std::string hostIP = anna::functions::getHostnameIP(); // Address
   int vendorId = anna::diameter::helpers::VENDORID__tgpp; // Unsigned32
   std::string productName = "ANNA Diameter Client"; // UTF8String
@@ -274,7 +274,7 @@ throw(anna::RuntimeException) {
   result->setCategory(category);
   result->setDescription(description);
   result->setAllowedInactivityTime(allowedInactivityTime);
-  result->initializeStatisticConcepts();
+  result->initializeStatisticResources();
 // Los saco con metodos virtuales readXXX del motor:
 //   if ((a_cea.isEmpty()) || (a_dwa.isEmpty()))
 //      throw anna::RuntimeException("Must define valid CEA and DWA messages by mean setCEAandDWA()", ANNA_FILE_LOCATION);
@@ -315,7 +315,7 @@ throw(anna::RuntimeException) {
   result->a_socket = socket;
   result->setMaxClientSessions(a_numberOfClientSessionsPerServer /* engine */);
   result->a_engine = this;
-  result->initializeStatisticConcepts();
+  result->initializeStatisticResources();
 
   for(int k = 0; k < a_numberOfClientSessionsPerServer; k++)
     result->addClientSession(k);
@@ -769,13 +769,13 @@ int comm::Engine::getOTARequestsForLocalServers() const throw() {
 }
 
 
-void comm::Engine::setRealm(const std::string & name) throw() {
-  a_realm = ((name != "") ? name : anna::functions::getDomainname());
+void comm::Engine::setOriginRealmName(const std::string & originRealmName) throw() {
+  a_originRealm = ((originRealmName != "") ? originRealmName : anna::functions::getDomainname());
 }
 
 
-void comm::Engine::setHost(const std::string & name) throw() {
-  a_host = ((name != "") ? name : anna::functions::getHostname());
+void comm::Engine::setOriginHostName(const std::string & originHostName) throw() {
+  a_originHost = ((originHostName != "") ? originHostName : anna::functions::getHostname());
 }
 
 
@@ -927,8 +927,10 @@ comm::Engine::entity_key comm::Engine::getEntityKey(const socket_v &v) const thr
 void comm::Engine::availabilityLostForEntities() throw() {
   a_availableForEntities = false;
   LOGDEBUG(
-    std::string msg = "diameter::comm::Engine { Realm: ";
-    msg += getRealm();
+    std::string msg = "diameter::comm::Engine { Origin-Realm: ";
+    msg += getOriginRealmName();
+    msg += " | Origin-Host: ";
+    msg += getOriginHostName();
     msg += " } has lost its availability for entities";
     anna::Logger::debug(msg, ANNA_FILE_LOCATION);
   );
@@ -944,8 +946,10 @@ void comm::Engine::availabilityLostForEntities() throw() {
 void comm::Engine::availabilityRecoveredForEntities() throw() {
   a_availableForEntities = true;
   LOGDEBUG(
-    std::string msg = "diameter::comm::Engine { Realm: ";
-    msg += getRealm();
+    std::string msg = "diameter::comm::Engine { Origin-Realm: ";
+    msg += getOriginRealmName();
+    msg += " | Origin-Host: ";
+    msg += getOriginHostName();
     msg += " } has recovered its availability for entities";
     anna::Logger::debug(msg, ANNA_FILE_LOCATION);
   );
@@ -961,8 +965,10 @@ void comm::Engine::availabilityRecoveredForEntities() throw() {
 void comm::Engine::availabilityLostForLocalServers() throw() {
   a_availableForLocalServers = false;
   LOGDEBUG(
-    std::string msg = "diameter::comm::Engine { Realm: ";
-    msg += getRealm();
+    std::string msg = "diameter::comm::Engine { Origin-Realm: ";
+    msg += getOriginRealmName();
+    msg += " | Origin-Host: ";
+    msg += getOriginHostName();
     msg += " } has lost its availability for local servers";
     anna::Logger::debug(msg, ANNA_FILE_LOCATION);
   );
@@ -978,8 +984,10 @@ void comm::Engine::availabilityLostForLocalServers() throw() {
 void comm::Engine::availabilityRecoveredForLocalServers() throw() {
   a_availableForLocalServers = true;
   LOGDEBUG(
-    std::string msg = "diameter::comm::Engine { Realm: ";
-    msg += getRealm();
+    std::string msg = "diameter::comm::Engine { Origin-Realm: ";
+    msg += getOriginRealmName();
+    msg += " | Origin-Host: ";
+    msg += getOriginHostName();
     msg += " } has recovered its availability for local servers";
     anna::Logger::debug(msg, ANNA_FILE_LOCATION);
   );
@@ -1076,11 +1084,11 @@ void comm::Engine::readDPA(anna::DataBlock &dpa, const anna::DataBlock & dpr) th
     // Origin-Host
     avpOH.setId(anna::diameter::helpers::base::AVPID__Origin_Host);
     avpOH.setMandatoryBit();
-    avpOH.getDiameterIdentity()->fromPrintableString(a_host.c_str());
+    avpOH.getDiameterIdentity()->fromPrintableString(a_originHost.c_str());
     // Origin-Realm
     avpOR.setId(anna::diameter::helpers::base::AVPID__Origin_Realm);
     avpOR.setMandatoryBit();
-    avpOR.getDiameterIdentity()->fromPrintableString(a_realm.c_str());
+    avpOR.getDiameterIdentity()->fromPrintableString(a_originRealm.c_str());
     diameterDPA.addAvp(&avpRC);
     diameterDPA.addAvp(&avpOH);
     diameterDPA.addAvp(&avpOR);
@@ -1095,11 +1103,30 @@ void comm::Engine::readDPA(anna::DataBlock &dpa, const anna::DataBlock & dpr) th
 }
 
 
-void comm::Engine::readCEA(anna::DataBlock &cea, const anna::DataBlock & cer) throw() {
+void comm::Engine::readCEA(anna::DataBlock &cea, const anna::DataBlock &cer) throw() {
 
   // Check for base protocol codec engine health:
   assertBaseProtocolHealth();
 
+  if (a_ceaPathfile != "") {
+    anna::diameter::codec::Message diameterCEA(getBaseProtocolCodecEngine());
+
+    try {
+      diameterCEA.loadXML(a_ceaPathfile);
+      diameterCEA.setHopByHop(anna::diameter::codec::functions::getHopByHop(cer));
+      diameterCEA.setEndToEnd(anna::diameter::codec::functions::getEndToEnd(cer));
+      cea = diameterCEA.code();
+
+    } catch(anna::RuntimeException &ex) {
+      ex.trace();
+      LOGWARNING(anna::Logger::warning("CEA file not found or unable to parse. Encoding harcoded default version ...", ANNA_FILE_LOCATION));
+      //return anna::diameter::comm::Engine::readCEA(cea, cer);
+      // will fail with empty cea
+      }
+
+    return;
+  }
+
   // Default CEA implementation:
   //
   //   'Capabilities-Exchange-Answer' (257,answer)
@@ -1137,11 +1164,11 @@ void comm::Engine::readCEA(anna::DataBlock &cea, const anna::DataBlock & cer) th
     // Origin-Host
     avpOH.setId(anna::diameter::helpers::base::AVPID__Origin_Host);
     avpOH.setMandatoryBit();
-    avpOH.getDiameterIdentity()->fromPrintableString(a_host.c_str());
+    avpOH.getDiameterIdentity()->fromPrintableString(a_originHost.c_str());
     // Origin-Realm
     avpOR.setId(anna::diameter::helpers::base::AVPID__Origin_Realm);
     avpOR.setMandatoryBit();
-    avpOR.getDiameterIdentity()->fromPrintableString(a_realm.c_str());
+    avpOR.getDiameterIdentity()->fromPrintableString(a_originRealm.c_str());
     diameterCEA.addAvp(&avpRC);
     diameterCEA.addAvp(&avpOH);
     diameterCEA.addAvp(&avpOR);
@@ -1152,7 +1179,7 @@ void comm::Engine::readCEA(anna::DataBlock &cea, const anna::DataBlock & cer) th
     int vendorId = anna::diameter::helpers::VENDORID__tgpp; // Unsigned32
     diameterCEA.addAvp(anna::diameter::helpers::base::AVPID__Vendor_Id)->getUnsigned32()->setValue(vendorId);
     // Product-Name
-    std::string productName = "OCS Diameter Server"; // UTF8String
+    std::string productName = "Diameter Server"; // UTF8String
     diameterCEA.addAvp(anna::diameter::helpers::base::AVPID__Product_Name)->getUTF8String()->setValue(productName);
     // Encode
     cea = diameterCEA.code();
@@ -1256,11 +1283,11 @@ void comm::Engine::readDWA(anna::DataBlock &dwa, const anna::DataBlock & dwr) th
     // Origin-Host
     avpOH.setId(anna::diameter::helpers::base::AVPID__Origin_Host);
     avpOH.setMandatoryBit();
-    avpOH.getDiameterIdentity()->fromPrintableString(a_host.c_str());
+    avpOH.getDiameterIdentity()->fromPrintableString(a_originHost.c_str());
     // Origin-Realm
     avpOR.setId(anna::diameter::helpers::base::AVPID__Origin_Realm);
     avpOR.setMandatoryBit();
-    avpOR.getDiameterIdentity()->fromPrintableString(a_realm.c_str());
+    avpOR.getDiameterIdentity()->fromPrintableString(a_originRealm.c_str());
     diameterDWA.addAvp(&avpRC);
     diameterDWA.addAvp(&avpOH);
     diameterDWA.addAvp(&avpOR);