diff -r 000000000000 -r b16258d2340f applayerprotocols/telnetengine/SRC/TELFSM.H --- /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 + +// 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