Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members

subscriber.h

00001 //-*- C++ -*-
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_ ; // only available when receiving an event
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

Generated on Mon Jan 30 11:57:50 2006 for EventListener by  doxygen 1.3.9.1