//------------------------------------------------------------------------------
void Message::setEngine(Engine *engine) throw() {
- if (a_engine && engine != a_engine) {
+ if (!engine) {
+ LOGWARNING(anna::Logger::warning("Ignored: you must assign a valid codec engine. If you want to set NULL engine, clear the message", ANNA_FILE_LOCATION));
+ return;
+ }
+
+ if (a_engine && (engine != a_engine)) {
LOGWARNING(anna::Logger::warning("Ignored: it is not a good practice to change the codec engine once assigned. Clear the message first to set the engine again.", ANNA_FILE_LOCATION));
return;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------- Message::clear()
//------------------------------------------------------------------------------
-void Message::clear() throw(anna::RuntimeException) {
+void Message::clear(bool resetEngine) throw(anna::RuntimeException) {
for(avp_iterator it = avp_begin(); it != avp_end(); it++) { /*avp(it)->clear(); */getEngine()->releaseAvp(Avp::avp(it)); }
a_avps.clear();
a_finds.clear();
// Initialize:
initialize();
+ if (resetEngine) a_engine = NULL;
}
const stack::Command *stackCommand = getStackCommand();
if(!stackCommand) {
- anna::Logger::error("Impossible to decide if flags are correct because stack command is not identified. Assume flags ok", ANNA_FILE_LOCATION);
+ std::string msg = "Impossible to decide if flags are correct because stack command is not identified. Assume flags ok for Message ";
+ msg += anna::diameter::functions::commandIdAsPairString(a_id);
+ anna::Logger::error(msg, ANNA_FILE_LOCATION);
//rc = helpers::base::AVPVALUES__Result_Code::?????;
return true;
};
if(stackCommand->isRequest() != isRequest()) ok = false; // en teoria es imposible salir por aqui: blindado en la dtd
if(isRequest() && errorBit()) {
- anna::Logger::error("E(rror) bit is not allowed at diameter requests", ANNA_FILE_LOCATION);
+ std::string msg = "E(rror) bit is not allowed at diameter requests as ";
+ msg += stackCommand->getName();
+ anna::Logger::error(msg, ANNA_FILE_LOCATION);
ok = false;
}
if(isAnswer() && potentiallyReTransmittedMessageBit()) {
- anna::Logger::error("T(Potentially re-transmitted message) bit is not allowed at diameter answers", ANNA_FILE_LOCATION);
+ std::string msg = "T(Potentially re-transmitted message) bit is not allowed at diameter answers as ";
+ msg += stackCommand->getName();
+ anna::Logger::error(msg, ANNA_FILE_LOCATION);
ok = false;
}
// is set to one (1) or the bits in the Diameter header are set
// incorrectly.
if((a_flags & 0x0f) != 0x00) {
- anna::Logger::error("Any (or more than one) of the reserved message flags bit has been activated. Reserved bits must be null", ANNA_FILE_LOCATION);
+ std::string msg = "Any (or more than one) of the reserved message flags bit has been activated. Reserved bits must be null. Message is ";
+ msg += stackCommand->getName();
+ anna::Logger::error(msg, ANNA_FILE_LOCATION);
rc = helpers::base::AVPVALUES__Result_Code::DIAMETER_INVALID_BIT_IN_HEADER;
return false;
}
// Codec engine manager (a multithreaded application, normally does not achieve this point, because
// messages are prepared for each interface with the corresponding codec engine)
anna::diameter::codec::EngineManager &em = anna::diameter::codec::EngineManager::instantiate();
+ if (em.size() == 0) return;
if (em.selectFromApplicationId()) {
Engine *monostackEngine = em.getMonoStackCodecEngine();
if (monostackEngine) { a_engine = monostackEngine; return; }
trace += db.asString();
anna::Logger::debug(trace, ANNA_FILE_LOCATION);
);
- clear();
+ clear(false /* respect engine */);
// EXCEPTION MANAGEMENT IN THIS METHOD
// ===================================
// DECODE PHASE
//----------------------------------------------------------- Message::fromXML()
//------------------------------------------------------------------------------
void Message::fromXML(const anna::xml::Node* messageNode) throw(anna::RuntimeException) {
- // <!ATTLIST message version CDATA #IMPLIED name CDATA #IMPLIED code CDATA #IMPLIED flags CDATA #IMPLIED p-bit (yes | no) #IMPLIED e-bit (yes | no) #IMPLIED t-bit (yes | no) #IMPLIED application-id CDATA #REQUIRED hop-by-hop-id CDATA #IMPLIED end-by-end-id CDATA #IMPLIED>
+ // <!ATTLIST message version CDATA #IMPLIED name CDATA #IMPLIED code CDATA #IMPLIED flags CDATA #IMPLIED p-bit (yes | no) #IMPLIED e-bit (yes | no) #IMPLIED t-bit (yes | no) #IMPLIED application-id CDATA #REQUIRED hop-by-hop-id CDATA #IMPLIED end-to-end-id CDATA #IMPLIED>
const anna::xml::Attribute *version, *name, *code, *flags, *pbit, *ebit, *tbit, *appid, *hbh, *ete;
version = messageNode->getAttribute("version", false /* no exception */);
name = messageNode->getAttribute("name", false /* no exception */);
tbit = messageNode->getAttribute("t-bit", false /* no exception */);
appid = messageNode->getAttribute("application-id"); // required
hbh = messageNode->getAttribute("hop-by-hop-id", false /* no exception */);
- ete = messageNode->getAttribute("end-by-end-id", false /* no exception */);
+ ete = messageNode->getAttribute("end-to-end-id", false /* no exception */);
int i_aux;
unsigned int u_aux;
// Clear the message
- clear();
+ clear(false /* respect engine */);
if(version) {
i_aux = version->getIntegerValue();
//------------------------------------------------------------- Message::asXML()
//------------------------------------------------------------------------------
anna::xml::Node* Message::asXML(anna::xml::Node* parent) const throw() {
- // <!ATTLIST message version CDATA #IMPLIED name CDATA #IMPLIED code CDATA #IMPLIED flags CDATA #IMPLIED application-id CDATA #REQUIRED hop-by-hop-id CDATA #IMPLIED end-by-end-id CDATA #IMPLIED>
+ // <!ATTLIST message version CDATA #IMPLIED name CDATA #IMPLIED code CDATA #IMPLIED flags CDATA #IMPLIED application-id CDATA #REQUIRED hop-by-hop-id CDATA #IMPLIED end-to-end-id CDATA #IMPLIED>
anna::xml::Node* result = parent->createChild("message");
// Dictionary stack command:
const stack::Command *stackCommand = getStackCommand();
result->createAttribute("application-id", anna::functions::asString(a_applicationId));
result->createAttribute("hop-by-hop-id", anna::functions::asString(a_hopByHop));
- result->createAttribute("end-by-end-id", anna::functions::asString(a_endToEnd));
+ result->createAttribute("end-to-end-id", anna::functions::asString(a_endToEnd));
// Avps:
for(const_avp_iterator it = avp_begin(); it != avp_end(); it++) {