• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

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 "core/Node.h"
00014 #include <ibrdtn/utils/Utils.h>
00015 #include "Configuration.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), _clock(*this, 0)
00025                 {
00026                 }
00027 
00028                 DiscoveryAgent::~DiscoveryAgent()
00029                 {
00030                 }
00031 
00032                 void DiscoveryAgent::componentUp()
00033                 {
00034                         _clock.set(1);
00035                         _clock.start();
00036                 }
00037 
00038                 void DiscoveryAgent::componentDown()
00039                 {
00040                         _clock.remove();
00041 
00042                         stop();
00043                         join();
00044                 }
00045 
00046                 void DiscoveryAgent::addService(string name, string parameters)
00047                 {
00048                         DiscoveryService service(name, parameters);
00049                         _services.push_back(service);
00050                 }
00051 
00052                 void DiscoveryAgent::addService(DiscoveryServiceProvider *provider)
00053                 {
00054                         DiscoveryService service(provider);
00055                         _services.push_back(service);
00056                 }
00057 
00058                 void DiscoveryAgent::received(const DiscoveryAnnouncement &announcement)
00059                 {
00060                         // calculating RTT with the service timestamp
00061                         size_t rtt = 2700;
00062 
00063                         // convert the announcement into NodeEvents
00064                         Node n(Node::NODE_FLOATING, rtt);
00065 
00066                         // set the EID and some parameters of this Node
00067                         n.setURI(announcement.getEID().getString());
00068 
00069                         // get configured timeout value
00070                         n.setTimeout( _config.timeout() );
00071 
00072                         const list<DiscoveryService> services = announcement.getServices();
00073                         for (list<DiscoveryService>::const_iterator iter = services.begin(); iter != services.end(); iter++)
00074                         {
00075                                 const DiscoveryService &s = (*iter);
00076 
00077                                 if (s.getName() == "tcpcl")
00078                                 {
00079                                         n.setProtocol(Node::CONN_TCPIP);
00080                                 }
00081                                 else if (s.getName() == "udpcl")
00082                                 {
00083                                         n.setProtocol(Node::CONN_UDPIP);
00084                                 }
00085                                 else
00086                                 {
00087                                         continue;
00088                                 }
00089 
00090                                 // parse parameters
00091                                 std::vector<string> parameters = dtn::utils::Utils::tokenize(";", s.getParameters());
00092                                 std::vector<string>::const_iterator param_iter = parameters.begin();
00093 
00094                                 while (param_iter != parameters.end())
00095                                 {
00096                                         std::vector<string> p = dtn::utils::Utils::tokenize("=", (*param_iter));
00097 
00098                                         if (p[0].compare("ip") == 0)
00099                                         {
00100                                                 n.setAddress(p[1]);
00101                                         }
00102 
00103                                         if (p[0].compare("port") == 0)
00104                                         {
00105                                                 int port_number = 0;
00106                                                 stringstream port_stream;
00107                                                 port_stream << p[1];
00108                                                 port_stream >> port_number;
00109                                                 n.setPort(port_number);
00110                                         }
00111 
00112                                         param_iter++;
00113                                 }
00114 
00115                                 // create and raise a new event
00116                                 dtn::core::NodeEvent::raise(n, NODE_INFO_UPDATED);
00117                         }
00118                 }
00119 
00120                 size_t DiscoveryAgent::timeout(size_t)
00121                 {
00122                         // check if announcements are enabled
00123                         if (_config.announce())
00124                         {
00125                                 sendAnnoucement(_sn, _services);
00126 
00127                                 // increment sequencenumber
00128                                 _sn++;
00129                         }
00130 
00131                         return 1;
00132                 }
00133         }
00134 }

Generated on Wed Mar 30 2011 11:11:49 for IBR-DTNSuite by  doxygen 1.7.1