Go to the documentation of this file.00001
00002
00003
00004
00005
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
00061 size_t rtt = 2700;
00062
00063
00064 Node n(Node::NODE_FLOATING, rtt);
00065
00066
00067 n.setURI(announcement.getEID().getString());
00068
00069
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
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
00116 dtn::core::NodeEvent::raise(n, NODE_INFO_UPDATED);
00117 }
00118 }
00119
00120 size_t DiscoveryAgent::timeout(size_t)
00121 {
00122
00123 if (_config.announce())
00124 {
00125 sendAnnoucement(_sn, _services);
00126
00127
00128 _sn++;
00129 }
00130
00131 return 1;
00132 }
00133 }
00134 }