// 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 <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 = "";
}
-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) {
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;