New feature to allow to register components with different names for same class:...
[anna.git] / example / diameter / launcher / Launcher.cpp
index f377e91..239095f 100644 (file)
@@ -22,7 +22,7 @@
 
 #define SIGUSR2_TASKS_INPUT_FILENAME "./sigusr2.tasks.input"
 #define SIGUSR2_TASKS_OUTPUT_FILENAME "./sigusr2.tasks.output"
-
+#define DIAMETER_CODEC_ENGINE_NAME_PREFIX "MyCodecEngine"
 
 Launcher::Launcher() : anna::comm::Application("launcher", "DiameterLauncher", "1.1"), a_communicator(NULL) {
   a_myDiameterEngine = new MyDiameterEngine();
@@ -320,6 +320,7 @@ void Launcher::startDiameterServer(int diameterServerSessions) throw(anna::Runti
   //ServerSocket *createServerSocket(const std::string & addr, int port = Session::DefaultPort, int maxConnections = -1, int category = 1, const std::string & description = "")
   a_diameterLocalServer = (MyLocalServer*)(a_myDiameterEngine->createLocalServer(address, port, diameterServerSessions));
   a_diameterLocalServer->setDescription("Launcher diameter local server");
+  a_diameterLocalServer->setProgrammedAnswersCodecEngine(getCodecEngine());
   int allowedInactivityTime = 90000; // ms
 
   if(cl.exists("allowedInactivityTime")) allowedInactivityTime = cl.getIntegerValue("allowedInactivityTime");
@@ -395,7 +396,7 @@ throw(anna::RuntimeException) {
   }
 
   // Stack:
-  anna::diameter::codec::Engine *codecEngine = new anna::diameter::codec::Engine();
+  a_codecEngine = new anna::diameter::codec::Engine(DIAMETER_CODEC_ENGINE_NAME_PREFIX);
   anna::diameter::stack::Engine &stackEngine = anna::diameter::stack::Engine::instantiate();
   anna::diameter::stack::Dictionary * d = stackEngine.createDictionary(0 /* stack id; its value don't mind, is not used (ADL is monostack) */);
   // Analyze comma-separated list:
@@ -416,8 +417,8 @@ throw(anna::RuntimeException) {
     }
   }
 
-  codecEngine->setDictionary(d);
-  LOGDEBUG(anna::Logger::debug(codecEngine->asString(), ANNA_FILE_LOCATION));
+  getCodecEngine()->setDictionary(d);
+  LOGDEBUG(anna::Logger::debug(getCodecEngine()->asString(), ANNA_FILE_LOCATION));
 
   if(lst.size() > 1) {
     std::string all_in_one = "./dictionary-all-in-one.xml";
@@ -563,8 +564,8 @@ throw(anna::RuntimeException) {
   // Integration (validation 'Complete' for receiving messages) and debugging (validation also before encoding: 'Always').
   // If missing 'integrationAndDebugging', default behaviour at engine is: mode 'AfterDecoding', depth 'FirstError':
   if(cl.exists("integrationAndDebugging")) {
-    codecEngine->setValidationMode(anna::diameter::codec::Engine::ValidationMode::Always);
-    codecEngine->setValidationDepth(anna::diameter::codec::Engine::ValidationDepth::Complete);
+    getCodecEngine()->setValidationMode(anna::diameter::codec::Engine::ValidationMode::Always);
+    getCodecEngine()->setValidationDepth(anna::diameter::codec::Engine::ValidationDepth::Complete);
   }
 
   // Fix mode
@@ -576,10 +577,10 @@ throw(anna::RuntimeException) {
     else if (fixMode == "Always") fm = anna::diameter::codec::Engine::FixMode::Always;
     else if (fixMode == "Never") fm = anna::diameter::codec::Engine::FixMode::Never;
     else LOGINFORMATION(anna::Logger::information("Unreconized command-line fix mode. Assumed default 'BeforeEncoding'", ANNA_FILE_LOCATION));
-    codecEngine->setFixMode(fm);
+    getCodecEngine()->setFixMode(fm);
   }
 
-  codecEngine->ignoreFlagsOnValidation(cl.exists("ignoreFlags"));
+  getCodecEngine()->ignoreFlagsOnValidation(cl.exists("ignoreFlags"));
 
   // Diameter Server:
   if(cl.exists("diameterServer"))
@@ -636,6 +637,7 @@ throw(anna::RuntimeException) {
       a_entity = (MyDiameterEntity*)(a_myDiameterEngine->createEntity(servers, "Launcher diameter entity"));
       a_entity->setClassCodeTimeout(anna::diameter::comm::ClassCode::Bind, ceaTimeout);
       a_entity->setClassCodeTimeout(anna::diameter::comm::ClassCode::ApplicationMessage, answersTimeout);
+      a_entity->setProgrammedAnswersCodecEngine(getCodecEngine());
       a_entity->bind();
     }
   }
@@ -1554,8 +1556,7 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
     } else if (param1 == "dump") {
       localServer->getReactingAnswers()->dump();
     } else {
-      anna::diameter::codec::Engine *engine = anna::functions::component <Engine> (ANNA_FILE_LOCATION);
-      anna::diameter::codec::Message *message = engine->createMessage(param1);
+      anna::diameter::codec::Message *message = getCodecEngine()->createMessage(param1);
       LOGDEBUG
       (
         anna::Logger::debug(message->asXMLString(), ANNA_FILE_LOCATION);
@@ -1587,8 +1588,7 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
     } else if (param1 == "dump") {
       entity->getReactingAnswers()->dump();
     } else {
-      anna::diameter::codec::Engine *engine = anna::functions::component <Engine> (ANNA_FILE_LOCATION);
-      anna::diameter::codec::Message *message = engine->createMessage(param1);
+      anna::diameter::codec::Message *message = getCodecEngine()->createMessage(param1);
       LOGDEBUG
       (
         anna::Logger::debug(message->asXMLString(), ANNA_FILE_LOCATION);
@@ -1724,7 +1724,7 @@ throw() {
   result->createAttribute("StartTime", a_start_time.asString());
   result->createAttribute("SecondsLifeTime", anna::time::functions::lapsedMilliseconds() / 1000);
   // Diameter:
-  (anna::functions::component <anna::diameter::codec::Engine> (ANNA_FILE_LOCATION))->asXML(result);
+  getCodecEngine()->asXML(result);
   // OAM:
   anna::diameter::comm::OamModule::instantiate().asXML(result);
   anna::diameter::comm::ApplicationMessageOamModule::instantiate().asXML(result);