SmaugWizard/Backup/
SmaugWizard/Backup/L/
SmaugWizard/Boards/
SmaugWizard/Building/
SmaugWizard/Corpses/
SmaugWizard/Councils/
SmaugWizard/Deity/
SmaugWizard/Gods/
SmaugWizard/MudProgs/
SmaugWizard/Player/L/
SmaugWizard/Src/
SmaugWizard/Src/res/
/****************************************************************************
 * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame      |				*
 * -----------------------------------------------------------|   \\._.//	*
 * SmaugWiz (C) 1998 by Russ Pillsbury (Windows NT version)   |   (0...0)	*
 * -----------------------------------------------------------|    ).:.(	*
 * SMAUG (C) 1994, 1995, 1996 by Derek Snider                 |    {o o}	*
 * -----------------------------------------------------------|   / ' ' \	*
 * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus,      |~'~.VxvxV.~'~*
 * Scryn, Swordbearer, Rennard, Tricops, and Gorog.           |				*
 * ------------------------------------------------------------------------ *
 * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael        *
 * Chastain, Michael Quan, and Mitchell Tse.                                *
 * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,          *
 * Michael Seifert, Hans Henrik Staerfeldt, Tom Madsen, and Katja Nyboe.    *
 * ------------------------------------------------------------------------ *
 *			    Socket Descriptors Interface file							*
 ****************************************************************************/

#ifndef		DESCRIPTOR_H
#define		DESCRIPTOR_H


class host_and_name_lookup {
public:
				host_and_name_lookup () { memset (this, 0,
										  sizeof (host_and_name_lookup)); }

	// These are used by WSAAsyncGetHostByAddr ()
	char	hostdata [MAXGETHOSTSTRUCT];
	HANDLE	hRequestHandle;
	struct	in_addr sin_addr;

	// These are used by the identd stuff
	char	username [64];
	UINT	sAuth;					// Auth Socket #
	struct	sockaddr_in authsock;	// Address of the authentication
	struct	sockaddr_in us;			// Address of our socket to this player
	struct	sockaddr_in them;		// Address of our socket to this player
};


// Descriptor (channel) class.
class CDescriptor {
public:
				CDescriptor () { Empty (); }

	void		Empty ()
				{ ClearAddrRange (&m_pSnoopBy, &m_PrevColor,
				  sizeof (m_PrevColor)); }
	BOOL		IsCommandReady () { return m_Incomm [0] != '\0'; }
	void		ReadFromBuffer ();
	BOOL		ReadFromDescriptor ();
	void		WriteToBuffer (const char* txt, int length = 0);
	BOOL		WriteToDescriptor (char *txt, int length = 0);
	BOOL		ProcessOutput (BOOL fPrompt);
	void		GetPagerInput ();
	BOOL		PagerOutput ();
	void		ShowString (char *input);
	void		DisplayPrompt ();
	void		GetConnectionInfo ();
	void		SetDisconnecting () { m_bCloseSocket = TRUE; }
	BOOL		IsDisconnecting () { return m_bCloseSocket; }
	void		Shutdown ();
	BOOL		IsHost () { return m_pHost && *m_pHost; }

	CDescriptor		*m_pSnoopBy;
	CCharacter		*m_pCharacter;
	CCharacter		*m_pOriginal;
	char			*m_pHost;
	CSmaugSocket	*m_pSocket;

	host_and_name_lookup *m_HostAndName; // Gets players site and user name
	short		m_Connected;
	BOOL		m_bFcommand;
	char		m_Inbuf [4 * MAX_INPUT_LENGTH];
	char		m_Incomm [MAX_INPUT_LENGTH];
	char		m_Inlast [MAX_INPUT_LENGTH];
	int			m_Repeat;
	char		*m_pOutbuf;
	int			m_Outsize;
	int			m_Outtop;
	int			m_bCloseSocket;		// Close socket & retire Desc. when empty.

	// Note: All below added by Smaug
	int			port;
	int			m_DescNo;
	ULONG		m_Idle;
	short		lines;
	short		scrlen;
	char		*pagebuf;
	ULONG		pagesize;
	int			pagetop;
	char		*pagepoint;
	char		pagecmd;
	int			auth_inc;
	int			auth_state;
	char		abuf [256];
	int			auth_fd;
	char		*user;
	int 		atimes;
	int			newstate;
	UCHAR		m_PrevColor;
};


class	CDescriptorList	: public CPtrList {
public:
				CDescriptorList () {}

	CDescriptor	*GetNext (POSITION& pos)
				{ return (CDescriptor*) CPtrList::GetNext (pos); }

	CDescriptor	*GetPrev (POSITION& pos)
				{ return (CDescriptor*) CPtrList::GetPrev (pos); }

	void		AddHead (CDescriptor* d)
				{ CPtrList::AddHead (d); d->m_DescNo = GetCount (); }
	void		AddTail (CDescriptor* d)
				{ CPtrList::AddTail (d); d->m_DescNo = GetCount (); }
};

extern	CDescriptorList	DList;		// List of connected player descriptors
extern	CPtrList		DFreeList;	// list of free descriptors

#ifdef SMAUGSERVER_CPP
	CDescriptorList	DList;
	CPtrList		DFreeList;
#endif


extern HWND      hQryDlgBox;	// handle of modeless dialog box

// @@@ My junk
#ifdef SMAUGSERVER_CPP	
  char	echo_off_str [] = { IAC, WILL, TELOPT_ECHO, '\0' };
  char	echo_on_str  [] = { IAC, WONT, TELOPT_ECHO, '\0' };
  char 	go_ahead_str [] = { IAC, GA, '\0' };
#endif

extern char	echo_off_str [];
extern char	echo_on_str  [];
extern char	go_ahead_str [];


#endif