email/imum/Utils/Src/ImumInSettingsDataImpl.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imum/Utils/Src/ImumInSettingsDataImpl.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,826 @@
+/*
+* Copyright (c) 2002 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:  ImumInSettingsDataImpl.cpp
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <SendUiConsts.h>
+
+#include "ImumInternalApiImpl.h"
+#include "ImumInSettingsDataImpl.h"
+#include "ImumInSettingsDataCollectionImpl.h"
+#include "ImumInMailboxServicesImpl.h"
+#include "ImumDaErrorCodes.h"
+#include "ImumPanic.h"
+#include "ImumMboxDefaultData.h"
+#include "ImumInSettingsDataArray.h"
+#include "ImumDaSettingsKeys.h"
+#include "ImumInSettingsKeys.h"
+#include "ImumInSettingsDataCtrl.h"
+#include "ImumInSettingsDataValidator.h"
+#include "ImumUtilsLogging.h"
+#include "ImumConstants.h"
+
+// EXTERNAL DATA STRUCTURES
+// EXTERNAL FUNCTION PROTOTYPES
+// CONSTANTS
+// MACROS
+// LOCAL CONSTANTS AND MACROS
+// MODULE DATA STRUCTURES
+// LOCAL FUNCTION PROTOTYPES
+// FORWARD DECLARATIONS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ----------------------------------------------------------------------------
+// CImumInSettingsDataImpl::CImumInSettingsDataImpl()
+// ----------------------------------------------------------------------------
+//
+CImumInSettingsDataImpl::CImumInSettingsDataImpl(
+    CImumInternalApiImpl& aMailboxApi,
+    const CImumMboxDefaultData* aDefaultData )
+    :
+    iConnectionSettings( NULL ),
+    iSettings( NULL ),
+    iValidator( NULL ),
+    iDefaultData( aDefaultData ),
+    iMailboxApi( aMailboxApi )
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CImumInSettingsDataImpl::~CImumInSettingsDataImpl()
+// ----------------------------------------------------------------------------
+//
+CImumInSettingsDataImpl::~CImumInSettingsDataImpl()
+    {
+    IMUM_CONTEXT( CImumInSettingsDataImpl::~CImumInSettingsDataImpl, 0, KLogInApi );
+    IMUM_IN();
+
+    iDefaultData = NULL;
+    if ( iConnectionSettings )
+        {
+        iConnectionSettings->ResetAndDestroy();
+        }
+
+    delete iConnectionSettings;
+    iConnectionSettings = NULL;
+    delete iSettings;
+    iSettings = NULL;
+    delete iValidator;
+    iValidator = NULL;
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumInSettingsDataImpl::ConstructL()
+// ----------------------------------------------------------------------------
+//
+void CImumInSettingsDataImpl::ConstructL(
+    const TUid& aProtocol )
+    {
+    IMUM_CONTEXT( CImumInSettingsDataImpl::ConstructL, 0, KLogInApi );
+    IMUM_IN();
+
+    iSettings = iDefaultData->CloneSettingsL();
+    iConnectionSettings =
+        new ( ELeave ) CImumInConnSettings( KImumInConnSettingsGranularity );
+
+    // Prepare the settings structure
+    if ( aProtocol == KSenduiMtmImap4Uid )
+        {
+        AddInSetL( aProtocol );
+        AddInSetL( KSenduiMtmSmtpUid );
+        }
+    else if ( aProtocol == KSenduiMtmPop3Uid )
+        {
+        AddInSetL( aProtocol );
+        AddInSetL( KSenduiMtmSmtpUid );
+        }
+    else if ( aProtocol == KSenduiMtmSmtpUid )
+        {
+        SettingsDataExceptionL( TImumDaErrorCode::EParamNotReceivingProtocol );
+        }
+    else if ( aProtocol.iUid )
+        {
+        SettingsDataExceptionL( TImumDaErrorCode::EParamUnsupportedProtocol );
+        }
+    else
+        {
+        // Empty, will be defined later
+        }
+
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImumInSettingsDataImpl::NewL()
+// ----------------------------------------------------------------------------
+//
+CImumInSettingsDataImpl* CImumInSettingsDataImpl::NewL(
+    CImumInternalApiImpl& aMailboxApi,
+    const TUid& aProtocol,
+    const CImumMboxDefaultData* aDefaultData )
+    {
+    IMUM_STATIC_CONTEXT( CImumInSettingsDataImpl::NewL, 0, utils, KLogInApi );
+    IMUM_IN();
+
+    CImumInSettingsDataImpl* self =
+        NewLC( aMailboxApi, aProtocol, aDefaultData );
+    CleanupStack::Pop( self );
+
+    IMUM_OUT();
+
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CImumInSettingsDataImpl::NewLC()
+// ----------------------------------------------------------------------------
+//
+CImumInSettingsDataImpl* CImumInSettingsDataImpl::NewLC(
+    CImumInternalApiImpl& aMailboxApi,
+    const TUid& aProtocol,
+    const CImumMboxDefaultData* aDefaultData )
+    {
+    IMUM_STATIC_CONTEXT( CImumInSettingsDataImpl::NewLC, 0, utils, KLogInApi );
+    IMUM_IN();
+
+    CImumInSettingsDataImpl* self =
+        new ( ELeave ) CImumInSettingsDataImpl( aMailboxApi, aDefaultData );
+    CleanupStack::PushL( self );
+    self->ConstructL( aProtocol );
+
+    IMUM_OUT();
+
+    return self;
+    }
+
+// ================ INTERFACE IMPLEMENTATION ================
+
+// ---------------------------------------------------------------------------
+// CImumInSettingsDataImpl::SelectDefaultData()
+// ---------------------------------------------------------------------------
+//
+const CImumInSettingsDataCollectionImpl*
+    CImumInSettingsDataImpl::SelectDefaultData(
+        const TUid& aProtocol,
+        const CImumMboxDefaultData* aDefaultData ) const
+    {
+    if ( aDefaultData )
+        {
+        switch ( aProtocol.iUid )
+            {
+            case KSenduiMtmImap4UidValue:
+                return aDefaultData->DefaultConnectionData(
+                    EImumMboxDefaultDataIndexImap4 );
+
+            case KSenduiMtmPop3UidValue:
+                return aDefaultData->DefaultConnectionData(
+                    EImumMboxDefaultDataIndexPop3 );
+
+            case KSenduiMtmSmtpUidValue:
+                return aDefaultData->DefaultConnectionData(
+                    EImumMboxDefaultDataIndexSmtp );
+
+            default:
+                break;
+            }
+        }
+
+    return NULL;
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::AddSetL()
+// ---------------------------------------------------------------------------
+//
+MImumDaSettingsDataCollection& CImumInSettingsDataImpl::AddSetL(
+    const TUid& aProtocol )
+    {
+    return AddInSetL( aProtocol );
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::AddInSetL()
+// ---------------------------------------------------------------------------
+//
+MImumInSettingsDataCollection& CImumInSettingsDataImpl::AddInSetL(
+    const TUid& aProtocol )
+    {
+    IMUM_CONTEXT( CImumInSettingsDataImpl::AddInSetL, 0, KLogInApi );
+    IMUM_IN();
+
+    // Clone the connection settings from the default data object
+    CImumInSettingsDataCollectionImpl* connSettings =
+        iDefaultData->CloneConnectionSettingsL( aProtocol );
+    CleanupStack::PushL( connSettings );
+    iConnectionSettings->AppendL( connSettings );
+    CleanupStack::Pop( connSettings );
+
+    IMUM_OUT();
+
+    return *connSettings;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::DelSetL()
+// ---------------------------------------------------------------------------
+//
+void CImumInSettingsDataImpl::DelSetL( const TUint aIndex )
+    {
+    IMUM_CONTEXT( CImumInSettingsDataImpl::DelSetL, 0, KLogInApi );
+    IMUM_IN();
+
+    // Check that index con
+    if ( aIndex < iConnectionSettings->Count() )
+        {
+        delete ( *iConnectionSettings )[aIndex];
+        iConnectionSettings->Delete( aIndex );
+        }
+    else
+        {
+        SettingsDataExceptionL( TImumDaErrorCode::EConnectionIndexOverflow );
+        }
+
+    IMUM_OUT();
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::DelSetL()
+// ---------------------------------------------------------------------------
+//
+void CImumInSettingsDataImpl::DelSetL(
+    const MImumDaSettingsDataCollection& aSettingsDataCollection )
+    {
+    IMUM_CONTEXT( CImumInSettingsDataImpl::DelSetL, 0, KLogInApi );
+    IMUM_IN();
+
+    TBool deleted = EFalse;
+
+    for ( TInt setting = iConnectionSettings->Count();
+        --setting >= 0 && !deleted; )
+        {
+        if ( *( *iConnectionSettings )[setting] == aSettingsDataCollection )
+            {
+            delete ( *iConnectionSettings )[setting];
+            iConnectionSettings->Delete( setting );
+            deleted = ETrue;
+            }
+        }
+
+    IMUM_OUT();
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::GetSet()
+// ---------------------------------------------------------------------------
+//
+MImumDaSettingsDataCollection& CImumInSettingsDataImpl::GetSetL(
+    const TUint aIndex ) const
+    {
+    return GetInSetL( aIndex );
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumInSettingsData.
+// CImumInSettingsDataImpl::GetSet()
+// ---------------------------------------------------------------------------
+//
+MImumInSettingsDataCollection& CImumInSettingsDataImpl::GetInSetL(
+    const TUint aIndex ) const
+    {
+    IMUM_CONTEXT( CImumInSettingsDataImpl::GetInSetL, 0, KLogInApi );
+    IMUM_IN();
+
+    MImumInSettingsDataCollection* settings = NULL;
+
+    // Check that index con
+    if ( aIndex < iConnectionSettings->Count() )
+        {
+        settings = iConnectionSettings->At( aIndex );
+        }
+    else
+        {
+        SettingsDataExceptionL( TImumDaErrorCode::EConnectionIndexOverflow );
+        }
+
+    IMUM_OUT();
+
+    return *settings;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::Validate()
+// ---------------------------------------------------------------------------
+//
+TInt CImumInSettingsDataImpl::Validate()
+    {
+    IMUM_CONTEXT( CImumInSettingsDataImpl::Validate, 0, KLogInApi );
+    IMUM_IN();
+
+    TRAPD( error, ValidateL() );
+
+    IMUM_OUT();
+
+    return error;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::SetAttr()
+// ---------------------------------------------------------------------------
+//
+TInt CImumInSettingsDataImpl::SetAttr(
+    const TUint aAttributeKey,
+    const TInt aValue )
+    {
+    TInt defaultValue = 0;
+    return ImumInSettingsDataCtrl::CreateToArray(
+        *iSettings,
+        iDefaultData,
+        aAttributeKey,
+        ECmpTInt32,
+        aValue,
+        defaultValue );
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::SetAttr()
+// ---------------------------------------------------------------------------
+//
+TInt CImumInSettingsDataImpl::SetAttr(
+    const TUint aAttributeKey,
+    const TInt64 aValue )
+    {
+    TInt64 defaultValue = 0;
+    return ImumInSettingsDataCtrl::CreateToArray(
+        *iSettings,
+        iDefaultData,
+        aAttributeKey,
+        ECmpTInt64,
+        aValue,
+        defaultValue );
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::SetAttr()
+// ---------------------------------------------------------------------------
+//
+TInt CImumInSettingsDataImpl::SetAttr(
+    const TUint aAttributeKey,
+    const TMsvId aId )
+    {
+    TMsvId defaultValue = 0;
+    return ImumInSettingsDataCtrl::CreateToArray(
+        *iSettings,
+        iDefaultData,
+        aAttributeKey,
+        ECmpTUint32,
+        aId,
+        defaultValue );
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::SetAttr()
+// ---------------------------------------------------------------------------
+//
+TInt CImumInSettingsDataImpl::SetAttr(
+    const TUint aAttributeKey,
+    const TDesC& aText )
+    {
+    RBuf emptyDefault;
+    TInt error = emptyDefault.Create( ImumTextConsts::EMaxTextLen );
+    if ( error == KErrNone )
+        {
+        error = ImumInSettingsDataCtrl::CreateToArray(
+            *iSettings,
+            iDefaultData,
+            aAttributeKey,
+            ECmpNormal,
+            aText,
+            emptyDefault );
+        }
+
+    emptyDefault.Close();
+
+    return error;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::SetAttr()
+// ---------------------------------------------------------------------------
+//
+TInt CImumInSettingsDataImpl::SetAttr(
+    const TUint aAttributeKey,
+    const TDesC8& aText )
+    {
+    RBuf8 emptyDefault;
+    TInt error = emptyDefault.Create( ImumTextConsts::EMaxTextLen );
+    if ( error == KErrNone )
+        {
+        error = ImumInSettingsDataCtrl::CreateToArray(
+            *iSettings,
+            iDefaultData,
+            aAttributeKey,
+            ECmpNormal8,
+            aText,
+            emptyDefault );
+        }
+
+    emptyDefault.Close();
+
+    return error;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::GetAttr()
+// ---------------------------------------------------------------------------
+//
+TInt CImumInSettingsDataImpl::GetAttr(
+    const TUint aAttributeKey,
+    TInt& aValue ) const
+    {
+    return ImumInSettingsDataCtrl::RetrieveFromArray(
+        *iSettings,
+        aAttributeKey,
+        ECmpTInt32,
+        aValue );
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::GetAttr()
+// ---------------------------------------------------------------------------
+//
+TInt CImumInSettingsDataImpl::GetAttr(
+    const TUint aAttributeKey,
+    TInt64& aValue ) const
+    {
+    return ImumInSettingsDataCtrl::RetrieveFromArray(
+        *iSettings,
+        aAttributeKey,
+        ECmpTInt64,
+        aValue );
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::GetAttr()
+// ---------------------------------------------------------------------------
+//
+TInt CImumInSettingsDataImpl::GetAttr(
+    const TUint aAttributeKey,
+    TMsvId& aId ) const
+    {
+    return ImumInSettingsDataCtrl::RetrieveFromArray(
+        *iSettings,
+        aAttributeKey,
+        ECmpTUint32,
+        aId );
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::GetAttr()
+// ---------------------------------------------------------------------------
+//
+TInt CImumInSettingsDataImpl::GetAttr(
+    const TUint aAttributeKey,
+    TDes& aText ) const
+    {
+    return ImumInSettingsDataCtrl::RetrieveFromArray(
+        *iSettings,
+        aAttributeKey,
+        ECmpNormal,
+        aText );
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::GetAttr()
+// ---------------------------------------------------------------------------
+//
+TInt CImumInSettingsDataImpl::GetAttr(
+    const TUint aAttributeKey,
+    TDes8& aText ) const
+    {
+    return ImumInSettingsDataCtrl::RetrieveFromArray(
+        *iSettings,
+        aAttributeKey,
+        ECmpNormal8,
+        aText );
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::operator!=()
+// ---------------------------------------------------------------------------
+//
+TBool CImumInSettingsDataImpl::operator!=(
+    const CImumDaSettingsData& /* aSettingsData */ ) const
+    {
+    IMUM_CONTEXT( CImumInSettingsDataImpl::operator!=, 0, KLogInApi );
+    IMUM_IN();
+
+    __ASSERT_DEBUG( EFalse,
+        User::Panic( KImumInSettingsDataImpl,
+        TImumDaErrorCode::EUnsupportedOperation ) );
+
+    IMUM_OUT();
+
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumInSettingsData.
+// CImumInSettingsDataImpl::operator!=()
+// ---------------------------------------------------------------------------
+//
+TBool CImumInSettingsDataImpl::operator!=(
+    const CImumInSettingsData& /* aSettingsData */ ) const
+    {
+    IMUM_CONTEXT( CImumInSettingsDataImpl::operator!=, 0, KLogInApi );
+    IMUM_IN();
+
+    __ASSERT_DEBUG( EFalse,
+        User::Panic( KImumInSettingsDataImpl,
+        TImumDaErrorCode::EUnsupportedOperation ) );
+
+    IMUM_OUT();
+
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::operator==()
+// ---------------------------------------------------------------------------
+//
+TBool CImumInSettingsDataImpl::operator==(
+    const CImumDaSettingsData& /* aSettingsData */ ) const
+    {
+    IMUM_CONTEXT( CImumInSettingsDataImpl::operator==, 0, KLogInApi );
+    IMUM_IN();
+
+    __ASSERT_DEBUG( EFalse,
+        User::Panic( KImumInSettingsDataImpl,
+        TImumDaErrorCode::EUnsupportedOperation ) );
+
+    IMUM_OUT();
+
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumInSettingsData.
+// CImumInSettingsDataImpl::operator==()
+// ---------------------------------------------------------------------------
+//
+TBool CImumInSettingsDataImpl::operator==(
+    const CImumInSettingsData& /* aSettingsData */ ) const
+    {
+    IMUM_CONTEXT( CImumInSettingsDataImpl::operator==, 0, KLogInApi );
+    IMUM_IN();
+
+    __ASSERT_DEBUG( EFalse,
+        User::Panic( KImumInSettingsDataImpl,
+        TImumDaErrorCode::EUnsupportedOperation ) );
+
+    IMUM_OUT();
+
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::operator[]()
+// ---------------------------------------------------------------------------
+//
+MImumDaSettingsDataCollection& CImumInSettingsDataImpl::operator[](
+    const TUint aIndex ) const
+    {
+    IMUM_CONTEXT( CImumInSettingsDataImpl::operator, 0, KLogInApi );
+    IMUM_IN();
+
+    __ASSERT_DEBUG( aIndex < iConnectionSettings->Count(),
+        User::Panic( KImumInSettingsDataImpl,
+        TImumDaErrorCode::EConnectionIndexOverflow ) );
+
+    IMUM_OUT();
+
+    return *iConnectionSettings->At( aIndex );
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::Reset()
+// ---------------------------------------------------------------------------
+//
+void CImumInSettingsDataImpl::Reset( const TUint aAttributeKey )
+    {
+    iSettings->ResetAttr( aAttributeKey );
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::ResetAll()
+// ---------------------------------------------------------------------------
+//
+void CImumInSettingsDataImpl::ResetAll()
+    {
+    IMUM_CONTEXT( CImumInSettingsDataImpl::ResetAll, 0, KLogInApi );
+    IMUM_IN();
+
+    // Default data is up to date, so do the actual resetting of the
+    // settings
+    for ( TInt connSet = iConnectionSettings->Count(); --connSet >= 0; )
+        {
+        iConnectionSettings->At( connSet )->ResetAll();
+        }
+
+    RArray<TUint> excludeList;
+    iSettings->ResetAll( excludeList );
+    excludeList.Close();
+
+    IMUM_OUT();
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::Copy()
+// ---------------------------------------------------------------------------
+//
+TInt CImumInSettingsDataImpl::Copy( const CImumInSettingsData& aSettingsData )
+    {
+    return Copy( *static_cast<const CImumDaSettingsData*>( &aSettingsData ) );
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumInSettingsData.
+// CImumInSettingsDataImpl::Copy()
+// ---------------------------------------------------------------------------
+//
+TInt CImumInSettingsDataImpl::Copy( const CImumDaSettingsData& aSettingsData )
+    {
+    IMUM_CONTEXT( CImumInSettingsDataImpl::Copy, 0, KLogInApi );
+    IMUM_IN();
+
+    __ASSERT_DEBUG( EFalse,
+        User::Panic( KImumInSettingsDataImpl,
+        TImumDaErrorCode::EUnsupportedOperation ) );
+
+    TInt error = TImumDaErrorCode::ENoError;
+    for ( TInt connSet = iConnectionSettings->Count();
+          --connSet >= 0 && !error; )
+        {
+        error = iConnectionSettings->At( connSet )->Copy( aSettingsData[connSet] );
+        }
+
+    IMUM_OUT();
+
+    return error;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumDaSettingsData.
+// CImumInSettingsDataImpl::Log()
+// ---------------------------------------------------------------------------
+//
+void CImumInSettingsDataImpl::Log() const
+    {
+    IMUM_CONTEXT( CImumInSettingsDataImpl::Log, 0, KLogInApi );
+    IMUM_IN();
+
+#ifdef __DEBUG
+    // First, validate the connection settings
+    for ( TInt connSet = iConnectionSettings->Count(); --connSet >= 0; )
+        {
+        iConnectionSettings->At( connSet )->Log();
+        }
+#endif // __DEBUG
+
+    IMUM_OUT();
+    }
+
+// ================ GENERAL IMPLEMENTATION ================
+
+// ---------------------------------------------------------------------------
+// CImumInSettingsDataImpl::SettingsDataExceptionL()
+// ---------------------------------------------------------------------------
+//
+void CImumInSettingsDataImpl::SettingsDataExceptionL(
+    const TInt aErrorCode ) const
+    {
+    IMUM_CONTEXT( CImumInSettingsDataImpl::SettingsDataExceptionL, 0, KLogInApi );
+    IMUM_IN();
+
+    User::Leave( aErrorCode );
+    __ASSERT_DEBUG( EFalse, User::Panic(
+        KImumInSettingsDataImpl, aErrorCode ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CImumInSettingsDataImpl::ValidatorL()
+// ---------------------------------------------------------------------------
+//
+CImumInSettingsDataValidator& CImumInSettingsDataImpl::ValidatorL()
+    {
+    if ( !iValidator )
+        {
+        // Create settings validator
+        iValidator = CImumInSettingsDataValidator::NewL( iMailboxApi );
+        }
+
+    return *iValidator;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CImumInSettingsDataImpl::ValidateL()
+// ---------------------------------------------------------------------------
+//
+void CImumInSettingsDataImpl::ValidateL()
+    {
+    IMUM_CONTEXT( CImumInSettingsDataImpl::ValidateL, 0, KLogInApi );
+    IMUM_IN();
+
+    ValidatorL().ValidateL( *this );
+
+    IMUM_OUT();
+    }
+
+// ---------------------------------------------------------------------------
+// CImumInSettingsDataImpl::ConnectionSettingsCount()
+// ---------------------------------------------------------------------------
+//
+TInt CImumInSettingsDataImpl::ConnectionSettingsCount()
+    {
+    return iConnectionSettings->Count();
+    }
+
+// ---------------------------------------------------------------------------
+// From class CImumInSettingsData.
+// CImumInSettingsDataImpl::CloneL()
+// ---------------------------------------------------------------------------
+//
+CImumInSettingsData* CImumInSettingsDataImpl::CloneL() const
+    {
+    IMUM_CONTEXT( CImumInSettingsDataImpl::CloneL, 0, KLogInApi );
+    IMUM_IN();
+
+    // When cloning, the default data object must be added to the new data.
+    // This guarrantees also, that there will be only one default data object.
+    CImumInSettingsDataImpl* clone = NewLC(
+        iMailboxApi,
+        TUid::Uid( 0 ),
+        iMailboxApi.MailboxServicesImplL().DefaultDataObjectL() );
+
+    for ( TInt connection = KErrNotFound;
+        ++connection < iConnectionSettings->Count(); )
+        {
+        clone->iConnectionSettings->AppendL(
+            iConnectionSettings->At( connection )->DoCloneL() );
+        }
+
+    // Before doing anything, the previous array must be delete to prevent
+    // any extra data to remain in the memory.
+    delete clone->iSettings;
+    clone->iSettings = iSettings->CloneL();
+
+    CleanupStack::Pop( clone );
+
+    IMUM_OUT();
+
+    return clone;
+    }
+