|
IBR-DTNSuite 0.6
|
00001 /* 00002 * DiscoveryAgent.cpp 00003 * 00004 * Created on: 14.09.2009 00005 * Author: morgenro 00006 */ 00007 00008 #include "Configuration.h" 00009 #include "net/DiscoveryAgent.h" 00010 #include "net/DiscoveryService.h" 00011 #include "net/DiscoveryAnnouncement.h" 00012 #include "core/TimeEvent.h" 00013 #include "core/NodeEvent.h" 00014 #include <ibrdtn/utils/Utils.h> 00015 #include <ibrcommon/Logger.h> 00016 00017 using namespace dtn::core; 00018 00019 namespace dtn 00020 { 00021 namespace net 00022 { 00023 DiscoveryAgent::DiscoveryAgent(const dtn::daemon::Configuration::Discovery &config) 00024 : _config(config), _sn(0) 00025 { 00026 } 00027 00028 DiscoveryAgent::~DiscoveryAgent() 00029 { 00030 } 00031 00032 void DiscoveryAgent::addService(std::string name, std::string parameters) 00033 { 00034 DiscoveryService service(name, parameters); 00035 _services.push_back(service); 00036 } 00037 00038 void DiscoveryAgent::addService(DiscoveryServiceProvider *provider) 00039 { 00040 DiscoveryService service(provider); 00041 _services.push_back(service); 00042 } 00043 00044 void DiscoveryAgent::received(const DiscoveryAnnouncement &announcement, size_t timeout) 00045 { 00046 // convert the announcement into NodeEvents 00047 Node n(announcement.getEID()); 00048 00049 const std::list<DiscoveryService> services = announcement.getServices(); 00050 for (std::list<DiscoveryService>::const_iterator iter = services.begin(); iter != services.end(); iter++) 00051 { 00052 size_t to_value = (timeout == 0) ? _config.timeout() : timeout; 00053 00054 const DiscoveryService &s = (*iter); 00055 00056 if (s.getName() == "tcpcl") 00057 { 00058 n.add(Node::URI(Node::NODE_DISCOVERED, Node::CONN_TCPIP, s.getParameters(), to_value)); 00059 } 00060 else if (s.getName() == "udpcl") 00061 { 00062 n.add(Node::URI(Node::NODE_DISCOVERED, Node::CONN_UDPIP, s.getParameters(), to_value)); 00063 } 00064 else 00065 { 00066 n.add(Node::Attribute(Node::NODE_DISCOVERED, s.getName(), s.getParameters(), to_value)); 00067 } 00068 } 00069 00070 // create and raise a new event 00071 dtn::core::NodeEvent::raise(n, NODE_INFO_UPDATED); 00072 } 00073 00074 void DiscoveryAgent::timeout() 00075 { 00076 // check if announcements are enabled 00077 if (_config.announce()) 00078 { 00079 IBRCOMMON_LOGGER_DEBUG(25) << "send discovery announcement" << IBRCOMMON_LOGGER_ENDL; 00080 00081 sendAnnoucement(_sn, _services); 00082 00083 // increment sequencenumber 00084 _sn++; 00085 } 00086 } 00087 } 00088 }