diff -r ebe688cedc25 -r 7fdbb852d323 email/imum/Utils/Src/ImumInSettingsDataImpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/imum/Utils/Src/ImumInSettingsDataImpl.cpp Wed Sep 01 12:31:54 2010 +0100 @@ -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 +#include + +#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 excludeList; + iSettings->ResetAll( excludeList ); + excludeList.Close(); + + IMUM_OUT(); + } + + +// --------------------------------------------------------------------------- +// From class CImumDaSettingsData. +// CImumInSettingsDataImpl::Copy() +// --------------------------------------------------------------------------- +// +TInt CImumInSettingsDataImpl::Copy( const CImumInSettingsData& aSettingsData ) + { + return Copy( *static_cast( &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; + } +