// 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>
#include <RealmNode.hpp>
#include <MyDiameterEngine.hpp>
+
namespace anna {
namespace diameter {
namespace stack {
}
}
-RealmNode::RealmNode(const std::string &originRealm, anna::diameter::codec::Engine *codecEngine, const anna::diameter::stack::Dictionary *baseProtocolDictionary) :
- a_originRealm(originRealm), 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(), baseProtocolDictionary);
a_commEngine->setAutoBind(false); // allow to create client-sessions without binding them, in order to set timeouts.
+ a_codecEngine = anna::diameter::codec::EngineManager::instantiate().getCodecEngine(applicationId);
a_logFile = "";
a_burstLogFile = "";
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) {
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) {
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;
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());
- 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;
anna::xml::Node* result = parent->createChild("RealmNode");
result->createAttribute("OriginRealm", a_originRealm);
+ result->createAttribute("ApplicationId", a_applicationId);
result->createAttribute("LogFile", a_logFile);
result->createAttribute("SplitLog", a_splitLog ? "yes" : "no");
result->createAttribute("DetailedLog", a_detailedLog ? "yes" : "no");