<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>paradigm.cpp Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.2.17 --> <center> <a class="qindex" href="main.html">Main Page</a> <a class="qindex" href="namespaces.html">Namespace List</a> <a class="qindex" href="classes.html">Alphabetical List</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="globals.html">File Members</a> <a class="qindex" href="pages.html">Related Pages</a> </center> <hr><h1>paradigm.cpp</h1><a href="paradigm_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 00142 <span class="preprocessor">#include "<a class="code" href="sysconfig_8h.html">sysconfig.h</a>"</span> 00143 <span class="preprocessor">#include "<a class="code" href="server_8h.html">server.h</a>"</span> 00144 <span class="preprocessor">#include "<a class="code" href="event_8h.html">event.h</a>"</span> 00145 <span class="preprocessor">#include "<a class="code" href="eventqueue_8h.html">eventqueue.h</a>"</span> 00146 <span class="preprocessor">#include "<a class="code" href="user_8h.html">user.h</a>"</span> 00147 00148 <span class="preprocessor">#ifdef __BORLANDC__</span> 00149 <span class="preprocessor"></span><span class="preprocessor">#if (__BORLANDC__ < 0x550)</span> 00150 <span class="preprocessor"></span><span class="preprocessor">#include <condefs.h></span> 00151 <a class="code" href="paradigm_8cpp.html#a9">USEUNIT</a>(<span class="stringliteral">"connection.cpp"</span>); 00152 <a class="code" href="paradigm_8cpp.html#a9">USEUNIT</a>(<span class="stringliteral">"server.cpp"</span>); 00153 <a class="code" href="paradigm_8cpp.html#a9">USEUNIT</a>(<span class="stringliteral">"socket.cpp"</span>); 00154 <a class="code" href="paradigm_8cpp.html#a9">USEUNIT</a>(<span class="stringliteral">"log.cpp"</span>); 00155 <a class="code" href="paradigm_8cpp.html#a9">USEUNIT</a>(<span class="stringliteral">"event.cpp"</span>); 00156 <a class="code" href="paradigm_8cpp.html#a9">USEUNIT</a>(<span class="stringliteral">"eventqueue.cpp"</span>); 00157 <a class="code" href="paradigm_8cpp.html#a9">USEUNIT</a>(<span class="stringliteral">"user.cpp"</span>); 00158 <span class="comment">//---------------------------------------------------------------------------</span> 00159 <span class="preprocessor">#endif</span> 00160 <span class="preprocessor"></span><span class="preprocessor">#endif</span> 00161 <span class="preprocessor"></span> <a name="l00162"></a><a class="code" href="paradigm_8cpp.html#a0">00162</a> <a class="code" href="classEventQueue.html">EventQueue</a>* <a class="code" href="paradigm_8cpp.html#a0">g_chat_to_server</a> = 0; <a name="l00163"></a><a class="code" href="paradigm_8cpp.html#a1">00163</a> <a class="code" href="classEventQueue.html">EventQueue</a>* <a class="code" href="paradigm_8cpp.html#a1">g_server_to_chat</a> = 0; <a name="l00164"></a><a class="code" href="paradigm_8cpp.html#a2">00164</a> <a class="code" href="classLog.html">Log</a>* <a class="code" href="paradigm_8cpp.html#a2">g_log</a> = 0; 00165 00166 <span class="preprocessor">#ifdef WIN32</span> 00167 <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="paradigm_8cpp.html#a10">StartServer</a>(<span class="keywordtype">void</span> * parms); 00168 <span class="preprocessor">#else</span> 00169 <span class="preprocessor"></span><span class="keywordtype">void</span>* <a class="code" href="paradigm_8cpp.html#a10">StartServer</a>(<span class="keywordtype">void</span> * parms); 00170 <span class="preprocessor">#endif</span> 00171 <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="paradigm_8cpp.html#a11">Chat</a>(); 00172 00173 <span class="comment">//---------------------------------------------------------------------------</span> 00174 <span class="preprocessor">#pragma argsused</span> <a name="l00175"></a><a class="code" href="paradigm_8cpp.html#a12">00175</a> <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="paradigm_8cpp.html#a12">main</a>(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv) 00176 { 00177 g_log = <span class="keyword">new</span> <a class="code" href="classLog.html">Log</a>(<span class="stringliteral">""</span>); 00178 00179 <span class="preprocessor">#ifdef WIN32</span> 00180 <span class="preprocessor"></span> WSADATA wsaData; <span class="comment">// This could be made global if we had a good reason.</span> 00181 00182 <span class="comment">// Request Windows to start socket services.</span> 00183 <span class="keywordtype">int</span> err = WSAStartup(0x202,&wsaData); 00184 <span class="keywordflow">if</span> (err) { 00185 cout << <span class="stringliteral">"ERROR-main(WSAStartup):"</span> << err << endl; 00186 <span class="keyword">delete</span> g_log; 00187 <span class="keywordflow">return</span> -1; 00188 } 00189 <span class="preprocessor">#endif</span> 00190 <span class="preprocessor"></span> 00191 g_chat_to_server = <span class="keyword">new</span> <a class="code" href="classEventQueue.html">EventQueue</a>(0); 00192 g_server_to_chat = <span class="keyword">new</span> <a class="code" href="classEventQueue.html">EventQueue</a>(0); 00193 <span class="keywordflow">if</span> (!g_chat_to_server-><a class="code" href="classEventQueue.html#a5">IsOk</a>() || !g_server_to_chat-><a class="code" href="classEventQueue.html#a5">IsOk</a>()) { 00194 g_log-><a class="code" href="classLog.html#a3">Write</a>(<span class="stringliteral">"ERROR-main(EventQueue): Unable to start event queues."</span>); 00195 <span class="keyword">delete</span> g_log; 00196 <span class="keywordflow">return</span> -1; 00197 } 00198 <a class="code" href="classServer.html">Server</a>* server = <span class="keyword">new</span> <a class="code" href="classServer.html">Server</a>(*g_chat_to_server, *g_server_to_chat, *g_log); 00199 <span class="keywordflow">if</span> (!server-><a class="code" href="classServer.html#a2">Boot</a>(32000)) { 00200 g_log-><a class="code" href="classLog.html#a3">Write</a>(<span class="stringliteral">"ERROR-main(Server): Unable to start server."</span>); 00201 <span class="keyword">delete</span> g_log; 00202 <span class="keywordflow">return</span> -1; 00203 } 00204 g_log-><a class="code" href="classLog.html#a3">Write</a>(<span class="stringliteral">"INFO-Main(): Server starting up"</span>); 00205 00206 <span class="comment">// Start up our Network server</span> 00207 <a class="code" href="sysconfig_8h.html#a3">THREADHANDLE_T</a> server_thread; 00208 <a class="code" href="sysconfig_8h.html#a2">StartThread</a>(server_thread, <a class="code" href="paradigm_8cpp.html#a10">StartServer</a>, 8192, (<span class="keywordtype">void</span>*)server); 00209 00210 <span class="comment">// Main thread will handle our Chat driver</span> 00211 <a class="code" href="paradigm_8cpp.html#a11">Chat</a>(); 00212 WaitForSingleObject(&server_thread, INFINITE); 00213 00214 <span class="preprocessor">#ifdef WIN32</span> 00215 <span class="preprocessor"></span> WSACleanup(); <span class="comment">// Must always cleanup Windows sockets</span> 00216 <span class="preprocessor">#endif</span> 00217 <span class="preprocessor"></span> <span class="keywordflow">return</span> 0; 00218 } 00219 00223 <span class="preprocessor">#ifdef WIN32</span> <a name="l00224"></a><a class="code" href="paradigm_8cpp.html#a10">00224</a> <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="paradigm_8cpp.html#a10">StartServer</a>(<span class="keywordtype">void</span> * parms) { 00225 <span class="preprocessor">#else</span> 00226 <span class="preprocessor"></span><span class="keywordtype">void</span>* <a class="code" href="paradigm_8cpp.html#a10">StartServer</a>(<span class="keywordtype">void</span> * parms) { 00227 <span class="preprocessor">#endif</span> 00228 <span class="preprocessor"></span> <a class="code" href="classServer.html">Server</a>* server = (<a class="code" href="classServer.html">Server</a> *)parms; 00229 <span class="keywordflow">if</span> (server) 00230 server-><a class="code" href="classServer.html#a3">Run</a>(NULL); 00231 <span class="keyword">delete</span> server; 00232 <span class="preprocessor">#ifdef UNIX</span> 00233 <span class="preprocessor"></span> <span class="keywordflow">return</span> NULL; 00234 <span class="preprocessor">#endif</span> 00235 <span class="preprocessor"></span>} 00236 <a name="l00237"></a><a class="code" href="paradigm_8cpp.html#a11">00237</a> <span class="keywordtype">void</span> <a class="code" href="paradigm_8cpp.html#a11">Chat</a>() { 00239 <span class="keyword">typedef</span> list<User> UserList; 00240 00241 UserList users; 00242 UserList::iterator u; 00243 <a class="code" href="classEvent.html">Event</a>* e; 00244 <span class="keywordtype">bool</span> shutdown = <span class="keyword">false</span>; 00245 00246 <span class="keywordflow">while</span> (!shutdown) { 00247 e = g_server_to_chat-><a class="code" href="classEventQueue.html#a3">Pop</a>(); 00248 <span class="keywordflow">if</span> (!e) { 00249 <span class="preprocessor">#ifdef WIN32</span> 00250 <span class="preprocessor"></span> Sleep(1); 00251 <span class="preprocessor">#else</span> 00252 <span class="preprocessor"></span> usleep(1); 00253 <span class="preprocessor">#endif</span> 00254 <span class="preprocessor"></span> } <span class="keywordflow">else</span> { 00255 <span class="keywordflow">switch</span> (e-><a class="code" href="classEvent.html#m0">mEventType</a>) { 00256 <span class="keywordflow">case</span> <a class="code" href="event_8h.html#a5a1">CONNECT_E</a>: { 00257 <span class="keywordtype">char</span> msg[] = <span class="stringliteral">"Welcome!\r\n"</span>; 00258 <a class="code" href="classUser.html">User</a> user(e-><a class="code" href="classEvent.html#m1">mClientId</a>); 00259 users.push_back(user); 00260 g_chat_to_server-><a class="code" href="classEventQueue.html#a2">Push</a>(<span class="keyword">new</span> <a class="code" href="classEvent.html">Event</a>(<a class="code" href="event_8h.html#a5a3">MESSAGE_E</a>, user.<a class="code" href="classUser.html#a7">Id</a>(), 00261 strlen(msg), msg)); 00262 } 00263 <span class="keywordflow">break</span>; 00264 <span class="keywordflow">case</span> <a class="code" href="event_8h.html#a5a2">DISCONNECT_E</a>: { 00265 <span class="comment">// A connection is lost - kill the its user in this subsystem.</span> 00266 u = find(users.begin(),users.end(),e-><a class="code" href="classEvent.html#m1">mClientId</a>); 00267 users.erase(u); 00268 } 00269 <span class="keywordflow">break</span>; 00270 <span class="keywordflow">case</span> <a class="code" href="event_8h.html#a5a3">MESSAGE_E</a>: { 00271 <span class="comment">// check for shutdown message</span> 00272 <span class="comment">// :WARN: test for null message as it should be just a CRLF</span> 00273 <span class="keywordflow">if</span> (e-><a class="code" href="classEvent.html#m3">mpData</a> && !strncmp(e-><a class="code" href="classEvent.html#m3">mpData</a>, <span class="stringliteral">"@shutdown"</span>, e-><a class="code" href="classEvent.html#m2">mDataLen</a>)) { 00274 <span class="keywordtype">char</span> msg[] = <span class="stringliteral">"Shutting down..BYE.\r\n"</span>; 00275 <span class="keywordflow">for</span>(u = users.begin(); u != users.end(); u++) { 00276 g_chat_to_server-><a class="code" href="classEventQueue.html#a2">Push</a>(<span class="keyword">new</span> <a class="code" href="classEvent.html">Event</a>(<a class="code" href="event_8h.html#a5a3">MESSAGE_E</a>, (*u).Id(), 00277 strlen(msg), msg)); 00278 } 00279 g_chat_to_server-><a class="code" href="classEventQueue.html#a2">Push</a>(<span class="keyword">new</span> <a class="code" href="classEvent.html">Event</a>(<a class="code" href="event_8h.html#a5a4">SHUTDOWN_E</a>, 0, 0, 0)); 00280 } <span class="keywordflow">else</span> { <span class="comment">// otherwise we have a general message to echo</span> 00281 string msg; 00282 <span class="keywordflow">if</span> (e-><a class="code" href="classEvent.html#m3">mpData</a> && e-><a class="code" href="classEvent.html#m2">mDataLen</a>) { 00283 msg.append(e-><a class="code" href="classEvent.html#m3">mpData</a>, e-><a class="code" href="classEvent.html#m2">mDataLen</a>); 00284 } 00285 msg.append(<span class="stringliteral">"\r\n"</span>); 00286 <span class="comment">// message will be echoed to all clients</span> 00287 <span class="keywordflow">for</span>(u = users.begin(); u != users.end(); u++) { 00288 g_chat_to_server-><a class="code" href="classEventQueue.html#a2">Push</a>(<span class="keyword">new</span> <a class="code" href="classEvent.html">Event</a>(<a class="code" href="event_8h.html#a5a3">MESSAGE_E</a>, (*u).Id(), 00289 msg.length(), msg.c_str())); 00290 } 00291 } 00292 } 00293 <span class="keywordflow">break</span>; 00294 <span class="keywordflow">case</span> <a class="code" href="event_8h.html#a5a4">SHUTDOWN_E</a>: 00295 shutdown = <span class="keyword">true</span>; 00296 <span class="keywordflow">break</span>; 00297 <span class="keywordflow">case</span> <a class="code" href="event_8h.html#a5a0">NONE_E</a>: 00298 <span class="keywordflow">break</span>; 00299 } <span class="comment">// switch</span> 00300 <span class="keyword">delete</span> e; 00301 } <span class="comment">// else</span> 00302 } <span class="comment">// while</span> 00303 } 00304 00305 00306 </pre></div><hr><address style="align: right;"><small>Generated on Mon Mar 29 23:12:53 2004 for Paradigm by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0 width=110 height=53></a>1.2.17 </small></address> </body> </html>