diff -r 000000000000 -r 72b543305e3a email/imum/Utils/Src/ImumInSettingsDataValidator.cpp --- /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 +#include +#include + +#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( + 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( + 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( + 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( + aConnectionSettings, + TImumDaSettings::EKeyAccessPoint, + TImumDaSettings::EValueApAlwaysAsk, + KMaxTInt32 ); + + TInt type = ValidateKey( + 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( + aConnectionSettings, + TImumDaSettings::EKeySecurity, + TImumDaSettings::EValueSecurityOff, + TImumDaSettings::EValueSecuritySsl ); + + // Validate port settings + TInt port = ValidateKey( + 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