datacommsserver/esockserver/test/protocols/pdummy/pdummy.h
changeset 0 dfb7c4ff071f
--- /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 <comms-infras/nifif_internal.h>
+
+#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<CProtocolBase *> 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<CIfHolder> 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<RMBufChain>* 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__
+