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 <ibrcommon/thread/MutexLock.h> 00016 00017 using namespace dtn::core; 00018 00019 namespace dtn 00020 { 00021 namespace net 00022 { 00023 DiscoveryAgent::DiscoveryAgent() 00024 : _running(false), _sn(0) 00025 { 00026 } 00027 00028 DiscoveryAgent::~DiscoveryAgent() 00029 { 00030 } 00031 00032 void DiscoveryAgent::componentUp() 00033 { 00034 bindEvent(TimeEvent::className); 00035 } 00036 00037 void DiscoveryAgent::componentDown() 00038 { 00039 unbindEvent(TimeEvent::className); 00040 00041 _running = false; 00042 join(); 00043 } 00044 00045 void DiscoveryAgent::addService(string name, string parameters) 00046 { 00047 DiscoveryService service(name, parameters); 00048 _services.push_back(service); 00049 } 00050 00051 void DiscoveryAgent::addService(DiscoveryServiceProvider *provider) 00052 { 00053 DiscoveryService service(provider); 00054 _services.push_back(service); 00055 } 00056 00057 void DiscoveryAgent::received(const DiscoveryAnnouncement &announcement) 00058 { 00059 // calculating RTT with the service timestamp 00060 size_t rtt = 2700; 00061 00062 // convert the announcement into NodeEvents 00063 Node n(Node::NODE_FLOATING, rtt); 00064 00065 // set the EID and some parameters of this Node 00066 n.setURI(announcement.getEID().getString()); 00067 n.setTimeout(5); 00068 00069 const list<DiscoveryService> services = announcement.getServices(); 00070 for (list<DiscoveryService>::const_iterator iter = services.begin(); iter != services.end(); iter++) 00071 { 00072 const DiscoveryService &s = (*iter); 00073 00074 if (s.getName() == "tcpcl") 00075 { 00076 n.setProtocol(Node::CONN_TCPIP); 00077 } 00078 else if (s.getName() == "udpcl") 00079 { 00080 n.setProtocol(Node::CONN_UDPIP); 00081 } 00082 else 00083 { 00084 continue; 00085 } 00086 00087 // parse parameters 00088 std::vector<string> parameters = dtn::utils::Utils::tokenize(";", s.getParameters()); 00089 std::vector<string>::const_iterator param_iter = parameters.begin(); 00090 00091 while (param_iter != parameters.end()) 00092 { 00093 std::vector<string> p = dtn::utils::Utils::tokenize("=", (*param_iter)); 00094 00095 if (p[0].compare("ip") == 0) 00096 { 00097 n.setAddress(p[1]); 00098 } 00099 00100 if (p[0].compare("port") == 0) 00101 { 00102 int port_number = 0; 00103 stringstream port_stream; 00104 port_stream << p[1]; 00105 port_stream >> port_number; 00106 n.setPort(port_number); 00107 } 00108 00109 param_iter++; 00110 } 00111 00112 // create and raise a new event 00113 dtn::core::NodeEvent::raise(n, NODE_INFO_UPDATED); 00114 } 00115 } 00116 00117 void DiscoveryAgent::raiseEvent(const dtn::core::Event *evt) 00118 { 00119 try { 00120 dynamic_cast<const dtn::core::TimeEvent&>(*evt); 00121 00122 static ibrcommon::Mutex mutex; 00123 ibrcommon::MutexLock l(mutex); 00124 00125 // update all services 00126 for (std::list<DiscoveryService>::iterator iter = _services.begin(); iter != _services.end(); iter++) 00127 { 00128 (*iter).update(); 00129 } 00130 00131 sendAnnoucement(_sn, _services); 00132 00133 // increment sequencenumber 00134 _sn++; 00135 } catch (std::bad_cast) { 00136 00137 } 00138 } 00139 } 00140 }
1.6.3