diff -r 000000000000 -r 72b543305e3a email/imap4mtm/imaptransporthandler/inc/csocketconnector.h --- /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 +#include + +#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