00001 00034 #ifndef LLMEDIAEMITTER_H 00035 #define LLMEDIAEMITTER_H 00036 00037 #include <list> 00038 #include <algorithm> 00039 #include <typeinfo> 00040 00042 // 00043 template< class T > 00044 class LLMediaEmitter 00045 { 00046 public: 00047 LLMediaEmitter() { }; 00048 ~LLMediaEmitter() { }; 00049 00050 typedef typename T::EventType EventType; 00051 typedef std::list< T* > ObserverContainer; 00052 typedef void( T::*observerMethod )( const EventType& ); 00053 00055 // 00056 bool addObserver( T* observer_in ) 00057 { 00058 if ( ! observer_in ) 00059 return false; 00060 00061 if ( std::find( observers.begin(), observers.end(), observer_in) != observers.end() ) 00062 return false; 00063 00064 observers.push_back( observer_in ); 00065 00066 return true; 00067 }; 00068 00070 // 00071 bool remObserver( T* observer_in ) 00072 { 00073 if ( ! observer_in ) 00074 return false; 00075 00076 observers.remove( observer_in ); 00077 observers.remove( observer_in ); 00078 observers.remove( observer_in ); 00079 00080 00081 00082 return true; 00083 }; 00084 00086 // 00087 void update( observerMethod method, const EventType& msgIn ) 00088 { 00089 typename std::list< T* >::iterator iter = observers.begin(); 00090 00091 while( iter != observers.end() ) 00092 { 00093 ( ( *iter )->*method )( msgIn ); 00094 00095 ++iter; 00096 }; 00097 }; 00098 00099 protected: 00100 ObserverContainer observers; 00101 }; 00102 00103 #endif // LLMEDIAEMITTER_H