home *** CD-ROM | disk | FTP | other *** search
- Save Format v1.3
- @begin ClassFile "ServerWorker"
- Exported 0;
-
- @begin-code BaseClassList
-
- public WObject
-
- @end-code;
-
- @begin UserFunction "ServerWorker()"
- GencodeSrcLine 19;
- FunctionName "ServerWorker::ServerWorker()";
- @end;
-
- @begin UserFunction "Prototype for ServerWorker()"
- Private 1;
- GencodeSrcLine 32;
- FunctionName "ServerWorker::Prototype for ServerWorker()";
- @end;
-
- @begin UserFunction "~ServerWorker()"
- GencodeSrcLine 26;
- FunctionName "ServerWorker::~ServerWorker()";
- @end;
-
- @begin UserFunction "Prototype for ~ServerWorker()"
- Private 1;
- GencodeSrcLine 34;
- FunctionName "ServerWorker::Prototype for ~ServerWorker()";
- @end;
-
- @begin UserFunction "Create( Form1 * displayWindow )"
- GencodeSrcLine 33;
- FunctionName "ServerWorker::Create( Form1 * displayWindow )";
- @end;
-
- @begin UserFunction "Prototype for Create( Form1 * displayWindow )"
- Private 1;
- GencodeSrcLine 36;
- FunctionName "ServerWorker::Prototype for Create( Form1 * displayWindow )";
- @end;
-
- @begin UserFunction "Destroy()"
- GencodeSrcLine 46;
- FunctionName "ServerWorker::Destroy()";
- @end;
-
- @begin UserFunction "Prototype for Destroy()"
- Private 1;
- GencodeSrcLine 38;
- FunctionName "ServerWorker::Prototype for Destroy()";
- @end;
-
- @begin UserFunction "Server( void * )"
- Private 1;
- GencodeSrcLine 58;
- FunctionName "ServerWorker::Server( void * )";
- @end;
-
- @begin UserFunction "Prototype for Server( void * )"
- Private 1;
- GencodeSrcLine 40;
- FunctionName "ServerWorker::Prototype for Server( void * )";
- @end;
-
- @begin HPPPrefixBlock
- @begin-code HPPPrefix
-
- // Declarations added here will be included at the top of the .HPP file
- #include "ClientWorker.hpp"
-
-
- template WVector< WSocket >;
- template WVector< ClientWorker >;
- class Form1;
-
- @end-code;
- GencodeSrcLine 11;
- @end;
-
- @begin CPPPrefixBlock
- @begin-code CPPPrefix
-
- // Code added here will be included at the top of the .CPP file
- #include "Form1.hpp"
- WVector< WSocket > ServerWorker::_client_sockets;
- WVector< ClientWorker > ServerWorker::_client_workers;
- WCriticalSection ServerWorker::_client_sockets_cs;
-
- // Include definitions for resources.
- #include "WRes.h"
-
- @end-code;
- GencodeSrcLine 11;
- @end;
-
- @begin ClassContentsBlock
- @begin-code ClassContents
-
- public:
- static WVector< WSocket > _client_sockets;
- static WVector< ClientWorker > _client_workers;
- static WCriticalSection _client_sockets_cs;
-
- private:
- Form1 * _displayWindow;
- WBool _dyingNow;
- WThread _thread;
- WServerSocket * _server_sock;
-
- @end-code;
- GencodeSrcLine 22;
- @end;
-
- @begin-code GeneratedClassContents
-
-
- @end-code;
-
- @begin-code Code "ServerWorker::ServerWorker()"
-
- @@CLASSNAME@::@CLASSNAME@()
- : _displayWindow( NULL ),
- _dyingNow( FALSE ),
- _server_sock( NULL )
- {
-
- }
-
- @end-code;
-
- @begin-code Code "ServerWorker::Prototype for ServerWorker()"
-
- public:
- @@CLASSNAME@();
-
- @end-code;
-
- @begin-code Code "ServerWorker::~ServerWorker()"
-
- @@CLASSNAME@::~@CLASSNAME@()
- {
- if( _server_sock ) {
- delete _server_sock;
- _server_sock = NULL;
- }
- }
-
- @end-code;
-
- @begin-code Code "ServerWorker::Prototype for ~ServerWorker()"
-
- public:
- ~@CLASSNAME@();
-
- @end-code;
-
- @begin-code Code "ServerWorker::Create( Form1 * displayWindow )"
-
- WBool @CLASSNAME@::Create( Form1 * displayWindow )
- {
- WBool success;
-
- _displayWindow = displayWindow;
- success = _thread.Create( this,
- (WThreadRoutine)&@CLASSNAME@::Server,
- NULL );
- if( success ) {
- _displayWindow->AddLog( WTEXT( "Created server thread." ) );
- }
- return success;
- }
-
- @end-code;
-
- @begin-code Code "ServerWorker::Prototype for Create( Form1 * displayWindow )"
-
- public:
- WBool Create( Form1 * displayWindow );
-
- @end-code;
-
- @begin-code Code "ServerWorker::Destroy()"
-
- WBool @CLASSNAME@::Destroy()
- {
- WBool result;
-
- _dyingNow = TRUE;
- result = _server_sock->Close( TRUE, 1 );
- _thread.Wait();
- if( result ) {
- _displayWindow->AddLog( WTEXT( "Server thread gracefully done." ) );
- }
- return TRUE;
- }
-
- @end-code;
-
- @begin-code Code "ServerWorker::Prototype for Destroy()"
-
- public:
- WBool Destroy();
-
- @end-code;
-
- @begin-code Code "ServerWorker::Server( void * )"
-
- WDWord @CLASSNAME@::Server( void * )
- {
- WSocket client;
- WSocket *new_client;
- ClientWorker *client_worker;
- WBool success;
- WInt i;
- WString msg;
-
- WCurrentThread::SetName( WTEXT( "Chat Server" ) );
-
- /* Create and initialize the server socket
- */
- _server_sock = new WServerSocket();
- if( _server_sock == NULL ) {
- _displayWindow->AddLog( WTEXT( "Could not create server socket!" ) );
- return 0;
- }
- if( !_server_sock->Create() ) {
- _displayWindow->AddLog( WTEXT( "Could not create server socket!" ) );
- return 0;
- }
- if ( !_server_sock->SetLocalPort( 1777 ) ) {
- _displayWindow->AddLog( WTEXT( "Could not set local port!" ) );
- return 0;
- }
- _server_sock->Listen();
- //if( _server_sock->Listen() == 0 ) {
- msg.Sprintf( WTEXT("Server %s listening on port 1777."),
- _server_sock->GetLocalHostName().GetText() );
- _displayWindow->AddLog( msg );
- //} else {
- // _server_sock->Close( FALSE );
- // _displayWindow->AddLog( WTEXT( "Listen failed!" ) );
- // return 0;
- //}
-
- /* Process requests
- */
- while( TRUE ) {
- /* Wait for a chat client to connect to the server
- */
- _displayWindow->AddLog( WTEXT( "Waiting for connection..." ) );
- client = _server_sock->Accept();
- if( _dyingNow ) {
- _displayWindow->AddLog( WTEXT( "Server shutting down." ) );
- break;
- }
- if( _server_sock->GetState() == WSockStateError ) {
- msg.Sprintf( WTEXT( "Server shutting down. Error %d."),
- _server_sock->GetLastError() );
- _displayWindow->AddLog( msg.GetText() );
- break;
- }
-
- /* Open a socket to talk back to the client
- */
- success = FALSE;
- new_client = new WSocket( client );
- if( new_client == NULL ) {
- _displayWindow->AddLog( WTEXT( "Invalid connection." ) );
- } else {
- _displayWindow->AddLog( WTEXT( "Connected." ) );
- _client_sockets_cs.Enter();
- i = _client_sockets.Append( new_client );
- client_worker = new ClientWorker();
- if( client_worker != NULL ) {
- _client_workers.Append( client_worker );
- success = TRUE;
- } else {
- new_client->Close( FALSE );
- _client_sockets.RemoveAt( i );
- delete new_client;
- }
- _client_sockets_cs.Exit();
- }
-
- /* Spawn a new thread to handle client interaction
- */
- if( success ) {
- success = client_worker->Create( _displayWindow, i );
- if( success ) {
- msg.Sprintf( WTEXT( "Client %d started." ), i );
- _displayWindow->AddLog( msg.GetText() );
- } else {
- new_client->Close( FALSE );
- _client_sockets_cs.Enter();
- _client_sockets.RemoveAt( i );
- _client_workers.RemoveAt( i );
- _client_sockets_cs.Exit();
- delete new_client;
- delete client_worker;
- }
- }
- }
- return 0;
- }
-
- @end-code;
-
- @begin-code Code "ServerWorker::Prototype for Server( void * )"
-
- private:
- WDWord Server( void * );
-
- @end-code;
- @end;
-