applayerprotocols/telnetengine/SRC/TELFSM.H
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerprotocols/telnetengine/SRC/TELFSM.H	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,500 @@
+/*
+* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#ifndef _TELFSM_
+#define _TELFSM_
+
+#include <telsess.h>
+
+// RFC defined codes/commands 
+
+/**
+End of subnegotiation
+*/
+static const TUint8 KTelnetSE	= 240;
+	
+/**
+No Operation
+*/
+static const TUint8 KTelnetNOP	= 241;
+	
+/**
+Data Mark
+*/
+static const TUint8 KTelnetDM	= 242;	
+/**
+NVT character Break
+*/
+static const TUint8 KTelnetBRK	= 243;
+	
+/**
+NVT Interrupt Process
+*/
+static const TUint8 KTelnetIP	= 244;	
+
+/**
+NVT Abort Output
+*/
+static const TUint8 KTelnetAO	= 245;	
+
+/**
+NVT Are You There
+*/
+static const TUint8 KTelnetAYT	= 246;	
+
+/**
+NVT Erase Character
+*/
+static const TUint8 KTelnetEC	= 247;	
+
+/**
+NVT Erase Line
+*/
+static const TUint8 KTelnetEL	= 248;
+	
+/**
+NVT Go Ahead Signal
+*/
+static const TUint8 KTelnetGA	= 249;	
+
+/**
+Start of subnegotiation
+*/
+static const TUint8 KTelnetSB	= 250;	
+
+/**
+Indicates the desire to begin/confirm option
+*/
+static const TUint8 KTelnetWILL	= 251;
+	
+/**
+Indicates the refusal to begin/continue option
+*/
+static const TUint8 KTelnetWONT	= 252;
+	
+/**
+Indicates the request that the other party begin/confirmation of option
+*/
+static const TUint8 KTelnetDO	= 253;	
+
+/**
+Indicates the demand to stop/confirm that the option is no longer expected
+*/
+static const TUint8 KTelnetDONT	= 254;
+	
+/**
+NVT Interpret As Command escape character
+*/
+static const TUint8 KTelnetIAC	= 255;	
+
+static const TUint8 KTelnetCommandSEND	= 1;
+static const TUint8 KTelnetCommandIS	= 0;
+
+
+// Supported RFC defined options 
+
+static const TUint8 KTelnetProtOptionEcho			= 1;
+static const TUint8 KTelnetProtOptionSuppressGA		= 3;
+static const TUint8 KTelnetProtOptionBinary			= 0;
+static const TUint8 KTelnetProtOptionTerminalSpeed	= 32;
+static const TUint8 KTelnetProtOptionTerminalType	= 24;
+static const TUint8 KTelnetProtOptionWindowSize		= 31;
+static const TUint8 KTelnetProtOptionLogoff			= 18;
+static const TUint8 KTelnetProtOptionStatus			= 5;
+
+// RFC defined NVT Character constants 
+
+static const TUint8 KTelnetCR			= 0x0D;
+static const TUint8 KTelnetLF			= 0x0A;
+static const TUint8 KTelnetNULL			= 0x00;
+
+class MProtoEvent;
+
+class TOptionFSM
+/**
+RFC 1143 Bidirectional RFC option negotiation
+This class contains the core Us/Him state machine as defined in RFC 1143
+
+@internalComponent
+*/
+{
+public:
+
+	/** Option Negotiation requests for both directions */
+	enum TRequests
+		{
+		ENoOption,EClientDo = 1,EClientWill = 2,EServerDo = 4, EServerWill = 8,
+		EClientWont,EClientDont,EServerWont,EServerDont
+		};
+
+	/** Return values from Request */
+	enum TRequestReturns
+		{
+		EErrNone,EProtocolError,EPermissionsError
+		};
+
+	/** Actions as a result of Request */
+	enum TActions
+		{
+		ENoAction,ESendDo,ESendWill,ESendDont,ESendWont
+		};
+
+	/** Events as a result of Request */
+	enum TEvents
+		{
+		ENoEvent,EServerEnabled = 1,EServerDisabled = 2,EClientEnabled = 4,EClientDisabled = 8
+		};
+	
+	// Key RFC 1143 method that takes requests from client or server side
+	TInt32	Request(const TInt32 aRequest,TInt32& aAction,TInt32& aEvent);
+	// Set the permissission on an option, maximum of :-
+	// EClientDo | EClientWill | EServerDo | EServerWill
+	void	SetPermission(const TInt32 aRequestPermissions){Allowed = aRequestPermissions;}
+	
+	// There are intermmediate WANT states but we only return enabled/disabled
+	TBool	ServerEnabled(){return(Him == EYes);}
+	TBool	ClientEnabled(){return(Us == EYes);}
+	// Reset the state machine
+	void	Reset();
+
+	TOptionFSM();
+	~TOptionFSM(){}
+
+private:
+	// Permissions, maximum of :-
+	// EClientDo | EClientWill | EServerDo | EServerWill
+	TInt32	Allowed;
+	// Defined in RFC 1143
+	TInt8	Us;
+	TInt8	UsQ;
+	TInt8	Him;
+	TInt8	HimQ;
+	
+	// values for HimQ,UsQ
+	enum TQueueStates
+		{
+		ENone,EEmpty,EOpposite
+		};
+											
+	// Values for Us,Him
+	enum TOptionStates
+		{
+		ENo,EYes,EWantYes,EWantNo
+		};
+};
+
+
+NONSHARABLE_CLASS(CUnknownOption)	:	public CBase
+/**
+Handles any unsupported RFC options
+
+@internalComponent
+*/
+	{
+public:
+	CUnknownOption(){}
+	~CUnknownOption();
+	void RequestUnknown(TInt8 aOption,TInt32 aRequest,TDes8& aAction,TInt32& aEvent);
+	void Reset(){iFSM.Reset();}
+
+	static CUnknownOption* NewL();
+
+protected:
+	void ConstructL();
+
+	TOptionFSM iFSM;
+	};
+
+
+NONSHARABLE_CLASS(CRFCOptionBase)	:	public	CBase
+/**
+@internalComponent
+*/
+	{
+public:
+	CRFCOptionBase(){}
+	~CRFCOptionBase();
+
+	static void CreateOptionResponse(TInt8 aOption,TInt32 aAction,TDes8& aBuffer);
+	void Reset(){iFSM.Reset();}
+	void SetRequestPermission(const TInt32 aAllowed){iFSM.SetPermission(aAllowed);}	
+protected:
+
+	virtual TInt32  RequestOption(const TInt32 aRequest,TDes8& aAction,TInt32& aEvent) = 0;
+	virtual void	GetTelnetOptionStatus(TDes8& aCurrentStatus) = 0;
+
+	TOptionFSM iFSM;
+
+	};
+
+NONSHARABLE_CLASS(CSuppressGAOption) :		public CRFCOptionBase
+/**
+TELNET Suppress Go Ahead RFC 858
+
+@internalComponent
+*/
+	{
+public:
+	CSuppressGAOption(){}
+	~CSuppressGAOption(){}
+
+	static  CSuppressGAOption* NewL();
+	TInt32  RequestOption(const TInt32 aRequest,TDes8& aAction,TInt32& aEvent);
+	void	GetTelnetOptionStatus(TDes8& aCurrentStatus);
+
+protected:
+	void ConstructL();
+
+	};
+
+NONSHARABLE_CLASS(CStatusOption)	:	public CRFCOptionBase
+/**
+TELNET Status Option RFC 859
+
+@internalComponent
+*/
+	{
+public:
+	CStatusOption(){}
+	~CStatusOption(){}
+
+	static CStatusOption* NewL();
+	TInt32  RequestOption(const TInt32 aRequest,TDes8& aAction,TInt32& aEvent);
+	void	GetTelnetOptionStatus(TDes8& aCurrentStatus);
+	TBool	ReceiveStatus(){return(iFSM.ServerEnabled());}
+	TBool	SendStatus(){return(iFSM.ClientEnabled());}
+protected:
+	void ConstructL();
+
+	};
+
+NONSHARABLE_CLASS(CSpeedOption)	:	public CRFCOptionBase
+/**
+TELNET Terminal Speed Option RFC 1079
+
+@internalComponent
+*/
+	{
+public:
+	CSpeedOption(){}
+	~CSpeedOption(){}
+
+	static CSpeedOption* NewL();
+	TInt32  RequestOption(const TInt32 aRequest,TDes8& aAction,TInt32& aEvent);
+	void	GetTelnetOptionStatus(TDes8& aCurrentStatus);
+	void	GetTelnetSubOption(TDes8& aOutBuffer);
+	TBool	Set(const TDesC8& aSpeed);
+	TBool	SendSpeed(){return(iFSM.ClientEnabled());}
+
+protected:
+	void ConstructL();
+
+private:
+	TBuf8<20>	iTermSpeed;
+	};
+
+NONSHARABLE_CLASS(CLogoutOption)	:	public CRFCOptionBase
+/**
+TELNET Logout Option RFC 727
+
+@internalComponent
+*/
+	{
+public:
+	CLogoutOption(){}
+	~CLogoutOption(){}
+
+	static  CLogoutOption* NewL();
+	TInt32  RequestOption(const TInt32 aRequest,TDes8& aAction,TInt32& aEvent);
+	void	GetTelnetOptionStatus(TDes8& aCurrentStatus);
+
+protected:
+	void ConstructL();
+	};
+
+
+NONSHARABLE_CLASS(CTerminalTypeOption)	:	public CRFCOptionBase
+/**
+TELNET Terminal Type Option RFC 1091
+
+@internalComponent
+*/
+	{
+public:
+	CTerminalTypeOption(){}
+	~CTerminalTypeOption(){}
+
+	static CTerminalTypeOption* NewL();
+	TInt32  RequestOption(const TInt32 aRequest,TDes8& aAction,TInt32& aEvent);
+	void	GetTelnetOptionStatus(TDes8& aCurrentStatus);
+	void	GetTelnetSubOption(TDes8& aOutBuffer);
+	TBool	Set(const TDesC8& aType);
+	TBool	SendTerminalType(){return(iFSM.ClientEnabled());}
+	const TDesC8& TerminalType(){return(iTermType);}   
+
+protected:
+	void ConstructL();
+
+private:
+	TBuf8<40>	iTermType;
+	};
+
+NONSHARABLE_CLASS(CWindowSizeOption)	:	public CRFCOptionBase
+/**
+TELNET Window Size Option RFC 1073
+
+@internalComponent
+*/
+	{
+public:
+	CWindowSizeOption(){}
+	~CWindowSizeOption(){}
+
+	static CWindowSizeOption* NewL();
+	TInt32  RequestOption(const TInt32 aRequest,TDes8& aAction,TInt32& aEvent);
+	void	GetTelnetOptionStatus(TDes8& aCurrentStatus);
+	void	GetTelnetSubOption(TDes8& aOutBuffer);
+	TBool	Set(const TTelnetConfig::TWindowSize& aSize);
+	TBool	SendWindowSize(){return(iFSM.ClientEnabled());}
+
+protected:
+	void ConstructL();
+
+private:
+	TTelnetConfig::TWindowSize iWindowSize;
+	};
+
+
+NONSHARABLE_CLASS(CEchoOption)	:	public CRFCOptionBase
+/**
+TELNET Echo Option RFC 857
+
+@internalComponent
+*/
+	{
+public:
+	CEchoOption(){}
+	~CEchoOption(){}
+
+	static CEchoOption* NewL();
+	TInt32  RequestOption(const TInt32 aRequest,TDes8& aAction,TInt32& aEvent);
+	void	GetTelnetOptionStatus(TDes8& aCurrentStatus);
+	TBool	ReceiveEcho(){return(iFSM.ServerEnabled());}
+protected:
+	void ConstructL();
+
+	};
+
+NONSHARABLE_CLASS(CBinaryOption)	:	public CRFCOptionBase
+/**
+TELNET Binary Option RFC 856
+
+@internalComponent
+*/
+	{
+public:
+	CBinaryOption(){}
+	~CBinaryOption(){}
+
+	static CBinaryOption* NewL();
+	TInt32  RequestOption(const TInt32 aRequest,TDes8& aAction,TInt32& aEvent);
+	void	GetTelnetOptionStatus(TDes8& aCurrentStatus);
+	TBool	ReceiveBinary(){return(iFSM.ServerEnabled());}
+	TBool	SendBinary(){return(iFSM.ClientEnabled());}
+
+protected:
+	void ConstructL();
+	};
+
+NONSHARABLE_CLASS(CProto) : public CBase
+/**
+The main TELNET RFC 854 coordinating class
+
+@internalComponent
+*/
+	{
+public:
+	CProto();
+	~CProto();
+	static CProto* NewL(const TTelnetConfig& aConfig,MProtoEvent* aNotifier);
+	TInt ProtoWrite(const TDesC8& aInBuffer,TDes8& aOutBuffer);
+	TInt ProtoWrite(const TTelnetUserControl& aControlCode,TDes8& aBuffer,TDes8& aUrgentBuffer);
+	TInt ProtoRead(const TDesC8& aPortReadBuffer,TDes8& aClientReadBuffer,TDes8& aProtoBuffer);
+	TInt ClientRequestOption(TInt32 aOptionRequest,TDes8& aAction,TInt32& aEvent);
+	void ModifyConfig(const TTelnetConfig& aConfig,TDes8* aAction);
+	void ReceiveUrgent(TInt aUrgentData);
+	void OptionStatus(TOptionStatus& aStatus);
+	void ServerOptionStatus(TDes8& aActionBuffer);
+
+	void GetInitOptions(TDes8& aActionBuffer);
+	void Reset();
+
+	enum TLineEvents
+		{
+		EEventNone,
+		EEventUrgentData
+		};
+	
+private:
+	enum TReceiveState
+		{
+		ENormal,EIAC,ECommand,ESubOpt
+		};
+
+	enum TSubOptState
+		{
+		ESB,EOption,ERequest,EEndIAC
+		};
+
+	TBool					iUrgentFlag;
+	TInt					iUrgentData;
+
+	TReceiveState			iReceiveState;
+	TSubOptState			iSubOptState;
+
+	TBuf8<128>				iProtReadBuffer;
+	TBuf8<128>				iServerStatus;
+
+	CBinaryOption*			iBinary;
+	CEchoOption*			iEcho;
+	CWindowSizeOption*		iWindowSize;
+	CTerminalTypeOption*	iTerminalType;
+	CLogoutOption*			iLogout;
+	CSpeedOption*			iSpeed;
+	CSuppressGAOption*		iGA;
+	CStatusOption*			iStatus;
+	CUnknownOption*			iUnknown;
+
+	void GetOptionStatus(TDes8& aOutBuffer);
+
+	MProtoEvent* iNotifier;
+protected :
+	void ConstructL(const TTelnetConfig& aConfig,MProtoEvent* aNotifier);
+	};
+
+class MProtoEvent
+/**
+@internalComponent
+*/
+	{
+public:
+	virtual void ProtoError(TInt aError) = 0;
+	virtual void ProtoEvent() = 0;
+	};
+
+#endif