00001 #ifdef WIN32 00002 #pragma warning(disable : 4786 ) 00003 #endif 00004 00005 #include "CSMessageDispatchable.h" 00006 #include "CSMessageListener.h" 00007 #include "CSMessage.h" 00008 00009 const char *CSMessageDispatchable::CLASS = "CSMessageDispatchable"; 00010 00011 void CSMessageDispatchable::sendMessage(CSMessage &message) 00012 { 00013 static char *functionName="sendMessage"; 00014 // saftey meassure. if a listener is removed while sending! 00015 ListenerInteresteds listeners = mListeners; 00016 ListenerInteresteds::iterator iter; 00017 for (iter = listeners.begin(); iter != listeners.end(); iter++) 00018 { 00019 ListenerInterested *listenerInterested = *iter; 00020 if ((listenerInterested->mInterestedIn == -1 ) || (listenerInterested->mInterestedIn == message.getType())) 00021 { 00022 // todo! 00023 // something to make sure, that a message is not sent twice to the same listener! 00024 listenerInterested->mListener->dispatchMessage(&message); 00025 } 00026 } 00027 } 00028 00029 void CSMessageDispatchable::addMessageListener(CSMessageListener* listener, int typeOfMessage) 00030 { 00031 static char *functionName="addMessageListener"; 00032 LOG_ENTER 00033 // savety meassure, not to add twice! 00034 removeMessageListener(listener, typeOfMessage); 00035 ListenerInterested *listenerInterested = new ListenerInterested(listener, typeOfMessage); 00036 mListeners.push_back(listenerInterested); 00037 LOG_EXIT 00038 } 00039 00040 int CSMessageDispatchable::removeMessageListener(CSMessageListener* listener) 00041 { 00042 static char *functionName="removeMessageListener"; 00043 LOG_ENTER 00044 int count = 0; 00045 ListenerInteresteds::iterator iter = mListeners.begin(); 00046 while ( iter != mListeners.end()) 00047 { 00048 if ((*iter)->mListener == listener) 00049 { 00050 mListeners.erase(iter); 00051 delete ((*iter)); 00052 iter = mListeners.begin(); // restart! 00053 count++; 00054 } 00055 else 00056 { 00057 iter++; 00058 } 00059 } 00060 00061 // TODO: ensure, that the listener is not currently enqueued with 00062 // a waiting message! 00063 LOG_EXIT 00064 return count; 00065 } 00066 00067 int CSMessageDispatchable::removeMessageListener(CSMessageListener* listener, int typeOfMessage) 00068 { 00069 static char *functionName="removeMessageListener"; 00070 LOG_ENTER 00071 int count = 0; 00072 ListenerInteresteds::iterator iter = mListeners.begin(); 00073 while ( iter != mListeners.end()) 00074 { 00075 ListenerInterested *listenerInterested = *iter; 00076 if ((listenerInterested->mInterestedIn == typeOfMessage) 00077 && ( listenerInterested->mListener == listener)) 00078 { 00079 mListeners.erase(iter); 00080 delete (listenerInterested); 00081 iter = mListeners.begin(); 00082 count++; 00083 } 00084 else 00085 { 00086 iter++; 00087 } 00088 } 00089 // TODO: ensure, that the listener is not currently enqueued with 00090 // a waiting message! 00091 LOG_EXIT 00092 return count; 00093 }