Logo
~Sockets~
~Examples~
~Contact~


EventHandler Class Reference
[EventTimer event handling]

SocketHandler implementing the IEventHandler interface. More...

#include <EventHandler.h>

Inheritance diagram for EventHandler:
Collaboration diagram for EventHandler:

List of all members.


Public Member Functions

 EventHandler (StdLog *=NULL)
 EventHandler (IMutex &, StdLog *=NULL)
 ~EventHandler ()
bool GetTimeUntilNextEvent (struct timeval *tv)
 Return time left until next event.
void CheckEvents ()
 Will fire events whose time has come.
long AddEvent (IEventOwner *from, long sec, long usec)
 Schedule event for an owner.
void ClearEvents (IEventOwner *from)
 Clear all events for a specific owner.
void RemoveEvent (IEventOwner *from, long eid)
 Remove one specific event for an event owner.
void EventLoop ()
 SocketHandler while() loop implemented with event functionality.
void SetQuit (bool=true)
 Stop event loop.
void Add (Socket *)
 Add socket instance to socket map.

Private Member Functions

 EventHandler (const EventHandler &)
EventHandleroperator= (const EventHandler &)

Private Attributes

std::list< Event * > m_events
bool m_quit
TcpSocketm_socket
port_t m_port

Detailed Description

SocketHandler implementing the IEventHandler interface.

Definition at line 49 of file EventHandler.h.


Constructor & Destructor Documentation

EventHandler::EventHandler ( StdLog p = NULL  ) 

Definition at line 46 of file EventHandler.cpp.

00046                                     : SocketHandler(p), m_quit(false), m_socket(NULL)
00047 {
00048 }

EventHandler::EventHandler ( IMutex m,
StdLog p = NULL 
)

Definition at line 51 of file EventHandler.cpp.

00051                                               : SocketHandler(m, p), m_quit(false), m_socket(NULL)
00052 {
00053 }

EventHandler::~EventHandler (  ) 

Definition at line 56 of file EventHandler.cpp.

References m_events.

00057 {
00058         while (m_events.size())
00059         {
00060                 std::list<Event *>::iterator it = m_events.begin();
00061                 Event *e = *it;
00062                 e -> GetFrom() -> SetHandlerInvalid();
00063                 delete e;
00064                 m_events.erase(it);
00065         }
00066 }

EventHandler::EventHandler ( const EventHandler  )  [inline, private]

Definition at line 70 of file EventHandler.h.

00070 {} // copy constructor


Member Function Documentation

bool EventHandler::GetTimeUntilNextEvent ( struct timeval *   )  [virtual]

Return time left until next event.

Parameters:
tv Time struct that will be filled by method
Returns:
true if time is set for next event

Implements IEventHandler.

Definition at line 69 of file EventHandler.cpp.

References m_events.

Referenced by EventLoop().

00070 {
00071         if (!m_events.size())
00072                 return false;
00073         std::list<Event *>::iterator it = m_events.begin();
00074         if (it != m_events.end())
00075         {
00076                 EventTime now;
00077                 mytime_t diff = (*it) -> GetTime() - now;
00078                 if (diff < 1)
00079                 {
00080                         diff = 1;
00081                 }
00082                 tv -> tv_sec = static_cast<long>(diff / 1000000);
00083                 tv -> tv_usec = static_cast<long>(diff % 1000000);
00084                 return true;
00085         }
00086         return false;
00087 }

void EventHandler::CheckEvents (  )  [virtual]

Will fire events whose time has come.

Implements IEventHandler.

Definition at line 90 of file EventHandler.cpp.

References m_events, and SocketHandler::Valid().

Referenced by EventLoop().

00091 {
00092         EventTime now;
00093         std::list<Event *>::iterator it = m_events.begin();
00094         while (it != m_events.end() && (*it) -> GetTime() < now)
00095         {
00096                 Event *e = *it;
00097                 Socket *s = dynamic_cast<Socket *>(e -> GetFrom());
00098                 /*
00099                 s == NULL    This is another object implementing 'IEventOwner' and not a socket.
00100                 s != NULL    This is a Socket implementing IEventOwner, and we can check that the
00101                              object instance still is valid using SocketHandler::Valid.
00102                 */
00103                 if (!s || (s && Valid(s)))
00104                 {
00105                         e -> GetFrom() -> OnEvent(e -> GetID());
00106                 }
00107                 for (it = m_events.begin(); it != m_events.end(); ++it)
00108                         if (*it == e)
00109                         {
00110                                 delete e;
00111                                 break;
00112                         }
00113                 if (it != m_events.end())
00114                         m_events.erase(it);
00115                 it = m_events.begin();
00116         }
00117 }

