--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imum/Utils/Src/ImumInSettingsDataValidator.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,525 @@
+/*
+* Copyright (c) 2006 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: ImumInSettingsDataValidator.cpp
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <commdb.h>
+#include <MuiuMsvUiServiceUtilities.h>
+
+#include "ImumDaSettingsKeys.h"
+#include "ImumInternalApiImpl.h"
+#include "ImumInSettingsDataValidator.h"
+#include "ImumDaErrorCodes.h"
+#include "ImumInSettingsDataImpl.h"
+#include "ImumInSettingsDataCollectionImpl.h"
+#include "ImumDaSettingsKeys.h"
+#include "ImumInSettingsKeys.h"
+#include "EmailUtils.H"
+#include "EmailFeatureUtils.h"
+#include "ComDbUtl.h" // CMsvCommDbUtilities
+#include "ImumUtilsLogging.h"
+
+
+// EXTERNAL DATA STRUCTURES
+// EXTERNAL FUNCTION PROTOTYPES
+// CONSTANTS
+const TInt KImumInValidatorMaxPortValue = 65536;
+
+// MACROS
+// LOCAL CONSTANTS AND MACROS
+// MODULE DATA STRUCTURES
+// LOCAL FUNCTION PROTOTYPES
+// FORWARD DECLARATIONS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ----------------------------------------------------------------------------
+// CImumInSettingsDataValidator::CImumInSettingsDataValidator()
+// ----------------------------------------------------------------------------
+//
+CImumInSettingsDataValidator::CImumInSettingsDataValidator(
+ CImumInternalApiImpl& aInternalApi )
+ :
+ iInternalApi( aInternalApi ),
+ iCommDbUtils( NULL )
+ {
+ }
+
+// ----------------------------------------------------------------------------
+// CImumInSettingsDataValidator::~CImumInSettingsDataValidator()
+// ----------------------------------------------------------------------------
+//
+CImumInSettingsDataValidator::~CImumInSettingsDataValidator()
+ {
+ IMUM_CONTEXT( CImumInSettingsDataValidator::~CImumInSettingsDataValidator, 0, KLogInApi );
+ IMUM_IN();
+
+ delete iCommDbUtils;
+ iCommDbUtils = NULL;
+
+ IMUM_OUT();
+ }
+
+// ----------------------------------------------------------------------------
+// CImumInSettingsDataValidator::ConstructL()
+// ----------------------------------------------------------------------------
+//
+void CImumInSettingsDataValidator::ConstructL()
+ {
+ IMUM_CONTEXT( CImumInSettingsDataValidator::ConstructL, 0, KLogInApi );
+ IMUM_IN();
+
+ iCommDbUtils = CMsvCommDbUtilities::NewL();
+
+ // Make sure that the filters are set in commdbutils
+ iCommDbUtils->InitializeSelectionL();
+ IMUM_OUT();
+ }
+
+// ----------------------------------------------------------------------------
+// CImumInSettingsDataValidator::NewL()
+// ----------------------------------------------------------------------------
+//
+CImumInSettingsDataValidator* CImumInSettingsDataValidator::NewL(
+ CImumInternalApiImpl& aInternalApi )
+ {
+ IMUM_STATIC_CONTEXT( CImumInSettingsDataValidator::NewL, 0, utils, KLogInApi );
+ IMUM_IN();
+
+ CImumInSettingsDataValidator* self = NewLC( aInternalApi );
+ CleanupStack::Pop( self );
+
+ IMUM_OUT();
+
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CImumInSettingsDataValidator::NewLC()
+// ----------------------------------------------------------------------------
+//
+CImumInSettingsDataValidator* CImumInSettingsDataValidator::NewLC(
+ CImumInternalApiImpl& aInternalApi )
+ {
+ IMUM_STATIC_CONTEXT( CImumInSettingsDataValidator::NewLC, 0, utils, KLogInApi );
+ IMUM_IN();
+
+ CImumInSettingsDataValidator* self =
+ new ( ELeave ) CImumInSettingsDataValidator( aInternalApi );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+
+ IMUM_OUT();
+
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CImumInSettingsDataValidator::Validate()
+// ---------------------------------------------------------------------------
+//
+TInt CImumInSettingsDataValidator::Validate(
+ CImumInSettingsDataImpl& aSettings )
+ {
+ IMUM_CONTEXT( CImumInSettingsDataValidator::Validate, 0, KLogInApi );
+ IMUM_IN();
+
+ TRAPD( error, ValidateL( aSettings ) );
+
+ IMUM_OUT();
+
+ return error;
+ }
+
+// ---------------------------------------------------------------------------
+// CImumInSettingsDataValidator::ValidateL()
+// ---------------------------------------------------------------------------
+//
+void CImumInSettingsDataValidator::ValidateL(
+ CImumInSettingsDataImpl& aSettings )
+ {
+ IMUM_CONTEXT( CImumInSettingsDataValidator::ValidateL, 0, KLogInApi );
+ IMUM_IN();
+
+ // Settings must have 1 or more connection settings to be valid
+ if ( aSettings.ConnectionSettingsCount() < 1 )
+ {
+ User::Leave( TImumDaErrorCode::NoConnectionSettings );
+ }
+
+ // Check that the protocols are valid
+ CheckProtocolsL( aSettings );
+
+ // Check all the connection settings
+ for ( TInt sending = aSettings.ConnectionSettingsCount();
+ --sending >= 0; )
+ {
+ ValidateL( aSettings.GetInSetL( sending ) );
+ }
+
+ // Check the email address
+ CheckEmailAddressL( aSettings );
+
+ // Check the mailbox name
+ CheckMailboxNameL( aSettings );
+
+ IMUM_OUT();
+ }
+
+// ---------------------------------------------------------------------------
+// CImumInSettingsDataValidator::CheckProtocolsL()
+// ---------------------------------------------------------------------------
+//
+void CImumInSettingsDataValidator::CheckProtocolsL(
+ CImumInSettingsDataImpl& aSettings )
+ {
+ IMUM_CONTEXT( CImumInSettingsDataValidator::CheckProtocolsL, 0, KLogInApi );
+ IMUM_IN();
+
+ // Retrieve the first protocol
+ TInt protocol = VerifyKeyL<TInt>(
+ aSettings[0],
+ TImumDaSettings::EKeyProtocol,
+ TImumDaSettings::EValueProtocolImap4,
+ TImumDaSettings::EValueProtocolSmtp,
+ TImumDaErrorCode::EValueProtocolReceivingNotSet );
+
+ // First setting must be receiving protocol
+ if ( protocol == TImumDaSettings::EValueProtocolSmtp )
+ {
+ User::Leave( TImumDaErrorCode::EValueProtocolFirstNotReceiving );
+ }
+
+ // Check all the sending settings
+ for ( TInt sending = aSettings.ConnectionSettingsCount();
+ --sending > 0; )
+ {
+ protocol = VerifyKeyL<TInt>(
+ aSettings[sending],
+ TImumDaSettings::EKeyProtocol,
+ TImumDaSettings::EValueProtocolImap4,
+ TImumDaSettings::EValueProtocolSmtp,
+ TImumDaErrorCode::EValueProtocolSendingNotSet );
+
+ // Only smtp is supported sending protocol
+ if ( protocol != TImumDaSettings::EValueProtocolSmtp )
+ {
+ User::Leave( TImumDaErrorCode::EValueProtocolTooManyReceiving );
+ }
+ }
+
+ IMUM_OUT();
+ }
+
+// ---------------------------------------------------------------------------
+// CImumInSettingsDataValidator::Validate()
+// ---------------------------------------------------------------------------
+//
+TInt CImumInSettingsDataValidator::Validate(
+ MImumInSettingsDataCollection& aConnectionSettings )
+ {
+ IMUM_CONTEXT( CImumInSettingsDataValidator::Validate, 0, KLogInApi );
+ IMUM_IN();
+
+ TRAPD( error, ValidateL( aConnectionSettings ) );
+
+ IMUM_OUT();
+ return error;
+ }
+
+// ---------------------------------------------------------------------------
+// CImumInSettingsDataValidator::ValidateL()
+// ---------------------------------------------------------------------------
+//
+void CImumInSettingsDataValidator::ValidateL(
+ MImumInSettingsDataCollection& aConnectionSettings )
+ {
+ IMUM_CONTEXT( CImumInSettingsDataValidator::ValidateL, 0, KLogInApi );
+ IMUM_IN();
+
+ // Get and check protocol
+ TInt protocol = VerifyKeyL<TInt>(
+ aConnectionSettings,
+ TImumDaSettings::EKeyProtocol,
+ TImumDaSettings::EValueProtocolImap4,
+ TImumDaSettings::EValueProtocolSmtp,
+ TImumDaErrorCode::EValueProtocolInvalid );
+
+ // Check server address
+ CheckServerAddressL( aConnectionSettings );
+
+ // Check access point
+ ValidateAccessPointL( aConnectionSettings );
+
+ // Validate security settings
+ ValidateSecurityL( aConnectionSettings );
+
+ IMUM_OUT();
+ }
+
+// ---------------------------------------------------------------------------
+// CImumInSettingsDataValidator::ValidateAccessPointL()
+// ---------------------------------------------------------------------------
+//
+void CImumInSettingsDataValidator::ValidateAccessPointL(
+ MImumInSettingsDataCollection& aConnectionSettings )
+ {
+ IMUM_CONTEXT( CImumInSettingsDataValidator::ValidateAccessPointL, 0, KLogInApi );
+ IMUM_IN();
+
+ // Access Point contains the id of the access point or always ask setting
+ TInt apId = ValidateKey<TInt>(
+ aConnectionSettings,
+ TImumDaSettings::EKeyAccessPoint,
+ TImumDaSettings::EValueApAlwaysAsk,
+ KMaxTInt32 );
+
+ TInt type = ValidateKey<TInt>(
+ aConnectionSettings,
+ TImumInSettings::EKeyAccessPointType,
+ TImumInSettings::EValueApIsIapId,
+ TImumInSettings::EValueApIsIapId );
+
+ IMUM_OUT();
+ }
+
+// ---------------------------------------------------------------------------
+// CImumInSettingsDataValidator::CheckEmailAddressL()
+// ---------------------------------------------------------------------------
+//
+void CImumInSettingsDataValidator::CheckEmailAddressL(
+ const CImumInSettingsDataImpl& aSettings )
+ {
+ IMUM_CONTEXT( CImumInSettingsDataValidator::CheckEmailAddressL, 0, KLogInApi );
+ IMUM_IN();
+
+ // Get the info if the email address can be empty
+ TInt allowEmpty = EFalse;
+ aSettings.GetAttr(
+ TImumInSettings::EKeyAllowEmptyEmailAddress, allowEmpty );
+
+ // Fetch the address
+ TImumDaSettings::TTextEmailAddress address;
+ if ( aSettings.GetAttr(
+ TImumDaSettings::EKeyEmailAddress, address ) )
+ {
+ User::Leave( TImumDaErrorCode::EEmailAddressNotSet );
+ }
+
+ // If the empty mail address is not allowed and the length is zero, leave
+ if ( !allowEmpty && !address.Length() )
+ {
+ User::Leave( TImumDaErrorCode::EEmailAddressEmpty );
+ }
+
+ if ( address.Length() > 0 )
+ {
+ // Validate email address if it has any characters
+ if ( !MsvUiServiceUtilities::IsValidEmailAddressL( address ) )
+ {
+ User::Leave( TImumDaErrorCode::EEmailAddressInvalid );
+ }
+ }
+
+ IMUM_OUT();
+ }
+
+// ---------------------------------------------------------------------------
+// CImumInSettingsDataValidator::CheckServerAddressL()
+// ---------------------------------------------------------------------------
+//
+void CImumInSettingsDataValidator::CheckServerAddressL(
+ const MImumInSettingsDataCollection& aConnectionSettings )
+ {
+ IMUM_CONTEXT( CImumInSettingsDataValidator::CheckServerAddressL, 0, KLogInApi );
+ IMUM_IN();
+
+ // Fetch the address
+ TImumDaSettings::TTextServerAddress address;
+ if ( aConnectionSettings.GetAttr(
+ TImumDaSettings::EKeyServer, address ) )
+ {
+ User::Leave( TImumDaErrorCode::EServerAddressNotSet );
+ }
+
+ // If the empty mail address is not allowed and the length is zero, leave
+ if ( !address.Length() )
+ {
+ User::Leave( TImumDaErrorCode::EServerAddressEmpty );
+ }
+
+ // Validate server address
+ if ( !MsvUiServiceUtilities::IsValidDomainL( address ) )
+ {
+ User::Leave( TImumDaErrorCode::EServerAddressInvalid );
+ }
+
+ IMUM_OUT();
+ }
+
+// ---------------------------------------------------------------------------
+// CImumInSettingsDataValidator::CheckMailboxNameL()
+// ---------------------------------------------------------------------------
+//
+void CImumInSettingsDataValidator::CheckMailboxNameL(
+ const CImumInSettingsDataImpl& aSettings )
+ {
+ IMUM_CONTEXT( CImumInSettingsDataValidator::CheckMailboxNameL, 0, KLogInApi );
+ IMUM_IN();
+
+ // Check if the name exists for the mailbox
+ TImumDaSettings::TTextMailboxName name;
+ if ( aSettings.GetAttr(
+ TImumDaSettings::EKeyMailboxName, name ) )
+ {
+ User::Leave( TImumDaErrorCode::EMailboxNameNotSet );
+ }
+ else
+ {
+ TInt generate = 0;
+ aSettings.GetAttr(
+ TImumInSettings::EKeyGenerateMailboxName, generate );
+ TMsvId mailboxId = 0;
+ aSettings[0].GetAttr(
+ TImumDaSettings::EKeyMailboxId, mailboxId );
+
+ // Do the account check
+ TRAPD( error, MsvEmailMtmUiUtils::CheckAccountNameL(
+ iInternalApi, name, mailboxId, generate ) );
+ if ( error == KErrAlreadyExists )
+ {
+ User::Leave( TImumDaErrorCode::EMailboxNameAlreadyExist );
+ }
+ else if ( error )
+ {
+ User::Leave( TImumDaErrorCode::EMailboxNameUnknownError );
+ }
+ else
+ {
+ // No errors
+ }
+ }
+
+ IMUM_OUT();
+ }
+
+// ----------------------------------------------------------------------------
+// CImumInSettingsDataValidator::GetDefaultSecurityPortL()
+// ----------------------------------------------------------------------------
+//
+TInt CImumInSettingsDataValidator::GetDefaultSecurityPortL(
+ const TInt aSecurity,
+ const TInt aProtocol )
+ {
+ IMUM_CONTEXT( CImumInSettingsDataValidator::GetDefaultSecurityPortL, 0, KLogInApi );
+ IMUM_IN();
+
+ TInt port( 0 );
+
+ switch( aSecurity )
+ {
+ case TImumDaSettings::EValueSecurityTls:
+ case TImumDaSettings::EValueSecurityOff:
+ {
+ switch ( aProtocol )
+ {
+ case TImumDaSettings::EValueProtocolImap4:
+ port = TImumDaSettings::EDefaultPortImap4;
+ break;
+
+ case TImumDaSettings::EValueProtocolPop3:
+ port = TImumDaSettings::EDefaultPortPop3;
+ break;
+
+ case TImumDaSettings::EValueProtocolSmtp:
+ port = TImumDaSettings::EDefaultPortSmtp;
+ break;
+
+ default:
+ User::Leave( TImumDaErrorCode::ESecurityProtocolIllegal );
+ }
+ break;
+ }
+ case TImumDaSettings::EValueSecuritySsl:
+ {
+ switch ( aProtocol )
+ {
+ case TImumDaSettings::EValueProtocolImap4:
+ port = TImumDaSettings::EDefaultSecurityPortImap4;
+ break;
+
+ case TImumDaSettings::EValueProtocolPop3:
+ port = TImumDaSettings::EDefaultSecurityPortPop3;
+ break;
+
+ case TImumDaSettings::EValueProtocolSmtp:
+ port = TImumDaSettings::EDefaultSecurityPortSmtp;
+ break;
+
+ default:
+ User::Leave( TImumDaErrorCode::ESecurityProtocolIllegal );
+ }
+ }
+ break;
+ }
+
+ IMUM_OUT();
+
+ return port;
+ }
+
+// ---------------------------------------------------------------------------
+// CImumInSettingsDataValidator::ValidateSecurityL()
+// ---------------------------------------------------------------------------
+//
+void CImumInSettingsDataValidator::ValidateSecurityL(
+ MImumInSettingsDataCollection& aConnectionSettings )
+ {
+ IMUM_CONTEXT( CImumInSettingsDataValidator::ValidateSecurityL, 0, KLogInApi );
+ IMUM_IN();
+
+ // Validate security settings
+ TInt security = ValidateKey<TInt>(
+ aConnectionSettings,
+ TImumDaSettings::EKeySecurity,
+ TImumDaSettings::EValueSecurityOff,
+ TImumDaSettings::EValueSecuritySsl );
+
+ // Validate port settings
+ TInt port = ValidateKey<TInt>(
+ aConnectionSettings,
+ TImumDaSettings::EKeyPort,
+ TImumDaSettings::EValuePortDefault,
+ KImumInValidatorMaxPortValue );
+
+ // Set correct default port
+ if ( port == TImumDaSettings::EValuePortDefault )
+ {
+ TInt protocol = 0;
+ aConnectionSettings.GetAttr(
+ TImumDaSettings::EKeyProtocol,
+ protocol );
+ port = GetDefaultSecurityPortL( security, protocol );
+ aConnectionSettings.SetAttr(
+ TImumDaSettings::EKeyPort, port );
+ }
+
+ IMUM_OUT();
+ }
+
+// End of File