diff -r ebe688cedc25 -r 7fdbb852d323 email/imum/Utils/Src/ImumMboxManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/imum/Utils/Src/ImumMboxManager.cpp Wed Sep 01 12:31:54 2010 +0100 @@ -0,0 +1,1700 @@ +/* +* 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: +* Encapsulates saving and removing email accounts +* +*/ + + +// INCLUDE FILES +#include +#include // CMsvEntry +#include // CEmailAccounts +#include // CImSmtpSettings +#include // CImPop3Settings +#include // CImImap4Settings +#include // CImIAPPreferences +#include +#include + +#include "ImumInternalApiImpl.h" +#include "ImumMboxSymbianDataConverter.h" +#include "ImumMboxInternalDataConverter.h" +#include "ImumMboxManager.h" +#include "ImumInHealthServicesImpl.h" +#include "ImumMboxData.h" +#include "ImumMboxSettingsCtrl.h" +#include "IMSSettingsNoteUi.h" +#include "ImumUtilsLogging.h" +#include "EmailUtils.H" +#include "ImumPanic.h" + +#include +#include +#include + +// EXTERNAL DATA STRUCTURES +// EXTERNAL FUNCTION PROTOTYPES +// CONSTANTS +const TInt KImumMboxQueryTextLength = 100; +const TInt KImumMboxArrayGranularity = 4; + +// MACROS +// LOCAL CONSTANTS AND MACROS +// MODULE DATA STRUCTURES +// LOCAL FUNCTION PROTOTYPES +// FORWARD DECLARATIONS + +// ============================ MEMBER FUNCTIONS =============================== + + +// ---------------------------------------------------------------------------- +// CImumMboxManager::CImumMboxManager() +// ---------------------------------------------------------------------------- +// +CImumMboxManager::CImumMboxManager( + CImumInternalApiImpl& aMailboxApi ) + : + iMailboxApi( aMailboxApi ), + iMboxSettingsCtrl( NULL ), + iAccounts( NULL ), + iCleaner( NULL ) + { + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::ConstructL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::ConstructL() + { + IMUM_CONTEXT( CImumMboxManager::ConstructL, 0, KLogData ); + IMUM_IN(); + + FeatureManager::InitializeLibL(); + + iAccounts = CEmailAccounts::NewL(); + iMboxSettingsCtrl = CImumMboxSettingsCtrl::NewL( iMailboxApi ); + iCleaner = CImumInHealthServicesImpl::NewL( iMailboxApi ); + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::~CImumMboxManager() +// ---------------------------------------------------------------------------- +// +CImumMboxManager::~CImumMboxManager() + { + IMUM_CONTEXT( CImumMboxManager::~CImumMboxManager, 0, KLogData ); + IMUM_IN(); + + FeatureManager::UnInitializeLib(); + delete iMboxSettingsCtrl; + iMboxSettingsCtrl = NULL; + delete iAccounts; + iAccounts = NULL; + delete iCleaner; + iCleaner = NULL; + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::NewL() +// ---------------------------------------------------------------------------- +// +CImumMboxManager* CImumMboxManager::NewL( + CImumInternalApiImpl& aMailboxApi ) + { + IMUM_STATIC_CONTEXT( CImumMboxManager::NewL, 0, utils, KLogData ); + IMUM_IN(); + + CImumMboxManager* self = NewLC( aMailboxApi ); + CleanupStack::Pop( self ); + + IMUM_OUT(); + + return self; + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::NewLC() +// ---------------------------------------------------------------------------- +// +CImumMboxManager* CImumMboxManager::NewLC( + CImumInternalApiImpl& aMailboxApi ) + { + IMUM_STATIC_CONTEXT( CImumMboxManager::NewLC, 0, utils, KLogData ); + IMUM_IN(); + + CImumMboxManager* self = + new ( ELeave ) CImumMboxManager( aMailboxApi ); + CleanupStack::PushL( self ); + self->ConstructL(); + + IMUM_OUT(); + + return self; + } + +/****************************************************************************** + + Static Functions + +******************************************************************************/ + +// ---------------------------------------------------------------------------- +// CImumMboxManager::GetIapPreferencesL() +// ---------------------------------------------------------------------------- +// +TInt CImumMboxManager::GetIapPreferencesL( + const TMsvId aMailboxId, + CEmailAccounts& aAccounts, + CImIAPPreferences& aIapPrefs, + CImumInternalApiImpl& aMailboxApi, + const TBool aSmtp ) + { + IMUM_STATIC_CONTEXT( CImumMboxManager::GetIapPreferencesL, 0, utils, KLogData ); + IMUM_IN(); + + TMsvEntry entry; + + // Get the correct part of the mailbox + if ( aSmtp ) + { + // Get SMTP part of the mailbox + entry = aMailboxApi.MailboxUtilitiesL().GetMailboxEntryL( + aMailboxId, MImumInMailboxUtilities::ERequestSending ); + + // Define the account id + TSmtpAccount smtpAccountId; + smtpAccountId.iSmtpAccountId = entry.iMtmData2; + + // Load preferences + aAccounts.LoadSmtpIapSettingsL( smtpAccountId, aIapPrefs ); + } + else + { + // Get POP3 or IMAP4 part of the mailbox + entry = aMailboxApi.MailboxUtilitiesL().GetMailboxEntryL( + aMailboxId, MImumInMailboxUtilities::ERequestReceiving ); + + // Load settings based on the mtm type + if ( entry.iMtm.iUid == KSenduiMtmImap4UidValue ) + { + // Define imap4 account id + TImapAccount imapAccountId; + imapAccountId.iImapAccountId = entry.iMtmData2; + + // Load preferences + aAccounts.LoadImapIapSettingsL( imapAccountId, aIapPrefs ); + } + else + { + // Define pop3 account id + TPopAccount popAccountId; + popAccountId.iPopAccountId = entry.iMtmData2; + + // Load preferences + aAccounts.LoadPopIapSettingsL( popAccountId, aIapPrefs ); + } + } + + IMUM_OUT(); + + return KErrNone; + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::SetIapPreferencesL() +// ---------------------------------------------------------------------------- +// +TInt CImumMboxManager::SetIapPreferencesL( + const TMsvId aMailboxId, + CEmailAccounts& aAccounts, + const CImIAPPreferences& aIapPrefs, + CImumInternalApiImpl& aMailboxApi, + const TBool aSmtp ) + { + IMUM_STATIC_CONTEXT( CImumMboxManager::SetIapPreferencesL, 0, utils, KLogData ); + IMUM_IN(); + + TMsvEntry entry; + TInt error = KErrNone; + + // Get the correct part of the mailbox + if ( aSmtp ) + { + // Get SMTP part of the mailbox + entry = aMailboxApi.MailboxUtilitiesL().GetMailboxEntryL( + aMailboxId, MImumInMailboxUtilities::ERequestSending ); + + // Define the account id + TSmtpAccount smtpAccountId; + smtpAccountId.iSmtpAccountId = entry.iMtmData2; + + // Load preferences + aAccounts.SaveSmtpIapSettingsL( smtpAccountId, aIapPrefs ); + } + else + { + // Get POP3 or IMAP4 part of the mailbox + entry = aMailboxApi.MailboxUtilitiesL().GetMailboxEntryL( + aMailboxId, MImumInMailboxUtilities::ERequestReceiving ); + + // Load settings based on the mtm type + if ( entry.iMtm.iUid == KSenduiMtmImap4UidValue ) + { + // Define imap4 account id + TImapAccount imapAccountId; + imapAccountId.iImapAccountId = entry.iMtmData2; + + // Load preferences + aAccounts.SaveImapIapSettingsL( imapAccountId, aIapPrefs ); + } + else + { + // Define pop3 account id + TPopAccount popAccountId; + popAccountId.iPopAccountId = entry.iMtmData2; + + // Load preferences + aAccounts.SavePopIapSettingsL( popAccountId, aIapPrefs ); + } + } + + IMUM_OUT(); + + return error; + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::ForceAlwaysAskL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::ForceAlwaysAskL( + const TMsvId aMailboxId, + CEmailAccounts& aAccounts, + CImIAPPreferences& aIapPrefs, + CImumInternalApiImpl& aMailboxApi, + const TBool aSmtp ) + { + IMUM_STATIC_CONTEXT( CImumMboxManager::ForceAlwaysAskL, 0, utils, KLogData ); + IMUM_IN(); + + aIapPrefs.RemoveIAPL( 0 ); + TImIAPChoice iap; + iap.iDialogPref = ECommDbDialogPrefPrompt; + iap.iIAP = 0; + aIapPrefs.AddIAPL( iap ); + User::LeaveIfError( CImumMboxManager::SetIapPreferencesL( + aMailboxId, aAccounts, aIapPrefs, aMailboxApi, aSmtp ) ); + + IMUM_OUT(); + } + +/****************************************************************************** + + Manager tools + +******************************************************************************/ + +// ---------------------------------------------------------------------------- +// CImumMboxManager::CreateAccountFillIapL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::CreateAccountFillIapL( + CImumMboxData& aSettings ) + { + IMUM_CONTEXT( CImumMboxManager::CreateAccountFillIapL, 0, KLogData ); + IMUM_IN(); + + // This is not ideal choice, but current situation forces to do this, + // until Reset() funcion is exported from class CImIAPPreferences + delete aSettings.iIncomingIapPref; + aSettings.iIncomingIapPref = NULL; + delete aSettings.iOutgoingIapPref; + aSettings.iOutgoingIapPref = NULL; + + // Make sure the preferences are made + if ( !aSettings.iIncomingIapPref ) + { + aSettings.iIncomingIapPref = CImIAPPreferences::NewLC(); + CleanupStack::Pop( aSettings.iIncomingIapPref ); + } + + if ( !aSettings.iOutgoingIapPref ) + { + aSettings.iOutgoingIapPref = CImIAPPreferences::NewLC(); + CleanupStack::Pop( aSettings.iOutgoingIapPref ); + } + + // Set incoming internet access point + TImIAPChoice incomingIapChoice; + incomingIapChoice.iIAP = aSettings.iIncomingIap; + incomingIapChoice.iDialogPref = ECommDbDialogPrefDoNotPrompt; + aSettings.iIncomingIapPref->AddIAPL( incomingIapChoice ); + + // Set outgoing internet access point + TImIAPChoice outgoingIapChoice; + outgoingIapChoice.iIAP = aSettings.iOutgoingIap; + outgoingIapChoice.iDialogPref = ECommDbDialogPrefDoNotPrompt; + aSettings.iOutgoingIapPref->AddIAPL( outgoingIapChoice ); + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::LoadAccountFillIapL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::LoadAccountFillIapL( + CImumMboxData& aSettings ) + { + IMUM_CONTEXT( CImumMboxManager::LoadAccountFillIapL, 0, KLogData ); + IMUM_IN(); + + //check Incoming IAP number + if ( aSettings.iIncomingIapPref->NumberOfIAPs() > 0 ) + { + // Set internet access point (incoming IAP) + TImIAPChoice incomingIapChoice = + aSettings.iIncomingIapPref->IAPPreference( 0 ); + aSettings.iIncomingIap = incomingIapChoice.iIAP; + } + + //check SNAP define + else if( aSettings.iIncomingIapPref->SNAPDefined() ) + { + aSettings.iIncomingIap = aSettings.iIncomingIapPref->SNAPPreference(); + } + else + { + aSettings.iIncomingIap = 0; + } + + //check Outgoing IAP number + if ( aSettings.iOutgoingIapPref->NumberOfIAPs() > 0 ) + { + // Set internet access point (Outgoing IAP) + TImIAPChoice outgoingIapChoice = + aSettings.iOutgoingIapPref->IAPPreference( 0 ); + aSettings.iOutgoingIap = outgoingIapChoice.iIAP; + } + //check SNAP define + else if( aSettings.iOutgoingIapPref->SNAPDefined() ) + { + aSettings.iOutgoingIap = aSettings.iOutgoingIapPref->SNAPPreference(); + } + else + { + aSettings.iOutgoingIap = 0; + } + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::DetermineDefaultAccountL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::DetermineDefaultAccountL( + CImumMboxData& aSettings ) + { + IMUM_CONTEXT( CImumMboxManager::DetermineDefaultAccountL, 0, KLogData ); + IMUM_IN(); + + // First check if default account id is set + aSettings.iDefaultAccountId = + MsvUiServiceUtilitiesInternal::DefaultServiceForMTML( + iMailboxApi.MsvSession(), KSenduiMtmSmtpUid, EFalse ); + + // Set the newly created one as a default account + if ( aSettings.iDefaultAccountId == KMsvUnknownServiceIndexEntryId ) + { + if( !FeatureManager::FeatureSupported( KFeatureIdSelectableEmail ) || + !MsvUiServiceUtilitiesInternal::OtherEmailMTMExistL( + iMailboxApi.MsvSession(), aSettings.iMailboxId ) ) + { + TSmtpAccount smtpAccountId; + iAccounts->GetSmtpAccountL( aSettings.iMailboxId, smtpAccountId ); + iAccounts->SetDefaultSmtpAccountL( smtpAccountId ); + + MsvUiServiceUtilitiesInternal::SetDefaultServiceForMTML( + iMailboxApi.MsvSession(), KSenduiMtmSmtpUid, + aSettings.iMailboxId ); + aSettings.iDefaultAccountId = aSettings.iMailboxId; + } + } + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::RemoveAccountL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::RemoveAccountL( + const CImumMboxData& aSettings ) + { + IMUM_CONTEXT( CImumMboxManager::RemoveAccountL, 0, KLogData ); + IMUM_IN(); + + // Delete Imap4 or Pop3 account + if ( aSettings.iIsImap4 ) + { + DeleteExtendedSettings( TIMAStorerParams( + aSettings.iImap4AccountId.iImapAccountId, KSenduiMtmImap4Uid ) ); + + DeleteBaseSettingsL( aSettings ); + } + else + { + DeleteExtendedSettings( TIMAStorerParams( + aSettings.iPop3AccountId.iPopAccountId, KSenduiMtmPop3Uid ) ); + + DeleteBaseSettingsL( aSettings ); + } + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::RemoveAccountL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::RemoveAccountL( + const TMsvEntry& aMailboxEntry, TBool aSilent ) + { + IMUM_CONTEXT( CImumMboxManager::RemoveAccountL, 0, KLogData ); + IMUM_IN(); + + if ( aSilent || AccountDeletionConditionsOkL( aMailboxEntry.Id() ) ) + { + // Delete Imap4 or Pop3 account + if ( aMailboxEntry.iMtm == KSenduiMtmImap4Uid ) + { + DeleteExtendedSettings( TIMAStorerParams( + aMailboxEntry.iMtmData2, KSenduiMtmImap4Uid ) ); + + DeleteBaseSettingsL( aMailboxEntry.iMtmData2, ETrue ); + } + else + { + DeleteExtendedSettings( TIMAStorerParams( + aMailboxEntry.iMtmData2, KSenduiMtmPop3Uid ) ); + + DeleteBaseSettingsL( aMailboxEntry.iMtmData2, EFalse ); + } + } + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::RemoveAccountL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::RemoveAccountL( + const TUint32 aRelatedAccountId, + const TUid& aMtmId ) + { + IMUM_CONTEXT( CImumMboxManager::RemoveAccountL, 0, KLogData ); + IMUM_IN(); + + // First remove the extended settings, as this cannot leave + DeleteExtendedSettings( + TIMAStorerParams( aRelatedAccountId, aMtmId ) ); + + // Delete Imap4 or Pop3 account + DeleteBaseSettingsL( + aRelatedAccountId, aMtmId == KSenduiMtmImap4Uid ); + + IMUM_OUT(); + } + +// --------------------------------------------------------------------------- +// CImumMboxManager::RemoveAccount() +// --------------------------------------------------------------------------- +// +void CImumMboxManager::RemoveAccount( const TMsvId aMailboxId, TBool aSilent ) + { + IMUM_CONTEXT( CImumMboxManager::RemoveAccount, 0, KLogData ); + IMUM_IN(); + + TMsvEntry entry; + TRAPD( error, entry = iMailboxApi.MailboxUtilitiesL().GetMailboxEntryL( + aMailboxId, + MImumInMailboxUtilities::ERequestReceiving ) ); + + if ( !error ) + { + TRAP_IGNORE( RemoveAccountL( entry, aSilent ) ); + } + + IMUM_OUT(); + } + + +/****************************************************************************** + + Account creation + +******************************************************************************/ + +// ---------------------------------------------------------------------------- +// CImumMboxManager::CreateEmailAccount() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::CreateEmailAccount( + CImumMboxData& aSettings, + const TBool aPopulateDefaults ) + { + IMUM_CONTEXT( CImumMboxManager::CreateEmailAccount, 0, KLogData ); + IMUM_IN(); + + // If settings not ready, don't try to create + if ( aSettings.IsOk() ) + { + // Attempt to create the mailaccount + TRAPD( error, CreateEmailAccountL( aSettings, aPopulateDefaults ) ); + + // Creating mailbox has failed, delete entries and cenrep settings + if ( error != KErrNone ) + { + TRAP_IGNORE( RemoveAccountL( aSettings ) ); + __ASSERT_DEBUG( EFalse, User::Panic( KImumMtmUiPanic, error ) ); + } + } + + IMUM_OUT(); + } + +// --------------------------------------------------------------------------- +// CImumMboxManager::CreateEmailAccountL() +// --------------------------------------------------------------------------- +// +TMsvId CImumMboxManager::CreateEmailAccountL( + const CImumInSettingsData& aSettingsData ) + { + IMUM_CONTEXT( CImumMboxManager::CreateEmailAccountL, 0, KLogData ); + IMUM_IN(); + + CImumMboxData* settings = + CImumMboxSymbianDataConverter::ConvertToSymbianMboxDataLC( + iMailboxApi, aSettingsData ); + + CreateEmailAccountL( *settings, EFalse ); + + TMsvId mboxId = settings->iMailboxId; + CleanupStack::PopAndDestroy( settings ); + settings = NULL; + + IMUM_OUT(); + + return mboxId; + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::CreateEmailAccountL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::CreateEmailAccountL( + CImumMboxData& aSettings, + const TBool aPopulateDefaults ) + { + IMUM_CONTEXT( CImumMboxManager::CreateEmailAccountL, 0, KLogData ); + IMUM_IN(); + + TUint32 id = 0; + TUid mtmId; + TMsvId serviceId = 0; + IMUM0(0, " ### Starting mailbox creation processs"); + + // Check for imap4 + if ( aSettings.iIsImap4 ) + { + IMUM0( 0, " # STEP1 : Create IMAP4 account" ); + // Catch all the problems with account creation + id = CreateImap4AccountL( aSettings, aPopulateDefaults ); + serviceId = aSettings.iImap4AccountId.iImapService; + mtmId = KSenduiMtmImap4Uid; + } + else + { + IMUM0( 0, " # STEP1 : Create POP3 account" ); + + id = CreatePop3AccountL( aSettings, aPopulateDefaults ); + serviceId = aSettings.iPop3AccountId.iPopService; + mtmId = KSenduiMtmPop3Uid; + } + + IMUM0( 0, " # STEP1.5 : Store IMEI" ); + iCleaner->StoreIMEIToMailbox( aSettings.iMailboxId ); + + IMUM0( 0, " # STEP2 : Create extended settings" ); + CreateExtendedSettingsL( aSettings.iMailboxId, id, mtmId, aSettings, aPopulateDefaults ); + + IMUM0( 0, " # STEP3 : Store account ID to entry" ); + StoreAccountIdToEntryL( aSettings ); + + IMUM0( 0, " # STEP4 : Choose default account" ); + DetermineDefaultAccountL( aSettings ); + + IMUM0( 0, " # STEP5 : Store signature" ); + TRAP_IGNORE( StoreSignatureL( aSettings ) ); + + IMUM0( 0, " # STEP6 : Activate AO Email plugin if needed" ); + if( serviceId && ( + EMailAoOff != aSettings.iExtendedSettings->AlwaysOnlineState() || + EMailEmnOff != aSettings.iExtendedSettings->EmailNotificationState() ) ) + { + TRAPD( error, MsvEmailMtmUiUtils::SendAOCommandL( EServerAPIEmailTurnOn, serviceId ) ); + if ( error != KErrNotFound ) + { + User::LeaveIfError( error ); + } + } + IMUM0(0, " ### Finishing mailbox creation processs"); + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::CreateImap4AccountL() +// ---------------------------------------------------------------------------- +// +TUint32 CImumMboxManager::CreateImap4AccountL( + CImumMboxData& aSettings, + const TBool aPopulateDefaults, + const TBool aReadOnly ) + { + IMUM_CONTEXT( CImumMboxManager::CreateImap4AccountL, 0, KLogData ); + IMUM_IN(); + + // Populate defaults + if ( aPopulateDefaults ) + { + iAccounts->PopulateDefaultImapSettingsL( + *aSettings.iImap4Settings, *aSettings.iIncomingIapPref ); + iAccounts->PopulateDefaultSmtpSettingsL( + *aSettings.iSmtpSettings, *aSettings.iOutgoingIapPref ); + } + + // Fill iap preferences + CreateAccountFillIapL( aSettings ); + + // Create the account + aSettings.iImap4AccountId = iAccounts->CreateImapAccountL( + aSettings.iName, *aSettings.iImap4Settings, + *aSettings.iIncomingIapPref, aReadOnly ); + iAccounts->CreateSmtpAccountL( aSettings.iImap4AccountId, + *aSettings.iSmtpSettings, *aSettings.iOutgoingIapPref, aReadOnly ); + + aSettings.iMailboxId = aSettings.iImap4AccountId.iSmtpService; + + IMUM_OUT(); + + return aSettings.iImap4AccountId.iImapAccountId; + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::CreatePop3AccountL() +// ---------------------------------------------------------------------------- +// +TUint32 CImumMboxManager::CreatePop3AccountL( + CImumMboxData& aSettings, + const TBool aPopulateDefaults, + const TBool aReadOnly ) + { + IMUM_CONTEXT( CImumMboxManager::CreatePop3AccountL, 0, KLogData ); + IMUM_IN(); + + // Populate defaults + if ( aPopulateDefaults ) + { + iAccounts->PopulateDefaultPopSettingsL( + *aSettings.iPop3Settings, *aSettings.iIncomingIapPref ); + iAccounts->PopulateDefaultSmtpSettingsL( + *aSettings.iSmtpSettings, *aSettings.iOutgoingIapPref ); + } + + // Fill iap preferences + CreateAccountFillIapL( aSettings ); + + // Create the account + aSettings.iPop3AccountId = iAccounts->CreatePopAccountL( + aSettings.iName, + *aSettings.iPop3Settings, *aSettings.iIncomingIapPref, aReadOnly ); + iAccounts->CreateSmtpAccountL( aSettings.iPop3AccountId, + *aSettings.iSmtpSettings, *aSettings.iOutgoingIapPref, aReadOnly ); + + aSettings.iMailboxId = aSettings.iPop3AccountId.iSmtpService; + + IMUM_OUT(); + + return aSettings.iPop3AccountId.iPopAccountId; + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::CreateExtendedSettingsL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::CreateExtendedSettingsL( + const TMsvId aMailboxId, + const TUint32 aAccountId, + const TUid& aProtocol, + CImumMboxData& aSettings, + const TBool aPopulateDefaults ) + { + IMUM_CONTEXT( CImumMboxManager::CreateExtendedSettingsL, 0, KLogData ); + IMUM_IN(); + + // If populating has been successful + User::LeaveIfError( iMboxSettingsCtrl->CreateSettings( + aMailboxId, aAccountId, aProtocol, + *aSettings.iExtendedSettings, aPopulateDefaults ) ); + + IMUM_OUT(); + } + +/****************************************************************************** + + Account Deletion + +******************************************************************************/ + +// ---------------------------------------------------------------------------- +// CImumMboxManager::DeleteExtendedSettings() +// ---------------------------------------------------------------------------- +// +TInt CImumMboxManager::DeleteExtendedSettings( + const TIMAStorerParams& aParams ) + { + // Delete the settings + return iMboxSettingsCtrl->DeleteExtendedSettings( aParams ); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::DeleteRelatedSmtpAccountsL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::DeleteRelatedSmtpAccountsL( + const CImumMboxData& aSettings ) + { + IMUM_CONTEXT( CImumMboxManager::DeleteRelatedSmtpAccountsL, 0, KLogData ); + IMUM_IN(); + + // Get the available smtp accounts + RArray smtpAccountArray; + iAccounts->GetSmtpAccountsL( smtpAccountArray ); + + // Get the related service id + TMsvId relatedServiceId = aSettings.iIsImap4 ? + aSettings.iImap4AccountId.iImapService : + aSettings.iPop3AccountId.iPopService; + + // Delete the accounts + DeleteSmtpAccountsL( relatedServiceId, smtpAccountArray ); + + smtpAccountArray.Reset(); + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::DeleteRelatedSmtpAccountsL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::DeleteRelatedSmtpAccountsL( + const TUint32 aRelatedAccountId, + const TBool aIsImap4 ) + { + IMUM_CONTEXT( CImumMboxManager::DeleteRelatedSmtpAccountsL, 0, KLogData ); + IMUM_IN(); + + // Get the available imap accounts + TMsvId relatedService = KMsvNullIndexEntryId; + + if ( aIsImap4 ) + { + // Get Imap account + RIMASImap4IdArray imapAccountArray; + iAccounts->GetImapAccountsL( imapAccountArray ); + + // Find the account from imap accounts + for ( TInt mailbox = imapAccountArray.Count(); + --mailbox >= 0 && relatedService == KMsvNullIndexEntryId; ) + { + TUint32 imapId = imapAccountArray[mailbox].iImapAccountId; + if ( imapId == aRelatedAccountId ) + { + relatedService = imapAccountArray[mailbox].iImapService; + } + } + + imapAccountArray.Reset(); + } + else + { + // Get pop account + RIMASPop3IdArray popAccountArray; + iAccounts->GetPopAccountsL( popAccountArray ); + + // Find the account from pop accounts + for ( TInt mailbox = popAccountArray.Count(); + --mailbox >= 0 && relatedService == KMsvNullIndexEntryId; ) + { + TUint32 popId = popAccountArray[mailbox].iPopAccountId; + if ( popId == aRelatedAccountId ) + { + relatedService = popAccountArray[mailbox].iPopService; + } + } + + popAccountArray.Reset(); + } + + // If found, remove the accounts + if ( relatedService != KMsvNullIndexEntryId ) + { + RIMASSmtpIdArray smtpAccountArray; + iAccounts->GetSmtpAccountsL( smtpAccountArray ); + + // Delete the accounts + DeleteSmtpAccountsL( relatedService, smtpAccountArray ); + smtpAccountArray.Reset(); + } + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::DeleteSmtpAccountsL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::DeleteSmtpAccountsL( + const TMsvId aRelatedMailboxId, + const RIMASSmtpIdArray& aSmtpAccountArray ) + { + IMUM_CONTEXT( CImumMboxManager::DeleteSmtpAccountsL, 0, KLogData ); + IMUM_IN(); + + TSmtpAccount smtpId; + + // Start checking the mailboxes + for ( TInt mailbox = aSmtpAccountArray.Count(); --mailbox >= 0; ) + { + smtpId = aSmtpAccountArray[mailbox]; + + // If the related id matches with the smtp accounts related service + // id, the account can be deleted. + if ( aRelatedMailboxId == smtpId.iRelatedService ) + { + iAccounts->DeleteSmtpAccountL( smtpId ); + } + } + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::DeleteBaseSettingsL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::DeleteBaseSettingsL( + const TUint32 aRelatedAccountId, + const TBool aIsImap4 ) + { + IMUM_CONTEXT( CImumMboxManager::DeleteBaseSettingsL, 0, KLogData ); + + // Remove the related smtp accounts + DeleteRelatedSmtpAccountsL( aRelatedAccountId, aIsImap4 ); + + // Determine the account type + if ( aIsImap4 ) + { + // Remove the Imap4 account + TImapAccount imapId; + imapId.iImapAccountId = aRelatedAccountId; + iAccounts->DeleteImapAccountL( imapId ); + } + else + { + // Remove the Pop3 account + TPopAccount popId; + popId.iPopAccountId = aRelatedAccountId; + iAccounts->DeletePopAccountL( popId ); + } + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::DeleteBaseSettingsL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::DeleteBaseSettingsL( + const CImumMboxData& aSettings ) + { + IMUM_CONTEXT( CImumMboxManager::DeleteBaseSettingsL, 0, KLogData ); + IMUM_IN(); + + // Remove the related smtp accounts + DeleteRelatedSmtpAccountsL( aSettings ); + + // Determine the account type + if ( aSettings.iIsImap4 ) + { + // Remove the Imap4 account + iAccounts->DeleteImapAccountL( aSettings.iImap4AccountId ); + } + else + { + // Remove the Pop3 account + iAccounts->DeletePopAccountL( aSettings.iPop3AccountId ); + } + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::DeleteAccountSettings() +// ---------------------------------------------------------------------------- +// +TInt CImumMboxManager::DeleteAccountSettings( + const TUint32 aAccountId, + const TUid& aMtmId ) + { + IMUM_CONTEXT( CImumMboxManager::DeleteAccountSettings, 0, KLogData ); + IMUM_IN(); + + TInt error = KErrNone; + + // Delete the related extended settings + if ( aMtmId == KSenduiMtmImap4Uid ) + { + // Delete Imap4 or Pop3 account + TImapAccount imapId; + imapId.iImapAccountId = aAccountId; + TRAP( error, iAccounts->DeleteImapAccountL( imapId ) ); + } + else if ( aMtmId == KSenduiMtmPop3Uid ) + { + // Remove the Pop3 account + TPopAccount popId; + popId.iPopAccountId = aAccountId; + TRAP( error, iAccounts->DeletePopAccountL( popId ) ); + } + else + { + // Remove the Smtp account + TSmtpAccount smtpId; + smtpId.iSmtpAccountId = aAccountId; + TRAP( error, iAccounts->DeleteSmtpAccountL( smtpId ) ); + } + + if ( aMtmId != KSenduiMtmSmtpUid ) + { + DeleteExtendedSettings( + TIMAStorerParams( aAccountId, aMtmId ) ); + } + + IMUM_OUT(); + + return error; + } + +// --------------------------------------------------------------------------- +// CImumMboxManager::CheckAccountDeletionConditionsL() +// --------------------------------------------------------------------------- +// +TBool CImumMboxManager::CheckAccountDeletionConditionsL( + const TMsvId aMailboxId ) + { + return AccountDeletionConditionsOkL( aMailboxId ); + } + +/****************************************************************************** + + Account Saving + +******************************************************************************/ + +// --------------------------------------------------------------------------- +// CImumMboxManager::SaveEmailSettingsL() +// --------------------------------------------------------------------------- +// +void CImumMboxManager::SaveEmailSettingsL( + const CImumInSettingsData& aSettingsData ) + { + IMUM_CONTEXT( CImumMboxManager::SaveEmailSettingsL, 0, KLogData ); + IMUM_IN(); + + CImumMboxData* settings = + CImumMboxSymbianDataConverter::ConvertToSymbianMboxDataLC( + iMailboxApi, aSettingsData ); + + SaveEmailSettingsL( *settings ); + + CleanupStack::PopAndDestroy( settings ); + settings = NULL; + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::SaveEmailSettingsL() +// ---------------------------------------------------------------------------- +// +TInt CImumMboxManager::SaveEmailSettingsL( + CImumMboxData& aSettings ) + { + IMUM_CONTEXT( CImumMboxManager::SaveEmailSettingsL, 0, KLogData ); + IMUM_IN(); + + // If settings not ready, don't try to create + if ( !aSettings.IsOk() ) + { + return KErrNotFound; + } + + TInt error = KErrNone; + CreateAccountFillIapL( aSettings ); + + // Check for imap4 + if ( aSettings.iIsImap4 ) + { + // Catch all the problems with account creation + TRAP( error, SaveImap4SettingsL( aSettings ) ); + + // Attempt to save the extended settings, even if other settings have + // failed to save + iMboxSettingsCtrl->SaveSettings( *aSettings.iExtendedSettings ); + TRAP_IGNORE( StoreSignatureL( aSettings ) ); + } + // It's a pop + else + { + // Catch all the problems with account creation + TRAP( error, SavePop3SettingsL( aSettings ) ); + + // Attempt to save the extended settings, even if other settings have + // failed to save + iMboxSettingsCtrl->SaveSettings( *aSettings.iExtendedSettings ); + TRAP_IGNORE( StoreSignatureL( aSettings ) ); + } + + IMUM_OUT(); + + return error; + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::SavePop3SettingsL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::SavePop3SettingsL( + CImumMboxData& aSettings ) + { + IMUM_CONTEXT( CImumMboxManager::SavePop3SettingsL, 0, KLogData ); + IMUM_IN(); + + TSmtpAccount smtpAccountId; + iAccounts->GetSmtpAccountL( + aSettings.iPop3AccountId.iSmtpService, smtpAccountId ); + + // Store the mailbox name + aSettings.iPop3AccountId.iPopAccountName.Copy( + aSettings.iName ); + smtpAccountId.iSmtpAccountName.Copy( + aSettings.iName ); + + // Load mailbox settings + iAccounts->SavePopSettingsL( + aSettings.iPop3AccountId, *aSettings.iPop3Settings ); + iAccounts->SavePopIapSettingsL( + aSettings.iPop3AccountId, *aSettings.iIncomingIapPref ); + iAccounts->SaveSmtpSettingsL( + smtpAccountId, *aSettings.iSmtpSettings ); + iAccounts->SaveSmtpIapSettingsL( + smtpAccountId, *aSettings.iOutgoingIapPref ); + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::SaveImap4SettingsL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::SaveImap4SettingsL( + CImumMboxData& aSettings ) + { + IMUM_CONTEXT( CImumMboxManager::SaveImap4SettingsL, 0, KLogData ); + IMUM_IN(); + + TSmtpAccount smtpAccountId; + iAccounts->GetSmtpAccountL( + aSettings.iImap4AccountId.iSmtpService, smtpAccountId ); + + // Store the mailbox name + aSettings.iImap4AccountId.iImapAccountName.Copy( + aSettings.iName ); + smtpAccountId.iSmtpAccountName.Copy( + aSettings.iName ); + + // Load mailbox settings + iAccounts->SaveImapSettingsL( + aSettings.iImap4AccountId, *aSettings.iImap4Settings ); + iAccounts->SaveImapIapSettingsL( + aSettings.iImap4AccountId, *aSettings.iIncomingIapPref ); + iAccounts->SaveSmtpSettingsL( + smtpAccountId, *aSettings.iSmtpSettings ); + iAccounts->SaveSmtpIapSettingsL( + smtpAccountId, *aSettings.iOutgoingIapPref ); + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::StoreAccountIdToEntryL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::StoreAccountIdToEntryL( + const TMsvId aMailboxId, + const TUint32 aAccountId ) + { + IMUM_CONTEXT( CImumMboxManager::StoreAccountIdToEntryL, 0, KLogData ); + IMUM_IN(); + + // Get the entry + CMsvEntry* cEntry = iMailboxApi.MsvSession().GetEntryL( aMailboxId ); + CleanupStack::PushL( cEntry ); + + // Store the value to the entry + TMsvEntry tEntry( cEntry->Entry() ); + tEntry.iMtmData2 = aAccountId; + cEntry->ChangeL( tEntry ); + + CleanupStack::PopAndDestroy( cEntry ); + cEntry = NULL; + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::GetMailboxAccountIdsL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::GetMailboxAccountIdsL( + const TMsvId aMailboxId, + TMsvId& aReceivingMailboxId, + TUint32& aReceivingAccountId, + TMsvId& aSendingMailboxId, + TUint32& aSendingAccountId ) + { + IMUM_CONTEXT( CImumMboxManager::GetMailboxAccountIdsL, 0, KLogData ); + IMUM_IN(); + + MImumInMailboxUtilities::RMsvEntryArray entries; + iMailboxApi.MailboxUtilitiesL().GetMailboxEntriesL( + aMailboxId, entries ); + TMsvEntry receiving = entries[0]; + TMsvEntry sending = entries[1]; + entries.Reset(); + + if ( receiving.iMtm == KSenduiMtmImap4Uid ) + { + // Get Imap account id + TImapAccount imapAccountId; + iAccounts->GetImapAccountL( receiving.Id(), imapAccountId ); + + aReceivingMailboxId = receiving.Id(); + aReceivingAccountId = imapAccountId.iImapAccountId; + aSendingMailboxId = sending.Id(); + } + else if ( receiving.iMtm == KSenduiMtmPop3Uid ) + { + // Get Pop account id + TPopAccount popAccountId; + iAccounts->GetPopAccountL( receiving.Id(), popAccountId ); + + aReceivingMailboxId = receiving.Id(); + aReceivingAccountId = popAccountId.iPopAccountId; + aSendingMailboxId = sending.Id(); + } + else + { + // This should not happen ever, but if it does for some reason + // then leave, as the leave will be trapped and the mailbox + // shall be removed after it + User::Leave( KErrUnknown ); + } + + // Get smtp account id + TSmtpAccount smtpAccountId; + iAccounts->GetSmtpAccountL( aSendingMailboxId, smtpAccountId ); + + aSendingAccountId = smtpAccountId.iSmtpAccountId; + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::StoreAccountIdToEntryL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::StoreAccountIdToEntryL( + CImumMboxData& aSettings ) + { + IMUM_CONTEXT( CImumMboxManager::StoreAccountIdToEntryL, 0, KLogData ); + IMUM_IN(); + + TMsvId sendingMailboxId; + TMsvId receivingMailboxId; + TUint32 sendingAccountId; + TUint32 receivingAccountId; + GetMailboxAccountIdsL( aSettings.iMailboxId, + receivingMailboxId, receivingAccountId, + sendingMailboxId, sendingAccountId ); + + StoreAccountIdToEntryL( receivingMailboxId, receivingAccountId ); + StoreAccountIdToEntryL( sendingMailboxId, sendingAccountId ); + + IMUM_OUT(); + } + +/****************************************************************************** + + Account Loading + +******************************************************************************/ + +// ---------------------------------------------------------------------------- +// CImumMboxManager::LoadEmailSettingsL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::LoadEmailSettingsL( + const TMsvEntry& aEntry, + CImumMboxData& aSettings ) + { + IMUM_CONTEXT( CImumMboxManager::LoadEmailSettingsL, 0, KLogData ); + IMUM_IN(); + + // Get both of the entries + TMsvEntry receiving = iMailboxApi.MailboxUtilitiesL().GetMailboxEntryL( + aEntry.Id(), MImumInMailboxUtilities::ERequestReceiving ); + + // Store the id and protocol + aSettings.iMailboxId = receiving.iRelatedId; + aSettings.iIsImap4 = ( receiving.iMtm == KSenduiMtmImap4Uid ); + + // Load settings based on the protocol + if ( aSettings.iIsImap4 ) + { + iAccounts->GetImapAccountL( + receiving.Id(), aSettings.iImap4AccountId ); + LoadImap4SettingsL( aSettings ); + + // Load extended settings + TUint32 accountId = aSettings.iImap4AccountId.iImapAccountId; + iMboxSettingsCtrl->LoadSettings( + TIMAStorerParams( accountId, receiving.iMtm ), + *aSettings.iExtendedSettings ); + + // Attempt to read the signature + TRAP_IGNORE( RestoreSignatureL( aSettings ) ); + } + else // pop3 + { + iAccounts->GetPopAccountL( + receiving.Id(), aSettings.iPop3AccountId ); + LoadPop3SettingsL( aSettings ); + + // Load extended settings + TUint32 accountId = aSettings.iPop3AccountId.iPopAccountId; + iMboxSettingsCtrl->LoadSettings( + TIMAStorerParams( accountId, receiving.iMtm ), + *aSettings.iExtendedSettings ); + + // Attempt to read the signature + TRAP_IGNORE( RestoreSignatureL( aSettings ) ); + } + + IMUM_OUT(); + } + +// --------------------------------------------------------------------------- +// CImumMboxManager::LoadEmailSettingsL() +// --------------------------------------------------------------------------- +// +CImumInSettingsData* CImumMboxManager::LoadEmailSettingsL( + const TMsvId aMailboxId ) + { + IMUM_CONTEXT( CImumMboxManager::LoadEmailSettingsL, 0, KLogData ); + IMUM_IN(); + + CImumMboxData* oldData = CImumMboxData::NewLC(); + TMsvEntry mailbox = + iMailboxApi.MailboxUtilitiesL().GetMailboxEntryL( aMailboxId ); + LoadEmailSettingsL( mailbox, *oldData ); + + CImumInSettingsData* internalData = + CImumMboxInternalDataConverter::ConvertToInternalMboxDataLC( + iMailboxApi, *oldData ); + CleanupStack::Pop( internalData ); + CleanupStack::PopAndDestroy( oldData ); + oldData = NULL; + + IMUM_OUT(); + + return internalData; + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::LoadPop3SettingsL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::LoadPop3SettingsL( + CImumMboxData& aSettings ) + { + IMUM_CONTEXT( CImumMboxManager::LoadPop3SettingsL, 0, KLogData ); + IMUM_IN(); + + TSmtpAccount smtpAccountId; + iAccounts->GetSmtpAccountL( + aSettings.iPop3AccountId.iSmtpService, smtpAccountId ); + + // Load mailbox settings + iAccounts->LoadPopSettingsL( + aSettings.iPop3AccountId, *aSettings.iPop3Settings ); + iAccounts->LoadPopIapSettingsL( + aSettings.iPop3AccountId, *aSettings.iIncomingIapPref ); + iAccounts->LoadSmtpSettingsL( + smtpAccountId, *aSettings.iSmtpSettings ); + iAccounts->LoadSmtpIapSettingsL( + smtpAccountId, *aSettings.iOutgoingIapPref ); + + LoadAccountFillIapL( aSettings ); + aSettings.iName.Copy( aSettings.iPop3AccountId.iPopAccountName ); + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::LoadImap4SettingsL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::LoadImap4SettingsL( + CImumMboxData& aSettings ) + { + IMUM_CONTEXT( CImumMboxManager::LoadImap4SettingsL, 0, KLogData ); + IMUM_IN(); + + TSmtpAccount smtpAccountId; + iAccounts->GetSmtpAccountL( + aSettings.iImap4AccountId.iSmtpService, smtpAccountId ); + + // Load mailbox settings + iAccounts->LoadImapSettingsL( + aSettings.iImap4AccountId, *aSettings.iImap4Settings ); + iAccounts->LoadImapIapSettingsL( + aSettings.iImap4AccountId, *aSettings.iIncomingIapPref ); + iAccounts->LoadSmtpSettingsL( + smtpAccountId, *aSettings.iSmtpSettings ); + iAccounts->LoadSmtpIapSettingsL( + smtpAccountId, *aSettings.iOutgoingIapPref ); + + LoadAccountFillIapL( aSettings ); + aSettings.iName.Copy( aSettings.iImap4AccountId.iImapAccountName ); + + IMUM_OUT(); + } + +/****************************************************************************** + + MISC TOOLS + +******************************************************************************/ + +// ---------------------------------------------------------------------------- +// CImumMboxManager::StoreSignatureL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::StoreSignatureL( + const CImumMboxData& aSettings ) + { + IMUM_CONTEXT( CImumMboxManager::StoreSignatureL, 0, KLogData ); + IMUM_IN(); + + // Get Signature + CMsvEntry* entry = iMailboxApi.MsvSession().GetEntryL( aSettings.iMailboxId ); + CleanupStack::PushL( entry ); + CMsvStore* msvStore = entry->EditStoreL(); + CleanupStack::PushL( msvStore ); + + msvStore->StoreBodyTextL( *( aSettings.iSignature->iRichText ) ); + msvStore->CommitL(); + + CleanupStack::PopAndDestroy( msvStore ); + msvStore = NULL; + CleanupStack::PopAndDestroy( entry ); + entry = NULL; + + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::RestoreSignatureL() +// ---------------------------------------------------------------------------- +// +void CImumMboxManager::RestoreSignatureL( + CImumMboxData& aSettings ) + { + IMUM_CONTEXT( CImumMboxManager::RestoreSignatureL, 0, KLogData ); + IMUM_IN(); + + // Get Signature + CMsvEntry* entry = iMailboxApi.MsvSession().GetEntryL( aSettings.iMailboxId ); + CleanupStack::PushL( entry ); + CMsvStore* msvStore = entry->ReadStoreL(); + CleanupStack::PushL( msvStore ); + + aSettings.iSignature->CreateEmptyRichTextL(); + msvStore->RestoreBodyTextL( *( aSettings.iSignature->iRichText ) ); + + CleanupStack::PopAndDestroy( msvStore ); + msvStore = NULL; + CleanupStack::PopAndDestroy( entry ); + entry = NULL; + + IMUM_OUT(); + } + +// --------------------------------------------------------------------------- +// CImumMboxManager::IsConnectedL() +// --------------------------------------------------------------------------- +// +TBool CImumMboxManager::IsConnectedL( const TMsvId aMailboxId ) const + { + IMUM_CONTEXT( CImumMboxManager::IsConnectedL, 0, KLogData ); + IMUM_IN(); + + TBool connected = EFalse; + + // Make sure that none of the entries is in connected state + MImumInMailboxUtilities::RMsvEntryArray entries; + iMailboxApi.MailboxUtilitiesL().GetMailboxEntriesL( + aMailboxId, entries ); + CleanupClosePushL( entries ); + + for ( TInt mbox = entries.Count(); --mbox >= 0 && !connected; ) + { + connected = entries[mbox].Connected(); + } + + CleanupStack::PopAndDestroy( &entries ); + + IMUM_OUT(); + + return connected; + } + +// --------------------------------------------------------------------------- +// CImumMboxManager::IsLockedL() +// --------------------------------------------------------------------------- +// +TBool CImumMboxManager::IsLockedL( const TMsvId aMailboxId ) const + { + IMUM_CONTEXT( CImumMboxManager::IsLockedL, 0, KLogData ); + IMUM_IN(); + + TBool isLocked = EFalse; + CMsvEntry* centry = + iMailboxApi.MsvSession().GetEntryL( aMailboxId ); + CleanupStack::PushL( centry ); + + // If the entry is locked, deletion should not be possible + TRAPD( err, centry->ChangeL( centry->Entry() ) ); + if( err != KErrNone ) + { + isLocked = ETrue; + } + + CleanupStack::PopAndDestroy( centry ); + centry = NULL; + + IMUM_OUT(); + + return isLocked; + } + +// ---------------------------------------------------------------------------- +// CImumMboxManager::HandleMailboxInUseDeleteL() +// ---------------------------------------------------------------------------- +// +TBool CImumMboxManager::HandleMailboxInUseDeleteL( + MImumInHealthServices::RMailboxIdArray& aMailboxes, + const TMsvEntry& aSmtpEntry ) const + { + IMUM_CONTEXT( CImumMboxManager::HandleMailboxInUseDeleteL, 0, KLogData ); + IMUM_IN(); + TBool continueDeletion(ETrue); + TMsvId newDefaultId = 0; + TInt mailboxCount = aMailboxes.Count(); + if ( mailboxCount == 2 ) // CSI: 47 # Mailbox count. + { + // set default to be the other one + TInt newDefaultIndex = + ( aSmtpEntry.Id() == aMailboxes[0] ) ? 1 : 0; + newDefaultId = aMailboxes[newDefaultIndex]; + } + else + { + // To show mailbox name list, the array must be constructed here + CDesCArrayFlat* items = + new ( ELeave ) CDesCArrayFlat( KImumMboxArrayGranularity ); + CleanupStack::PushL( items ); + + TMsvEntry tempEntry; + TInt delIndex=-1; + for (TInt loop = 0; loop < mailboxCount; loop++) + { + TMsvId tempServiceId; + User::LeaveIfError( iMailboxApi.MsvSession().GetEntry( + aMailboxes[loop], + tempServiceId, + tempEntry ) ); + if ( aSmtpEntry.Id() != tempEntry.Id() ) + { + items->AppendL( tempEntry.iDetails ); + } + else + { + delIndex = loop; + } + } + if ( delIndex>=0 ) + { + //take the mailbox to be deleted off from the array + aMailboxes.Remove(delIndex); + } + + TInt index = 0; + CAknListQueryDialog* dlg = new (ELeave) CAknListQueryDialog(&index); + dlg->PrepareLC( R_IMUM_NEW_DEFAULT_MAILBOX_LIST_QUERY ); + dlg->SetItemTextArray( items ); + dlg->SetOwnershipType( ELbmDoesNotOwnItemArray ); + if ( dlg->RunLD( ) == EEikBidOk ) + { + newDefaultId = aMailboxes[index]; + } + else + { + continueDeletion = EFalse; + } + + CleanupStack::PopAndDestroy( items ); // items + items = NULL; + } + + if ( newDefaultId ) + { + // Set default + MsvUiServiceUtilitiesInternal::SetDefaultServiceForMTML( + iMailboxApi.MsvSession(), + KSenduiMtmSmtpUid, + newDefaultId ); + } + + IMUM_OUT(); + return continueDeletion; + } + +// --------------------------------------------------------------------------- +// CImumMboxManager::AccountDeletionConditionsOkL() +// --------------------------------------------------------------------------- +// +TBool CImumMboxManager::AccountDeletionConditionsOkL( + const TMsvId aMailboxId ) + { + IMUM_CONTEXT( CImumMboxManager::AccountDeletionConditionsOkL, 0, KLogData ); + IMUM_IN(); + + TBool conditionsOk = EFalse; + + // Entry is required to get the name of the mailbox Id + TMsvEntry mailbox = iMailboxApi.MailboxUtilitiesL().GetMailboxEntryL( + aMailboxId, MImumInMailboxUtilities::ERequestSending ); + TBuf name; + name.Copy( mailbox.iDetails.Left( KImumMboxQueryTextLength ) ); + TUid mtm = KSenduiMtmSmtpUid; + + TMsvId defaultService = MsvUiServiceUtilitiesInternal:: + DefaultServiceForMTML( + iMailboxApi.MsvSession(), mtm, EFalse ); + + // Get the list of available mailboxes + MImumInHealthServices::RMailboxIdArray mailboxes; + iMailboxApi.HealthServicesL().GetMailboxList( mailboxes, + MImumInHealthServices::EFlagGetHealthy | + MImumInHealthServices::EFlagIncludeSmtp ); + CleanupClosePushL( mailboxes ); + + // Don't allow locked or connected mailboxes to be deleted + if ( IsConnectedL( aMailboxId ) || + IsLockedL( mailbox.Id() ) ) + { + CIMSSettingsNoteUi::ShowNoteL( + R_IMUM_SETTINGS_MAIL_NO_DELETE, EIMSInformationNote, ETrue ); + } + // + else if ( mailboxes.Count() == 1 ) + { + conditionsOk = + CIMSSettingsNoteUi::ShowQueryL( + R_IMUM_SETTINGS_MAIL_QUEST_DEL, + mailbox.iDetails ); + + } + // If the current mailbox is not default, it can be deleted + // immediately. + else if ( mailbox.Id() != defaultService ) + { + conditionsOk = + CIMSSettingsNoteUi::ShowQueryL( + R_IMUM_COMMON_CONF_DELETE, + mailbox.iDetails ); + } + else + { + conditionsOk = + CIMSSettingsNoteUi::ShowQueryL( + R_IMUM_SETTINGS_MAIL_QUEST_D, + mailbox.iDetails ); + + if ( conditionsOk ) + { + conditionsOk = HandleMailboxInUseDeleteL( mailboxes, mailbox ); + } + } + + CleanupStack::PopAndDestroy( &mailboxes ); + + IMUM_OUT(); + return conditionsOk; + } + + +// End Of File +