-// 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
#include <stdarg.h>
-
-// libxml2 Parser doesn't support default attribute value retrieving:
-// <!ATTLIST avp name CDATA #REQUIRED code CDATA #REQUIRED vendor-name CDATA #IMPLIED may-encrypt (yes | no) \"no\" v-bit (must | may | shouldnot | mustnot) \"mustnot\" m-bit (must | may | shouldnot | mustnot) \"may\" p-bit (must | may | shouldnot | mustnot) \"may\">\n\
-// This dtd sintax will be replaced by #IMPLIED attributes.
-
namespace anna {
namespace diameter {
namespace stack {
//------------------------------------------------------------------------------
//------------------------------------------------------ Engine::getDictionary()
//------------------------------------------------------------------------------
-const anna::diameter::stack::Dictionary * anna::diameter::stack::Engine::getDictionary(int stackId) const throw() {
+const anna::diameter::stack::Dictionary * anna::diameter::stack::Engine::getDictionary(unsigned int stackId) const throw() {
const Dictionary * result = NULL;
const_stack_iterator it = a_stacks.find(stackId);
//------------------------------------------------------------------------------
//----------------------------------------------------------- Engine::asString()
//------------------------------------------------------------------------------
-std::string anna::diameter::stack::Engine::asString(void) const throw() {
+std::string anna::diameter::stack::Engine::asString(bool all) const throw() {
std::string trace;
- int stackId;
if(isEmpty()) {
- trace = "No diameter dictionaries found";
+ trace = "No diameter stacks found";
} else {
int numberOfStacks = stack_size();
trace = ((numberOfStacks > 1) ? "Multi-stack " : "Mono-stack ");
std::string title = "Diameter stack id = ";
title += anna::functions::asString((*it).first);
trace += anna::functions::highlightJustify(title);
- trace += (*it).second->asString(); trace += "\n";
+
+ if(all) trace += (*it).second->asString();
+ else trace += (*it).second->getName();
+
+ trace += "\n";
}
}
//------------------------------------------------------------------------------
-//--------------------------------------------------- Engine::createDictionary()
+//------------------------------------------------- Engine::registerDictionary()
//------------------------------------------------------------------------------
-anna::diameter::stack::Dictionary * anna::diameter::stack::Engine::createDictionary(int stackId, const std::string & xmlPathFile) throw(anna::RuntimeException) {
+anna::diameter::stack::Dictionary * anna::diameter::stack::Engine::registerDictionary(unsigned int stackId, Dictionary *dictionary) throw(anna::RuntimeException) {
Dictionary * result = const_cast<Dictionary *>(getDictionary(stackId));
+ if(!dictionary)
+ throw anna::RuntimeException("Cannot provide a NULL dictionary. It must be previously allocated", ANNA_FILE_LOCATION);
+
if(result) { // if exists, launch exception
throw anna::RuntimeException("Such provided stack id has already been created. Removes it before call this method", ANNA_FILE_LOCATION);
} else { // new stack
- a_stacks[stackId] = new Dictionary(); // no need for singleton destructor
- const_stack_iterator it = a_stacks.find(stackId);
- result = (Dictionary *)(*it).second;
+ a_stacks[stackId] = dictionary; // no need for singleton destructor
+ //const_stack_iterator it = a_stacks.find(stackId);
+ //result = (Dictionary *)(*it).second;
+ result = dictionary;
}
+ return result;
+}
+
+//------------------------------------------------------------------------------
+//--------------------------------------------------- Engine::createDictionary()
+//------------------------------------------------------------------------------
+anna::diameter::stack::Dictionary * anna::diameter::stack::Engine::createDictionary(unsigned int stackId, const std::string & xmlPathFile) throw(anna::RuntimeException) {
+ Dictionary * result = const_cast<Dictionary *>(getDictionary(stackId));
+
+ if(result) // if exists, launch exception
+ throw anna::RuntimeException("Such provided stack id has already been created (note: API allows you to remove any registered stack)", ANNA_FILE_LOCATION);
+
+ // Register a new dictionary:
+ result = registerDictionary(stackId, new Dictionary());
+
if(xmlPathFile != "") {
try {
result->load(xmlPathFile);
}
-void anna::diameter::stack::Engine::loadDictionary(const std::vector<int> & stacks, const std::string & xmlPathFile) throw(anna::RuntimeException) {
- std::vector<int>::const_iterator it;
+void anna::diameter::stack::Engine::loadDictionary(const std::vector<unsigned int> & stacks, const std::string & xmlPathFile) throw(anna::RuntimeException) {
+ std::vector<unsigned int>::const_iterator it;
Dictionary *d;
if(xmlPathFile == "")
//------------------------------------------------------------------------------
//-------------------------------------------------------- Engine::removeStack()
//------------------------------------------------------------------------------
-void anna::diameter::stack::Engine::removeStack(int stackId) throw() {
+void anna::diameter::stack::Engine::removeStack(unsigned int stackId) throw() {
stack_iterator it = a_stacks.find(stackId);
if(it != stack_end()) { // if exists, clear