// PPPLCP.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#if !defined(__PPPLCP_H__)
#define __PPPLCP_H__

#if !defined(__E32BASE_H__)
#include <e32base.h>
#endif
#if !defined(__E32DEF_H__)
#include <e32def.h>
#endif
#include <es_prot.h>
#include <es_mbuf.h>

#if !defined(__NIFMAN_H__)
#include <nifman.h>
#endif // __NIFMAN_H__

#include "pppcomp.h"
#include "pppccp.h"
#include "ppplrd.h"

////////////////////////////////////////////////////////////////////////////////
// PPP LCP - The heart of PPP
////////////////////////////////////////////////////////////////////////////////

//const TUint KPppIdEsocl = 0x10000; // outside PPP range and Esock forbids zero.

class CPppIfFactory : public CNifIfFactory
	{
protected:
	virtual void InstallL();
	virtual CNifIfBase* NewInterfaceL(const TDesC& aName);
	virtual TInt Info(TNifIfInfo& aInfo, TInt aIndex) const;
	};

class CPppAcp;
class CPppApBase;
class CPppMsCbcpClient;	// CSW


// Callback IETF request types (see draft RFC for PPP-callback)
typedef enum	// CSW
	{
	ECallbackIETFRequestType0=0,	// defined by IETF draft RFC
	ECallbackIETFRequestType1=1,
	ECallbackIETFRequestType2=2,
	ECallbackIETFRequestType3=3,
	ECallbackIETFRequestType4=4,
	ECallbackIETFRequestType5=5,
	// and also
	ECallbackIETFRequestTypeMSCBCP=6	// from MS rejected draft
	} TCallbackIETFRequestType;


class CPppLcp : public CNifIfLink, public MPppFsm, public MPppOptionsExtender
	{
public:
	CPppLcp(CNifIfFactory& aFactory);
	~CPppLcp();
	void InitL();
	inline CPppLinkBase*  PppLink() { return iPppLink; }
	void RegisterRecvr(MPppRecvr* aRecvr);
	void ReregisterRecvr(MPppRecvr* aRecvr);
	void DeregisterRecvr(MPppRecvr* aRecvr);
	void LinkRecv(RMBufChain& aPacket);
	void LinkFlowOn();
	void LinkLayerUp();
	void LinkLayerDown(TInt aStatus);
	void PhaseComplete();
	void PhaseAborted(TInt aStatus);
	void PhaseAdvance(TPppPhase aNewPhase);
	void PhaseRetard(TPppPhase aNewPhase, TInt aReason);
	TUint8 CPppLcp::SendEchoRequest();
	void SendIdentification();
	TPppLinkMode PppLinkMode();
	//
	TInt PppOpen();
	void PppClose();

	void Authenticate(CPppApBase* aAp);
	void CancelAuthenticate(CPppApBase* aAp);
	inline const TDesC& PassWord() const { return iPassWord; }
	inline const TDesC& UserName() const { return iUserName; }

	virtual TInt Send(RMBufChain& aPdu, TAny* aSource=0);
    virtual void AuthenticateComplete(TInt aResult);
	virtual TInt Start();
	virtual void Stop(TInt aReason, MNifIfNotify::TAction aAction);
	virtual CNifIfBase* GetBinderL(const TDesC& aName);
	virtual void Info(TNifIfInfo& aInfo) const;
	static void FillInInfo(TNifIfInfo& aInfo);
	inline TBool DoLcpExts() const { return iDoLcpExts; }
	inline void CallbackRequestGranted();	// CSW
	void   TerminateLink(MNifIfNotify::TAction aAction, TInt aError=KErrNone);
	void PppNewCompressor(const CPppCompressor* aCompressor);
	void PppNewDeCompressor(const CPppDeCompressor* aDeCompressor);
	void StopProtocol(TUint aProtocol);
	inline void SetMaxTransferSize(TInt aLength);
	inline TInt MaxTransferSize();
	TBool DoesDllExist(const TDesC& aFilename);
	inline CObjectConIx*	ContainerForDlls() const { return iContainerForDlls; }

protected:
	// PPP FSM Upcalls
	virtual TInt FsmLayerStarted();
	virtual void FsmLayerFinished(TInt aReason=KErrNone);
	virtual void FsmLayerUp();
	virtual void FsmLayerDown(TInt aReason=KErrNone);
	virtual void FsmFillinConfigRequestL(RPppOptionList& aRequestList);
	virtual void FsmCheckConfigRequest(RPppOptionList& aRequestList, RPppOptionList& aAckList, RPppOptionList& aNakList, RPppOptionList& aRejList);
	virtual void FsmApplyConfigRequest(RPppOptionList& aRequestList);
	virtual void FsmRecvConfigAck(RPppOptionList& aReplyList);
	virtual void FsmRecvConfigNak(RPppOptionList& aReplyList, RPppOptionList& aReqList);
	virtual void FsmRecvConfigReject(RPppOptionList& aReplyList, RPppOptionList& aReqList);
	virtual void FsmTerminationPhaseComplete();
	virtual TBool FsmRecvUnknownCode(TUint8 aCode, TUint8 aId, TInt aLength, RMBufChain& aPacket);
private:
	static void NewMagicNumber(TUint& aMagicNumber);
	INLINE void AppendCallbackRequestL(RPppOptionList&  aRequestList );	// CSW
	INLINE void InitCallbackInfoL();				// CSW
	INLINE void PhaseAdvancesBeyondAuthenticate();	// CSW
	INLINE void CallbackGrantedAndAuthenticated();	// CSW
	INLINE TBool GetCallbackEnabledFromNetdial();	// CSW
	INLINE TCallbackAction GetCallbackActionFromNetdialL();	// CSW
	INLINE TInt GetCallbackRequestInfoFromNetdial( TDes8& aInfo );	// CSW
	INLINE void GetCallbackInfoL();	// CSW
	INLINE void NewCallbackRequestInfoL( TCallbackIETFRequestType aRequestType );	// CSW
	INLINE TBool QueryNetdialIsDialIn();	// CSW
private:
	CPppCcp* iPppCcp;
	TInt iOpenCount;
	TPppPhase iPhase;
	CPppAcp* iPppAcp;
	CPppLrd* iPppLrd;
	CPppLinkBase* iPppLink;
	TDblQue<MPppRecvr> iRecvrList;
	TUint iLocMagicNumber;
	TUint iRemMagicNumber;	// Or last NAK sent to peer
	TInt iConsecMagic;
	TInt iMaxSendSize;
	TInt iMaxRecvSize;
	HBufC8* iRecvIdentification;
	TTimeIntervalSeconds iRecvTimeRemaining;
	TTime iRecvTimeNotification;
	HBufC8* iRecvTimeRemMessage;
	CPppApBase* iAuthenticate;

	TBool	iGotCallbackInfo;			
	TBool	iCallbackEnabled;			
	TCallbackAction iCallbackAction;	
	TCallbackIETFRequestType iCallbackIETFRequestType;	
	TUint8* iCallbackInfo;	
	TInt	iCallbackInfoLen;	
	TUint8* iCallbackIETFRequestPacket;	
	TInt	iCallbackIETFRequestPacketLen;	
	TBool	iCallbackRequestGranted;	
	CPppMsCbcpClient * iPppMsCbcp;		
	MNifIfNotify::TAction iTerminateAction;
	TInt	iError;

	TBool iDoLcpExts;
	TBool iRecursive;
	CObjectConIx*	iContainerForDlls;

	TBuf<50> iUserName;
	TBuf<50> iPassWord;
	TBool iAuthenticateDone;

	};

#include "ppplcp.inl"
#endif
