email/imap4mtm/imaptransporthandler/inc/csocketwriter.h
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imap4mtm/imaptransporthandler/inc/csocketwriter.h	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,103 @@
+// 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 __CSOCKETWRITER_H__
+#define __CSOCKETWRITER_H__
+
+#include <e32base.h>
+
+#include "moutputstream.h"
+#include "cimapobservabletimer.h"
+
+// Forward declarations
+class CSocket;
+class MOutputSocketObserver;
+class MSocketController;
+
+/**
+The CSocketWriter class encapsulates the writing functionality and behaviour
+for a connected socket. It implements the MOutputStream API.
+
+@see MOutputStream
+@internalTechnology
+@prototype
+*/
+class CSocketWriter : public CActive, public MOutputStream, public MImapTimerObserver
+	{
+public:
+	static CSocketWriter* NewL(CSocket& aSocket, MSocketController& aController);
+	virtual ~CSocketWriter();
+	
+	void SocketClosed(TInt aError);
+	virtual void SecureClientReq(const TDesC8& aSSLDomainName);
+
+private:
+	CSocketWriter(CSocket& aSocket, MSocketController& aController);
+	void ConstructL();
+	void CompleteSelf();
+	
+	// from MOutputStream
+	virtual void Bind(MOutputStreamObserver& aObserver, TInt aLogId);
+	virtual void BindSecure(MOutputStreamSecureObserver& aObserver);
+	virtual void SendDataReq(const TDesC8& aBuffer, TInt aIdleTime = 0);
+	virtual void Close();
+
+	// from CActive
+	virtual void RunL();
+	virtual void DoCancel();
+	virtual TInt RunError(TInt aError);
+	void CloseStreams(TInt aError);
+	// from MImapTimerObserver
+	void OnTimerL(const CImapObservableTimer& aSourceTimer);
+
+private:
+	/** The state machine for the output stream. */
+	enum TOutputState
+		{
+		/** The output stream is waiting for an observer to bind itself to it. */
+		EIdle = 0,
+		/** The output stream is ready to send data to the socket. It is waiting for the observer to request a data send. */
+		EPendingSend,
+		/** Data has been sent to the socket. The output stream is waiting for the socket to notify it that the write was successful. */
+		ESentData,
+		/** Start the secure handshake procedure. */
+		EStartSecureHandshake,
+		/** Secure handshake has completed. */
+		ESecureHandshakeComplete,
+		/**	The observer has asked the output stream to close the socket. */
+		EClosing,
+		/**	The socket has been closed - data can no longer be sent to it. */
+		EClosed
+		};
+
+private:
+	/** The connected socket.*/
+	CSocket&					iSocket;
+	/** The socket controller that owns the socket.*/
+	MSocketController&			iController;
+	/**	The state of the output stream. */
+	TOutputState				iState;
+	/**	The observer for the output stream. */
+	MOutputStreamObserver*		iObserver;
+	/**	The observer for the output stream for secure socket notifications. */
+	MOutputStreamSecureObserver* iSecureObserver;
+	/** SSL domain name to use for certificate validation. */
+	TPtrC8 iSSLDomainName;
+	/** Log file identifier */
+	TInt iLogId;
+	CImapObservableTimer* 		iTimer;
+	};
+
+#endif	// __CSOCKETWRITER_H__
\ No newline at end of file