diff -r 000000000000 -r b16258d2340f applayerprotocols/httptransportfw/Test/t_httptransporthandler/ctestsocketreader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applayerprotocols/httptransportfw/Test/t_httptransporthandler/ctestsocketreader.h Tue Feb 02 01:09:52 2010 +0200 @@ -0,0 +1,155 @@ +// 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: +// + +#ifndef __CTESTSOCKETREADER_H__ +#define __CTESTSOCKETREADER_H__ + +#include +#include + +class MInputStream; +class MTestReaderObserver; + +/** @class CTestSocketReader + The CTestSocketReader class encapsulates the input stream of a connected + socket. The state machine is initially in the Idle state. When data is + expected to be received, the observer passes the expected data using the + ExpectData() API. The descriptor buffer passed in must remain valid until + the test socket reader termibates. + + The ExpectData() API binds the test socket reader to the input stream. The + state changes to PendingReceivedData and the test socket reader waits for + the input strean to notify it that data has been received. + + The input stream uses the MInputStreamObserver::ReceivedDataInd() API to + notify the test socket reader that data has been received. The test socket + reader verifies that the received data is part of the expected data. If so + that part is removed from the expected data. The test socket reader moves + to the ReceiveAck state and self-completes. If the received data was not + part of the expected data or if there was extra data in the received buffer + then a panic occurs. + + In the ReceiveAck state the test socket reader notifies the input stream + that it has finished with the received buffer. If all the expected data has + been received then the test socket reader moves to the Idle state. If more + data is expected the test socket reader moves to the PendingReceivedData. + + The test socket reader observer can request that the input stream be closed + using the CloseReader() API. The test socket reader must be in the Idle + state or else there will be a panic. The state changes to Closing and the + test socket reader self-completes. + + In the Closing state the test socket reader requests that the input stream + close asynchronously. The test socket reader moves to the PendingClosed + state and waits to be notified that the input stream is closed. + + Once the stream has closed, the test socket reader is notified via the + MInputStreamObserver::InputStreamCloseInd() API. The test socket reader + moves to the Closed state. + + If the input stream is closed, either because the corresponding output + stream has been closed, the remote host has closed the socket or there has + been a socket error, the test socket reader is notified via the + MInputStreamObserver::InputStreamCloseInd() API. + @componentInternal +*/ +class CTestSocketReader : public CActive, + public MInputStreamObserver + { +public: // methods + + static CTestSocketReader* NewL(MTestReaderObserver& aObserver, MInputStream& aInputStream, TBool aSecure); + + virtual ~CTestSocketReader(); + + void ExpectData(const TDesC8& aData); + + void CloseReader(); + +private: // methods from MInputStreamObserver + + virtual void ReceivedDataIndL(const TDesC8& aBuffer); + + virtual void InputStreamCloseInd(TInt aError); + + virtual void SecureServerCnf(); + + virtual void MInputStreamObserver_Reserved(); + + MHttpResponse* CurrentResponse(); + + virtual void OnReceiveTimeOut(); + +private: // methods from CActive + + virtual void RunL(); + + virtual void DoCancel(); + + virtual TInt RunError(TInt aError); + +private: // methods + + CTestSocketReader(MTestReaderObserver& aObserver, MInputStream& aInputStream, TBool aSecure); + + TInt UpdateData(const TDesC8& aReceivedData, TPtrC8& aExcessData); + + TInt CheckResponseStatusL(const TDesC8& aReceivedData); + + void CompleteSelf(); + +private: // enums + +/** @enum TReaderState + The test socket reader state machine. + @componentInternal +*/ + enum TReaderState + { + /** The test socket reader is idle. + */ + EIdle =0, + /** The test socket reader is expecting to receive more data. + */ + EPendingReceivedData, + /** The test socket reader needs to acknowledge the received data packet. + */ + EReceiveAck, + /** The test socket reader observer has requested that the test socket reader + close the input stream. + */ + EClosing, + /** The test socket reader is waiting for the input stream to notify it that + it has closed. + */ + EPendingClosed, + /** The test socket reader is closed - no more data can be received. + */ + EClosed + }; + +private: // attributes + + MTestReaderObserver& iObserver; + MInputStream* iInputStream; + TReaderState iState; + TBool iBoundToInputStream; + TPtrC8 iExpectedData; + TPtrC8 iReceivedBuffer; + TBool iSecure; + TBool iSecureTestPassed; + }; + +#endif // __CTESTSOCKETREADER_H__