source: nrEngine/src/EventChannel.cpp @ 19

Revision 19, 4.7 KB checked in by art, 13 years ago (diff)
Line 
1/***************************************************************************
2 *                                                                         *
3 *   (c) Art Tevs, MPI Informatik Saarbruecken                             *
4 *       mailto: <tevs@mpi-sb.mpg.de>                                      *
5 *                                                                         *
6 *   This program is free software; you can redistribute it and/or modify  *
7 *   it under the terms of the GNU General Public License as published by  *
8 *   the Free Software Foundation; either version 2 of the License, or     *
9 *   (at your option) any later version.                                   *
10 *                                                                         *
11 ***************************************************************************/
12
13//----------------------------------------------------------------------------------
14// Includes
15//----------------------------------------------------------------------------------
16#include "EventChannel.h"
17#include "Log.h"
18#include "Profiler.h"
19
20namespace nrEngine{
21
22        //------------------------------------------------------------------------
23        EventChannel::EventChannel(EventManager* manager, const std::string& name) : mName(name){
24                mParentManager = manager;
25        }
26
27        //------------------------------------------------------------------------
28        EventChannel::~EventChannel(){
29                // disconnect all actors
30                _disconnectAll();
31        }
32
33        //------------------------------------------------------------------------
34        Result EventChannel::add(EventActor* actor, bool notice)
35        {
36                // check if actor has got a name
37                if (actor == NULL) return OK;
38                if (actor->getName().length() == 0)
39                {
40                        NR_Log(Log::LOG_ENGINE, Log::LL_ERROR, "EventChannel (%s): Want to connect nameless actor", getName().c_str());
41                        return EVENT_NO_VALID_ACTOR;
42                }
43               
44                // we first check whenever the actor is already connected
45                if (isConnected(actor->getName())) return EVENT_ALREADY_CONNECTED;
46
47                // connect the actor to the OnEvent - Signal slot
48                mActorDb[actor->getName()] = actor;
49
50                // notice an actor that he is got a connection now
51                if (notice) actor->_noticeConnected(this);
52
53                // Log debug stuff
54                NR_Log(Log::LOG_ENGINE, Log::LL_DEBUG, "EventChannel (%s): New actor connected \"%s\"", getName().c_str(), actor->getName().c_str());
55
56                return OK;
57        }
58
59        //------------------------------------------------------------------------
60        Result EventChannel::del(EventActor* actor, bool notice)
61        {
62                if (actor == NULL) return OK;
63               
64                // we first check whenever the actor is already connected
65                if (!isConnected(actor->getName())) return EVENT_NOT_CONNECTED;
66
67                // disconnect the actor to the OnEvent - Signal slot
68                mActorDb.erase(mActorDb.find(actor->getName()));
69
70                // notice an actor that it is disconnected now
71                if (notice) actor->_noticeDisconnected(this);
72
73                // Log debug stuff
74                NR_Log(Log::LOG_ENGINE, Log::LL_DEBUG, "EventChannel (%s): Actor \"%s\" disconnected ", getName().c_str(), actor->getName().c_str());
75
76                return OK;
77        }
78
79        //------------------------------------------------------------------------
80        void EventChannel::_disconnectAll()
81        {
82                // Profiling of the engine
83                _nrEngineProfile("EventChannel._disconnectAll");
84
85                // some logging
86                NR_Log(Log::LOG_ENGINE, Log::LL_DEBUG, "EventChannel (%s): Disconnect all actors", getName().c_str());
87
88                // iterate through all connections and close them
89                ActorDatabase::iterator it = mActorDb.begin();
90                for (; it != mActorDb.end(); it++){
91                        mActorDb.erase(it);
92                        it->second->_noticeDisconnected(this);
93                }
94
95        }
96
97        //------------------------------------------------------------------------
98        bool EventChannel::isConnected(const std::string& name)
99        {
100                ActorDatabase::iterator it = mActorDb.find(name);
101                return it != mActorDb.end();
102        }
103
104        //------------------------------------------------------------------------
105        void EventChannel::emit (SharedPtr<Event> event)
106        {
107                // iterate through all connected actors and emit the signal
108                ActorDatabase::iterator it = mActorDb.begin();
109                for (; it != mActorDb.end(); it++){
110                        it->second->OnEvent(*this, event);
111                }
112        }
113
114        //------------------------------------------------------------------------
115        void EventChannel::push (SharedPtr<Event> event)
116        {
117                // check if the event priority is immediat
118                if (event->getPriority() == Priority::IMMEDIATE){
119                        emit(event);
120                }else{
121                        mEventQueue.push(event);
122                }
123        }
124
125
126        //------------------------------------------------------------------------
127        void EventChannel::deliver()
128        {
129                // Profiling of the engine
130                _nrEngineProfile("EventChannel.deliver");
131
132                // we go through all elements in our event queue and deliver
133                // the messages from the queue to connected actors
134                while (!mEventQueue.empty()){
135                        emit(mEventQueue.top());
136                        mEventQueue.pop();
137                }
138
139        }
140
141}; // end namespace
142
Note: See TracBrowser for help on using the repository browser.