00001
00002
00003 #ifndef __LISTENER__subscriber_h__
00004 #define __LISTENER__subscriber_h__
00005
00006 #include "common.h"
00007 #include "listener.h"
00008 #include <list>
00009
00010
00022 #define igs_add_listener(PUB, LIS, FUNC) add_listener( new LIS(PUB, FUNC)) ;
00023
00024 namespace listener {
00025
00026 class MultiplexerListener ;
00027 class Publisher ;
00028
00042 class IGSLISTENER Subscriber {
00043 public:
00044 Subscriber() ;
00045 virtual ~Subscriber() ;
00046
00051 Listener::ID add_listener(Listener* l) ;
00052
00058 bool remove_listener_with_id(const Listener::ID& id) ;
00059
00063 void remove_all_listener() ;
00064
00068 void add_event_filter(Listener::ID, EventFilter*) ;
00069
00074 void add_event_filter(EventFilter*) ;
00075
00080 void remove_all_event_filters() ;
00081
00085 Listener* get_listener_with_id(const Listener::ID&) const ;
00086
00090 void block_events() ;
00091
00095 void unblock_events() ;
00096
00100 bool are_events_blocked() const ;
00101
00102 void dump_subscriber(std::ostream&, int spaces=0) ;
00103
00104 protected:
00111 Publisher* get_source() ;
00112
00118 template <typename LISTENER>
00119 Listener::ID register_listener() {return add_self_listener(dynamic_cast<LISTENER*>(this)) ;}
00120
00121 private:
00122 friend class Publisher ;
00123 friend class MultiplexerListener ;
00124 typedef std::list<Listener*> Listeners ;
00125 typedef Listeners::const_iterator const_iterator ;
00126 typedef std::list<EventFilter_var> Filters ;
00127 const_iterator begin_listeners() const {return listeners_.begin() ;}
00128 const_iterator end_listeners() const {return listeners_.end() ;}
00129 Listener::ID add_self_listener(Listener* l) ;
00130 bool remove_listener_with_id_no_delegate(const Listener::ID& id) ;
00131 Listeners listeners_ ;
00132 Filters event_filters_ ;
00133 Publisher* source_ ;
00134 bool blocked_ ;
00135
00136 } ;
00137
00138
00139 inline Publisher* Subscriber::get_source() {
00140 return source_ ;
00141 }
00142
00143 inline bool Subscriber::are_events_blocked() const {
00144 return blocked_ ;
00145 }
00146
00147 }
00148
00149 #endif