Improvements from anna fork
[anna.git] / dynamic / launcher / gx / 00001 / Procedure.cpp
index 63b4ef1..99a87fe 100644 (file)
@@ -18,6 +18,7 @@
 #include <anna/diameter/helpers/dcca/functions.hpp>
 #include <anna/diameter/helpers/dcca/functions.hpp>
 #include <anna/diameter.comm/OriginHost.hpp>
+#include <anna/diameter.comm/OriginHostManager.hpp>
 
 // Local
 #include "Procedure.hpp"
@@ -27,7 +28,7 @@ namespace {
    void usage (std::string &response) {
      response += "\n\nInvalid arguments. Provide these ones:";
      response += "\n";
-     response += "\n<test timeout ms (0: no timeout step)><initial sequence>|<final sequence>|<digits>|<CCR-I xml file>[|CCR-T xml file]";
+     response += "\n<initial sequence>|<final sequence>|<test timeout ms (0: no timeout step)>|<digits>|<CCR-I xml file>[|CCR-T xml file]";
      response += "\n";
      response += "\nSequences are parsed when needed, over AVPs or internal values:";
      response += "\n";
@@ -42,12 +43,12 @@ namespace {
      response += "\nThe same will be done in MSISDN and IMSI (Subscription-Data AVPs).";
      response += "\nFramed-IP-Address will be sequenced with a direct correspondence to hex value.";
      response += "\n";
-     response += "\nThen, you could provide these arguments: \"5000|2000000|9000000|7|CCR-I.xml|CCR-T.xml\"";
+     response += "\nThen, you could provide these arguments: \"2000000|9000000|5000|7|CCR-I.xml|CCR-T.xml\"";
      response += "\n";
    }
 }
 
-void Procedure::execute(const std::string &args, std::string &response, anna::diameter::comm::OriginHost *originHost)  throw(anna::RuntimeException) {
+void Procedure::execute(const std::string &args, std::string &response)  throw(anna::RuntimeException) {
 
   response = "Dynamic procedure failed to process '"; response += args; response += "': ";
 
@@ -92,58 +93,55 @@ void Procedure::execute(const std::string &args, std::string &response, anna::di
   // Load xml messages:
   anna::diameter::codec::Message ccri, ccrt;
   anna::diameter::codec::Avp *ccri_sessionId, *ccrt_sessionId, *ccri_framedIPAddress, *ccrt_framedIPAddress, *ccri_msisdn, *ccri_imsi;
-  anna::diameter::codec::Avp *si1, *si2, *sidata1, *sidata2, *sitype1, *sitype2;
+  anna::diameter::codec::Avp *si1, *si2, *sidata1, *sidata2, *sitype1;
+  anna::diameter::codec::Avp *ccri_originHost;
 
-  try {
+  ///////// CCR-Initial:
+  ccri.loadXML(ccr_i);
 
-    ///////// CCR-Initial:
-    ccri.loadXML(ccr_i);
+  // Session-Id & Framed-Ip-Address AVPs
+  ccri_sessionId = ccri.getAvp("Session-Id");
+  ccri_framedIPAddress = ccri.getAvp("Framed-IP-Address");
+  ccri_originHost = ccri.getAvp("Origin-Host");
 
-    // Session-Id & Framed-Ip-Address AVPs
-    ccri_sessionId = ccri.getAvp("Session-Id");
-    ccri_framedIPAddress = ccri.getAvp("Framed-IP-Address");
-
-    // Subscription-Id AVPs
-    if (ccri.countAvp("Subscription-Id") != 2) {
-      response += "Both Subscription-Id MSISDN & IMSI Avps must be present in the CCR-Initial provided !";
-      return;
-    }
+  // Subscription-Id AVPs
+  if (ccri.countAvp("Subscription-Id") != 2) {
+    response += "Both Subscription-Id MSISDN & IMSI Avps must be present in the CCR-Initial provided !";
+    return;
+  }
 
-    si1 = ccri.getAvp("Subscription-Id", 1, anna::Exception::Mode::Ignore);
-    si2 = ccri.getAvp("Subscription-Id", 2, anna::Exception::Mode::Ignore);
+  si1 = ccri.getAvp("Subscription-Id", 1, anna::Exception::Mode::Ignore);
+  si2 = ccri.getAvp("Subscription-Id", 2, anna::Exception::Mode::Ignore);
 
-    if (!si1 || !si2) {
-      response += "Cannot found Subscription-Id MSISDN & IMSI Avps !" ;
-      return;
-    }
+  if (!si1 || !si2) {
+    response += "Cannot found Subscription-Id MSISDN & IMSI Avps !" ;
+    return;
+  }
 
-    sidata1 = si1->getAvp("Subscription-Id-Data");
-    sidata2 = si2->getAvp("Subscription-Id-Data");
-    sitype1 = si1->getAvp("Subscription-Id-Type");
-    //sitype2 = si2->getAvp("Subscription-Id-Type");
+  sidata1 = si1->getAvp("Subscription-Id-Data");
+  sidata2 = si2->getAvp("Subscription-Id-Data");
+  sitype1 = si1->getAvp("Subscription-Id-Type");
+  //sitype2 = si2->getAvp("Subscription-Id-Type");
 
-    if (sitype1->getEnumerated()->getValue() == anna::diameter::helpers::dcca::AVPVALUES__Subscription_Id_Type::END_USER_E164) {
-      ccri_msisdn = sidata1;
-      ccri_imsi = sidata2;
-    }
-    else {
-      ccri_msisdn = sidata2;
-      ccri_imsi = sidata1;
-    }
+  if (sitype1->getEnumerated()->getValue() == anna::diameter::helpers::dcca::AVPVALUES__Subscription_Id_Type::END_USER_E164) {
+    ccri_msisdn = sidata1;
+    ccri_imsi = sidata2;
+  }
+  else {
+    ccri_msisdn = sidata2;
+    ccri_imsi = sidata1;
+  }
 
-    ///////// CCR-Termination:
-    if (haveTermination) {
-      ccrt.loadXML(ccr_t);
+  ///////// CCR-Termination:
+  if (haveTermination) {
+    ccrt.loadXML(ccr_t);
 
-      // Session-Id & Framed-Ip-Address AVPs
-      ccrt_sessionId = ccrt.getAvp("Session-Id");
-      ccrt_framedIPAddress = ccrt.getAvp("Framed-IP-Address");
-    }
-  }
-  catch(anna::RuntimeException &ex) {
-    ex.trace();
+    // Session-Id & Framed-Ip-Address AVPs
+    ccrt_sessionId = ccrt.getAvp("Session-Id");
+    ccrt_framedIPAddress = ccrt.getAvp("Framed-IP-Address");
   }
 
+
   // Prepare session-id string:
   std::string sessionId = ccri_sessionId->getUTF8String()->getValue();
   std::size_t last_semicolon = sessionId.rfind(";");
@@ -211,6 +209,12 @@ void Procedure::execute(const std::string &args, std::string &response, anna::di
   char cad_framed[16];
   anna::testing::TestCase *tc;
 
+  // Origin host manager:
+  anna::diameter::comm::OriginHostManager &ohm = anna::diameter::comm::OriginHostManager::instantiate();
+  // Assume the oh name from CCR-I (same as CCR-T):
+  std::string originHostName = ccri_originHost->getDiameterIdentity()->getValue();
+  anna::diameter::comm::OriginHost *originHost = ohm.getOriginHost(originHostName);
+
   for (ll_index = 0; ll_index < ll_seq_size; ll_index++) {
 
     // Calculate next values ////////////////////////////////////////////////////////////
@@ -258,19 +262,19 @@ void Procedure::execute(const std::string &args, std::string &response, anna::di
     }
 
     // Step 2: sendxml2e: CCR-Initial
-    tc->addSendxml2e(ccri.code(), originHost, -1 /* 'wait for request' step number for answers */);
+    tc->addSendDiameterXml2e(ccri.code(), originHost, -1 /* 'wait for request' step number for answers */);
 
     // Step 3: waitfe: CCA with same session id
     // PARAM: 1     2            3      4          5           6             7           8          9       10         11
     //             wait<fe/fc>|[code]|[bitR]|[hopByHop]|[applicationId]|[sessionId]|[resultCode]|[msisdn]|[imsi]|[serviceContextId]
-    tc->addWait(true /* from entity */, "272", "0", "", "", sessionId, "2001", "", "", "");
+    tc->addWaitDiameter(true /* from entity */, "272", "0", "", "", sessionId, "2001", "", "", "");
 
     if (haveTermination) {
       // Step 4: sendxml2e: CCR-Termination
-      tc->addSendxml2e(ccrt.code(), originHost, -1 /* 'wait for request' step number for answers */);
+      tc->addSendDiameterXml2e(ccrt.code(), originHost, -1 /* 'wait for request' step number for answers */);
 
       // Step 5: waitfe: CCA with same session id
-      tc->addWait(true /* from entity */, "272", "0", "", "", sessionId, "2001", "", "", "");
+      tc->addWaitDiameter(true /* from entity */, "272", "0", "", "", sessionId, "2001", "", "", "");
     }
   } // loop