DiscoveryTable.cc

Go to the documentation of this file.
00001 /*
00002  *    Copyright 2006 Baylor University
00003  * 
00004  *    Licensed under the Apache License, Version 2.0 (the "License");
00005  *    you may not use this file except in compliance with the License.
00006  *    You may obtain a copy of the License at
00007  * 
00008  *        http://www.apache.org/licenses/LICENSE-2.0
00009  * 
00010  *    Unless required by applicable law or agreed to in writing, software
00011  *    distributed under the License is distributed on an "AS IS" BASIS,
00012  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013  *    See the License for the specific language governing permissions and
00014  *    limitations under the License.
00015  */
00016 
00017 #include "Discovery.h"
00018 #include "DiscoveryTable.h"
00019 #include "conv_layers/ConvergenceLayer.h"
00020 
00021 namespace dtn {
00022 
00023 template<>
00024 DiscoveryTable* oasys::Singleton<DiscoveryTable,false>::instance_ = NULL;
00025 
00026 DiscoveryTable::DiscoveryTable()
00027     : Logger("DiscoveryTable","/dtn/discovery/table")
00028 {
00029 }
00030 
00031 DiscoveryTable::~DiscoveryTable()
00032 {
00033 }
00034 
00035 void
00036 DiscoveryTable::shutdown()
00037 {
00038     for(DiscoveryList::iterator i = dlist_.begin();
00039         i != dlist_.end();
00040         i++)
00041     {
00042         Discovery* d = *i;
00043         d->shutdown();
00044         delete d;
00045     }
00046     dlist_.clear();
00047 }
00048 
00049 bool
00050 DiscoveryTable::find(const std::string& name,
00051                      DiscoveryList::iterator* iter)
00052 {
00053     Discovery* disc;
00054     for (*iter = dlist_.begin(); *iter != dlist_.end(); (*iter)++)
00055     {
00056         disc = **iter;
00057         if (disc->name() == name)
00058             return true;
00059     }
00060     return false;
00061 }
00062 
00063 bool
00064 DiscoveryTable::add(const std::string& name,
00065                     const char* afname,
00066                     int argc, const char* argv[])
00067 {
00068     DiscoveryList::iterator iter;
00069 
00070     if (find(name, &iter))
00071     {
00072         log_err("discovery agent %s already exists",name.c_str());
00073         return false;
00074     }
00075 
00076     std::string af(afname);
00077     Discovery* disc = Discovery::create_discovery(name,afname,argc,argv);
00078 
00079     if (disc == NULL)
00080         return false;
00081     
00082     log_info("adding discovery agent %s (%s)",name.c_str(),afname);
00083 
00084     dlist_.push_back(disc);
00085     return true;
00086 }
00087 
00088 bool
00089 DiscoveryTable::del(const std::string& name)
00090 {
00091     DiscoveryList::iterator iter;
00092     Discovery* disc;
00093 
00094     log_info("removing discovery agent %s",name.c_str());
00095 
00096     if(! find(name,&iter))
00097     {
00098         log_err("error removing agent %s: no such agent",name.c_str());
00099         return false;
00100     }
00101 
00102     disc = *iter;
00103     dlist_.erase(iter);
00104     disc->shutdown(); 
00105     delete disc;
00106 
00107     return true;
00108 }
00109 
00110 void
00111 DiscoveryTable::dump(oasys::StringBuffer* buf)
00112 {
00113     DiscoveryList::iterator iter;
00114     Discovery* disc;
00115 
00116     buf->appendf("\nDiscovery: %zu agents\n"
00117                  "---------\n",dlist_.size());
00118     for (iter = dlist_.begin(); iter != dlist_.end(); iter++)
00119     {
00120         disc = *iter;
00121         disc->dump(buf);
00122         buf->append("\n");
00123     }
00124 }
00125 
00126 } // namespace dtn

Generated on Sat Sep 8 08:43:26 2007 for DTN Reference Implementation by  doxygen 1.5.3