email/imap4mtm/imaptransporthandler/inc/csocketconnector.h
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imap4mtm/imaptransporthandler/inc/csocketconnector.h	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,134 @@
+// 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 __CSOCKETCONNECTOR_H__
+#define __CSOCKETCONNECTOR_H__
+
+#include <e32base.h>
+#include <in_sock.h>
+
+#include "msocketconnector.h"
+
+// Forward declarations
+class CSocket;
+class MSocketConnectorStore;
+class MSocketConnectObserver;
+class MSocketControllerFactory;
+class MCommsInfoProvider;
+
+/**	
+The CSocketConnector class provides socket connecting behaviour. Once the
+socket connector object has been started (ConnectL() API) it will notify its
+observer when it has established a connection with the specified remote host.
+
+The socket connector initially does a DNS lookup for the host name provided
+in the ConnectL() API. Once the IP address has been found for the host name
+the socket connector will attempt to establish a TCP connection with the 
+remote host.
+
+When a connection has been established a socket controller object is created
+by the socket controller factory to encapsulate the connected socket. This
+provides the input and output streams for the socket.
+
+The observer, an MSocketConnectObserver object, is notified of a connection
+using the MSocketConnectObserver::ConnectionMadeL() API. The input and output
+streams that encapsulate the connected socket are passed to the observer.
+
+The connected socket is then placed in the socket controller store by the 
+socket controller factory. This transfers the ownership of the socket
+controller object to the store.
+
+After the socket controller ownership has been transferred, the socket 
+connector removes itself from the socket connector store and then suicides.
+
+If the socket connector encounters any problems it notifies its observer using
+the MSocketConnectObserver::HandleConnectError(TInt aError) API. If a problem 
+does occur the socket connector will suicide after handling the error.
+
+@internalTechnology
+@prototype
+*/
+
+class CSocketConnector : public CActive,
+						 public	MSocketConnector
+	{
+public:
+	static CSocketConnector* NewL(MSocketConnectorStore& aStore, MSocketControllerFactory& aSocketControllerFactory,MCommsInfoProvider& aCommsInfoProvider);
+	virtual ~CSocketConnector();
+	void ConnectL(MSocketConnectObserver& aObserver, const TDesC8& aRemoteHost, TUint16 aRemotePort);
+
+private:
+	CSocketConnector(MSocketConnectorStore& aStore, MSocketControllerFactory& aSocketControllerFactory, MCommsInfoProvider&	aCommsInfoProvider);
+	void CompleteSelf();
+	void Suicide();
+
+	// from MSocketConnector
+	virtual void StopConnect();
+
+	// from CActive
+	virtual void RunL();
+	virtual void DoCancel();
+	virtual TInt RunError(TInt aError);
+
+private:
+	/**
+	The state machine for the socket connector.
+	*/
+	enum TConnectState
+		{
+		/** The socket connector is idle. */
+		EIdle = 0,
+		/** A connection has been requested. The DNS lookup needs to be initiated
+			to find the IP address of the remote host. 
+		*/
+		EPendingDNSLookup,
+		/**	The IP address of the remote host has been found. Initiated a TCP
+			connection to that remote host.
+		*/
+		EConnecting,
+		/**	The connection has been established. Ownership of the connected socket
+			must be passed to the observer.
+		*/
+		EConnected,
+		/**	The socket connector has completed - need to self-destruct. */
+		ESuicide
+		};
+
+private:
+	/** The socket connector store. */
+	MSocketConnectorStore&		iStore;
+	/**	The socket controller factory.*/
+	MSocketControllerFactory&	iSocketControllerFactory;
+	/** The comms info provider. */
+	MCommsInfoProvider&			iCommsInfoProvider;
+	/** The state of the socket connector. */
+	TConnectState				iState;
+	/** The host resolver session. */
+	RHostResolver				iHostResolver;
+	/** The socket connect observer. */
+	MSocketConnectObserver*		iObserver;
+	/**	The host name/IP address for the remote client.*/
+	HBufC*						iHost;
+	/**	The port number on remote host with which to connect to */
+	TUint16						iPort;
+	/** The DNS entry object for the remote client */
+	TNameEntry					iHostDnsEntry;
+	/** The IP address */
+	TInetAddr					iAddress;
+	/**	The socket object that is connecting to the remote client */
+	CSocket*					iConnectingSocket;
+	};
+
+#endif	// __CSOCKETCONNECTOR_H__
\ No newline at end of file