email/pop3andsmtpmtm/clientmtms/src/POP3SET.CPP
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/clientmtms/src/POP3SET.CPP	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,725 @@
+// Copyright (c) 1998-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 "POP3SET.H"
+#include <nifvar.h>				// For KLinkLayerOpen
+
+
+GLREF_C TPtrC8 LimitStringSize(const TPtrC8& aString, TInt aMaxSize);
+
+const TInt KPOP3PopulateOptionsVersion=1;
+
+/**
+Creates and initialises a TImPop3PopulateOptions using data from a packaged
+descriptor to initialise members. 
+
+@param aDesc
+descriptor containing a packaged instance of either TImPop3PopulateOptions
+
+@param aUnpackTo
+Used to return the unpacked options class
+
+*/
+EXPORT_C void TImPop3PopulateOptions::UnpackL(const TDesC8& aDesc, TImPop3PopulateOptions &aUnpackTo)
+
+	{
+	TPckgBuf<TImPop3PopulateOptions> options;
+	options.Copy(aDesc);
+	aUnpackTo=options();
+	}
+
+EXPORT_C TImPop3PopulateOptions::TImPop3PopulateOptions() :
+		iVersion(KPOP3PopulateOptionsVersion),
+		iMaxEmailSize(KMaxTInt),
+		iPopulationLimit(-1)
+	{
+
+	}
+
+
+EXPORT_C TInt TImPop3PopulateOptions::MaxEmailSize()
+	{
+	return iMaxEmailSize;
+	}
+
+EXPORT_C void TImPop3PopulateOptions::SetMaxEmailSize(TInt aMaxEmailSize)
+	{
+	iMaxEmailSize=aMaxEmailSize;
+	}
+
+EXPORT_C TInt TImPop3PopulateOptions::PopulationLimit()
+	{
+	return iPopulationLimit;
+	}
+
+EXPORT_C void TImPop3PopulateOptions::SetPopulationLimit(TInt aPopulationLimit)
+	{
+	iPopulationLimit=aPopulationLimit;
+	}
+		
+
+
+EXPORT_C TInt TPop3Progress::ConnectionState() const
+/**
+Retrieves the stage of the connection process as defined in nifvar.h and csdprog.h
+while the service is connecting to the POP3 server.
+
+@return
+KLinkLayerOpen if the POP3 service has successfully connected, or
+KErrNotFound if the POP3 service is disconnected, or 
+the current connection stage (declared in nifvar.h and csdprog.h) while
+establishing a connection.
+*/
+	{
+	switch(iPop3Progress )
+		{
+	case EPopConnecting:
+		// Return the connection state temporarily stored in iTotalMsgs
+		// while connection is in progress
+		return iTotalMsgs;
+	case EPopDisconnected:
+		// If we're definately in a disconnected state, return KErrNotFound
+		return KErrNotFound;
+	default:
+		// If we're in one of the connected states, return KLinkLayerOpen
+		return KLinkLayerOpen;
+		}
+	}
+
+
+EXPORT_C TInt TPop3Progress::ConnectionIAP() const
+/**
+Retrieves the internet access point that is used when connecting to the
+POP3 service.
+
+@return
+KErrNotFound if the POP3 service is not connecting, otherwise the
+internet access point number.
+*/
+	{
+	if (iPop3Progress == EPopConnecting)
+		{
+		// Return the connection IAP temporarily stored in iTotalBytes
+		// while connection is in progress
+		return iTotalBytes;
+		}
+	else
+		{
+		return KErrNotFound;
+		}
+	}
+
+
+EXPORT_C CImPop3Settings::CImPop3Settings()
+/** 
+Allocates and creates a new CImPop3Settings object initialised to
+default values.
+*/
+	{
+	Reset();
+	} 
+
+
+EXPORT_C CImPop3Settings::~CImPop3Settings()
+/**
+Destructor.
+*/
+	{
+	Reset();
+	
+	delete iExtension;
+	iExtension = NULL;
+	} 
+
+
+EXPORT_C void CImPop3Settings::Reset()
+/**
+Resets the settings to their default values.
+*/
+	{
+	CImBaseEmailSettings::Reset();
+	
+	iPortNumber = KPOP3DefaultPortNumber;
+
+	iInboxSyncLimit=KImPop3SynchroniseAll;
+	iMaxEmailSize = KMaxTInt;
+
+	if (Extension())
+		{
+		delete Extension()->iLoginName;
+		Extension()->iLoginName=NULL;
+
+		delete Extension()->iPassword;
+		Extension()->iPassword = NULL;
+		
+		delete Extension()->iTlsSslDomain;
+		Extension()->iTlsSslDomain=NULL;
+		
+		// no population limit
+		Extension()->iPopulationLimit=-1;
+		}
+
+	SetApop(EFalse); 
+	}
+
+
+EXPORT_C const TPtrC8 CImPop3Settings::LoginName() const
+/**
+Retrieves the configured login user name (mailbox) of the POP3 service.
+
+@see
+SetLoginNameL()
+
+@return 
+The user name.
+*/
+	{
+	if (Extension() && Extension()->iLoginName)
+		return TPtrC8(*(Extension()->iLoginName));
+	return TPtrC8();
+	}
+
+
+EXPORT_C const TPtrC8 CImPop3Settings::Password() const
+/**
+Retrieves the configured plain text login password that will be sent to the POP3
+server if APOP is not configured.
+
+@see
+SetPasswordL()
+
+@return 
+The password.
+*/
+	{
+	if (Extension() && Extension()->iPassword)
+		return TPtrC8(*(Extension()->iPassword));
+	return TPtrC8();
+	}
+
+
+EXPORT_C TBool CImPop3Settings::Apop() const
+/**
+Checks whether the POP3 service is configured to log on using plain text
+authentication or APOP encrypted authentication.
+
+The default setting is EFalse.
+
+@see
+SetApop()
+
+@return
+ETrue if using APOP encrypted authentication.
+EFalse if using plain text authentication.
+*/
+	{
+	return iFlags & KPop3ApopFlag;
+	}
+
+
+EXPORT_C TBool CImPop3Settings::AutoSendOnConnect() const
+/**
+Checks whether queued emails associated with the same internet access point
+as the POP3 service will be sent first before logging onto the POP3 server.
+The internet access point for each email service (POP3, IMAP4, SMTP) is configured
+using CImIAPPreferences.
+ 
+@see CImIAPPreferences
+
+@return 
+ETrue if configured to send emails after the connection is established, but before
+authentication with the POP3 server.
+*/
+	{
+	return iFlags & KPop3AutoSendFlag;
+	}
+
+
+EXPORT_C void CImPop3Settings::SetLoginNameL(const TDesC8& aLoginName)
+/**
+Configures the login user name (mailbox) for the POP3 service.
+
+@param aLoginName
+The plain text login user name. A copy of aLoginName is made so if you
+want to change the user name you must call this method again for the
+changes to take effect.
+*/
+	{
+	CheckExtensionExistsL();
+	HBufC8* newLoginName = aLoginName.AllocL();
+	delete Extension()->iLoginName;
+	Extension()->iLoginName = newLoginName;
+	}
+
+
+EXPORT_C void CImPop3Settings::SetPasswordL(const TDesC8& aPassword)
+/**
+Configures the login password for the POP3 service. The plain text password
+will be sent during authentication with the POP3 server. It can also be
+used to store the shared secret when authenticating using APOP if SetApop() is
+enabled.
+
+@param aPassword
+The plain text login password. A copy of aPassword is made so if you
+want to change the user name you must call this method again for the
+changes to take effect.
+*/
+	{
+	CheckExtensionExistsL();
+	HBufC8* newPassword = aPassword.AllocL();
+	delete Extension()->iPassword;
+	Extension()->iPassword = newPassword;
+	}
+
+
+EXPORT_C void CImPop3Settings::SetApop(TBool aFlag)
+/** 
+Configures the POP3 service to authenticate using either a plain text password
+or an APOP encrypted digest.
+
+If configured to use APOP authentication, the configured password set by the call
+to SetPasswordL() is used to store the shared secret between the server and the POP3
+service. The timestamp sent in the servers' hello banner and the password are joined
+and encrypted into a digest before being sent using the MD5 algorithm.
+
+The default setting is EFalse.
+
+@param aFlag
+Specify ETrue to use APOP encrypted authentication.
+Specify EFalse to use plain text authentication.
+*/
+	{
+	iFlags = (iFlags & ~KPop3ApopFlag) | (aFlag ? KPop3ApopFlag : KPop3SettingsClearFlag);
+	}
+
+
+EXPORT_C void CImPop3Settings::SetAutoSendOnConnect(TBool aFlag)
+/** 
+Configures the POP3 service to send queued emails associated with the same internet
+access point to be sent first before logging onto the POP3 server.
+
+The internet access point for each email service (POP3, IMAP4, SMTP) is configured
+using CImIAPPreferences.
+ 
+@see CImIAPPreferences
+
+@param aFlag 
+Specify ETrue to send emails after the connection is established, but before
+authentication with the POP3 service.
+Specify EFalse to disable this functionality.
+*/
+	{
+	iFlags = (iFlags & ~KPop3AutoSendFlag) | (aFlag ? KPop3AutoSendFlag : KPop3SettingsClearFlag);
+	}
+
+
+EXPORT_C TBool CImPop3Settings::DisconnectedUserMode() const
+/**
+Checks if disconnected user mode is configured.
+
+If disconnected user mode is enabled by calling SetDisconnectedUserMode(), 
+then the POP3 client MTM (CPop3ClientMtm) will accept message operations, 
+such as deleting messages from a server, while the user is offline.
+The operations are stored and executed when the user connects again.
+
+@see
+CPop3ClientMtm
+
+@return 
+ETrue if disconnected user mode is enabled.
+*/
+	{
+	return iFlags & KPop3DisconnectedModeFlag;
+	}
+
+
+EXPORT_C void CImPop3Settings::SetDisconnectedUserMode(TBool aFlag)
+/** 
+Enables the POP3 client MTM (CPop3ClientMtm) to accept message operations
+while disconnected.
+
+If disconnected user mode is enabled the POP3 client MTM will accept message
+operations such as deleting messages from a server, while the user is offline.
+The operations are stored and executed when the user connects again.
+
+@see
+CPop3ClientMtm
+
+@param aFlag
+Specify ETrue to enable disconnected user mode.
+Specify EFalse to disable disconnected user mode.
+*/
+	{
+	iFlags = (iFlags & ~KPop3DisconnectedModeFlag) | (aFlag ? KPop3DisconnectedModeFlag : KPop3SettingsClearFlag);
+	}
+
+
+EXPORT_C TBool CImPop3Settings::DeleteEmailsWhenDisconnecting() const
+/** 
+Checks whether the caller has enabled this setting by calling 
+SetDeleteEmailsWhenDisconnecting().
+
+This flag is not used by the Messaging subsystem.
+
+@see
+CPop3ClientMtm
+
+@return
+ETrue if this flag is set.
+*/
+	{
+	return iFlags & KPop3DeleteEmailsWhenDisconnectingFlag;
+	}
+
+
+EXPORT_C void CImPop3Settings::SetDeleteEmailsWhenDisconnecting(TBool aFlag)
+/** 
+Sets or resets a flag.
+
+This flag is not used by the Messaging subsystem.
+
+@param aFlag
+Specify ETrue to set this flag.
+*/
+	{
+	iFlags = (iFlags & ~KPop3DeleteEmailsWhenDisconnectingFlag) | (aFlag ? KPop3DeleteEmailsWhenDisconnectingFlag : KPop3SettingsClearFlag);
+	}
+
+
+EXPORT_C TBool CImPop3Settings::AcknowledgeReceipts() const
+/** 
+Checks whether the caller has enabled this setting by calling 
+SetAcknowledgeReceipts().
+
+This flag is a convenience setting for Messaging client applications that may 
+wish to store whether or not to send a receipt email message to the sender when the
+email has been received. The Messaging subsystem does not use this setting, 
+and has to be explicitly commanded by the Messaging client application to
+send a receipt notification. Messaging applications can use CImHeader to check
+if a message has a return receipt address. Receipt notification messages can 
+be created using CImEmailOperation, and sent using the SMTP client MTM.
+
+@see
+CImHeader
+CImEmailOperation
+CSmtpClientMtm
+
+@return
+ETrue if this flag is set.
+*/
+	{
+	return iFlags & KPop3AcknowledgeReceipts;
+	}
+
+
+EXPORT_C void CImPop3Settings::SetAcknowledgeReceipts(TBool aFlag)
+/** 
+Sets or resets a flag.
+
+This flag is a convenience setting for Messaging client applications that may 
+wish to store whether or not to send a receipt email message to the sender when the
+email has been received. The Messaging subsystem does not use this setting, 
+and has to be explicitly commanded by the Messaging client application to
+send a receipt notification. Messaging applications can use CImHeader to check
+if a message has a return receipt address. Receipt notification messages can be
+created using CImEmailOperation, and sent using the SMTP client MTM.
+
+@see
+CImHeader
+CImEmailOperation
+CSmtpClientMtm
+
+@param aFlag
+Specify ETrue to set this flag.
+*/
+	{
+	iFlags = (iFlags & ~KPop3AcknowledgeReceipts) | (aFlag ? KPop3AcknowledgeReceipts : KPop3SettingsClearFlag);
+	}
+
+
+EXPORT_C TInt CImPop3Settings::MaxEmailSize() const
+/** 
+Returns the maximum message size in bytes to be downloaded. This
+value is set by a calling SetMaxEmailSize().
+
+The Messaging subsystem does not use this setting. The default setting is KMaxInt.
+
+Messaging applications can use CImPOP3GetMail or CPop3ClientMtm to specify
+a maximum email size to retrieve by passing a TImPop3GetMailInfo parameter in
+method calls.
+
+@see
+TImPop3GetMailInfo
+CImPOP3GetMail
+CPop3ClientMtm
+
+@return
+The maximum message size in bytes.
+*/
+	{
+	return iMaxEmailSize;
+	}
+
+
+EXPORT_C void CImPop3Settings::SetMaxEmailSize(const TInt aMaxEmailSize)
+/** 
+Sets the maximum message size in bytes to be downloaded.
+
+The Messaging subsystem does not use this setting. The default setting is KMaxInt.
+
+Messaging applications can use CImPOP3GetMail or CPop3ClientMtm to specify
+a maximum email size to retrieve by passing a TImPop3GetMailInfo parameter in
+method calls.
+
+@see
+TImPop3GetMailInfo
+CImPOP3GetMail
+CPop3ClientMtm
+
+@param aMaxEmailSize
+Specifies the maximum message size in bytes.
+*/
+	{
+	iMaxEmailSize = aMaxEmailSize;
+	}
+
+
+EXPORT_C TPop3GetMailOptions CImPop3Settings::GetMailOptions() const
+/**
+Retrieves an enumeration that specifies whether only the messages headers
+or the entire message will be downloaded when synchronising with the POP3 server.
+This is specified by calling SetGetMailOptions().
+
+@see
+TPop3GetMailOptions
+
+@return
+An enumeration specifying how messages will be synchronised.
+*/
+	{
+	return iGetMailOptions;
+	}
+
+
+EXPORT_C void CImPop3Settings::SetGetMailOptions(TPop3GetMailOptions aGetMailOptions)
+/** 
+Specifies whether to download headers only, or entire messages when
+synchronising with the POP3 server.
+
+@see
+TPop3GetMailOptions
+
+@param aGetMailOptions
+Specifies whether to download headers only, or entire messages when
+synchronising with the POP3 server.
+*/
+	{
+	iGetMailOptions = aGetMailOptions;
+	}
+
+
+EXPORT_C TInt32 CImPop3Settings::InboxSynchronisationLimit() const
+/** 
+Returns whether or not the POP3 service will synchronise with all
+emails on the server after connecting, or the maximum number of new messages 
+that will be synchronised if there are new messages on the server. This
+setting is configured by calling SetInboxSynchronisationLimit().
+
+The default setting is to synchronise all messages.
+
+@return
+If negative, the POP3 service will synchronise all emails after connecting.
+If zero, the POP3 service will not synchronise after connecting.
+If positive, the POP3 service will synchronise to the n most recent emails,
+where n is this return value.
+*/
+	{
+	return iInboxSyncLimit ;
+	}
+
+
+EXPORT_C void CImPop3Settings::SetInboxSynchronisationLimit(const TInt32 aInboxSyncLimit)
+/** 
+Specifies whether or not the POP3 service will synchronise with all
+emails on the server after connecting, or the maximum number of new messages 
+that will be synchronised if there are new messages on the server.
+
+The default setting is to synchronise all messages.
+
+@param aInboxSyncLimit
+If negative, the POP3 service will synchronise all emails after connecting.
+If zero, the POP3 service will not synchronise after connecting.
+If positive, the POP3 service will synchronise to the n most recent emails,
+where n is this return value.
+*/
+	{
+	iInboxSyncLimit = aInboxSyncLimit;
+	}
+
+/** 
+Retrieves the currently stored TOP population limit from settings.
+If this is set, it does not mean that this limit is applied but rather
+is just a convenient place to store the current limit
+*/
+EXPORT_C TInt32 CImPop3Settings::PopulationLimit() const
+	{
+	if(Extension())
+		{
+		return Extension()->iPopulationLimit;
+		}
+	else
+		{
+		// default to no poulation limit if none has been set
+		return -1;
+		}
+	}
+
+
+/** 
+Sets the currently stored TOP population limit to settings.
+If this is set, it does not mean that this limit is applied but rather
+is just a convenient place to store the current limit, the limit must be passed in
+the parameters of the command
+*/
+EXPORT_C void CImPop3Settings::SetPopulationLimitL(const TInt32 aPopulationLimit)
+	{
+	CheckExtensionExistsL();
+	Extension()->iPopulationLimit = aPopulationLimit;
+	}
+	
+
+EXPORT_C CImPop3Settings& CImPop3Settings::CopyL(const CImPop3Settings& aCImPop3Settings)
+/**
+Copies the configuration settings from another POP3 settings object into this object.
+
+@param aCImPop3Settings
+Specifies the object to copy.
+
+@return
+This object after copying.
+*/
+	{
+	// CheckExtensionExistsL() called at the start of the function, since it's allocation will be longer lived
+	CheckExtensionExistsL();
+	Reset();
+	CImBaseEmailSettings::CopyL(aCImPop3Settings);
+	Extension()->iLoginName		=	aCImPop3Settings.LoginName().AllocL();
+	Extension()->iPassword		=	aCImPop3Settings.Password().AllocL();
+	Extension()->iTlsSslDomain 	= 	aCImPop3Settings.TlsSslDomain().AllocL();
+	iMaxEmailSize			=	aCImPop3Settings.iMaxEmailSize;
+	iGetMailOptions			=	aCImPop3Settings.GetMailOptions();
+	iInboxSyncLimit			=	aCImPop3Settings.InboxSynchronisationLimit();
+	SetPopulationLimitL(aCImPop3Settings.PopulationLimit());
+	return (*this);
+	}
+
+
+EXPORT_C TBool CImPop3Settings::operator==(const CImPop3Settings& aCImPop3Settings) const
+/**
+Equality operator.
+
+@param aCImPop3Settings
+Specifies the POP3 settings object to compare with.
+
+@return
+ETrue if the settings are the same.
+*/
+	{
+	return 	((MaxEmailSize() == aCImPop3Settings.iMaxEmailSize) &&
+		 !(LoginName().Compare(aCImPop3Settings.LoginName())) &&
+		 !(Password().Compare(aCImPop3Settings.Password())) &&
+		 (CImBaseEmailSettings::operator==(aCImPop3Settings)) &&	 
+		 (InboxSynchronisationLimit()==aCImPop3Settings.InboxSynchronisationLimit()) &&
+		 (PopulationLimit()==aCImPop3Settings.PopulationLimit()));
+	}
+
+/**
+Sets the domain name to use during TLS/SSL certificate validation.
+
+@param aDomainName Domain name
+*/
+EXPORT_C void CImPop3Settings::SetTlsSslDomainL(const TDesC8& aDomainName)
+	{
+	CheckExtensionExistsL();
+	HBufC8* newTlsSslDomain = aDomainName.AllocL();
+	delete Extension()->iTlsSslDomain;
+	Extension()->iTlsSslDomain = newTlsSslDomain;
+	}
+
+/**
+Gets the domain name used during TLS/SSL certificate validation.
+
+@return Domain name
+*/
+EXPORT_C TPtrC8 CImPop3Settings::TlsSslDomain() const
+	{		
+	if (Extension() && Extension()->iTlsSslDomain)		
+		return TPtrC8(*(Extension()->iTlsSslDomain));
+	return TPtrC8();
+	}
+
+
+#if (defined SYMBIAN_EMAIL_CAPABILITY_SUPPORT)
+/**
+Enables POP3 authentication using CRAM-MD5 when connecting to email server.
+Read RFC 2195 "IMAP/POP Authorize Extension for Simple Challenge/Response" for more details.
+
+@param aFlag
+ETrue to enable POP3 authentication.
+*/
+EXPORT_C void CImPop3Settings::SetPOP3Auth(TBool aFlag)
+	{
+	iFlags = (iFlags & ~KPop3AuthFlag) | (aFlag ? KPop3AuthFlag : KPop3SettingsClearFlag);
+	}
+
+
+/**
+Retrieves the value of POP3 authentication flag.
+
+@return
+ETrue if POP3 authentication is enabled.
+*/
+
+EXPORT_C TBool CImPop3Settings::POP3Auth() const
+	{
+	return iFlags & KPop3AuthFlag;
+	}
+	
+
+/**
+Enables less secure authentication mechanism (PLAIN or LOGIN), when email server doesn't support CRAM-MD5 authentication. 
+Fallback flag will be used in conjunction with Authenticate flag and will be used when Authenticate flag is enabled.
+By default Fallback flag will be EFalse.
+
+@param aFlag
+ETrue to enable Fallback option for less secure authentication.
+*/
+EXPORT_C void CImPop3Settings::SetFallBack(TBool aFlag)
+	{
+	iFlags = (iFlags & ~KPop3FallbackFlag) | (aFlag ? KPop3FallbackFlag : KPop3SettingsClearFlag);
+	}
+
+
+/**
+Retrieves the value of Fallback flag.
+
+@return
+ETrue if Fallback flag is enabled.
+*/
+EXPORT_C TBool CImPop3Settings::FallBack() const
+	{
+	return iFlags & KPop3FallbackFlag;
+	}
+#endif