source: nrEngine/src/EventChannel.cpp @ 1

Revision 1, 4.4 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                // we first check whenever the actor is already connected
37                if (isConnected(actor->getName())) return EVENT_ALREADY_CONNECTED;
38
39                // connect the actor to the OnEvent - Signal slot
40                mActorDb[actor->getName()] = actor;
41
42                // notice an actor that he is got a connection now
43                if (notice) actor->_noticeConnected(this);
44
45                // Log debug stuff
46                NR_Log(Log::LOG_ENGINE, Log::LL_DEBUG, "EventChannel (%s): New actor connected \"%s\"", getName().c_str(), actor->getName().c_str());
47
48                return OK;
49        }
50
51        //------------------------------------------------------------------------
52        Result EventChannel::del(EventActor* actor, bool notice)
53        {
54                // we first check whenever the actor is already connected
55                if (!isConnected(actor->getName())) return EVENT_NOT_CONNECTED;
56
57                // disconnect the actor to the OnEvent - Signal slot
58                mActorDb.erase(mActorDb.find(actor->getName()));
59
60                // notice an actor that it is disconnected now
61                if (notice) actor->_noticeDisconnected(this);
62
63                // Log debug stuff
64                NR_Log(Log::LOG_ENGINE, Log::LL_DEBUG, "EventChannel (%s): Actor \"%s\" disconnected ", getName().c_str(), actor->getName().c_str());
65
66                return OK;
67        }
68
69        //------------------------------------------------------------------------
70        void EventChannel::_disconnectAll()
71        {
72                // Profiling of the engine
73                _nrEngineProfile("EventChannel._disconnectAll");
74
75                // some logging
76                NR_Log(Log::LOG_ENGINE, Log::LL_DEBUG, "EventChannel (%s): Disconnect all actors", getName().c_str());
77
78                // iterate through all connections and close them
79                ActorDatabase::iterator it = mActorDb.begin();
80                for (; it != mActorDb.end(); it++){
81                        mActorDb.erase(it);
82                        it->second->_noticeDisconnected(this);
83                }
84
85        }
86
87        //------------------------------------------------------------------------
88        bool EventChannel::isConnected(const std::string& name)
89        {
90                ActorDatabase::iterator it = mActorDb.find(name);
91                return it != mActorDb.end();
92        }
93
94        //------------------------------------------------------------------------
95        void EventChannel::emit (SharedPtr<Event> event)
96        {
97                // iterate through all connected actors and emit the signal
98                ActorDatabase::iterator it = mActorDb.begin();
99                for (; it != mActorDb.end(); it++){
100                        it->second->OnEvent(*this, event);
101                }
102        }
103
104        //------------------------------------------------------------------------
105        void EventChannel::push (SharedPtr<Event> event)
106        {
107                // check if the event priority is immediat
108                if (event->getPriority() == Priority::IMMEDIATE){
109                        emit(event);
110                }else{
111                        mEventQueue.push(event);
112                }
113        }
114
115
116        //------------------------------------------------------------------------
117        void EventChannel::deliver()
118        {
119                // Profiling of the engine
120                _nrEngineProfile("EventChannel.deliver");
121
122                // we go through all elements in our event queue and deliver
123                // the messages from the queue to connected actors
124                while (!mEventQueue.empty()){
125                        emit(mEventQueue.top());
126                        mEventQueue.pop();
127                }
128
129        }
130
131}; // end namespace
132
Note: See TracBrowser for help on using the repository browser.