/*! \file server.h
  This is the Server class definition.
  It implements a common non-blocking select() server.

  \author Jon A. Lambert
  \date 02/15/2003
  \version 0.10
 */

#ifndef	SERVER_H
#define	SERVER_H

#include "connection.h"

//! ConnList is typedef'd here for ease of changing it later
//##ModelId=3ED44BF10181
typedef list<Connection*> ConnList;

/*!
  The Server class defines a singleton representation of a
  virtual network server.

  \notes
  No reason why this should be a singleton as long as different
  ports are served.

  \todo
  - Make Server an abstract class overriding its Run method to
  illustrate different network designs as well as different types
  of servers, e.g. httpd, ftpd, instead of telnetd.
  - Move Execute out of here as it belongs to some Chat engine

 */
//##ModelId=3ED44BF101B2
class Server {
public:
  //##ModelId=3ED44BF10311
  static Server* Instance();
  //##ModelId=3ED44BF10313
  bool Boot(unsigned short port);
  //##ModelId=3ED44BF1031C
  void Run();
  //##ModelId=3ED44BF10325
  static void Destroy();
private:
  //##ModelId=3ED44BF10327
  Server();
  //##ModelId=3ED44BF1032F
  ~Server();
  //##ModelId=3ED44BF10330
  Server(const Server&);
  //##ModelId=3ED44BF1033A
  Server& operator= (const Server&);

  //##ModelId=3ED44BF102A6
  static Server* sInstance;  //!< pointer to the singleton Server instance
  //##ModelId=3ED44BF102B7
  bool   mShutdown;          //!< flag indicating whether the server is shutting down
  //##ModelId=3ED44BF102C1
  fd_set mInputFDs;          //!< array of input sockets that select will test
  //##ModelId=3ED44BF102CB
  fd_set mOutputFDs;         //!< array of output sockets that select will test
  //##ModelId=3ED44BF102DF
  SOCKET mAcceptor;          //!< socket that the Server listens to for incoming connections
  //##ModelId=3ED44BF102E9
  struct sockaddr_in mTo;    //!< network address of the server listening port
  //##ModelId=3ED44BF102FE
  ConnList mUsers;           //!< the list of Connections managed by the Server

  //##ModelId=3ED44BF10344
  Connection* AcceptConnection();
  //##ModelId=3ED44BF1034D
  void InitFDs ();
  //##ModelId=3ED44BF1034E
  void Execute();
  //##ModelId=3ED44BF10357
  void ShutdownServer();
};

#endif // SERVER_H