1 // File: Event_Loop.hxx
2 // Created: Thu Mar 13 2014
3 // Author: Mikhail PONIKAROV
5 #include <Event_Loop.h>
10 Event_Loop* Event_Loop::Loop()
12 // initialized on initialization of the application
13 static Event_Loop MAIN_LOOP;
17 Event_ID Event_Loop::EventByName(const char* theName)
19 ///! All events created in this session, uniquely identified by the text and char pointer
20 static map<string, char*> CREATED_EVENTS;
22 string aName(theName);
23 map<string, char*>::iterator aFound = CREATED_EVENTS.find(aName);
24 if (aFound == CREATED_EVENTS.end()) { //not created yet
25 aResult = strdup(theName); // copy to make unique internal pointer
26 CREATED_EVENTS[aName] = aResult;
28 aResult = aFound->second;
30 return Event_ID(aResult);
33 void Event_Loop::Send(Event_Message& theMessage)
35 // TO DO: make it in thread and wit husage of semaphores
37 map<char*, map<void*, list<Event_Listener*> > >::iterator aFindID = myListeners.find(
38 theMessage.EventID().EventText());
39 if (aFindID != myListeners.end()) {
40 map<void*, list<Event_Listener*> >::iterator aFindSender = aFindID->second.find(
42 if (aFindSender != aFindID->second.end()) {
43 list<Event_Listener*>& aListeners = aFindSender->second;
44 for(list<Event_Listener*>::iterator aL = aListeners.begin(); aL != aListeners.end(); aL++)
45 (*aL)->ProcessEvent(&theMessage);
47 if (theMessage.Sender()) { // also call for NULL senders registered
48 aFindSender = aFindID->second.find(NULL);
49 if (aFindSender != aFindID->second.end()) {
50 list<Event_Listener*>& aListeners = aFindSender->second;
51 for(list<Event_Listener*>::iterator aL = aListeners.begin(); aL != aListeners.end(); aL++)
52 (*aL)->ProcessEvent(&theMessage);
58 void Event_Loop::RegisterListener(Event_Listener* theListener, const Event_ID theID,
61 map<char*, map<void*, list<Event_Listener*> > >::iterator aFindID = myListeners.find(
63 if (aFindID == myListeners.end()) { // create container associated with ID
64 myListeners[theID.EventText()] = map<void*, list<Event_Listener*> >();
65 aFindID = myListeners.find(theID.EventText());
68 map<void*, list<Event_Listener*> >::iterator aFindSender = aFindID->second.find(theSender);
69 if (aFindSender == aFindID->second.end()) { // create container associated with sender
70 aFindID->second[theSender] = list<Event_Listener*>();
71 aFindSender = aFindID->second.find(theSender);
73 // check that listener was not registered wit hsuch parameters before
74 list<Event_Listener*>& aListeners = aFindSender->second;
75 for(list<Event_Listener*>::iterator aL = aListeners.begin(); aL != aListeners.end(); aL++)
76 if (*aL == theListener)
77 return; // avoid duplicates
79 aListeners.push_back(theListener);