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;
00181
00182
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
00207 THREADHANDLE_T server_thread;
00208 StartThread(server_thread, StartServer, 8192, (void*)server);
00209
00210
00211 Chat();
00212 WaitForSingleObject(&server_thread, INFINITE);
00213
00214 #ifdef WIN32
00215 WSACleanup();
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
00266 u = find(users.begin(),users.end(),e->mClientId);
00267 users.erase(u);
00268 }
00269 break;
00270 case MESSAGE_E: {
00271
00272
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 {
00281 string msg;
00282 if (e->mpData && e->mDataLen) {
00283 msg.append(e->mpData, e->mDataLen);
00284 }
00285 msg.append("\r\n");
00286
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 }
00300 delete e;
00301 }
00302 }
00303 }
00304
00305
00306