00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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 }