diff -r 000000000000 -r 72b543305e3a email/imap4mtm/imaptransporthandler/src/csecuresocketcontroller.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/imap4mtm/imaptransporthandler/src/csecuresocketcontroller.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,163 @@ +// 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: +// + +#include "csecuresocketcontroller.h" +#include "mcommsinfoprovider.h" +#include "imappaniccodes.h" +#include + +/** +The factory constructor. + +@param aSocket Reference to the socket. +@param aCommsInfoProvider Reference to the comms info provider. +*/ +CSecureSocketController* CSecureSocketController::NewL(RSocket& aSocket, MCommsInfoProvider& aCommsInfoProvider) + { + CSecureSocketController* self = new (ELeave) CSecureSocketController(aSocket, aCommsInfoProvider); + return self; + } + +/** +Destructor. +*/ +CSecureSocketController::~CSecureSocketController() + { + if( iTlsSocket ) + { + iTlsSocket->Close(); + delete iTlsSocket; + } + else + { + iSocket.Close(); // Has ownership of socket if secure layer was not created + } + } + +/** +Constructor. + +@param aSocket Reference to the socket. +@param aCommsInfoProvider Reference to the comms info provider. +*/ +CSecureSocketController::CSecureSocketController(RSocket& aSocket, MCommsInfoProvider& aCommsInfoProvider) +: iSocket(aSocket), iCommsInfoProvider(aCommsInfoProvider) + { + } + +/** +Used to start a tls handshake with the host. + +@param aStatus The request status. +@param aSSLDomainName SSL domain name +*/ +void CSecureSocketController::StartSecureHandshakeL(TRequestStatus& aStatus, const TDesC8& aSSLDomainName) + { + // Create the secure layer + _LIT(KTxtTls, "tls1.0"); + if( !iTlsSocket ) + { + iTlsSocket = CSecureSocket::NewL(iSocket, KTxtTls()); + } + + // Get the security preferences, dialog prompt and security policy + TBool dialogPref; + iCommsInfoProvider.SecurityPreferences(dialogPref); + + // Dialog preferences + if( !dialogPref ) + { + User::LeaveIfError(iTlsSocket->SetDialogMode(EDialogModeUnattended)); + } + + // Set an option on the socket to check the server certificate domain + User::LeaveIfError(iTlsSocket->SetOpt(KSoSSLDomainName, KSolInetSSL, aSSLDomainName)); + + iTlsSocket->StartClientHandshake(aStatus); + } + +/** +Receives data from a remote host and completes when data is available. +@param aBuffer A descriptor where data read will be placed. +@param aStatus On completion, KErrNone if successful, otherwise one of + the system wide error codes. Note that KErrEof indicates + either that a remote connection is closed, and that no more + data is available for reading, or the socket has been + shutdown with option RSocket::EStopInput. +@param aLength For non-datagram sockets, on return, a length + which indicates how much data was read. This + is the same as length of the returned aDesc. + For datagram sockets, this parameter is not used. +*/ +void CSecureSocketController::RecvOneOrMore(TDes8& aBuffer, TRequestStatus& aStatus, TSockXfrLength& aLength) + { + __ASSERT_DEBUG( iTlsSocket!=NULL, TImapServerPanic::ImapPanic(TImapServerPanic::ETlsSocketNotStarted) ); + + iTlsSocket->RecvOneOrMore(aBuffer, aStatus, aLength); + } + +/** +Cancels an outstanding Recv() operation. +*/ +void CSecureSocketController::CancelRecv() + { + if( iTlsSocket ) + { + iTlsSocket->CancelRecv(); + } + } + +/** +Sends data to a remote host on a connected socket with options set by protocol specific flags. +The length of the descriptor indicates the amount of data to be sent. The TSockXfrLength argument +will return the amount of data actually sent. +A socket may only have one send operation in progress at any one time. +Send() should only be used with connected sockets. +If a protocol's information flag is marked with KSIUrgentData, then KSockWriteUrgent may be provided +as a flag to Send(). All other flags are protocol specific. + +@param aBuffer Reference to the data to send. +@param aStatus The request status. +*/ +void CSecureSocketController::Send(const TDesC8& aBuffer, TRequestStatus& aStatus) + { + __ASSERT_DEBUG( iTlsSocket!=NULL, TImapServerPanic::ImapPanic(TImapServerPanic::ETlsSocketNotStarted) ); + + iTlsSocket->Send(aBuffer, aStatus); + } + +/** +Cancels an outstanding Send() operation. Calling the function will cause any outstanding +send operation to complete prematurely. The state of a socket after a send is cancelled +is defined by the characteristics of the protocol. +*/ +void CSecureSocketController::CancelSend() + { + if( iTlsSocket ) + { + iTlsSocket->CancelSend(); + } + } + +/** +Cancels the handshake. +*/ +void CSecureSocketController::CancelHandshake() + { + if( iTlsSocket ) + { + iTlsSocket->CancelHandshake(); + } + }