diff -r 000000000000 -r dfb7c4ff071f datacommsserver/esockserver/test/TS_MultiHoming/CEchoSocket.h --- /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__ +