00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef _DTN_SIM_EVENT_H_
00018 #define _DTN_SIM_EVENT_H_
00019
00020 #include "bundling/BundleEvent.h"
00021
00022 using namespace dtn;
00023
00024 namespace dtnsim {
00025
00026 class ConnState;
00027 class SimEventHandler;
00028
00029
00030
00031
00032 typedef enum {
00033 SIM_ROUTER_EVENT = 0x1,
00034 SIM_ADD_LINK,
00035 SIM_DEL_LINK,
00036 SIM_ADD_ROUTE,
00037 SIM_DEL_ROUTE,
00038 SIM_CONTACT_UP,
00039 SIM_CONTACT_DOWN,
00040 SIM_CONNECTIVITY,
00041 SIM_NEXT_SENDTIME,
00042
00043 } sim_event_type_t;
00044
00048 static const char*
00049 sim_ev2str(sim_event_type_t event) {
00050 switch (event) {
00051 case SIM_ROUTER_EVENT: return "SIM_ROUTER_EVENT";
00052 case SIM_ADD_LINK: return "SIM_ADD_LINK";
00053 case SIM_DEL_LINK: return "SIM_DEL_LINK";
00054 case SIM_ADD_ROUTE: return "SIM_ADD_ROUTE";
00055 case SIM_DEL_ROUTE: return "SIM_DEL_ROUTE";
00056 case SIM_CONTACT_UP: return "SIM_CONTACT_UP";
00057 case SIM_CONTACT_DOWN: return "SIM_CONTACT_DOWN";
00058 case SIM_CONNECTIVITY: return "SIM_CONNECTIVITY";
00059 case SIM_NEXT_SENDTIME: return "SIM_NEXT_SENDTIME";
00060 }
00061
00062 NOTREACHED;
00063 }
00064
00065
00066
00067
00068 class SimEvent {
00069 public:
00073 SimEvent(sim_event_type_t type, double time, SimEventHandler *handler)
00074 : type_(type), time_(time), handler_(handler), valid_(true) {}
00075
00076 SimEventHandler* handler() { return handler_; }
00077 double time() { return time_ ; }
00078 bool is_valid() { return valid_; }
00079 sim_event_type_t type() { return type_ ; }
00080 const char* type_str() { return sim_ev2str(type_); }
00081
00082 void cancel() { valid_ = false; }
00083
00084 private:
00085 sim_event_type_t type_;
00086 double time_;
00087 SimEventHandler* handler_;
00088 bool valid_;
00089 };
00090
00091
00092
00093
00094
00095 class SimEventCompare {
00096 public:
00100 bool operator () (SimEvent* a, SimEvent* b)
00101 {
00102 return a->time() > b->time();
00103 }
00104 };
00105
00106
00107
00108
00109
00110 class SimRouterEvent : public SimEvent {
00111 public:
00112 SimRouterEvent(double time, SimEventHandler* handler, BundleEvent* event)
00113 : SimEvent(SIM_ROUTER_EVENT, time, handler), event_(event) {}
00114
00115 BundleEvent* event_;
00116 };
00117
00118
00119
00120
00121 class SimAddLinkEvent : public SimEvent {
00122 public:
00123 SimAddLinkEvent(double time, SimEventHandler* handler, Link* link)
00124 : SimEvent(SIM_ADD_LINK, time, handler), link_(link) {}
00125
00126 Link* link_;
00127 };
00128
00129
00130
00131
00132 class SimDelLinkEvent : public SimEvent {
00133 public:
00134 SimDelLinkEvent(double time, SimEventHandler* handler, Link* link)
00135 : SimEvent(SIM_DEL_LINK, time, handler), link_(link) {}
00136
00137 Link* link_;
00138 };
00139
00140
00141
00142
00143 class SimAddRouteEvent : public SimEvent {
00144 public:
00145 SimAddRouteEvent(double time, SimEventHandler* handler,
00146 const EndpointIDPattern& dest, const char* nexthop)
00147 : SimEvent(SIM_ADD_ROUTE, time, handler),
00148 dest_(dest), nexthop_(nexthop) {}
00149
00150 EndpointIDPattern dest_;
00151 std::string nexthop_;
00152 };
00153
00154
00155
00156
00157 class SimConnectivityEvent : public SimEvent {
00158 public:
00159 SimConnectivityEvent(double time, SimEventHandler* handler,
00160 const char* n1, const char* n2, ConnState* state)
00161 : SimEvent(SIM_CONNECTIVITY, time, handler),
00162 n1_(n1), n2_(n2), state_(state) {}
00163
00164 std::string n1_, n2_;
00165 ConnState* state_;
00166 };
00167
00168 }
00169
00170 #endif