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 <e32base.h>
+#include <minputstreamobserver.h>
+
+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__