source: nrEngine/src/EventActor.cpp @ 19

Revision 19, 4.6 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 "EventActor.h"
17#include "EventManager.h"
18#include "EventChannel.h"
19#include "Engine.h"
20
21namespace nrEngine{
22
23        //------------------------------------------------------------------------
24        EventActor::EventActor()
25        {
26       
27        }
28
29        //------------------------------------------------------------------------
30        EventActor::EventActor(const std::string& name) : mName(name){
31        }
32                       
33        //------------------------------------------------------------------------
34        EventActor::~EventActor()
35        {
36                // first let each channel know, that we want to disconnect now
37                std::list<std::string>::iterator it = mChannel.begin();
38                for (; it != mChannel.end(); it++){
39                        Engine::sEventManager()->getChannel(*it)->del(this, false);
40                }
41
42        }
43
44        //------------------------------------------------------------------------
45        void EventActor::setName(const std::string& name)
46        {
47                mName = name;
48        }
49       
50       
51        //------------------------------------------------------------------------
52        const std::string& EventActor::getName() const
53        {
54                return mName;
55        }
56
57        //------------------------------------------------------------------------
58        /*void EventActor::OnEvent(const EventChannel& channel, SharedPtr<Event> event)
59        {
60                // we call the pure virtual derived function which has to be
61                // overloaded for different event types.
62                _OnEvent(channel, event);
63        }*/
64       
65        //------------------------------------------------------------------------
66        Result EventActor::emit(SharedPtr<Event> event)
67        {
68                // iterate through channels and emit messages
69                std::list<std::string>::iterator it = mChannel.begin();
70                for (; it != mChannel.end(); it++)
71                {
72                        Result res = Engine::sEventManager()->emit(*it, event);
73                        if (res != OK) 
74                        {
75                                NR_Log(Log::LOG_ENGINE, Log::LL_ERROR, "EventActor: Cannot emit message to '%s'", it->c_str());
76                                return res;
77                        }
78                }
79                return OK;
80        }
81
82        //------------------------------------------------------------------------
83        Result EventActor::connect (const std::string& name)
84        {
85                // get a channel
86                SharedPtr<EventChannel> channel = Engine::sEventManager()->getChannel(name);
87                if (!channel) return EVENT_NO_CHANNEL_FOUND;
88
89                // check if we are already connected
90                if (isConnected(name)) return EVENT_ALREADY_CONNECTED;
91               
92                // ask the channel to connect me to it
93                channel->add(this);
94                               
95                // ok
96                return OK;
97        }
98       
99        //------------------------------------------------------------------------
100        Result EventActor::disconnect (const std::string& name)
101        {
102                // get a channel
103                SharedPtr<EventChannel> channel = Engine::sEventManager()->getChannel(name);
104                if (!channel) return EVENT_NO_CHANNEL_FOUND;
105               
106                // check if we are already connected
107                if (!isConnected(name)) return EVENT_NOT_CONNECTED;
108               
109                // ask the channel to connect me to it
110                channel->del(this);
111
112                // ok
113                return OK;
114        }
115
116        //------------------------------------------------------------------------
117        bool EventActor::isConnected(const std::string& name)
118        {
119                // search for the name in the list
120                return std::find(mChannel.begin(), mChannel.end(), name) != mChannel.end();
121        }
122
123        //------------------------------------------------------------------------
124        void EventActor::_noticeConnected(EventChannel* channel)
125        {
126                // add the name of this channel to the list
127                if (!isConnected(channel->getName()))
128                        mChannel.push_back(channel->getName());
129        }
130
131       
132        //------------------------------------------------------------------------
133        void EventActor::_noticeDisconnected(EventChannel* channel)
134        {
135                // delete the name of this channel in the connection list
136                if (isConnected(channel->getName()))
137                        mChannel.erase(std::find(mChannel.begin(), mChannel.end(), channel->getName()));
138        }
139       
140}; // end namespace     
141
Note: See TracBrowser for help on using the repository browser.