1 // File: Events_Loop.hxx
2 // Created: Thu Mar 13 2014
3 // Author: Mikhail PONIKAROV
5 #include <Events_Loop.h>
12 Events_Loop* Events_Loop::loop()
14 // initialized on initialization of the application
15 static Events_Loop MAIN_LOOP;
19 Events_ID Events_Loop::eventByName(const char* theName)
21 ///! All events created in this session, uniquely identified by the text and char pointer
22 static map<string, char*> CREATED_EVENTS;
24 string aName(theName);
25 map<string, char*>::iterator aFound = CREATED_EVENTS.find(aName);
26 if (aFound == CREATED_EVENTS.end()) { //not created yet
27 aResult = strdup(theName); // copy to make unique internal pointer
28 CREATED_EVENTS[aName] = aResult;
30 aResult = aFound->second;
32 return Events_ID(aResult);
35 void Events_Loop::send(Events_Message& theMessage)
37 // TO DO: make it in thread and wit husage of semaphores
39 map<char*, map<void*, list<Events_Listener*> > >::iterator aFindID = myListeners.find(
40 theMessage.eventID().eventText());
41 if (aFindID != myListeners.end()) {
42 map<void*, list<Events_Listener*> >::iterator aFindSender = aFindID->second.find(
44 if (aFindSender != aFindID->second.end()) {
45 list<Events_Listener*>& aListeners = aFindSender->second;
46 for(list<Events_Listener*>::iterator aL = aListeners.begin(); aL != aListeners.end(); aL++)
47 (*aL)->processEvent(&theMessage);
49 if (theMessage.sender()) { // also call for NULL senders registered
50 aFindSender = aFindID->second.find(NULL);
51 if (aFindSender != aFindID->second.end()) {
52 list<Events_Listener*>& aListeners = aFindSender->second;
53 for(list<Events_Listener*>::iterator aL = aListeners.begin(); aL != aListeners.end(); aL++)
54 (*aL)->processEvent(&theMessage);
60 void Events_Loop::registerListener(Events_Listener* theListener, const Events_ID theID,
63 map<char*, map<void*, list<Events_Listener*> > >::iterator aFindID = myListeners.find(
65 if (aFindID == myListeners.end()) { // create container associated with ID
66 myListeners[theID.eventText()] = map<void*, list<Events_Listener*> >();
67 aFindID = myListeners.find(theID.eventText());
70 map<void*, list<Events_Listener*> >::iterator aFindSender = aFindID->second.find(theSender);
71 if (aFindSender == aFindID->second.end()) { // create container associated with sender
72 aFindID->second[theSender] = list<Events_Listener*>();
73 aFindSender = aFindID->second.find(theSender);
75 // check that listener was not registered wit hsuch parameters before
76 list<Events_Listener*>& aListeners = aFindSender->second;
77 for(list<Events_Listener*>::iterator aL = aListeners.begin(); aL != aListeners.end(); aL++)
78 if (*aL == theListener)
79 return; // avoid duplicates
81 aListeners.push_back(theListener);