//------------------------------------------------------------------------------
//----------------------------------------------------------- Message::Message()
//------------------------------------------------------------------------------
-Message::Message() : a_forCode(true) {
+Message::Message(Engine *engine) : a_engine(engine), a_forCode(true) {
initialize();
}
//------------------------------------------------------------------------------
//----------------------------------------------------------- Message::Message()
//------------------------------------------------------------------------------
-Message::Message(CommandId id) : a_forCode(true) {
+Message::Message(CommandId id, Engine *engine) : a_engine(engine), a_forCode(true) {
initialize();
setId(id);
}
//------------------------------------------------------------------------------
//-------------------------------------------------- Message::setApplicationId()
//------------------------------------------------------------------------------
-void Message::setApplicationId(U32 aid) throw() {
+void Message::setApplicationId(U32 aid) throw(anna::RuntimeException) {
a_applicationId = aid;
// Default behaviour:
while(avpPos < dataBytes) {
try {
- avp = getEngine()->allocateAvp();
+ avp = getEngine()->createAvp(NULL);
db_aux.assign(startData + avpPos, dataBytes - avpPos /* is valid to pass total length (indeed i don't know the real avp length) because it will be limited and this has deep copy disabled (no memory is reserved) */);
avp -> decode(db_aux, parent, answer);
} catch(anna::RuntimeException &ex) {
// most of the command codes as *[Failed-AVP], i think this is not a deliberate ambiguity.
// Probably the RFC wants to give freedom to the application layer, but it is recommended to
// have only one child (wrong avp) inside a unique message Failed-AVP to ease the Result-Code
- // correspondence. Anyway, this behaviour could be easily opened commenting condition block (*).
+ // correspondence. Anyway, this behaviour could be easily opened by mean 'setSingleFailedAVP(false)'
Avp *theFailedAvp = getAvp(helpers::base::AVPID__Failed_AVP, 1, anna::Exception::Mode::Ignore);
if (theFailedAvp) {
- LOGDEBUG(anna::Logger::debug("Failed-AVP has already been added. RFC 6733 Section 7.5 recommends to store only the first error found", ANNA_FILE_LOCATION));
- return;
+ if (getEngine()->getSingleFailedAVP()) {
+ LOGDEBUG(anna::Logger::debug("Failed-AVP has already been added. RFC 6733 Section 7.5 recommends to store only the first error found", ANNA_FILE_LOCATION));
+ return;
+ }
}
// Section 7.5 RFC 6733: A Diameter message SHOULD contain one Failed-AVP AVP
}
try {
- avp = getEngine()->allocateAvp();
+ avp = getEngine()->createAvp(NULL);
avp -> fromXML(*it);
} catch(anna::RuntimeException &ex) {
getEngine()->releaseAvp(avp);