diff -r 000000000000 -r dfb7c4ff071f datacommsserver/esockserver/test/protocols/pdummy/pdummy.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/datacommsserver/esockserver/test/protocols/pdummy/pdummy.h Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,338 @@ +// Copyright (c) 1997-2009 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: +// + +#if !defined(__PDUMMY_H__) +#define __PDUMMY_H__ + +#include + +#include "ES_DUMMY.H" + + +//--------------------------------------------------------------------------------------------------------- + +NONSHARABLE_CLASS(CDProtocolFamily): public CProtocolFamilyBase + { +public: + static CDProtocolFamily * NewL(); + void ConstructL(); + TInt Install(); + TInt Remove(); + CProtocolBase * NewProtocolL(TUint aSockType,TUint aProtocol); + TUint ProtocolList(TServerProtocolDesc *& aProtocolList); + CDProtocolFamily(); + +private: + void Construct(); + +private: + TServerProtocolDesc iProtocolDescs[5]; + }; + +//--------------------------------------------------------------------------------------------------------- + +NONSHARABLE_CLASS(CDummyProtocol): public CProtocolBase + { +public: + IMPORT_C static CDummyProtocol *NewL(TInt aProtocol, TServerProtocolDesc* aProtoDesc); + IMPORT_C TInt ProtocolBaseBind(CProtocolBase* aProt, TUint aId); + IMPORT_C TInt ProtocolBaseBindTo(CProtocolBase* aProt); + IMPORT_C TInt ProtocolBaseError(CProtocolBase* aProt); + IMPORT_C TInt ProtocolBaseGetOption(TUint aLevel, TUint aName, TDes8& aBuf, CProtocolBase* aProt); + IMPORT_C TInt ProtocolBaseNewHostResolver(); + IMPORT_C TInt ProtocolBaseNewNetDatabase(); + IMPORT_C TInt ProtocolBaseNewSAP(TUint aProt); + IMPORT_C TInt ProtocolBaseNewServiceResolver(); + IMPORT_C TInt ProtocolBaseProcess(RMBufChain &aChain, CProtocolBase* aProt); + IMPORT_C TInt ProtocolBaseSend(RMBufChain &aChain, CProtocolBase* aProt); + IMPORT_C TInt ProtocolBaseSetOption(TUint aLevel, TUint aName, TDes8& aBuf, CProtocolBase* aProt); + IMPORT_C TInt ProtocolBaseSendWithAddress(TDes8& aBuf,TSockAddr* aTo,TSockAddr* aFrom, CProtocolBase* aProt); + IMPORT_C TInt ProtocolBaseProcessWithAddress(TDes8& aPDU, TSockAddr* aFrom, TSockAddr* aTo, CProtocolBase* aProt); + IMPORT_C CDummyProtocol(TServerProtocolDesc* aProtoDesc); + IMPORT_C ~CDummyProtocol(); + +public: + CServProviderBase *NewSAPL(TUint aProtocol); + virtual CHostResolvProvdBase *NewHostResolverL(); + virtual CServiceResolvProvdBase *NewServiceResolverL(); + virtual CNetDBProvdBase* NewNetDatabaseL(); + TBool CanCreateSockets(); + void InitL(TDesC& aTag); + void BindL(CProtocolBase *aProtocol, TUint anId); + virtual void BindToL(CProtocolBase *protocol); + void StartL(void); + TInt Send(RMBufChain &,CProtocolBase* aSourceProtocol); + void Process(RMBufChain &,CProtocolBase* aSourceProtocol); + TInt Send(TDes8 &, TSockAddr *to,TSockAddr *from,CProtocolBase* aSourceProtocol); + void Process(TDes8 & ,TSockAddr *from,TSockAddr *to,CProtocolBase* aSourceProtocol); + void Identify(TServerProtocolDesc *)const; + TInt GetOption(TUint level,TUint name,TDes8 &anOption,CProtocolBase* aSourceProtocol); + TInt SetOption(TUint level,TUint name,const TDesC8& option,CProtocolBase* aSourceProtocol); + void Error(TInt anError,CProtocolBase* aSourceProtocol); + TBool IsStarted(){return iIsStarted;} + +protected: + TInt iType; + TServerProtocolDesc* iProtoDesc; + TBool iIsStarted; + CArrayFixFlat iProtocols; + }; + +//--------------------------------------------------------------------------------------------------------- + +class CInterfaceProtocol; +NONSHARABLE_CLASS(CIfHolder) : public CBase + { +public: + CIfHolder(CInterfaceProtocol&); + ~CIfHolder(); + TDblQueLink iLink; + CNifIfBase *iIf; + }; + +//--------------------------------------------------------------------------------------------------------- + +NONSHARABLE_CLASS(CInterfaceProtocol) : public CDummyProtocol, public MNifIfUser + { +friend class CIfHolder; +public: + CInterfaceProtocol(TServerProtocolDesc* aProtoDesc); + ~CInterfaceProtocol(); + virtual TInt GetOption(TUint level,TUint name,TDes8 &anOption,CProtocolBase* aSourceProtocol); + virtual void IfUserBindFailure(TInt aResult, TAny* aId); + virtual void IfUserNewInterfaceL(CNifIfBase* aIf, TAny* aId); + virtual void IfUserInterfaceDown(TInt aResult, CNifIfBase* aIf); + virtual CProtocolBase* IfUserProtocol(); + virtual void IfUserOpenNetworkLayer(); + virtual void IfUserCloseNetworkLayer(); + virtual TBool IfUserIsNetworkLayerActive(); + virtual void Close(); + void StartAutoInterfaceL(); +private: + TDblQue iInterfaces; + TName iInterfaceName; + TInt iInterfaceCount; + }; + +//--------------------------------------------------------------------------------------------------------- + +class CAsyncSocketErrorer; + +NONSHARABLE_CLASS(CDummyProvd) : public CServProviderBase + { +public: + ~CDummyProvd(); + static CDummyProvd *NewL(CDummyProtocol &aProtocol); + virtual void LocalName(TSockAddr &anAddr)const; + virtual TInt SetLocalName(TSockAddr &anAddr); + virtual void RemName(TSockAddr &anAddr)const; + virtual TInt SetRemName(TSockAddr &anAddr); + virtual TInt GetOption(TUint level,TUint name,TDes8 &anOption)const; + virtual TInt SetOption(TUint level,TUint name,const TDesC8 &anOption); + virtual void Ioctl(TUint level,TUint name,TDes8 *anOption); + virtual void CancelIoctl(TUint aLevel,TUint aName); + virtual TInt Write(RMBufChain& aData, TUint options, TSockAddr* anAddr=NULL); + virtual TUint Write(const TDesC8& aDesc, TUint options, TSockAddr* anAddr); + virtual TInt GetData(RMBufChain& aData, TUint aLength, TUint options,TSockAddr* anAddr=NULL); + virtual void GetData(TDes8& aDesc,TUint aOptions,TSockAddr*aAddr = NULL); + virtual void ActiveOpen(void); + virtual void ActiveOpen(const TDesC8 &aConnectionData); + virtual TInt PassiveOpen(TUint aQue); + virtual TInt PassiveOpen(TUint aQue,const TDesC8 &aConnectionData); + virtual void AutoBind( void ); + virtual void Shutdown(TCloseType option); + virtual void Shutdown(TCloseType option,const TDesC8 &aDisconnectData); + virtual void Start(); + + virtual TInt SecurityCheck(MProvdSecurityChecker *aSecurityChecker); + void DestroyAsyncErrorer(); + +private: + class CFlowOnTimer; + friend class CDummyProvd::CFlowOnTimer; + + static TInt NoBearerCB(TAny* aArg); + void ConstructL(); + TBool IsTransportType(TUint aType); + CDummyProvd(CDummyProtocol &aProtocol); + void HangModule(void); + TInt SetBlockedConnect(const TDesC8 &aOption); + TInt OptToErr(const TDesC8 &aOption, TInt &aRes); + TInt GobbleMBufs(); + void FreeMBufs(); + void FreeMBufs(TUint aNumber); + +private: + CArrayFixFlat* iDataArray; + TBool iIsBound; + CDummyProtocol *iProtocol; + TSockAddr iAddr; + CAsyncSocketErrorer* iAsyncErrorer; + TBool iInputStopped; + TInt iListenErrorCode; + TBool iCancelIoctl; // Set when an IOCTL has been cancelled. + + TBool iBlockOnClose; //Used by and test Ioctl to cause the socket to hang on close + TBool iCompleteIoctl; + TBool iConnectCompleteState; //Whether connects should be completes or not; + TBool iConnectPending; //Whether a connect is awaiting completion; + RBuf8 iListenData; + TInt iErrorForNextWrite; //Whether write should send an error if == KErrNone the operates normally + TInt iErrorForNextShutdown; //Whether write should send an error if == KErrNone the operates normally + TInt iErrorForNextConnect; //Whether write should send an error if == KErrNone the operates normally + + TBool iFlowOffWrite; + TInt iFlowOffWriteTimeout; + CFlowOnTimer* iFlowOnTimer; + RMBufChain iChain; + TBool iErrNoMBufs; + CAsyncCallBack iNoBearerCB; + }; + +//--------------------------------------------------------------------------------------------------------- + +class CDNSQueryProcessor; +NONSHARABLE_CLASS(CDatagramHostResolver): public CHostResolvProvdBase + { +private: + CDatagramHostResolver(); +public: + static CDatagramHostResolver* NewL(); + void ConstructL(); + ~CDatagramHostResolver(); + + virtual void GetByName(TNameRecord &iName); + virtual void GetByAddress(TNameRecord &iName); + virtual void SetHostName(TDes &aNameBuf); + virtual void GetHostName(TDes &aNameBuf); + virtual TInt SetOption(TUint level,TUint name,const TDesC8 &anOption); + virtual void CancelCurrentOperation(); + + virtual void Query(const TDesC8& aQryBuf, TDes8& aResBuf, TInt aCounter); + virtual TInt SecurityCheck(MProvdSecurityChecker *aSecurityChecker); +private: + + CDNSQueryProcessor* ipDNSQueryProcessor; //< simulates DNS queries processing + + }; + +//--------------------------------------------------------------------------------------------------------- + +NONSHARABLE_CLASS(CDatagramServResolver) : public CServiceResolvProvdBase + { +private: + CDatagramServResolver(); +public: + static CDatagramServResolver* NewL(); + virtual void GetByName(const TDesC &aNameBuf,TInt32 &aPortNum); + virtual void GetByNumber(TDes &aNameBuf,TInt32 aPortNum); + virtual void RegisterService(const TDesC &aNameBuf,TInt32 aPortNum); + virtual void RemoveService(const TDesC &aNameBuf,TInt32 aPortNum); + virtual void CancelCurrentOperation(); + virtual TInt SecurityCheck(MProvdSecurityChecker *aSecurityChecker); + }; + +//--------------------------------------------------------------------------------------------------------- + +NONSHARABLE_CLASS(CDatagramNetDataBase) : public CNetDBProvdBase + { +public: + virtual void Query(TDes8& aBuffer); + virtual void Add(TDes8& aBuffer); + virtual void Remove(TDes8& aBuffer); + virtual void CancelCurrentOperation(); + static CDatagramNetDataBase* NewL(); + virtual TInt SecurityCheck(MProvdSecurityChecker *aSecurityChecker); +private: + CDatagramNetDataBase(); + TInt iCount; + }; + +//--------------------------------------------------------------------------------------------------------- + +NONSHARABLE_CLASS(CAsyncSocketErrorer) : public CActive + { +public: + static CAsyncSocketErrorer* NewL(MSocketNotify& aSocket,TInt aErrorCode,TUint aOpMask, + CDummyProtocol * apProtocols, CDummyProvd* aOwner, const TDesC8* aListenData); + ~CAsyncSocketErrorer(); +private: + CAsyncSocketErrorer(MSocketNotify& aSocket,TInt aErrorCode,TUint aOpMask,CDummyProtocol * apProtocols, CDummyProvd* aOwner, const TDesC8* aListenData = NULL); + void RunL(); + void DoCancel(); + MSocketNotify& iSocket; + TInt iErrorCode; + TUint iOpMask; + CDummyProtocol* ipProtocols; + CDummyProvd* iOwner; + const TDesC8* iListenData; + }; + + +//--------------------------------------------------------------------------------------------------------- + +/** +* This class simulates DNS query processing. +* It checks incoming query data, forges DNS query responses +* and simulates processing by generating random delays. +* @see CDatagramHostResolver +*/ +NONSHARABLE_CLASS(CDNSQueryProcessor) : public CActive +{ +public: + + static CDNSQueryProcessor* NewL(); + ~CDNSQueryProcessor(); + void SetNotifier(MResolverNotify *aNotifier) {iDnsNotifier = aNotifier;} + + void ProcessQuery(const TDnsQuery& aQry, TDes8& aResBuf, TInt aCounter); + + +private: + CDNSQueryProcessor(); + + void RunL(); + void DoCancel(); + void ConstructL(void); + + void CompleteImmediately(); + void CompleteImmediately(TInt aResultCode); + + void SetQryProcessDelay(); + void SetCompletionCode(TInt aResultCode) {iCompleteResult = aResultCode;} + + //-- queries processors + void QryProcessA (const TDnsQuery& aQry, TDnsRespA& aQryResult, TInt aCounter); + void QryProcessSRV (const TDnsQuery& aQry, TDnsRespSRV& aQryResult, TInt aCounter); + void QryProcessPTR (const TDnsQuery& aQry, TDnsRespPTR& aQryResult, TInt aCounter); + void QryProcessNAPTR (const TDnsQuery& aQry, TDnsRespNAPTR& aQryResult, TInt aCounter); + void QryProcessMX (const TDnsQuery& aQry, TDnsRespMX& aQryResult, TInt aCounter); + void QryProcessAAAA (const TDnsQuery& aQry, TDnsRespAAAA& aQryResult, TInt aCounter); + +private: + + RTimer iDelayTimer; //< generates delays simulating queries completion + MResolverNotify *iDnsNotifier; //< notifier, QueryComplete will be called + TInt iCompleteResult; //< Query completion result + TUint16 iCurrQryType; //< current query type, used by QueryGetNext + TInt64 iRndSeed; //< random seed, for delays +}; + + + + + +#endif //__PDUMMY_H__ +