--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imap4mtm/imaptransporthandler/inc/csocketreader.h Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,116 @@
+// Copyright (c) 2006-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 __CSOCKETREADER_H__
+#define __CSOCKETREADER_H__
+
+#include <e32base.h>
+
+#include "minputstream.h"
+#include "cimapobservabletimer.h"
+
+// Size of buffer to store received data.
+// The size is chosen to try to minimise the number of reads required for a
+// large data block on high speed connections.
+const TInt KDefaultBufferSize = 6144;
+
+// Forward declarations
+class CSocket;
+class MInputStreamObserver;
+class MSocketController;
+
+/**
+The CSocketReader class encapsulates the reading functionality and behaviour
+for a connected socket. It implements the MInputStream API.
+
+@see MInputStream
+@internalTechnology
+@prototype
+*/
+class CSocketReader : public CActive,
+ public MInputStream,
+ public MImapTimerObserver
+ {
+private:
+ /** The state machine for the input stream. */
+ enum TInputState
+ {
+ /** The input stream is currently not servicing a request */
+ EIdle = 0,
+
+ /** The input stream has an observer and it requested a read from the socket. */
+ ERead,
+
+ /** The input stream has received a buffer of data from the socket. */
+ EReceivedData,
+
+ /** The observer has asked the input stream to close the socket. */
+ EClosing,
+
+ /** The socket has been closed - data can no longer be received from it. */
+ EClosed
+ };
+
+public:
+ static CSocketReader* NewL(CSocket& aSocket, MSocketController& aController);
+ virtual ~CSocketReader();
+
+ void SocketClosed(TInt aError);
+ void Suspend();
+ void Resume();
+
+private:
+ CSocketReader(CSocket& aSocket, MSocketController& aController);
+ void ConstructL();
+ void CompleteSelf();
+
+ // from MInputStream
+ virtual void Bind(MInputStreamObserver& aObserver, TInt aLogId);
+
+ virtual void ReadReq(TInt aIdleTime=0);
+ virtual void CancelReadReq();
+ virtual TBool IsReading();
+
+ // from CActive
+ virtual void RunL();
+ virtual void DoCancel();
+ virtual TInt RunError(TInt aError);
+
+ void SetState(TInputState aState);
+ void OnTimerL(const CImapObservableTimer& aSourceTimer);
+ void CloseStreams(TInt aError);
+private:
+ /** The connected socket. */
+ CSocket& iSocket;
+ /** The socket controller that owns the socket.*/
+ MSocketController& iController;
+ /** The buffer into which the received data is placed. */
+ TBuf8<KDefaultBufferSize> iBuffer;
+ /** Whether the data in iBuffer has been delivered to an observer */
+ TBool iBufferDataDelivered;
+ /** The state of the input stream. */
+ TInputState iState;
+ /** Is the socket suspended */
+ TBool iSuspended;
+ /** The observer for the input stream. */
+ MInputStreamObserver* iObserver;
+ /** Log file identifier */
+ TInt iLogId;
+ /**Imap Idle Timer. */
+ CImapObservableTimer* iTimer;
+ TInt iIdleTime;
+ };
+
+#endif // __CSOCKETREADER_H__