00001 /****************************************************************************** 00002 ** Copyright (c) 1992-2010 VT MAK 00003 ** All rights reserved. 00004 ******************************************************************************/ 00005 00008 00009 #ifndef observeEvent_H_ 00010 #define observeEvent_H_ 00011 00012 #include <list> 00013 #include <algorithm> 00014 #include <vlutil/vlSmartPointers.h> 00015 00016 #include <vlutil/vlExceptions.h> 00017 #include "observeConnection.h" 00018 #include "observe.h" 00019 00020 namespace MAKLogger 00021 { 00022 00026 template<typename SubjectType> 00027 class DtObserveEvent : public DtObserveConnectionComponent 00028 { 00029 00030 public: 00032 typedef DtObserver<SubjectType> SubjectObserver; 00033 typedef std::list<DtObserver<SubjectType>*> ObserverList; 00034 00036 DtObserveEvent() : 00037 myObservers() 00038 { 00039 } 00040 00042 virtual ~DtObserveEvent() 00043 { 00044 } 00045 00054 virtual void connect(DtObserveConnectionSP con) 00055 { 00056 if(!con) 00057 { 00058 throw DtInvalidInput("Connection may not be null."); 00059 } 00060 DtObserveConnectionComponent::connect(con); 00061 SubjectObserver* observer = reinterpret_cast<SubjectObserver*> 00062 (con->observer()); 00063 typename ObserverList::iterator it; 00064 it = std::find(myObservers.begin(),myObservers.end(),observer); 00065 if(it == myObservers.end()) 00066 { 00067 myObservers.push_back(observer); 00068 } 00069 } 00070 00071 00085 00086 virtual void disconnect(DtObserveConnectionSP con) 00087 { 00088 if(!con) 00089 { 00090 throw DtInvalidInput("Connection may not be null."); 00091 } 00092 DtObserveConnectionComponent::disconnect(con); 00093 SubjectObserver* observer = reinterpret_cast<SubjectObserver*> 00094 (con->observer()); 00095 myObservers.remove(observer); 00096 } 00097 00099 virtual void disconnect(SubjectObserver* observer) 00100 { 00101 DtObserveConnectionSP sharedCon = findEventObserverConnection(this, 00102 reinterpret_cast<DtObserveConnectionComponent*>(observer)); 00103 if(sharedCon) 00104 { 00105 sharedCon->disconnect(sharedCon); 00106 } 00107 } 00108 00111 void observeSubject(const SubjectType& value) 00112 { 00113 typename ObserverList::iterator obs; 00114 obs = myObservers.begin(); 00115 for(;obs != myObservers.end();++obs) 00116 { 00117 (*obs)->observe(value); 00118 } 00119 } 00120 00121 protected: 00122 00124 ObserverList myObservers; 00125 }; 00126 00127 } 00128 00129 #endif 00130