source: nrEngine/src/EventActor.cpp @ 15

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