datacommsserver/esockserver/test/TS_MultiHoming/CEchoSocket.h
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/test/TS_MultiHoming/CEchoSocket.h	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,174 @@
+// Copyright (c) 2002-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:
+// This is the header file for the CEchoSocket class, used in
+// the TS_MultiHoming test suite
+//
+//
+
+/**
+ @file
+*/
+
+#if (!defined __CECHOSOCKET_H__)
+#define __CECHOSOCKET_H__
+
+#include "TS_MultiHomingStep.h"
+
+
+
+
+
+
+// String Literals
+_LIT(KErrConnectFailed, "Could not connect/bind %S:%d, error %i");
+_LIT(KErrSendFailed, "Send of packet failed, %S:%d, error %i");
+_LIT(KErrRecvFailed, "Receive error on %S:%d, error %S");
+_LIT(KErrPacketsDiff, "Packet received did not match packet sent on %S:%d");
+_LIT(KTxtCEchoSocket, "CEchoSocket");
+_LIT(KTxtWhatHappened, "State Error: CEchoSocket");
+_LIT(KSockDetails, "%S:%d, Destination: %S:%i, %i Packets of %i bytes");
+
+
+enum EEchSockState
+/**
+ * Enum for internal state of the socket
+ */
+	{
+	EInitialised,		//< Socket initialised
+	EReady,				//< Socket bound (and connected for TCP)
+	ESentData,			//< SendData() was called last
+	ERecvdData,			//< RecvData() was last called
+	ERecvFail,			//< RecvData() did not read all that was expected
+	EComplete			//< All data has been sent on the socket, results available
+	};
+
+class CSafety;
+class CEchoSocket : public CActive
+	{
+	public:
+		static CEchoSocket* NewL();
+		virtual ~CEchoSocket();
+
+		// From CActive
+		void RunL();
+		void DoCancel();
+
+
+		// Request an echo socket implicit connections
+        virtual TInt Echo(const TInetAddr& aDest,   const TInetAddr& aSrc,
+					      const TInt& aSize,		const TInt& aPackets,
+					      const TUint& aProto,		const TInt& aTol,
+					      TConnDetails *aConn,      const TInt& aSockNum,
+					      const TBool aIsListener,  CTS_MultiHomingStep* aStep);
+
+		void LogTimeout( );
+		TInt LogReport(TBool& aPassed, TInt& aNumSent, TInt& aUdpRate);	//< Returns the socket's outcome
+		void SafetyCall();		//< Allows the safety timer to cancel socket operations
+
+		TInt iSockErr;
+		enum { SAFETY_TIMEOUT = 10000000,    //< 10 second safety timer
+			  MAX_CONSEC_TIMEOUT = 5   };	//< no more than 5 consecutive timeouts (ie 50 seconds)
+											//< Based on 30 second RIP updates, expect 3 udp packets to be lost
+									//<
+protected:
+		CEchoSocket();
+		void ConstructL();
+		void AcceptUdp();				//< Accepts Udp traffic
+		void ConnectTcp();				//< Performs a TCP Connect
+		void BindUdp();					//< Binds a UDP Socket
+		void SendData();				//< Sends a packet
+		virtual void RecvData();		//< Receives a packet
+		void SetComplete();				//< Closes the socket.
+		void RecvDataTcpListen();		//< handles client data
+		void SendDataToClient();		//< Echos data back to client
+		RSocket		iSocket;			//< The actual socket
+
+		TConnDetails *iTConnection;  //< The connection that has been started
+		TInetAddr	iSrcAddr;			//< Source IP address optional
+		TInetAddr	iDestAddr;			//< Destination IP address
+		TInt		iPacketSize;		//< Packet size in Bytes
+		TInt		iPackets;			//< Packets to send
+		TInt		iPacketsToSend;		//< Packets still to send
+		TInt		iRecvdGood;			//< Number of Packets received
+		TUint		iProtocol;			//< Protocol used TCP/UDP
+		TInt		iUDPTolerance;		//< Percentage allowed to drop
+		EEchSockState iState;			//< Current state of the socket
+		CSafety*	iSafety;			//< The Safety timer AO
+		HBufC8*		iWritebuf;			//< Output data buffer
+		HBufC8*		iReadbufThisRead;   //< Input data buffer for this read
+		HBufC8*		iReadbuf;			//< Input data buffer
+		TPtr8		iPtrRecvd;			//< Read buffer pointer total received
+		TPtr8		iPtrRecvdThisRead;  //< Read buffer pointer for each recv call
+		TPtr8		iPtrWritn;			//< Read buffer pointer
+
+		CTS_MultiHomingStep* iOwnerStep;	//< Pointer to owner step, logging use.
+		TName		iName;				//< Socket Name, for logging reference
+		TInt		iConsecRecvTimeOuts;//< number of consecutive read timeouts
+		TInt        iSockNum;           //< Socket number as assigned by the test suite
+		TBool       iIsListener;		//< Is a listener
+		RSocket	    iAcceptedConnection;
+	};
+
+
+
+class CSafety : public CActive
+/**
+ * Class to implement a safety timeout for the CEchoSocket class
+ */
+	{
+	public:
+		static CSafety* NewL(CEchoSocket* aOwner);
+		virtual ~CSafety();
+
+		// From CActive
+		void RunL();
+		void DoCancel();
+
+		// Set the timer
+		void SetSafety();
+
+	private:
+		CSafety();
+		void ConstructL(CEchoSocket* aOwner);
+
+		CEchoSocket*					myOwner;//< The owner AO for this option
+		RTimer							iSafety;//< Safety Timer for socket operations
+		TTimeIntervalMicroSeconds32		iTime;	//< Timeout in microseconds
+	};
+
+// Used for the incomming connection tests for multiple connections
+// This class will do only one side of the connection, rather than managing the whole thing.
+NONSHARABLE_CLASS(CSplitEchoSocket) : public CEchoSocket
+	{
+	public:
+		static CSplitEchoSocket* NewL();
+		 ~CSplitEchoSocket();
+
+		// Override the behaviour...
+		TInt Echo(const TInetAddr& aDest,       const TInetAddr& aSrc,
+							const TInt& aSize,			const TInt& aPackets,
+							const TUint& aProto,		const TInt& aTol,
+							TConnDetails *aConn,        const TInt& aSockNum,
+							const TBool aIsListener,    CTS_MultiHomingStep* aStep);
+		void RunL();
+
+	private:
+		CSplitEchoSocket();
+
+		// Override the behaviour...
+		void RecvData();				//< Receives a packet
+	};
+
+#endif //__CECHOSOCKET_H__
+