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 "net/DiscoveryAgent.h"
00009 #include "net/DiscoveryService.h"
00010 #include "net/DiscoveryAnnouncement.h"
00011 #include "core/TimeEvent.h"
00012 #include "core/NodeEvent.h"
00013 #include <ibrdtn/utils/Utils.h>
00014 #include "Configuration.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)
00045                 {
00046                         // calculating RTT with the service timestamp
00047                         size_t rtt = 2700;
00048 
00049                         // convert the announcement into NodeEvents
00050                         Node n(Node::NODE_FLOATING, rtt);
00051 
00052                         // set the EID and some parameters of this Node
00053                         n.setEID(announcement.getEID());
00054 
00055                         // get configured timeout value
00056                         n.setTimeout( _config.timeout() );
00057 
00058                         const list<DiscoveryService> services = announcement.getServices();
00059                         for (list<DiscoveryService>::const_iterator iter = services.begin(); iter != services.end(); iter++)
00060                         {
00061                                 const DiscoveryService &s = (*iter);
00062 
00063                                 if (s.getName() == "tcpcl")
00064                                 {
00065                                         n.add(Node::URI(s.getParameters(), Node::CONN_TCPIP));
00066                                 }
00067                                 else if (s.getName() == "udpcl")
00068                                 {
00069                                         n.add(Node::URI(s.getParameters(), Node::CONN_UDPIP));
00070                                 }
00071                                 else
00072                                 {
00073                                         n.add(Node::Attribute(s.getName(), s.getParameters()));
00074                                 }
00075                         }
00076 
00077                         // create and raise a new event
00078                         dtn::core::NodeEvent::raise(n, NODE_INFO_UPDATED);
00079                 }
00080 
00081                 void DiscoveryAgent::timeout()
00082                 {
00083                         // check if announcements are enabled
00084                         if (_config.announce())
00085                         {
00086                                 IBRCOMMON_LOGGER_DEBUG(25) << "send discovery announcement" << IBRCOMMON_LOGGER_ENDL;
00087 
00088                                 sendAnnoucement(_sn, _services);
00089 
00090                                 // increment sequencenumber
00091                                 _sn++;
00092                         }
00093                 }
00094         }
00095 }