1 // File: Event_Loop.hxx
2 // Created: Thu Mar 13 2014
3 // Author: Mikhail PONIKAROV
5 #include <Event_Loop.h>
12 Event_Loop* Event_Loop::loop()
14 // initialized on initialization of the application
15 static Event_Loop MAIN_LOOP;
19 Event_ID Event_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 Event_ID(aResult);
35 void Event_Loop::send(Event_Message& theMessage)
37 // TO DO: make it in thread and wit husage of semaphores
39 map<char*, map<void*, list<Event_Listener*> > >::iterator aFindID = myListeners.find(
40 theMessage.eventID().eventText());
41 if (aFindID != myListeners.end()) {
42 map<void*, list<Event_Listener*> >::iterator aFindSender = aFindID->second.find(
44 if (aFindSender != aFindID->second.end()) {
45 list<Event_Listener*>& aListeners = aFindSender->second;
46 for(list<Event_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<Event_Listener*>& aListeners = aFindSender->second;
53 for(list<Event_Listener*>::iterator aL = aListeners.begin(); aL != aListeners.end(); aL++)
54 (*aL)->processEvent(&theMessage);
60 void Event_Loop::registerListener(Event_Listener* theListener, const Event_ID theID,
63 map<char*, map<void*, list<Event_Listener*> > >::iterator aFindID = myListeners.find(
65 if (aFindID == myListeners.end()) { // create container associated with ID
66 myListeners[theID.eventText()] = map<void*, list<Event_Listener*> >();
67 aFindID = myListeners.find(theID.eventText());
70 map<void*, list<Event_Listener*> >::iterator aFindSender = aFindID->second.find(theSender);
71 if (aFindSender == aFindID->second.end()) { // create container associated with sender
72 aFindID->second[theSender] = list<Event_Listener*>();
73 aFindSender = aFindID->second.find(theSender);
75 // check that listener was not registered wit hsuch parameters before
76 list<Event_Listener*>& aListeners = aFindSender->second;
77 for(list<Event_Listener*>::iterator aL = aListeners.begin(); aL != aListeners.end(); aL++)
78 if (*aL == theListener)
79 return; // avoid duplicates
81 aListeners.push_back(theListener);