Salome HOME
Implimentation of the Config XML Reader
[modules/shaper.git] / src / Event / Event_Loop.cxx
1 // File:        Event_Loop.hxx
2 // Created:     Thu Mar 13 2014
3 // Author:      Mikhail PONIKAROV
4
5 #include <Event_Loop.hxx>
6 #include <string>
7
8 using namespace std;
9
10 Event_Loop* Event_Loop::Loop()
11 {
12   // initialized on initialization of the application
13   static Event_Loop MAIN_LOOP;
14   return &MAIN_LOOP;
15 }
16
17 Event_ID Event_Loop::EventByName(const char* theName)
18 {
19   ///! All events created in this session, uniquely identified by the text and char pointer
20   static map<string, char*> CREATED_EVENTS;
21   char* aResult;
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;
27   } else 
28     aResult = aFound->second;
29
30   return Event_ID(aResult);
31 }
32
33 void Event_Loop::Send(Event_Message& theMessage)
34 {
35   // TO DO: make it in thread and wit husage of semaphores
36
37   map<char*, map<void*, list<Event_Listener*> > >::iterator aFindID = 
38     myListeners.find(theMessage.ID().EventText());
39   if (aFindID != myListeners.end()) {
40     map<void*, list<Event_Listener*> >::iterator aFindSender = 
41       aFindID->second.find(theMessage.Sender());
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);
46     }
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);
53       }
54     }
55   }
56 }
57
58 void Event_Loop::RegisterListener(
59   Event_Listener* theListener, const Event_ID theID, void* theSender)
60 {
61   map<char*, map<void*, list<Event_Listener*> > >::iterator aFindID = 
62     myListeners.find(theID.EventText());
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());
66   }
67
68   map<void*, list<Event_Listener*> >::iterator aFindSender = 
69     aFindID->second.find(theSender);
70   if (aFindSender == aFindID->second.end()) { // create container associated with sender
71     aFindID->second[theSender] = list<Event_Listener*>();
72     aFindSender = aFindID->second.find(theSender);
73   }
74   // check that listener was not registered wit hsuch parameters before
75   list<Event_Listener*>& aListeners = aFindSender->second;
76   for(list<Event_Listener*>::iterator aL = aListeners.begin(); aL != aListeners.end(); aL++)
77     if (*aL == theListener) return; // avoid duplicates
78
79   aListeners.push_back(theListener);
80 }