IBR-DTNSuite 0.6

daemon/src/net/DiscoveryAgent.cpp

Go to the documentation of this file.
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 }