00001 #include "EventGeneratorBase.h"
00002 #include "Events/EventRouter.h"
00003
00004 using namespace std;
00005
00006 void
00007 EventGeneratorBase::DoStart() {
00008 BehaviorBase::DoStart();
00009 if(autoListen && getGeneratorID()!=EventBase::numEGIDs) {
00010 erouter->addListener(this,EventBase::erouterEGID,getGeneratorID());
00011 if(hasListeners())
00012 addSrcListener();
00013 }
00014 }
00015
00016 void
00017 EventGeneratorBase::DoStop() {
00018 erouter->removeListener(this);
00019 isListening=false;
00020 BehaviorBase::DoStop();
00021 }
00022
00023 void
00024 EventGeneratorBase::processEvent(const EventBase& event) {
00025 if(!autoListen || getGeneratorID()==EventBase::numEGIDs)
00026 return;
00027 if(event.getGeneratorID()==EventBase::erouterEGID) {
00028 if(hasListeners()) {
00029 addSrcListener();
00030 } else {
00031 removeSrcListener();
00032 }
00033 }
00034 }
00035
00036 void
00037 EventGeneratorBase::setAutoListen(EventBase::EventGeneratorID_t gid) {
00038 removeSrcListener();
00039 autoListen=true;
00040 srcGenID=gid;
00041 specificity=GENERATOR;
00042 if(gid==EventBase::numEGIDs) {
00043 autoListen=false;
00044 return;
00045 }
00046 if(isActive())
00047 erouter->addListener(this,EventBase::erouterEGID,getGeneratorID());
00048 if(hasListeners())
00049 addSrcListener();
00050 }
00051
00052 void
00053 EventGeneratorBase::setAutoListen(EventBase::EventGeneratorID_t gid, size_t sid) {
00054 removeSrcListener();
00055 autoListen=true;
00056 srcGenID=gid;
00057 srcSourceID=sid;
00058 specificity=SOURCE;
00059 if(gid==EventBase::numEGIDs) {
00060 autoListen=false;
00061 return;
00062 }
00063 if(isActive())
00064 erouter->addListener(this,EventBase::erouterEGID,getGeneratorID());
00065 if(hasListeners())
00066 addSrcListener();
00067 }
00068
00069 void
00070 EventGeneratorBase::setAutoListen(EventBase::EventGeneratorID_t gid, size_t sid, EventBase::EventTypeID_t tid) {
00071 removeSrcListener();
00072 autoListen=true;
00073 srcGenID=gid;
00074 srcSourceID=sid;
00075 srcTypeID=tid;
00076 specificity=TYPE;
00077 if(gid==EventBase::numEGIDs || tid==EventBase::numETIDs) {
00078 autoListen=false;
00079 return;
00080 }
00081 if(isActive())
00082 erouter->addListener(this,EventBase::erouterEGID,getGeneratorID());
00083 if(hasListeners())
00084 addSrcListener();
00085 }
00086
00087 void
00088 EventGeneratorBase::unsetAutoListen() {
00089 removeSrcListener();
00090 autoListen=false;
00091 }
00092
00093 bool
00094 EventGeneratorBase::hasListeners() const {
00095 return erouter->hasListeners(getGeneratorID(),getSourceID());
00096 }
00097
00098 void
00099 EventGeneratorBase::addSrcListener() {
00100 if(isListening || getListenGeneratorID()==EventBase::numEGIDs)
00101 return;
00102 isListening=true;
00103 switch(specificity) {
00104 case GENERATOR:
00105 erouter->addListener(this,getListenGeneratorID());
00106 break;
00107 case SOURCE:
00108 erouter->addListener(this,getListenGeneratorID(),getListenSourceID());
00109 break;
00110 case TYPE:
00111 if(getListenTypeID()==EventBase::numETIDs)
00112 return;
00113 erouter->addListener(this,getListenGeneratorID(),getListenSourceID(),getListenTypeID());
00114 break;
00115 }
00116 }
00117
00118 void
00119 EventGeneratorBase::removeSrcListener() {
00120 if(!isListening)
00121 return;
00122 isListening=false;
00123 switch(specificity) {
00124 case GENERATOR:
00125 erouter->removeListener(this,getListenGeneratorID());
00126 break;
00127 case SOURCE:
00128 erouter->removeListener(this,getListenGeneratorID(),getListenSourceID());
00129 break;
00130 case TYPE:
00131 erouter->removeListener(this,getListenGeneratorID(),getListenSourceID(),getListenTypeID());
00132 break;
00133 }
00134 }
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148