00001
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifdef _MSC_VER
00031 #pragma warning(disable:4786)
00032 #endif
00033 #include "EventHandler.h"
00034 #include "IEventOwner.h"
00035 #include "Event.h"
00036 #include "Socket.h"
00037 #include "TcpSocket.h"
00038 #include "ListenSocket.h"
00039
00040
00041 #ifdef SOCKETS_NAMESPACE
00042 namespace SOCKETS_NAMESPACE {
00043 #endif
00044
00045
00046 EventHandler::EventHandler(StdLog *p) : SocketHandler(p), m_quit(false), m_socket(NULL)
00047 {
00048 }
00049
00050
00051 EventHandler::EventHandler(IMutex& m,StdLog *p) : SocketHandler(m, p), m_quit(false), m_socket(NULL)
00052 {
00053 }
00054
00055
00056 EventHandler::~EventHandler()
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 }
00067
00068
00069 bool EventHandler::GetTimeUntilNextEvent(struct timeval *tv)
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 }
00088
00089
00090 void EventHandler::CheckEvents()
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
00100
00101
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 }
00118
00119
00120 long EventHandler::AddEvent(IEventOwner *from,long sec,long usec)
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 }
00135
00136
00137 void EventHandler::ClearEvents(IEventOwner *from)
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 }
00156
00157
00158 void EventHandler::EventLoop()
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 }
00174
00175
00176 void EventHandler::SetQuit(bool x)
00177 {
00178 m_quit = x;
00179 }
00180
00181
00182 void EventHandler::RemoveEvent(IEventOwner *from, long eid)
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 }
00195
00196
00197 void EventHandler::Add(Socket *p)
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 }
00218
00219
00220 #ifdef SOCKETS_NAMESPACE
00221 }
00222 #endif
00223
00224
00225