Main Page   Namespace List   Alphabetical List   Compound List   File List   Compound Members   File Members   Related Pages  

paradigm.cpp

Go to the documentation of this file.
00001 
00142 #include "sysconfig.h"
00143 #include "server.h"
00144 #include "event.h"
00145 #include "eventqueue.h"
00146 #include "user.h"
00147 
00148 #ifdef __BORLANDC__
00149 #if (__BORLANDC__ < 0x550)
00150 #include <condefs.h>
00151 USEUNIT("connection.cpp");
00152 USEUNIT("server.cpp");
00153 USEUNIT("socket.cpp");
00154 USEUNIT("log.cpp");
00155 USEUNIT("event.cpp");
00156 USEUNIT("eventqueue.cpp");
00157 USEUNIT("user.cpp");
00158 //---------------------------------------------------------------------------
00159 #endif
00160 #endif
00161 
00162 EventQueue* g_chat_to_server = 0;
00163 EventQueue* g_server_to_chat = 0;
00164 Log* g_log = 0;
00165 
00166 #ifdef WIN32
00167 void StartServer(void * parms);
00168 #else
00169 void* StartServer(void * parms);
00170 #endif
00171 void Chat();
00172 
00173 //---------------------------------------------------------------------------
00174 #pragma argsused
00175 int main(int argc, char **argv)
00176 {
00177   g_log = new Log("");
00178 
00179 #ifdef WIN32
00180   WSADATA wsaData;  // This could be made global if we had a good reason.
00181 
00182   // Request Windows to start socket services.
00183   int err = WSAStartup(0x202,&wsaData);
00184   if (err) {
00185     cout << "ERROR-main(WSAStartup):" << err << endl;
00186     delete g_log;
00187     return -1;
00188   }
00189 #endif
00190 
00191   g_chat_to_server = new EventQueue(0);
00192   g_server_to_chat = new EventQueue(0);
00193   if (!g_chat_to_server->IsOk() || !g_server_to_chat->IsOk()) {
00194     g_log->Write("ERROR-main(EventQueue): Unable to start event queues.");
00195     delete g_log;
00196     return -1;
00197   }
00198   Server* server = new Server(*g_chat_to_server, *g_server_to_chat, *g_log);
00199   if (!server->Boot(32000)) {
00200     g_log->Write("ERROR-main(Server): Unable to start server.");
00201     delete g_log;
00202     return -1;
00203   }
00204   g_log->Write("INFO-Main(): Server starting up");
00205 
00206   // Start up our Network server
00207   THREADHANDLE_T server_thread;
00208   StartThread(server_thread, StartServer, 8192, (void*)server);
00209 
00210   // Main thread will handle our Chat driver
00211   Chat();
00212   WaitForSingleObject(&server_thread, INFINITE);
00213 
00214 #ifdef WIN32
00215   WSACleanup();  // Must always cleanup Windows sockets
00216 #endif
00217   return 0;
00218 }
00219 
00223 #ifdef WIN32
00224 void StartServer(void * parms) {
00225 #else
00226 void* StartServer(void * parms) {
00227 #endif
00228   Server* server = (Server *)parms;
00229   if (server)
00230     server->Run(NULL);
00231   delete server;
00232 #ifdef UNIX
00233   return NULL;
00234 #endif
00235 }
00236 
00237 void Chat() {
00239   typedef list<User> UserList;
00240 
00241   UserList users;   
00242   UserList::iterator u;
00243   Event* e;
00244   bool shutdown = false;
00245 
00246   while (!shutdown) {
00247     e = g_server_to_chat->Pop();
00248     if (!e) {
00249 #ifdef WIN32
00250       Sleep(1);
00251 #else
00252       usleep(1);
00253 #endif
00254     } else {
00255       switch (e->mEventType) {
00256         case CONNECT_E: {
00257           char msg[] = "Welcome!\r\n";
00258           User user(e->mClientId);
00259           users.push_back(user);
00260           g_chat_to_server->Push(new Event(MESSAGE_E, user.Id(),
00261             strlen(msg), msg));
00262         }
00263         break;
00264         case DISCONNECT_E: {
00265           // A connection is lost - kill the its user in this subsystem.
00266           u = find(users.begin(),users.end(),e->mClientId);
00267           users.erase(u);
00268         }
00269         break;
00270         case MESSAGE_E: {
00271           // check for shutdown message
00272           // :WARN: test for null message as it should be just a CRLF
00273           if (e->mpData && !strncmp(e->mpData, "@shutdown", e->mDataLen)) {
00274             char msg[] = "Shutting down..BYE.\r\n";
00275             for(u = users.begin(); u != users.end(); u++) {
00276               g_chat_to_server->Push(new Event(MESSAGE_E, (*u).Id(),
00277                 strlen(msg), msg));
00278             }
00279             g_chat_to_server->Push(new Event(SHUTDOWN_E, 0, 0, 0));
00280           } else { // otherwise we have a general message to echo
00281             string msg;
00282             if (e->mpData && e->mDataLen) {
00283               msg.append(e->mpData, e->mDataLen);
00284             }
00285             msg.append("\r\n");
00286             // message will be echoed to all clients
00287             for(u = users.begin(); u != users.end(); u++) {
00288               g_chat_to_server->Push(new Event(MESSAGE_E, (*u).Id(),
00289                 msg.length(), msg.c_str()));
00290             }
00291           }
00292         }
00293         break;
00294         case SHUTDOWN_E:
00295           shutdown = true;
00296         break;
00297         case NONE_E:
00298         break;
00299       }  // switch
00300       delete e;
00301     }  // else
00302   } // while
00303 }
00304 
00305 
00306 

Generated on Mon Mar 29 23:12:53 2004 for Paradigm by doxygen1.2.17