EventHandler Class ReferenceSocketHandler implementing the IEventHandler interface.
More...
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 &) | |
| EventHandler & | operator= (const EventHandler &) |
Private Attributes | |
| std::list< Event * > | m_events |
| bool | m_quit |
| TcpSocket * | m_socket |
| port_t | m_port |
Definition at line 49 of file EventHandler.h.
| EventHandler::EventHandler | ( | StdLog * | p = NULL |
) |
Definition at line 46 of file EventHandler.cpp.
00046 : SocketHandler(p), m_quit(false), m_socket(NULL) 00047 { 00048 }
Definition at line 51 of file EventHandler.cpp.
00051 : SocketHandler(m, p), m_quit(false), m_socket(NULL) 00052 { 00053 }
| EventHandler::~EventHandler | ( | ) |
| EventHandler::EventHandler | ( | const EventHandler & | ) | [inline, private] |
| bool EventHandler::GetTimeUntilNextEvent | ( | struct timeval * | ) | [virtual] |
Return time left until next event.
| tv | Time struct that will be filled by method |
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.
| 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] |
std::list<Event *> EventHandler::m_events [private] |
Definition at line 72 of file EventHandler.h.
Referenced by AddEvent(), CheckEvents(), ClearEvents(), GetTimeUntilNextEvent(), RemoveEvent(), and ~EventHandler().
bool EventHandler::m_quit [private] |
TcpSocket* EventHandler::m_socket [private] |
port_t EventHandler::m_port [private] |
1.4.4