1 #include <Sockets/EventHandler.h>
2 #include <Sockets/TcpSocket.h>
3 #include <Sockets/IEventOwner.h>
4 #include <Sockets/ListenSocket.h>
5 #include <Sockets/StdoutLog.h>
6 #include <iostream>
7 #include <Sockets/Debug.h>
8
9
10 double start;
11
gettime()12 double gettime()
13 {
14 struct timeval tv;
15 Utility::GetTime(&tv);
16 return tv.tv_sec + (double)tv.tv_usec / 1000000;
17 }
18
19
20 class MyEvHandler : public EventHandler
21 {
22 public:
MyEvHandler()23 MyEvHandler() : EventHandler() {}
MyEvHandler(StdLog * p)24 MyEvHandler(StdLog *p) : EventHandler(p) {}
25
26 };
27
28
29 class EvThread : public Thread
30 {
31 public:
EvThread(Socket * p)32 EvThread(Socket *p) : m_socket(p) {}
33
34 void Run();
35
36 private:
37 Socket *m_socket;
38 };
39
40
41 class EvSocket : public TcpSocket, public IEventOwner
42 {
43 public:
EvSocket(ISocketHandler & h)44 EvSocket(ISocketHandler& h) : TcpSocket(h)
45 , IEventOwner( static_cast<MyEvHandler&>(h) ) {
46 }
47
OnEvent(int id)48 void OnEvent(int id) {
49 std::cout << "OnEvent" << std::endl;
50 std::cout << gettime() - start << std::endl;
51 SetCloseAndDelete();
52 }
53
OnAccept()54 void OnAccept() {
55 std::cout << "Incoming" << std::endl;
56 }
57
OnConnect()58 void OnConnect() {
59 std::cout << "Connected" << std::endl;
60 EvThread *thr = new EvThread( this );
61 thr -> SetDeleteOnExit();
62 }
63
OnDelete()64 void OnDelete() {
65 std::cout << "EvSocket::OnDelete()" << std::endl;
66 }
67 };
68
69
Run()70 void EvThread::Run()
71 {
72 Socket *p0 = (Socket *)m_socket;
73 EvSocket *p = dynamic_cast<EvSocket *>(p0);
74 if (p)
75 {
76 #ifdef _WIN32
77 Sleep( 5000 );
78 #else
79 sleep(10);
80 #endif
81 std::cout << "Add event" << std::endl;
82 start = gettime();
83 p -> AddEvent(1, 50000);
84 }
85 else
86 {
87 std::cout << "Thread: not an EvSocket" << std::endl;
88 }
89 }
90
91
92 //------------------------------------------------------------
93 // myTimer class
94 //------------------------------------------------------------
95 class myTimer : public IEventOwner
96 {
97 public:
98 // Prototype of user call back function
99 typedef void (*myTimer_cb)(myTimer* user_func, void* user_id);
100
101 myTimer(IEventHandler& h, long ssec, long susec,
102 long psec, long pusec, myTimer_cb func, void* id);
103 ~myTimer();
104
105 private:
106 void OnEvent(int id);
107 long ssec_;
108 long susec_;
109 long psec_;
110 long pusec_;
111 myTimer_cb user_func_;
112 void* user_id_;
113 bool periodic_;
114 };
115
116
117 //------------------------------------------------------------
myTimer(IEventHandler & h,long ssec,long susec,long psec,long pusec,myTimer_cb user_func,void * user_id)118 myTimer::myTimer(IEventHandler& h, long ssec, long susec,
119 long psec, long pusec, myTimer_cb user_func,
120 void* user_id) :
121 IEventOwner(h),
122 ssec_(ssec),
123 susec_(susec),
124 psec_(psec),
125 pusec_(pusec),
126 user_func_(user_func),
127 user_id_(user_id),
128 periodic_(psec != 0 || pusec != 0)
129 {
130 Debug deb("myTimer()");
131 AddEvent(ssec_, susec_);
132 }
133
134
135 //------------------------------------------------------------
~myTimer()136 myTimer::~myTimer()
137 {
138 Debug deb("~myTimer()");
139 ClearEvents();
140 }
141
142
143 //------------------------------------------------------------
OnEvent(int id)144 void myTimer::OnEvent(int id)
145 {
146 Debug deb("myTimer::OnEvent()");
147 if (periodic_)
148 {
149 AddEvent(psec_, pusec_);
150 }
151
152 user_func_(this, user_id_);
153
154 if (!periodic_)
155 {
156 delete this;
157 }
158 }
159
160
161 //------------------------------------------------------------
myfunc(myTimer * t,void * user_id)162 static void myfunc(myTimer* t, void* user_id)
163 {
164 Debug deb("myTimer::myfunc()");
165 deb << "Event " << ((char*)user_id) << Debug::endl();
166 }
167
168
169 /*
170 int main(int argc, char *argv[])
171 {
172 EventHandler h;
173
174 // Example 1: Create a 2 sec one-shot timer.
175 // No need to save the pointer as it will delete
176 // itself upon expiry.
177 new myTimer(h, 2, 0, 0, 0, myfunc, (void*)"My Timer 0");
178
179 // Example 2: Create a 1 sec periodic timer.
180 // Save the pointer because we can stop the timer
181 // later with a "delete mytimer".
182 myTimer* mytimer = new myTimer(h, 0, 0, 1, 0, myfunc,
183 (void*)"My Timer 1");
184
185 // Drop into the event handler ..
186 h.EventLoop();
187 }
188 */
189
190
main(int argc,char * argv[])191 int main(int argc, char *argv[])
192 {
193 StdoutLog log;
194 MyEvHandler h(&log);
195 ListenSocket<EvSocket> l(h);
196 l.Bind("localhost", 12344);
197 h.Add(&l);
198
199 EvSocket sock(h);
200 sock.Open("localhost", 12344);
201 h.Add(&sock);
202
203 // Example 1: Create a 2 sec one-shot timer.
204 // No need to save the pointer as it will delete
205 // itself upon expiry.
206 new myTimer(h, 2, 0, 0, 0, myfunc, (void*)"My Timer 0");
207
208 // Example 2: Create a 1 sec periodic timer.
209 // Save the pointer because we can stop the timer
210 // later with a "delete mytimer".
211 myTimer* mytimer = new myTimer(h, 0, 0, 1, 0, myfunc,
212 (void*)"My Timer 1");
213
214 h.EventLoop();
215 }
216
217
218