00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifdef HAVE_CONFIG_H
00018 # include <dtn-config.h>
00019 #endif
00020
00021 #include "Discovery.h"
00022 #include "DiscoveryTable.h"
00023 #include "conv_layers/ConvergenceLayer.h"
00024
00025 namespace dtn {
00026
00027 template<>
00028 DiscoveryTable* oasys::Singleton<DiscoveryTable,false>::instance_ = NULL;
00029
00030 DiscoveryTable::DiscoveryTable()
00031 : Logger("DiscoveryTable","/dtn/discovery/table")
00032 {
00033 }
00034
00035 DiscoveryTable::~DiscoveryTable()
00036 {
00037 }
00038
00039 void
00040 DiscoveryTable::shutdown()
00041 {
00042 for(DiscoveryList::iterator i = dlist_.begin();
00043 i != dlist_.end();
00044 i++)
00045 {
00046 Discovery* d = *i;
00047 d->shutdown();
00048 delete d;
00049 }
00050 dlist_.clear();
00051 }
00052
00053 bool
00054 DiscoveryTable::find(const std::string& name,
00055 DiscoveryList::iterator* iter)
00056 {
00057 Discovery* disc;
00058 for (*iter = dlist_.begin(); *iter != dlist_.end(); (*iter)++)
00059 {
00060 disc = **iter;
00061 if (disc->name() == name)
00062 return true;
00063 }
00064 return false;
00065 }
00066
00067 bool
00068 DiscoveryTable::add(const std::string& name,
00069 const char* afname,
00070 int argc, const char* argv[],
00071 const char** error)
00072 {
00073 DiscoveryList::iterator iter;
00074
00075 if (find(name, &iter))
00076 {
00077 *error = "agent exists with that name";
00078 return false;
00079 }
00080
00081 std::string af(afname);
00082 Discovery* disc = Discovery::create_discovery(name, afname, argc, argv,
00083 error);
00084
00085 if (disc == NULL) {
00086 return false;
00087 }
00088
00089 log_info("adding discovery agent %s (%s)",name.c_str(),afname);
00090
00091 dlist_.push_back(disc);
00092 return true;
00093 }
00094
00095 bool
00096 DiscoveryTable::del(const std::string& name)
00097 {
00098 DiscoveryList::iterator iter;
00099 Discovery* disc;
00100
00101 log_info("removing discovery agent %s",name.c_str());
00102
00103 if(! find(name,&iter))
00104 {
00105 log_err("error removing agent %s: no such agent",name.c_str());
00106 return false;
00107 }
00108
00109 disc = *iter;
00110 dlist_.erase(iter);
00111 disc->shutdown();
00112 delete disc;
00113
00114 return true;
00115 }
00116
00117 void
00118 DiscoveryTable::dump(oasys::StringBuffer* buf)
00119 {
00120 DiscoveryList::iterator iter;
00121 Discovery* disc;
00122
00123 buf->appendf("\nDiscovery: %zu agents\n"
00124 "---------\n",dlist_.size());
00125 for (iter = dlist_.begin(); iter != dlist_.end(); iter++)
00126 {
00127 disc = *iter;
00128 disc->dump(buf);
00129 buf->append("\n");
00130 }
00131 }
00132
00133 }