long EventHandler::AddEvent ( IEventOwner ,
long  sec,
long  usec 
) [virtual]

Schedule event for an owner.

Parameters:
from Event owner
sec Seconds until event
usec Microseconds until event

Implements IEventHandler.

Definition at line 120 of file EventHandler.cpp.

References m_events, and m_socket.

00121 {
00122         Event *e = new Event(from, sec, usec);
00123         std::list<Event *>::iterator it = m_events.begin();
00124         while (it != m_events.end() && *(*it) < *e)
00125         {
00126                 it++;
00127         }
00128         m_events.insert(it, e);
00129         if (m_socket)
00130         {
00131                 m_socket -> Send("\n");
00132         }
00133         return e -> GetID();
00134 }

void EventHandler::ClearEvents ( IEventOwner  )  [virtual]

Clear all events for a specific owner.

Implements IEventHandler.

Definition at line 137 of file EventHandler.cpp.

References m_events.

00138 {
00139         bool repeat;
00140         do
00141         {
00142                 repeat = false;
00143                 for (std::list<Event *>::iterator it = m_events.begin(); it != m_events.end(); it++)
00144                 {
00145                         Event *e = *it;
00146                         if (e -> GetFrom() == from)
00147                         {
00148                                 delete e;
00149                                 m_events.erase(it);
00150                                 repeat = true;
00151                                 break;
00152                         }
00153                 }
00154         } while (repeat);
00155 }

void EventHandler::RemoveEvent ( IEventOwner ,
long   
) [virtual]

Remove one specific event for an event owner.

Implements IEventHandler.

Definition at line 182 of file EventHandler.cpp.

References m_events.

00183 {
00184         for (std::list<Event *>::iterator it = m_events.begin(); it != m_events.end(); it++)
00185         {
00186                 Event *e = *it;
00187                 if (from == e -> GetFrom() && eid == e -> GetID())
00188                 {
00189                         delete e;
00190                         m_events.erase(it);
00191                         break;
00192                 }
00193         }
00194 }

void EventHandler::EventLoop (  ) 

SocketHandler while() loop implemented with event functionality.

Definition at line 158 of file EventHandler.cpp.

References CheckEvents(), GetTimeUntilNextEvent(), m_quit, and SocketHandler::Select().

00159 {
00160         while (!m_quit)
00161         {
00162                 struct timeval tv;
00163                 if (GetTimeUntilNextEvent(&tv))
00164                 {
00165                         Select(&tv);
00166                         CheckEvents();
00167                 }
00168                 else
00169                 {
00170                         Select();
00171                 }
00172         }
00173 }

void EventHandler::SetQuit ( bool  x = true  ) 

Stop event loop.

Definition at line 176 of file EventHandler.cpp.

References m_quit.

00177 {
00178         m_quit = x;
00179 }

void EventHandler::Add ( Socket p  )  [virtual]

Add socket instance to socket map.

Removal is always automatic.

Reimplemented from SocketHandler.

Definition at line 197 of file EventHandler.cpp.

References SocketHandler::Add(), m_port, and m_socket.

00198 {
00199         if (!m_socket)
00200         {
00201                 ListenSocket<TcpSocket> *l = new ListenSocket<TcpSocket>(*this);
00202                 l -> SetDeleteByHandler();
00203                 l -> Bind("127.0.0.1", 0);
00204                 m_port = l -> GetPort();
00205                 SocketHandler::Add(l);
00206                 m_socket = new TcpSocket( *this );
00207                 m_socket -> SetDeleteByHandler();
00208                 m_socket -> SetConnectTimeout(5);
00209                 m_socket -> SetConnectionRetry(-1);
00210 #ifdef ENABLE_RECONNECT
00211                 m_socket -> SetReconnect(true);
00212 #endif
00213                 m_socket -> Open("127.0.0.1", m_port);
00214                 SocketHandler::Add(m_socket);
00215         }
00216         SocketHandler::Add( p );
00217 }

EventHandler& EventHandler::operator= ( const EventHandler  )  [inline, private]

Definition at line 71 of file EventHandler.h.

00071 { return *this; } // assignment operator


Member Data Documentation

bool EventHandler::m_quit [private]

Definition at line 73 of file EventHandler.h.

Referenced by EventLoop(), and SetQuit().

Definition at line 74 of file EventHandler.h.

Referenced by Add(), and AddEvent().

Definition at line 75 of file EventHandler.h.

Referenced by Add().


The documentation for this class was generated from the following files:
Page, code, and content Copyright (C) 2007 by Anders Hedström
Generated for C++ Sockets by  doxygen 1.4.4