paradigm_3/html/
<!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> &nbsp; <a class="qindex" href="namespaces.html">Namespace List</a> &nbsp; <a class="qindex" href="classes.html">Alphabetical List</a> &nbsp; <a class="qindex" href="annotated.html">Compound List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; <a class="qindex" href="globals.html">File Members</a> &nbsp; <a class="qindex" href="pages.html">Related Pages</a> &nbsp; </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__ &lt; 0x550)</span>
00150 <span class="preprocessor"></span><span class="preprocessor">#include &lt;condefs.h&gt;</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,&amp;wsaData);
00184   <span class="keywordflow">if</span> (err) {
00185     cout &lt;&lt; <span class="stringliteral">"ERROR-main(WSAStartup):"</span> &lt;&lt; err &lt;&lt; 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-&gt;<a class="code" href="classEventQueue.html#a5">IsOk</a>() || !g_server_to_chat-&gt;<a class="code" href="classEventQueue.html#a5">IsOk</a>()) {
00194     g_log-&gt;<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-&gt;<a class="code" href="classServer.html#a2">Boot</a>(32000)) {
00200     g_log-&gt;<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-&gt;<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(&amp;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-&gt;<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&lt;User&gt; 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-&gt;<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-&gt;<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-&gt;<a class="code" href="classEvent.html#m1">mClientId</a>);
00259           users.push_back(user);
00260           g_chat_to_server-&gt;<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-&gt;<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-&gt;<a class="code" href="classEvent.html#m3">mpData</a> &amp;&amp; !strncmp(e-&gt;<a class="code" href="classEvent.html#m3">mpData</a>, <span class="stringliteral">"@shutdown"</span>, e-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="classEvent.html#m3">mpData</a> &amp;&amp; e-&gt;<a class="code" href="classEvent.html#m2">mDataLen</a>) {
00283               msg.append(e-&gt;<a class="code" href="classEvent.html#m3">mpData</a>, e-&gt;<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-&gt;<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>