<!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>