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