Fix enum bug (was on dictionary even when no data). PcapDecoder can load multiple...
[anna.git] / source / diameter / stack / Engine.cpp
index 80e6a00..bb46cbe 100644 (file)
@@ -1,8 +1,8 @@
-// ANNA - Anna is Not 'N' Anymore
+// ANNA - Anna is Not Nothingness Anymore
 //
 // (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
 //
-// https://bitbucket.org/testillano/anna
+// 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
@@ -14,7 +14,7 @@
 // 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 Google Inc. nor the names of its
+//     *  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.
 //
@@ -163,7 +163,7 @@ anna::diameter::stack::Engine::Engine(void) {
 //------------------------------------------------------------------------------
 //------------------------------------------------------ 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);
 
@@ -176,12 +176,12 @@ const anna::diameter::stack::Dictionary * anna::diameter::stack::Engine::getDict
 //------------------------------------------------------------------------------
 //----------------------------------------------------------- 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;
+  unsigned 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 ");
@@ -194,7 +194,11 @@ std::string anna::diameter::stack::Engine::asString(void) const throw() {
       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";
     }
   }
 
@@ -204,19 +208,38 @@ std::string anna::diameter::stack::Engine::asString(void) const throw() {
 
 
 //------------------------------------------------------------------------------
-//--------------------------------------------------- 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
+    a_stacks[stackId] = dictionary; // no need for singleton destructor
     const_stack_iterator it = a_stacks.find(stackId);
-    result = (Dictionary *)(*it).second;
+    //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. Removes it before call this method", ANNA_FILE_LOCATION);
+
+  // Register a new dictionary:
+  result = registerDictionary(stackId, new Dictionary());
+
   if(xmlPathFile != "") {
     try {
       result->load(xmlPathFile);
@@ -230,8 +253,8 @@ anna::diameter::stack::Dictionary *  anna::diameter::stack::Engine::createDictio
 }
 
 
-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 == "")
@@ -270,7 +293,7 @@ void anna::diameter::stack::Engine::loadDictionary(const std::string & xmlPathFi
 //------------------------------------------------------------------------------
 //-------------------------------------------------------- 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