1 /** \file EventHandler.cpp
3 ** \author grymse@alhem.net
6 Copyright (C) 2005,2007 Anders Hedstrom
8 This library is made available under the terms of the GNU GPL.
10 If you would like to use this library in a closed-source application,
11 a separate license agreement is available. For information about
12 the closed-source license agreement for the C++ sockets library,
13 please visit http://www.alhem.net/Sockets/license.html and/or
14 email license@alhem.net.
16 This program is free software; you can redistribute it and/or
17 modify it under the terms of the GNU General Public License
18 as published by the Free Software Foundation; either version 2
19 of the License, or (at your option) any later version.
21 This program is distributed in the hope that it will be useful,
22 but WITHOUT ANY WARRANTY; without even the implied warranty of
23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 GNU General Public License for more details.
26 You should have received a copy of the GNU General Public License
27 along with this program; if not, write to the Free Software
28 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
31 #pragma warning(disable:4786)
33 #include "EventHandler.h"
34 #include "IEventOwner.h"
37 #include "TcpSocket.h"
38 #include "ListenSocket.h"
41 #ifdef SOCKETS_NAMESPACE
42 namespace SOCKETS_NAMESPACE
{
46 EventHandler::EventHandler(StdLog
*p
) : SocketHandler(p
), m_quit(false), m_socket(NULL
)
51 EventHandler::EventHandler(Mutex
& m
,StdLog
*p
) : SocketHandler(m
, p
), m_quit(false), m_socket(NULL
)
56 EventHandler::~EventHandler()
58 while (m_events
.size())
60 std::list
<Event
*>::iterator it
= m_events
.begin();
62 e
-> GetFrom() -> SetHandlerInvalid();
69 bool EventHandler::GetTimeUntilNextEvent(struct timeval
*tv
)
73 std::list
<Event
*>::iterator it
= m_events
.begin();
74 if (it
!= m_events
.end())
77 mytime_t diff
= (*it
) -> GetTime() - now
;
82 tv
-> tv_sec
= static_cast<long>(diff
/ 1000000);
83 tv
-> tv_usec
= static_cast<long>(diff
% 1000000);
90 void EventHandler::CheckEvents()
93 std::list
<Event
*>::iterator it
= m_events
.begin();
94 while (it
!= m_events
.end() && (*it
) -> GetTime() < now
)
97 Socket
*s
= dynamic_cast<Socket
*>(e
-> GetFrom());
99 s == NULL This is another object implementing 'IEventOwner' and not a socket.
100 s != NULL This is a Socket implementing IEventOwner, and we can check that the
101 object instance still is valid using SocketHandler::Valid.
103 if (!s
|| (s
&& Valid(s
)))
105 e
-> GetFrom() -> OnEvent(e
-> GetID());
107 for (it
= m_events
.begin(); it
!= m_events
.end(); ++it
)
111 if (it
!= m_events
.end())
113 it
= m_events
.begin();
118 long EventHandler::AddEvent(IEventOwner
*from
,long sec
,long usec
)
120 Event
*e
= new Event(from
, sec
, usec
);
121 std::list
<Event
*>::iterator it
= m_events
.begin();
122 while (it
!= m_events
.end() && *(*it
) < *e
)
126 m_events
.insert(it
, e
);
129 m_socket
-> Send("\n");
135 void EventHandler::ClearEvents(IEventOwner
*from
)
141 for (std::list
<Event
*>::iterator it
= m_events
.begin(); it
!= m_events
.end(); it
++)
144 if (e
-> GetFrom() == from
)
156 void EventHandler::EventLoop()
161 if (GetTimeUntilNextEvent(&tv
))
174 void EventHandler::SetQuit(bool x
)
180 void EventHandler::RemoveEvent(IEventOwner
*from
, long eid
)
182 for (std::list
<Event
*>::iterator it
= m_events
.begin(); it
!= m_events
.end(); it
++)
185 if (from
== e
-> GetFrom() && eid
== e
-> GetID())
195 void EventHandler::Add(Socket
*p
)
199 ListenSocket
<TcpSocket
> *l
= new ListenSocket
<TcpSocket
>(*this);
200 l
-> SetDeleteByHandler();
201 l
-> Bind("127.0.0.1", 0);
202 m_port
= l
-> GetPort();
203 SocketHandler::Add(l
);
204 m_socket
= new TcpSocket( *this );
205 m_socket
-> SetDeleteByHandler();
206 m_socket
-> SetConnectTimeout(5);
207 m_socket
-> SetConnectionRetry(-1);
208 #ifdef ENABLE_RECONNECT
209 m_socket
-> SetReconnect(true);
211 m_socket
-> Open("127.0.0.1", m_port
);
212 SocketHandler::Add(m_socket
);
214 SocketHandler::Add( p
);
218 #ifdef SOCKETS_NAMESPACE