Codec engine on Avp and Message constructors
[anna.git] / source / diameter / codec / Avp.cpp
index 17ba005..79b04b0 100644 (file)
@@ -1,37 +1,9 @@
-// ANNA - Anna is Not Nothingness Anymore
-//
-// (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
-//
-// http://redmine.teslayout.com/projects/anna-suite
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions
-// are met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     *  Neither the name of the copyright holder nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: eduardo.ramos.testillano@gmail.com
-//          cisco.tierra@gmail.com
+// ANNA - Anna is Not Nothingness Anymore                                                         //
+//                                                                                                //
+// (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
+//                                                                                                //
+// See project site at http://redmine.teslayout.com/projects/anna-suite                           //
+// See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
 
 
 // Local
@@ -83,7 +55,7 @@ const U8 Avp::PBitMask(0x20);
 //------------------------------------------------------------------------------
 //------------------------------------------------------------------- Avp::Avp()
 //------------------------------------------------------------------------------
-Avp::Avp() {
+Avp::Avp(Engine *engine) : a_engine(engine) {
   initialize();
 }
 
@@ -91,7 +63,7 @@ Avp::Avp() {
 //------------------------------------------------------------------------------
 //------------------------------------------------------------------- Avp::Avp()
 //------------------------------------------------------------------------------
-Avp::Avp(AvpId id) {
+Avp::Avp(AvpId id, Engine *engine) : a_engine(engine) {
   initialize();
   setId(id);
 }
@@ -109,7 +81,10 @@ Avp::~Avp() {
 //------------------------------------------------------------- Avp::getEngine()
 //------------------------------------------------------------------------------
 Engine * Avp::getEngine() const throw(anna::RuntimeException) {
-  return a_engine ? a_engine : (a_engine = anna::functions::component <Engine> (ANNA_FILE_LOCATION));
+  if(!a_engine)
+    throw anna::RuntimeException("Invalid codec engine reference (NULL)", ANNA_FILE_LOCATION);
+
+  return a_engine;
 }
 
 
@@ -117,7 +92,6 @@ Engine * Avp::getEngine() const throw(anna::RuntimeException) {
 //------------------------------------------------------------ Avp::initialize()
 //------------------------------------------------------------------------------
 void Avp::initialize() throw() {
-  a_engine = NULL;
   a_id = helpers::AVPID__AVP; // (0,0)
   a_flags = 0x00;
   a_insertionPositionForChilds = 0;
@@ -206,7 +180,7 @@ avp_iterator Avp::avp_find(avp_container &avps, AvpId id, unsigned int position)
 //---------------------------------------------------------------- Avp::addAvp()
 //------------------------------------------------------------------------------
 Avp * Avp::addAvp(avp_container &avps, int &insertionPositionForChilds, AvpId id, Engine *engine) throw() {
-  Avp * result = engine->allocateAvp();
+  Avp * result = engine->createAvp(NULL);
   result->setId(id);
   addChild(avps, insertionPositionForChilds, result);
   return result;
@@ -693,7 +667,7 @@ void Avp::decodeDataPart(const char * buffer, int size, const parent_t & parent,
 
     while(avpPos < size) {
       try {
-        avp = getEngine()->allocateAvp();
+        avp = getEngine()->createAvp(NULL);
         db.assign(buffer + avpPos, size - avpPos /* is valid to pass total size (indeed i don't know the real avp size) because it will be limited and this has deep copy disabled (no memory is reserved) */);
         avp -> decode(db, me, answer);
       } catch(anna::RuntimeException &ex) {
@@ -1531,7 +1505,7 @@ void Avp::fromXML(const anna::xml::Node* avpNode) throw(anna::RuntimeException)
       }
 
       try {
-        avp =  getEngine()->allocateAvp();
+        avp =  getEngine()->createAvp(NULL);
         avp -> fromXML(*it);
       } catch(anna::RuntimeException &ex) {
         getEngine()->releaseAvp(avp);