Fork variant for TestStep command
[anna.git] / example / diameter / launcher / RealmNode.cpp
index 7e69337..d227650 100644 (file)
 
 // Project
 #include <anna/diameter.comm/Message.hpp>
+#include <anna/diameter/stack/Dictionary.hpp>
+#include <anna/diameter/codec/EngineManager.hpp>
 #include <anna/core/core.hpp>
 #include <anna/time/Date.hpp>
 #include <anna/xml/Compiler.hpp>
 
 // Process
-#include "RealmNode.hpp"
-#include "MyDiameterEngine.hpp"
+#include <RealmNode.hpp>
+#include <MyDiameterEngine.hpp>
 
 
+namespace anna {
+  namespace diameter {
+    namespace stack {
+      class Dictionary;
+    }
+  }
+}
 
-RealmNode::RealmNode(const std::string &originRealm, unsigned int applicationId, anna::diameter::codec::Engine *codecEngine) :
-  a_originRealm(originRealm), a_applicationId(applicationId), a_codecEngine(codecEngine) {
+RealmNode::RealmNode(const std::string &originRealm, unsigned int applicationId, const anna::diameter::stack::Dictionary *baseProtocolDictionary) :
+  a_originRealm(originRealm), a_applicationId(applicationId) {
 
   std::string commEngineName = a_originRealm + "_DiameterCommEngine";
-  a_commEngine = new MyDiameterEngine(commEngineName.c_str());
+  a_commEngine = new MyDiameterEngine(commEngineName.c_str(), baseProtocolDictionary);
   a_commEngine->setAutoBind(false);  // allow to create client-sessions without binding them, in order to set timeouts.
-  a_commEngine->setBaseProtocolCodecEngine(getCodecEngine());
+  a_codecEngine = anna::diameter::codec::EngineManager::instantiate().getCodecEngine(applicationId);
 
   a_logFile = "";
   a_burstLogFile = "";
@@ -56,16 +65,13 @@ RealmNode::RealmNode(const std::string &originRealm, unsigned int applicationId,
 }
 
 
-void RealmNode::createEntity(const std::string &entityRepresentation, const anna::Millisecond &bindTimeout, const anna::Millisecond &applicationTimeout) throw() {
+void RealmNode::createEntity(const std::string &entityRepresentation, const anna::Millisecond &bindTimeout, const anna::Millisecond &applicationTimeout) throw(anna::RuntimeException) {
 
   anna::socket_v servers = anna::functions::getSocketVectorFromString(entityRepresentation);
   std::string entityDescription = "Launcher diameter entity for "; entityDescription += a_originRealm;
   a_entity = (MyDiameterEntity*)(a_commEngine->createEntity(servers, entityDescription));
   a_entity->setClassCodeTimeout(anna::diameter::comm::ClassCode::Bind, bindTimeout);
   a_entity->setClassCodeTimeout(anna::diameter::comm::ClassCode::ApplicationMessage, applicationTimeout);
-
-  // Codec engine for reacting answers (failed-avp):
-  a_entity->setCodecEngine(getCodecEngine());
 }
 
 void RealmNode::startDiameterServer(const std::string &serverRepresentation, int sessions, const anna::Millisecond &inactivityTimeout) throw(anna::RuntimeException) {
@@ -81,9 +87,6 @@ void RealmNode::startDiameterServer(const std::string &serverRepresentation, int
 
   a_diameterServer->setDescription(serverDescription);
   a_diameterServer->setAllowedInactivityTime(inactivityTimeout);
-
-  // Codec engine for reacting answers (failed-avp):
-  a_diameterServer->setCodecEngine(getCodecEngine());
 }
 
 anna::diameter::comm::Message *RealmNode::createCommMessage() throw(anna::RuntimeException) {
@@ -100,16 +103,13 @@ void RealmNode::releaseCommMessage(anna::diameter::comm::Message *msg) throw() {
 
 
 void RealmNode::writeLogFile(const anna::DataBlock & db, const std::string &logExtension, const std::string &detail) const throw() {
-//   if (!logEnabled()) return;
-  anna::diameter::codec::Message codecMsg(getCodecEngine());
+  anna::diameter::codec::Message codecMsg;
   try { codecMsg.decode(db); } catch(anna::RuntimeException &ex) { ex.trace(); }
   writeLogFile(codecMsg, logExtension, detail);
-
 }
 
-// Si ya lo tengo decodificado:
-void RealmNode::writeLogFile(const anna::diameter::codec::Message & decodedMessage, const std::string &logExtension, const std::string &detail) const throw() {
-//   if (!logEnabled()) return;
+// Already decoded:
+void RealmNode::writeLogFile(const anna::diameter::codec::Message &decodedMessage, const std::string &logExtension, const std::string &detail) const throw() {
   // Open target file:
   std::string targetFile = a_logFile;
 
@@ -365,16 +365,17 @@ bool RealmNode::sendBurstMessage(bool anyway) throw() {
 }
 
 std::string RealmNode::lookBurst(int order) const throw() {
+
+  if (order == -1) order = a_burstDeliveryIt->first;
+
   std::string result = "No message found for order provided (";
   result += anna::functions::asString(order);
   result += ")";
   std::map<int, anna::diameter::comm::Message*>::const_iterator it = a_burstMessages.find(order - 1);
 
   if(it != a_burstMessages.end()) {
-    // Decode
-    anna::diameter::codec::Message codecMsg(getCodecEngine()); // XXXXXXXXXXXXXXXX el del nodo de trabajo
-    try { codecMsg.decode((*it).second->getBody()); } catch(anna::RuntimeException &ex) { ex.trace(); }
-    result = codecMsg.asXMLString();
+    anna::diameter::codec::Message codecMsg;
+    try { codecMsg.decode((*it).second->getBody()); result = codecMsg.asXMLString(); } catch(anna::RuntimeException &ex) { ex.trace(); }
   }
 
   return result;