//-----------------------------------------------------------------------------
// Torque Game Engine
// Copyright (C) GarageGames.com, Inc.
//-----------------------------------------------------------------------------

#ifndef _TELNETCONSOLE_H_
#define _TELNETCONSOLE_H_

#ifndef _CONSOLE_H_
#include "console/console.h"
#endif

/// Telnet admin console.
///
/// Torque supports remote access to its console. This is most useful when
/// running a dedicated server, as you can remotely administer the game
/// (for instance, kicking people). In the context of a MMORPG, this sort of
/// functionality would be useful for managing a server.
///
/// There are a number of products for Tribes2 which allow remote administration
/// via a nice GUI.
///
/// @section telnetconsole_use Using the Telnet Console
///
/// The TelnetConsole is designed to be used globally, so you don't instantiate
/// it like a normal class. Instead, you allow it to manage itself:
///
/// @code
///      // How to initialize the TelnetConsole.
///      TelnetConsole::create();
///
///      // How to shut down the TelnetConsole.
///      TelnetConsole::destroy();
/// @endcode
///
///
class TelnetConsole
{
   NetSocket mAcceptSocket;
   S32 mAcceptPort;

   enum {
      PasswordMaxLength = 32  ///< Maximum length of the telnet and listen passwords.
   };

   bool mRemoteEchoEnabled;
   char mTelnetPassword[PasswordMaxLength+1];
   char mListenPassword[PasswordMaxLength+1];
   ConsoleEvent mPostEvent;

   /// State of a TelnetClient.
   enum State
   {
      PasswordTryOne,      ///< Allow three password attempts.
      PasswordTryTwo,
      PasswordTryThree,
      DisconnectThisDude,  ///< If they've failed all three, disconnect them.
      FullAccessConnected, ///< They presented the telnetPassword, they get full access.
      ReadOnlyConnected    ///< They presented the listenPassword, they get read only access.
   };

   /// Represents a connection to the telnet console.
   ///
   /// This is also a linked list.
   struct TelnetClient
   {
      NetSocket socket;
      char curLine[Con::MaxLineLength];
      S32 curPos;
      S32 state;                       ///< State of the client.
                                       ///  @see TelnetConsole::State
      TelnetClient *nextClient;
   };
   TelnetClient *mClientList;
   TelnetConsole();
   ~TelnetConsole();

public:
   static void create();    ///< Initialize the telnet console.
   static void destroy();   ///< Shut down the telnet console.
   void process();          ///< Called by the main loop to let the console process commands
                            ///  and connections.

   /// Configure the parameter for the telnet console.
   ///
   /// @param    port           Port on which to listen for connections.
   /// @param    telnetPassword Password for full access to the console.
   /// @param    listenPassword Password for read-only access to the console.
   /// @param    remoteEcho     Enable/disable echoing input back to the client
   void setTelnetParameters(S32 port, const char *telnetPassword, const char *listenPassword, bool remoteEcho = false);

   /// Callback to handle a line from the console.
   ///
   /// @note This is used internally by the class; you
   ///       shouldn't need to call it.
   ///
   /// @see Con::addConsumer()
   void processConsoleLine(const char *line);
};

extern TelnetConsole *TelConsole;

#endif