Main Page | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

CSMessageDispatchable.cpp

Go to the documentation of this file.
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 }

Generated on Wed Jul 14 00:43:31 2004 for CSLib by doxygen 1.3.6