X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=dynamic%2Flauncher%2Fgx%2F00001%2FProcedure.cpp;h=03e02eb57b3fafeee4237d1eae4d946160c2268a;hb=5a6cba5fde2b2f538a7515f8293cc0a8d9589dfa;hp=086a0741ee176333f4a3a51be1cce3069fcf3d2f;hpb=7ee10b64f4c116460ffef5784eb9ef87d3f2339c;p=anna.git diff --git a/dynamic/launcher/gx/00001/Procedure.cpp b/dynamic/launcher/gx/00001/Procedure.cpp index 086a074..03e02eb 100644 --- a/dynamic/launcher/gx/00001/Procedure.cpp +++ b/dynamic/launcher/gx/00001/Procedure.cpp @@ -18,6 +18,7 @@ #include #include #include +#include // Local #include "Procedure.hpp" @@ -27,8 +28,19 @@ namespace { void usage (std::string &response) { response += "\n\nInvalid arguments. Provide these ones:"; response += "\n"; + response += "\nSIGUSR2 Interface:"; response += "\n||||[|CCR-T xml file]"; response += "\n"; + response += "\nREST Interface:"; + response += "\n{"; + response += "\n \"seqI\":\"\""; + response += "\n ,\"seqF\":\"\""; + response += "\n ,\"msecsTimeout\":\"\""; + response += "\n ,\"digits\":\"\""; + response += "\n ,\"ccrI\":\"\""; + response += "\n [,\"ccrT\":\"\"]"; + response += "\n}"; + response += "\n"; response += "\nSequences are parsed when needed, over AVPs or internal values:"; response += "\n"; response += "\nSession-Id: ;;[;]"; @@ -47,7 +59,7 @@ namespace { } } -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) noexcept(false) { response = "Dynamic procedure failed to process '"; response += args; response += "': "; @@ -93,13 +105,15 @@ void Procedure::execute(const std::string &args, std::string &response, anna::di 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; + anna::diameter::codec::Avp *ccri_originHost; ///////// CCR-Initial: - ccri.loadXML(ccr_i); + ccri.loadXMLFile(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"); // Subscription-Id AVPs if (ccri.countAvp("Subscription-Id") != 2) { @@ -131,7 +145,7 @@ void Procedure::execute(const std::string &args, std::string &response, anna::di ///////// CCR-Termination: if (haveTermination) { - ccrt.loadXML(ccr_t); + ccrt.loadXMLFile(ccr_t); // Session-Id & Framed-Ip-Address AVPs ccrt_sessionId = ccrt.getAvp("Session-Id"); @@ -206,6 +220,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 //////////////////////////////////////////////////////////// @@ -253,24 +273,46 @@ 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|[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 - response = "Completed provision for pid "; response += anna::functions::asString(a_app->getPid()); response += "; range ["; + response = "Completed provision: range ["; response += seq_i; response += ", "; response += seq_f; response += "]; scenary: "; response += "CCR-Initial"; if (haveTermination) response += " + CCR-Termination"; } +void Procedure::execute(const nlohmann::json &args, std::string &response) noexcept(false) { + + // Build the arguments string and call the previous centralized logic procedure execution: + // ||||[|CCR-T xml file] + const char *arg_names[6] = { "seqI", "seqF", "msecsTimeout", "digits", "ccrI", "ccrT" }; + std::string args_string, arg, pipe("|"); + + for (int i = 0; i < 6; i++) + { + auto it = args.find(arg_names[i]); + arg = (it != args.end() && it->is_string()) ? *it : ""; + if (arg != "") args_string += arg + pipe; + } + + // Remove last 'pipe': + if (args_string != "") + args_string = args_string.substr(0, args_string.size()-1); + + execute(args_string, response); +} + +