00001
00002 #ifndef INCLUDED_EventRouter_h
00003 #define INCLUDED_EventRouter_h
00004
00005 #include <vector>
00006 #include <list>
00007 #include <map>
00008 #include <algorithm>
00009 #include "EventListener.h"
00010 #include "EventTrapper.h"
00011 #include "Shared/get_time.h"
00012 #include "Shared/debuget.h"
00013 #include <iostream>
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 class EventRouter : public EventListener {
00041 public:
00042 EventRouter();
00043 virtual ~EventRouter() { reset(); removeAllTimers(); }
00044 void reset() { listeners.clear(); trappers.clear(); removeAllTimers(); }
00045
00046 void setBufferTime(unsigned int t) { buffertime=t; }
00047 unsigned int getBufferTime() { return buffertime; }
00048
00049
00050
00051 void postEvent(EventBase::EventGeneratorID_t egid, unsigned int sid, EventBase::EventTypeID_t etid, unsigned int dur) { if(buffertime>0) events.push_back(new EventBase(egid,sid,etid,dur)); else processEvent(EventBase(egid,sid,etid,dur)); }
00052 void postEvent(EventBase::EventGeneratorID_t egid, unsigned int sid, EventBase::EventTypeID_t etid, unsigned int dur, const std::string& n, float m) { if(buffertime>0) events.push_back(new EventBase(egid,sid,etid,dur,n,m)); else processEvent(EventBase(egid,sid,etid,dur,n,m)); }
00053 void postEvent(EventBase* e) { if(buffertime>0) events.push_back(e); else { processEvent(*e); delete e; } }
00054
00055
00056
00057
00058 void processTimers();
00059 void processEventBuffer();
00060 void processEvent(const EventBase& e);
00061
00062
00063
00064
00065
00066
00067 bool hasListeners(EventBase::EventGeneratorID_t egid) { return trappers.hasMapping(egid) || listeners.hasMapping(egid); }
00068 bool hasListeners(EventBase::EventGeneratorID_t egid, unsigned int sid) { return trappers.hasMapping(egid,sid) || listeners.hasMapping(egid,sid); }
00069 bool hasListeners(EventBase::EventGeneratorID_t egid, unsigned int sid, EventBase::EventTypeID_t etid) { return trappers.hasMapping(egid,sid,etid) || listeners.hasMapping(egid,sid,etid); }
00070
00071
00072
00073 void addTimer(EventListener* el, unsigned int sid, unsigned int delay, bool repeat=true);
00074 void addTimer(EventListener* el, const EventBase& e, bool repeat=true) { addTimer(el,e.getSourceID(),e.getDuration(),repeat); }
00075 void removeTimer(EventListener* el);
00076 void removeTimer(EventListener* el, unsigned int sid);
00077 void removeAllTimers();
00078
00079
00080
00081 void addListener(EventListener* el, const EventBase& e);
00082 void addListener(EventListener* el, EventBase::EventGeneratorID_t egid);
00083 void addListener(EventListener* el, EventBase::EventGeneratorID_t egid, unsigned int sid);
00084 void addListener(EventListener* el, EventBase::EventGeneratorID_t egid, unsigned int sid, EventBase::EventTypeID_t etid);
00085
00086
00087 void removeListener(EventListener* el, const EventBase& e);
00088 void removeListener(EventListener* el, EventBase::EventGeneratorID_t egid) { listeners.removeMapping(el,egid); listeners.clean(); }
00089 void removeListener(EventListener* el, EventBase::EventGeneratorID_t egid, unsigned int sid) { for(unsigned int et=0; et<EventBase::numETIDs; et++) listeners.removeMapping(el,egid,sid,(EventBase::EventTypeID_t)et); listeners.clean(); }
00090 void removeListener(EventListener* el, EventBase::EventGeneratorID_t egid, unsigned int sid, EventBase::EventTypeID_t etid) { listeners.removeMapping(el,egid,sid,etid); listeners.clean(); }
00091
00092 void removeListener(EventListener* el) { for(unsigned int eg=0; eg<EventBase::numEGIDs; eg++) listeners.removeMapping(el,(EventBase::EventGeneratorID_t)eg); listeners.clean(); }
00093 void forgetListener(EventListener* el) { removeTimer(el); removeListener(el); }
00094
00095
00096
00097 void addTrapper(EventTrapper* el, const EventBase& e) { trappers.addMapping(el,e.getGeneratorID(),e.getSourceID(),e.getTypeID()); }
00098 void addTrapper(EventTrapper* el, EventBase::EventGeneratorID_t egid) { trappers.addMapping(el,egid); }
00099 void addTrapper(EventTrapper* el, EventBase::EventGeneratorID_t egid, unsigned int sid) { for(unsigned int et=0; et<EventBase::numETIDs; et++) trappers.addMapping(el,egid,sid,(EventBase::EventTypeID_t)et); }
00100 void addTrapper(EventTrapper* el, EventBase::EventGeneratorID_t egid, unsigned int sid, EventBase::EventTypeID_t etid) { trappers.addMapping(el,egid,sid,etid); }
00101
00102 void addTrapper(EventTrapper* el) { for(unsigned int eg=0; eg<EventBase::numEGIDs; eg++) trappers.addMapping(el,(EventBase::EventGeneratorID_t)eg); }
00103
00104
00105 void removeTrapper(EventTrapper* el, const EventBase& e) { trappers.removeMapping(el,e.getGeneratorID(),e.getSourceID(),e.getTypeID()); trappers.clean(); }
00106 void removeTrapper(EventTrapper* el, EventBase::EventGeneratorID_t egid) { trappers.removeMapping(el,egid); trappers.clean(); }
00107 void removeTrapper(EventTrapper* el, EventBase::EventGeneratorID_t egid, unsigned int sid) { for(unsigned int et=0; et<EventBase::numETIDs; et++) trappers.removeMapping(el,egid,sid,(EventBase::EventTypeID_t)et); trappers.clean(); }
00108 void removeTrapper(EventTrapper* el, EventBase::EventGeneratorID_t egid, unsigned int sid, EventBase::EventTypeID_t etid) { trappers.removeMapping(el,egid,sid,etid); trappers.clean(); }
00109
00110 void removeTrapper(EventTrapper* el) { for(unsigned int eg=0; eg<EventBase::numEGIDs; eg++) trappers.removeMapping(el,(EventBase::EventGeneratorID_t)eg); trappers.clean(); }
00111
00112
00113 protected:
00114 void doSendBuffer();
00115 void doSendEvent(const EventBase& e);
00116
00117
00118 struct TimerEntry {
00119
00120 explicit TimerEntry(unsigned int nxt) : el(NULL), sid(0), delay(0), next(nxt), repeat(false) {}
00121
00122 TimerEntry(EventListener* e, unsigned int s, unsigned int d, bool r) : el(e), sid(s), delay(d), next(get_time()+delay), repeat(r) {}
00123
00124 TimerEntry(const TimerEntry& t) : el(t.el), sid(t.sid), delay(t.delay), next(t.next), repeat(t.repeat) {}
00125
00126 TimerEntry operator=(const TimerEntry& t) { el=t.el; sid=t.sid; delay=t.delay; next=t.next; repeat=t.repeat; return *this; }
00127
00128
00129
00130 void Set(unsigned int d, bool r) { delay=d; repeat=r; next=get_time()+delay; }
00131 EventListener* el;
00132 unsigned int sid;
00133 unsigned int delay;
00134 unsigned int next;
00135 bool repeat;
00136 };
00137
00138
00139 class TimerEntryPtrCmp {
00140 public:
00141
00142
00143
00144 bool operator()(const TimerEntry* const a, const TimerEntry* const b) const { return (a->next<b->next); }
00145 };
00146 typedef std::vector<TimerEntry*>::iterator timer_it_t;
00147 std::vector<TimerEntry*> timers;
00148
00149
00150 void chkTimers() {
00151 unsigned int last=0;
00152 for(timer_it_t it=timers.begin(); it!=timers.end(); it++) {
00153 if(last>(*it)->next) {
00154 dispTimers();
00155 return;
00156 }
00157 last=(*it)->next;
00158 }
00159 }
00160
00161 void dispTimers() {
00162 std::cout << "out of order timers " << get_time() << " :\t";
00163 unsigned int last=0;
00164 for(timer_it_t it=timers.begin(); it!=timers.end(); it++) {
00165 if(last>(*it)->next)
00166 std::cout << "##";
00167 std::cout << (last=(*it)->next) << '\t';
00168 }
00169 std::cout << std::endl;
00170 }
00171
00172 std::vector<EventBase*> events;
00173 bool doSendBufferLock;
00174 unsigned int lastBufClear;
00175 unsigned int buffertime;
00176
00177
00178
00179
00180
00181
00182 class EventMapper {
00183 public:
00184
00185 EventMapper();
00186
00187 void addMapping(void* el, EventBase::EventGeneratorID_t egid) { allevents[egid].push_back(el); }
00188 void addMapping(void* el, EventBase::EventGeneratorID_t egid, unsigned int sid, EventBase::EventTypeID_t etid);
00189
00190
00191
00192 void removeMapping(void* el, EventBase::EventGeneratorID_t egid);
00193
00194
00195
00196 void removeMapping(void* el, EventBase::EventGeneratorID_t egid, unsigned int sid, EventBase::EventTypeID_t etid);
00197
00198 void clean();
00199 void clear();
00200
00201
00202
00203
00204
00205
00206 bool hasMapping(EventBase::EventGeneratorID_t egid);
00207 bool hasMapping(EventBase::EventGeneratorID_t egid, unsigned int sid);
00208 bool hasMapping(EventBase::EventGeneratorID_t egid, unsigned int sid, EventBase::EventTypeID_t etid);
00209
00210
00211
00212
00213
00214
00215
00216 template<class T>
00217 void getMapping(const EventBase& e, std::vector<T*>& listeners);
00218
00219 protected:
00220
00221
00222 typedef std::map<unsigned int,std::vector<void*>,std::less<unsigned int> > SIDtoListenerVectorMap_t;
00223
00224
00225 std::vector<void*> allevents[EventBase::numEGIDs];
00226
00227 SIDtoListenerVectorMap_t* filteredevents[EventBase::numEGIDs][EventBase::numETIDs];
00228
00229 private:
00230 EventMapper(const EventMapper&);
00231 EventMapper operator=(const EventMapper&);
00232 };
00233
00234 EventMapper trappers;
00235 EventMapper listeners;
00236
00237 };
00238
00239
00240 extern EventRouter * erouter;
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253 #endif