email/imum/Utils/Src/IMSSettingsItemApprover.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imum/Utils/Src/IMSSettingsItemApprover.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,864 @@
+/*
+* 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:  IMSSettingsItemApprover.cpp
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <msvstd.hrh>                   // KUidMsvServiceEntryValue
+#include <MuiuMsvUiServiceUtilities.h>  // MsvUiServiceUtilities
+#include <StringLoader.h>               // StringLoader
+#include <ImumUtils.rsg>
+#include "MuiuDynamicSettingItemBase.h"      // CMuiuSettingBase
+#include "MuiuDynamicSettingItemEditValue.h" // CMuiuSettingEditValue
+#include "MuiuDynamicSettingItemEditText.h"  // CMuiuSettingEditText
+#include "MuiuDynamicSettingItemLink.h"      // CMuiuSettingLink
+#include "MuiuDynamicSettingItemExtLink.h"   // CMuiuSettingExtLink
+
+#include "IMSSettingsItemApprover.h"
+#include "ImumInMailboxUtilitiesImpl.h"
+#include "ImumInternalApi.h"
+#include "ImumInSettingsData.h"
+#include "IMSSettingsDialog.h"
+#include "EmailUtils.H"
+#include "IMASPageIds.hrh"
+#include "EmailFeatureUtils.h"
+#include "Imas.hrh"
+#include "ImumUtilsLogging.h"
+#include "ImumPanic.h"
+
+
+// EXTERNAL DATA STRUCTURES
+// EXTERNAL FUNCTION PROTOTYPES
+// CONSTANTS
+// MACROS
+// LOCAL CONSTANTS AND MACROS
+// MODULE DATA STRUCTURES
+// LOCAL FUNCTION PROTOTYPES
+// FORWARD DECLARATIONS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::CIMSSettingsItemApprover()
+// ----------------------------------------------------------------------------
+CIMSSettingsItemApprover::CIMSSettingsItemApprover(
+    CImumInternalApi& aMailboxApi,
+    CMsvCommDbUtilities& aCommsDb,
+    CIMSSettingsNoteUi& aNoteUi,
+    CIMSSettingsBaseUI& aDialog )
+    :
+    iMailboxApi( aMailboxApi ),
+    iCommsDbUtils( aCommsDb ),
+    iNoteUi( aNoteUi ),
+    iDialog( aDialog ),
+    iTempText( NULL )
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::CIMSSettingsItemApprover, 0, KLogUi );
+
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::ConstructL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSettingsItemApprover::ConstructL()
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::ConstructL, 0, KLogUi );
+
+    iTempText = new ( ELeave ) TMuiuSettingsText();
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::~CIMSSettingsItemApprover()
+// ----------------------------------------------------------------------------
+//
+CIMSSettingsItemApprover::~CIMSSettingsItemApprover()
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::~CIMSSettingsItemApprover, 0, KLogUi );
+
+    delete iTempText;
+    iTempText = NULL;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::NewL()
+// ----------------------------------------------------------------------------
+//
+CIMSSettingsItemApprover* CIMSSettingsItemApprover::NewL(
+    CImumInternalApi& aMailboxApi,
+    CMsvCommDbUtilities& aCommsDb,
+    CIMSSettingsNoteUi& aNoteUi,
+    CIMSSettingsBaseUI& aDialog )
+    {
+    IMUM_STATIC_CONTEXT( CIMSSettingsItemApprover::NewL, 0, utils, KLogUi );
+
+    CIMSSettingsItemApprover* self = NewLC(
+        aMailboxApi, aCommsDb, aNoteUi, aDialog );
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::NewLC()
+// ----------------------------------------------------------------------------
+//
+CIMSSettingsItemApprover* CIMSSettingsItemApprover::NewLC(
+    CImumInternalApi& aMailboxApi,
+    CMsvCommDbUtilities& aCommsDb,
+    CIMSSettingsNoteUi& aNoteUi,
+    CIMSSettingsBaseUI& aDialog )
+    {
+    IMUM_STATIC_CONTEXT( CIMSSettingsItemApprover::NewLC, 0, utils, KLogUi );
+
+    CIMSSettingsItemApprover* self =
+        new ( ELeave ) CIMSSettingsItemApprover(
+            aMailboxApi, aCommsDb, aNoteUi, aDialog );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+
+    return self;
+    }
+
+/******************************************************************************
+
+    Common item validating
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::ValidateType()
+// ----------------------------------------------------------------------------
+//
+TIMSErrors CIMSSettingsItemApprover::ValidateType(
+    const CMuiuSettingBase& aBaseItem,
+    TDes& aNewText,
+    TInt& aNewValue )
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::ValidateType, 0, KLogUi );
+    IMUM_IN();
+
+    // Handle the item, based on the type
+    switch ( aBaseItem.Type() )
+        {
+        // Text editor
+        case EMuiuDynSetItemEditText:
+        	IMUM_OUT();
+            return ValidateText( aBaseItem, aNewText );
+
+        // Number editor
+        case EMuiuDynSetCheckBoxArray:
+        case EMuiuDynSetItemEditValue:
+        	IMUM_OUT();
+            return ValidateValue( aBaseItem, aNewValue );
+
+        case EMuiuDynSetRadioButtonArray:
+        	IMUM_OUT();
+            return ValidateRadioButtons( aNewValue );
+
+        // Type is not recognized or not supported
+        default:
+            break;
+        }
+
+    IMUM_OUT();
+    return EIMSNoError;
+    }
+
+/******************************************************************************
+
+    Special item validating
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::EvaluateAccountName()
+// ----------------------------------------------------------------------------
+//
+TIMSErrors CIMSSettingsItemApprover::EvaluateAccountName(
+    const CMuiuSettingBase& aBaseItem,
+    TDes& aNewText )
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::EvaluateAccountName, 0, KLogUi );
+
+    // First make basic test
+    TIMSErrors result = ValidateText( aBaseItem, aNewText );
+
+    // Setting has been written, try to check
+    if ( result == EIMSNoError )
+        {
+        // Do not allow leaving, as it might interrupt initialization phase
+        TRAPD( error,
+            MsvEmailMtmUiUtils::CheckAccountNameL(
+                iMailboxApi,
+                aNewText,
+                iDialog.CurrentMailboxId(),
+                aBaseItem.iItemFlags.Flag( EIMSApproverGenerate ) ) );
+        result = ( error == KErrNone ) ? EIMSNoError : EIMSMailboxNameExists;
+        }
+    else
+        {
+        result = EIMSMailboxNameEmpty;
+        }
+
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::EvaluateServerAddress()
+// ----------------------------------------------------------------------------
+//
+TIMSErrors CIMSSettingsItemApprover::EvaluateServerAddress(
+    const CMuiuSettingBase& aBaseItem,
+    const TDesC& aNewText )
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::EvaluateServerAddress, 0, KLogUi );
+
+    TIMSErrors result = ValidateText( aBaseItem, aNewText );
+
+    // Check that dot isn't in start of the server address
+    if ( result == EIMSNoError )
+        {
+        TBool ok = EFalse;
+        TRAPD( error, ok = MsvUiServiceUtilities::IsValidDomainL( aNewText ) );
+
+        result = ( error == KErrNone ) && ok ? EIMSNoError : EIMSItemInvalid;
+        }
+
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::EvaluateEmailAddress()
+// ----------------------------------------------------------------------------
+//
+TIMSErrors CIMSSettingsItemApprover::EvaluateEmailAddress(
+    const CMuiuSettingBase& aBaseItem,
+    const TDesC& aNewText )
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::EvaluateEmailAddress, 0, KLogUi );
+
+    // First make basic test
+    TIMSErrors result = ValidateText( aBaseItem, aNewText );
+
+    // If text check was successful and the address is given, validate the
+    // email address
+    if ( result == EIMSNoError && aNewText.Length() )
+        {
+        // Trap any errors to prevent leaving
+        TBool ok = EFalse;
+        TRAPD( error, ok =
+            MsvUiServiceUtilities::IsValidEmailAddressL( aNewText ) );
+
+        result = ( ok && error == KErrNone ) ? EIMSNoError : EIMSItemInvalid;
+        }
+
+    return result;
+    }
+
+/******************************************************************************
+
+    Brand new validating code
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::EvaluateSettingItems()
+// ----------------------------------------------------------------------------
+//
+TIMSErrors CIMSSettingsItemApprover::EvaluateSettingItems(
+    TIMSApproverEvent& aEvent,
+    const CMuiuSettingBase& aBaseItem,
+    TDes& aNewText,
+    TInt& aNewValue )
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::EvaluateSettingItems, 0, KLogUi );
+
+    // Incoming settings
+    switch ( aBaseItem.iItemId.iUid )
+        {
+        // No validating
+        case EIMASUserFolderSubscription:
+        	break;
+
+        // Special validating
+        case EIMASUserUnixPath:
+        case EIMASUserOwnName:
+        	return EvaluateFreeText( aNewText );
+
+        case EIMASIncomingMailboxName:
+            return EvaluateAccountName( aBaseItem, aNewText );
+
+        case EIMASIncomingMailServer:
+        case EIMASOutgoingMailServer:
+            return EvaluateServerAddress( aBaseItem, aNewText );
+
+        case EIMASOutgoingEmailAddress:
+        case EIMASUserReplyTo:
+            return EvaluateEmailAddress( aBaseItem, aNewText );
+
+        // When clearing the username and password, it must be checked
+        // that the always online and mail message notification is off.
+        // Otherwise user must be reminded of always online or mail message
+        // notification requiring username and password in connection.
+        case EIMASIncomingUserPwd:
+        case EIMASIncomingUserName:
+            return EvaluateUsernameOrPassword( aEvent, aNewText );
+
+        // If the OMA EMN is attempted to turn on, check that
+        // current state of settings allows it
+        case EIMASMailNotifications:
+            return CheckItemOnlineSettingsCheckTurnOn(
+                aEvent, aNewValue, ETrue );
+
+        // If the Always Online is attempted to turn on, check that
+        // current state of settings allows it
+        case EIMASAORolling:
+            return CheckItemOnlineSettingsCheckTurnOn(
+                aEvent, aNewValue, EFalse );
+
+        case EIMASAODays:
+            break;
+
+        case EIMASAOHours:
+            break;
+
+        default:
+            break;
+        }
+
+    return ValidateType( aBaseItem, aNewText, aNewValue );
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::EvaluateWizardItems()
+// ----------------------------------------------------------------------------
+//
+TIMSErrors CIMSSettingsItemApprover::EvaluateWizardItems(
+    TIMSApproverEvent& /* aEvent */,
+    const CMuiuSettingBase& aBaseItem,
+    TDes& aNewText,
+    TInt& aNewValue )
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::EvaluateWizardItems, 0, KLogUi );
+
+    switch ( aBaseItem.iItemId.iUid )
+        {
+        case EIMAWEmailAddress:
+            return EvaluateEmailAddress( aBaseItem, aNewText );
+
+        case EIMAWSendingServer:
+        case EIMAWReceivingServer:
+            return EvaluateServerAddress( aBaseItem, aNewText );
+
+        case EIMAWMailboxName:
+            return EvaluateAccountName( aBaseItem, aNewText );
+
+        case EIMAWProtocol:
+        case EIMAWIap:
+        default:
+            break;
+        }
+
+    return ValidateType( aBaseItem, aNewText, aNewValue );
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::EvaluateItem()
+// ----------------------------------------------------------------------------
+//
+TMuiuPageEventResult CIMSSettingsItemApprover::EvaluateItem(
+    TIMSApproverEvent& aEvent,
+    const CMuiuSettingBase& aBaseItem,
+    TDes& aNewText,
+    TInt& aNewValue )
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::EvaluateItem, 0, KLogUi );
+
+    TIMSErrors error = EIMSNoError;
+
+    if ( iDialog.Flag( EImumSettingsWizard ) )
+        {
+        error = EvaluateWizardItems( aEvent, aBaseItem, aNewText, aNewValue );
+        }
+    else
+        {
+        error = EvaluateSettingItems( aEvent, aBaseItem, aNewText, aNewValue );
+        }
+
+    return iNoteUi.ShowDialog( aBaseItem, error, aNewText );
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::EvaluateText()
+// ----------------------------------------------------------------------------
+//
+TMuiuPageEventResult CIMSSettingsItemApprover::EvaluateText(
+    TIMSApproverEvent& aEvent,
+    const CMuiuSettingBase& aBaseItem,
+    TDes& aNewText )
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::EvaluateText, 0, KLogUi );
+
+    aEvent = EIMSApproverNoEvent;
+    TInt nothing = 0;
+    return EvaluateItem( aEvent, aBaseItem, aNewText, nothing );
+    }
+
+ // ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::EvaluateValue()
+// ----------------------------------------------------------------------------
+//
+TMuiuPageEventResult CIMSSettingsItemApprover::EvaluateValue(
+    TIMSApproverEvent& aEvent,
+    const CMuiuSettingBase& aBaseItem,
+    TInt& aNewValue )
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::EvaluateValue, 0, KLogUi );
+
+    aEvent = EIMSApproverNoEvent;
+    TMuiuSettingsText nothing;
+    return EvaluateItem( aEvent, aBaseItem, nothing, aNewValue );
+    }
+
+/******************************************************************************
+
+    Common code
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::IsItemFilled()
+// ----------------------------------------------------------------------------
+//
+TBool CIMSSettingsItemApprover::IsItemFilled(
+    const CMuiuSettingBase& aBaseItem,
+    const TInt aLength )
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::IsItemFilled, 0, KLogUi );
+
+    // At first, check if the item can be left empty
+    TBool ok =
+        !( aBaseItem.iItemFlags.Flag( EMuiuDynItemMustFill ) ||
+           aBaseItem.iItemFlags.Flag( EMuiuDynItemForceMustFill ) );
+
+    // The text field is considered filled, when:
+    // A: Item has NO must fill -flags on
+    // B: Item has must fill -flags on and length is higher than 0
+    return ok || ( !ok && aLength > 0 );
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::ValidateRadioButton()
+// ----------------------------------------------------------------------------
+//
+TIMSErrors CIMSSettingsItemApprover::ValidateRadioButtons(
+    const TInt aNewValue )
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::ValidateRadioButtons, 0, KLogUi );
+    IMUM_IN();
+    IMUM_OUT();
+
+    // Make sure item is checked
+    return ( aNewValue != KErrNotFound ) ? EIMSNoError : EIMSItemEmpty;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::ValidateValue()
+// ----------------------------------------------------------------------------
+//
+TIMSErrors CIMSSettingsItemApprover::ValidateValue(
+    const CMuiuSettingBase& aBaseItem,
+    TInt& aNewValue )
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::ValidateValue, 0, KLogUi );
+    IMUM_IN();
+    IMUM_OUT();
+
+    // This check makes sure, that the provided value is larger than 0
+    return IsItemFilled( aBaseItem, aNewValue ) ?
+        EIMSNoError : EIMSItemInvalid;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::ValidateTextL()
+// ----------------------------------------------------------------------------
+//
+TIMSErrors CIMSSettingsItemApprover::ValidateText(
+    const CMuiuSettingBase& aBaseItem,
+    const TDesC& aNewText )
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::ValidateText, 0, KLogUi );
+    IMUM_IN();
+    IMUM_OUT();
+
+    TBool result = IsItemFilled( aBaseItem, aNewText.Length() );
+
+    if( result )
+    	{
+    	// Checks if the name of the mailbox contains only
+    	// white space characters.
+    	TInt length = aNewText.Length();
+
+		// we should not test empty string
+		// result was that the item is filled, but it may
+		// still be allowed to be empty
+    	if( !length )
+    		{
+    		return EIMSNoError;
+    		}
+
+    	TUint currentAscii;
+
+    	for( TInt i = 0 ; i < length ; i++ )
+    		{
+    		currentAscii = aNewText[i];
+    		TChar tempChar( currentAscii );
+
+    		if( !tempChar.IsSpace() )
+    			{
+    			// If the character isn't a white space character
+    			// then EIMSNoError will be returned.
+    			return EIMSNoError;
+    			}
+    		}
+    		return EIMSItemEmpty;
+    	}
+    else
+    	{
+    	return EIMSItemEmpty;
+    	}
+    }
+
+/******************************************************************************
+
+    Individual item code
+
+******************************************************************************/
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::EvaluateUsernameOrPassword()
+// ----------------------------------------------------------------------------
+//
+TIMSErrors CIMSSettingsItemApprover::EvaluateUsernameOrPassword(
+    TIMSApproverEvent& aEvent,
+    TDes& aNewText )
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::EvaluateUsernameOrPassword, 0, KLogUi );
+
+    TBool ok = aNewText.Length() > 0;
+    TBool isAoOn = iDialog.Flag( EDialogAlwaysOnlineOn );
+    TBool isEmnOn = iDialog.Flag( EDialogOmaEmnOn );
+
+    MsvEmailMtmUiUtils::StripCharacters( aNewText );
+
+    // If the field is deleted and always online or oma emn is on
+    if ( !ok && ( isAoOn || isEmnOn ) )
+        {
+        // Prepare the correct event
+        aEvent = isAoOn ?
+            EIMSApproverRemoveAlwaysOnline : EIMSApproverRemoveOmaEmn;
+        return EIMSAoNoLogin;
+        }
+
+    return EIMSNoError;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::EvaluateFreeText()
+// ----------------------------------------------------------------------------
+//
+TIMSErrors CIMSSettingsItemApprover::EvaluateFreeText( TDes& aNewText )
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::EvaluateFreeText, 0, KLogUi );
+    IMUM_IN();
+
+    MsvEmailMtmUiUtils::StripCharacters( aNewText );
+
+    IMUM_OUT();
+    return EIMSNoError;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::CheckItemAOCheckTurnOn()
+// ----------------------------------------------------------------------------
+//
+TIMSErrors CIMSSettingsItemApprover::CheckItemOnlineSettingsCheckTurnOn(
+    TIMSApproverEvent& aEvent,
+    const TInt aNewValue,
+    TBool aIsEmn )
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::CheckItemOnlineSettingsCheckTurnOn, 0, KLogUi );
+
+    TIMSErrors result = EIMSNoError;
+
+    // If Always Online or OMA EMN state is changed from off to on, check that
+    // the current state of settings allows it
+    TBool ao = ( aNewValue != EMailAoOff &&
+        !iDialog.Flag( EDialogAlwaysOnlineOn ) && !aIsEmn );
+
+    TBool emn = ( aNewValue != EMailEmnOff &&
+        !iDialog.Flag( EDialogOmaEmnOn ) && aIsEmn );
+
+    if ( ao || emn )
+        {
+        TRAPD( error,
+            result = CheckItemOnlineSettingsCheckTurnOnL( aEvent, aIsEmn ) );
+
+        // If leave occurred, don't accept the setting
+        if ( error != KErrNone )
+            {
+            // Panic on debug to spot any errors
+            __ASSERT_DEBUG( EFalse, User::Panic(
+                KIMSSettingsApproverPanic, error ) );
+
+            aEvent = EIMSApproverNoEvent;
+            result = EIMSItemInvalid;
+            }
+        }
+    // Always online or OMA EMN is turned off, or the on state is changed in
+    // case of always online, simply continue
+    else
+        {
+        result = EIMSNoError;
+        }
+
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::CheckItemOnlineSettingsCheckTurnOnL()
+// ----------------------------------------------------------------------------
+//
+TIMSErrors CIMSSettingsItemApprover::CheckItemOnlineSettingsCheckTurnOnL(
+    TIMSApproverEvent& aEvent,
+    TBool aIsEmn )
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::CheckItemOnlineSettingsCheckTurnOnL, 0, KLogUi );
+
+    // Make packet Data check
+    TIMSErrors result = CheckItemAoConnectionTypeL();
+
+    // Number of access point mailboxes has to be less than 2
+    if ( result == EIMSNoError && !aIsEmn )
+        {
+        result = CheckItemAoCountOkL();
+        }
+
+    // Always ask not acceptable, require valid access point
+    // IAP user name and password check is not allowed
+    if ( result == EIMSNoError )
+        {
+        result = CheckItemAoAccessPointOkL();
+        }
+
+    // Oma EMN not allowed for the AO mailbox
+    // AO not allowed for the Oma EMN mailbox
+    if ( result == EIMSNoError )
+        {
+        result = CheckItemAoOmaEmnOffL( aIsEmn );
+        }
+
+    // Check for incoming username and password
+    if ( result == EIMSNoError )
+        {
+        result = CheckItemAoUsernameAndPasswordL();
+        }
+
+    // Query the user, if the header limit needs to be ignored
+    if ( result == EIMSNoError && !aIsEmn )
+        {
+        result = CheckItemAOFixFetchL();
+        }
+
+    aEvent = EIMSApproverNoEvent;
+
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::CheckItemAoCountOkL()
+// ----------------------------------------------------------------------------
+//
+TIMSErrors CIMSSettingsItemApprover::CheckItemAoCountOkL()
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::CheckItemAoCountOkL, 0, KLogUi );
+
+    // Number of always online mailboxes has to be less than 2
+    TBool on = MsvEmailMtmUiUtils::CheckActiveAOLimitsL(
+        iMailboxApi, iDialog.CurrentMailboxId() );
+
+    // Show error note in case of any errors
+    if ( !on )
+        {
+        return EIMSAoManyAlwaysOnline;
+        }
+
+    return EIMSNoError;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::CheckItemAoAccessPointOkL()
+// ----------------------------------------------------------------------------
+//
+TIMSErrors CIMSSettingsItemApprover::CheckItemAoAccessPointOkL()
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::CheckItemAoAccessPointOkL, 0, KLogUi );
+    TIMSErrors result = EIMSNoError;
+
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::CheckItemAoOmaEmnOffL()
+// ----------------------------------------------------------------------------
+//
+TIMSErrors CIMSSettingsItemApprover::CheckItemAoOmaEmnOffL( TBool aIsEmn )
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::CheckItemAoOmaEmnOffL, 0, KLogUi );
+
+    TIMSErrors result = EIMSNoError;
+
+    // AO is tried to turn on
+    if ( !aIsEmn )
+        {
+        CMuiuSettingsLinkExtended* omaEmnNotification = NULL;
+        User::LeaveIfError( iDialog.FindItem(
+            omaEmnNotification, TUid::Uid( EIMASMailNotifications ) ) );
+
+        // Show error note in case of any errors
+        if ( omaEmnNotification->Value() != EMailEmnOff )
+            {
+            result = EIMSAoOmaEmnOn;
+            }
+        }
+    // OMA EMN is tried to turn on
+    else
+        {
+        CMuiuSettingsLinkExtended* ao = NULL;
+        User::LeaveIfError( iDialog.FindItem(
+            ao, TUid::Uid( EIMASAORolling ) ) );
+
+        // Show error note in case of any errors
+        if ( ao->Value() != EMailAoOff )
+            {
+            result = EIMSOmaEmnAoOn;
+            }
+        }
+
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::CheckItemAoUsernameAndPasswordL()
+// ----------------------------------------------------------------------------
+//
+TIMSErrors CIMSSettingsItemApprover::CheckItemAoUsernameAndPasswordL()
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::CheckItemAoUsernameAndPasswordL, 0, KLogUi );
+
+    // Initialize incoming settings array before accessing username and
+    // password
+    CMuiuSettingsLinkExtended* username = NULL;
+    CMuiuSettingsLinkExtended* password = NULL;
+    User::LeaveIfError( iDialog.FindItem(
+        username, TUid::Uid( EIMASIncomingUserName ) ) );
+    User::LeaveIfError( iDialog.FindItem(
+        password, TUid::Uid( EIMASIncomingUserPwd ) ) );
+
+    TBool on = password->Text() && password->Text()->Length() > 0 &&
+        username->Text() && username->Text()->Length() > 0;
+
+    // Show error note in case of any errors
+    if ( !on )
+        {
+        return EIMSAoNoLogin;
+        }
+
+    return EIMSNoError;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::CheckItemAoConnectionTypeL()
+// ----------------------------------------------------------------------------
+//
+TIMSErrors CIMSSettingsItemApprover::CheckItemAoConnectionTypeL()
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::CheckItemAoConnectionTypeL, 0, KLogUi );
+
+    if ( !iDialog.Flags().LF( EMailFeatureAlwaysOnlineCSD ) )
+        {
+        // Initialize incoming settings array before accessing
+        // incoming accesspoints
+        CIMSSettingsAccessPointItem* iapItem = NULL;
+        User::LeaveIfError( iDialog.FindItem(
+            iapItem, TUid::Uid( EIMASIncomingIap ) ) );
+
+        if ( iCommsDbUtils.IsApBearerCircuitSwitchedL( iapItem->iIap.iId ) )
+            {
+            return EIMSAoIapTypeCSD;
+            }
+        }
+
+    return EIMSNoError;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSettingsItemApprover::CheckItemAOFixFetchL()
+// ----------------------------------------------------------------------------
+//
+TIMSErrors CIMSSettingsItemApprover::CheckItemAOFixFetchL()
+    {
+    IMUM_CONTEXT( CIMSSettingsItemApprover::CheckItemAOFixFetchL, 0, KLogUi );
+
+    // Turning on the always online requires of fetching all the mails,
+    // without header limits. This means the header limit is ignored, which
+    // has to be queried.
+    TIMSErrors result = EIMSNoError;
+
+    // Initalize fetch headers array
+    CMuiuSettingsLinkExtended* inboxLimit = NULL;
+    CMuiuSettingsLinkExtended* folderLimit = NULL;
+    User::LeaveIfError( iDialog.FindItem(
+        inboxLimit, TUid::Uid( EIMASLimitInbox ) ) );
+    User::LeaveIfError( iDialog.FindItem(
+        folderLimit, TUid::Uid( EIMASLimitFolders ) ) );
+
+    // Check if the value in either of the settings is something else
+    // than all
+    TBool inboxOk = !inboxLimit->Value();
+    TBool folderOk = !folderLimit->Value();
+    TBool hasFolders = iMailboxApi.MailboxUtilitiesL().HasSubscribedFoldersL(
+        iDialog.CurrentMailboxId() );
+
+    // If inbox retrieval limit is not all, or user has subscribed folders
+    // and limit is not all
+    if ( !inboxOk || ( hasFolders && !folderOk ) )
+        {
+        // Show the note
+        result = EIMSAoFetchNotAccepted;
+        }
+
+    inboxLimit = NULL;
+    folderLimit = NULL;
+
+    return result;
+    }
+
+
+//  End of File