--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imum/Utils/Src/ImumInMailboxServicesImpl.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,543 @@
+/*
+* 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: ImumInMailboxServicesImpl.cpp
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <SendUiConsts.h>
+#include <muiuemailtools.h>
+#include <MuiuMsvProgressReporterOperation.h>
+#include <avkon.mbg>
+#include <featmgr.h>
+#include <MessagingDomainCRKeys.h>
+
+#include "ImumInternalApiImpl.h"
+#include "ImumInMailboxServicesImpl.h"
+#include "ImumInMailboxUtilitiesImpl.h"
+#include "ImumInSettingsDataImpl.h"
+#include "ImumPanic.h"
+#include "ImumDaErrorCodes.h"
+#include "ImumMboxDefaultData.h"
+#include "ImumUtilsLogging.h"
+#include "ImumMboxServiceDeletion.h"
+
+// TEMP
+#include "ImumInSettingsKeys.h"
+
+#include "IMSSettingsNoteUi.h"
+#include "EmailFeatureUtils.h"
+
+// EXTERNAL DATA STRUCTURES
+// EXTERNAL FUNCTION PROTOTYPES
+// CONSTANTS
+// MACROS
+// LOCAL CONSTANTS AND MACROS
+// MODULE DATA STRUCTURES
+// LOCAL FUNCTION PROTOTYPES
+// FORWARD DECLARATIONS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+
+// ================ CLASS CONSTRUCTION ================
+
+
+
+// ----------------------------------------------------------------------------
+// CImumInMailboxServicesImpl::CImumInMailboxServicesImpl()
+// ----------------------------------------------------------------------------
+//
+CImumInMailboxServicesImpl::CImumInMailboxServicesImpl( CImumInternalApiImpl& aInternalApi )
+ :
+ iInternalApi( aInternalApi ),
+ iDefaultData( NULL )
+ {
+ IMUM_CONTEXT( CImumInMailboxServicesImpl::CImumInMailboxServicesImpl, 0, KLogInApi );
+ IMUM_IN();
+ IMUM_OUT();
+ }
+
+// ----------------------------------------------------------------------------
+// CImumInMailboxServicesImpl::~CImumInMailboxServicesImpl()
+// ----------------------------------------------------------------------------
+//
+CImumInMailboxServicesImpl::~CImumInMailboxServicesImpl()
+ {
+ IMUM_CONTEXT( CImumInMailboxServicesImpl::~CImumInMailboxServicesImpl, 0, KLogInApi );
+ IMUM_IN();
+
+ delete iDefaultData;
+ iDefaultData = NULL;
+
+ IMUM_OUT();
+ }
+
+// ----------------------------------------------------------------------------
+// CImumInMailboxServicesImpl::ConstructL()
+// ----------------------------------------------------------------------------
+//
+void CImumInMailboxServicesImpl::ConstructL()
+ {
+ IMUM_CONTEXT( CImumInMailboxServicesImpl::ConstructL, 0, KLogInApi );
+ IMUM_IN();
+ IMUM_OUT();
+ }
+
+// ----------------------------------------------------------------------------
+// CImumInMailboxServicesImpl::NewL()
+// ----------------------------------------------------------------------------
+//
+CImumInMailboxServicesImpl* CImumInMailboxServicesImpl::NewL(
+ CImumInternalApiImpl& aInternalApi )
+ {
+ IMUM_STATIC_CONTEXT( CImumInMailboxServicesImpl::NewL, 0, utils, KLogInApi );
+ IMUM_IN();
+
+ CImumInMailboxServicesImpl* self = NewLC( aInternalApi );
+ CleanupStack::Pop( self );
+
+ IMUM_OUT();
+
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CImumInMailboxServicesImpl::NewLC()
+// ----------------------------------------------------------------------------
+//
+CImumInMailboxServicesImpl* CImumInMailboxServicesImpl::NewLC(
+ CImumInternalApiImpl& aInternalApi )
+ {
+ IMUM_STATIC_CONTEXT( CImumInMailboxServicesImpl::NewLC, 0, utils, KLogInApi );
+ IMUM_IN();
+
+ CImumInMailboxServicesImpl* self =
+ new ( ELeave ) CImumInMailboxServicesImpl( aInternalApi );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+
+ IMUM_OUT();
+
+ return self;
+ }
+
+
+
+// ================ INTERFACE IMPLEMENTATION ================
+
+
+
+// ---------------------------------------------------------------------------
+// From class MImumInMailboxServices.
+// CImumInMailboxServicesImpl::CreateSettingsDataL()
+// ---------------------------------------------------------------------------
+//
+CImumInSettingsData* CImumInMailboxServicesImpl::CreateSettingsDataL(
+ const TUid& aProtocol ) const
+ {
+ IMUM_CONTEXT( CImumInMailboxServicesImpl::CreateSettingsDataL, 0, KLogInApi );
+ IMUM_IN();
+
+ CImumInSettingsData* data = NULL;
+
+ // Allow empty and valid mailbox mtm's
+ if ( !aProtocol.iUid ||
+ iInternalApi.MailboxUtilitiesL().IsMailMtm( aProtocol, ETrue ) )
+ {
+ CImumInMailboxServicesImpl* me =
+ const_cast<CImumInMailboxServicesImpl*>( this );
+ data = CImumInSettingsDataImpl::NewL(
+ iInternalApi, aProtocol, me->DefaultDataObjectL() );
+ }
+ else
+ {
+ ServiceExceptionL( TImumDaErrorCode::EUnsupportedProtocol );
+ }
+
+ IMUM_OUT();
+
+ return data;
+ }
+
+// ---------------------------------------------------------------------------
+// From class MImumInMailboxServices.
+// CImumInMailboxServicesImpl::CreateSettingsDataL()
+// ---------------------------------------------------------------------------
+//
+CImumInSettingsData* CImumInMailboxServicesImpl::CreateSettingsDataL(
+ const TUid& aProtocol,
+ const TDesC& aEmailAddress,
+ const TDesC& aIncomingServer,
+ const TDesC& aOutgoingServer,
+ const TInt aAccessPoint,
+ const TDesC& aMailboxName ) const
+ {
+ IMUM_CONTEXT( CImumInMailboxServicesImpl::CreateSettingsDataL, 0, KLogInApi );
+ IMUM_IN();
+
+ CImumInSettingsData* data = CreateSettingsDataL( aProtocol );
+ CleanupStack::PushL( data );
+
+ data->SetAttr( TImumDaSettings::EKeyMailboxName, aMailboxName );
+ data->SetAttr( TImumDaSettings::EKeyEmailAddress, aEmailAddress );
+ data->GetSetL( 0 ).SetAttr(
+ TImumDaSettings::EKeyServer, aIncomingServer );
+ data->GetSetL( 0 ).SetAttr(
+ TImumDaSettings::EKeyAccessPoint, aAccessPoint );
+
+ data->GetSetL( 1 ).SetAttr(
+ TImumDaSettings::EKeyServer, aOutgoingServer );
+ data->GetSetL( 1 ).SetAttr(
+ TImumDaSettings::EKeyAccessPoint, aAccessPoint );
+
+ CleanupStack::Pop( data );
+
+ IMUM_OUT();
+
+ return data;
+ }
+
+// ---------------------------------------------------------------------------
+// From class MImumInMailboxServices.
+// CImumInMailboxServicesImpl::LoadMailboxSettingsL()
+// ---------------------------------------------------------------------------
+//
+CImumInSettingsData* CImumInMailboxServicesImpl::LoadMailboxSettingsL(
+ const TMsvId aMailboxId ) const
+ {
+ IMUM_CONTEXT( CImumInMailboxServicesImpl::LoadMailboxSettingsL, 0, KLogInApi );
+ IMUM_IN();
+
+ CImumInSettingsData* data = NULL;
+
+ if ( iInternalApi.MailboxUtilitiesL().IsMailbox( aMailboxId ) )
+ {
+ // Load settings only in case of IMAP, POP and SMTP
+ // otherwise a null pointer is returned
+ TMsvEntry receiving = iInternalApi.MailboxUtilitiesL().GetMailboxEntryL(
+ aMailboxId, MImumInMailboxUtilities::ERequestReceiving );
+
+ if( !( ( receiving.iMtm.iUid == KSenduiMtmSmtpUidValue )
+ || ( receiving.iMtm.iUid == KSenduiMtmImap4UidValue )
+ || ( receiving.iMtm.iUid == KSenduiMtmPop3UidValue ) ) )
+ {
+ return data;
+ }
+
+ data = iInternalApi.SettingsManagerL().LoadEmailSettingsL(
+ aMailboxId );
+ }
+ else
+ {
+ ServiceExceptionL( TImumDaErrorCode::EIdNotRecongnized );
+ }
+
+ IMUM_OUT();
+
+ return data;
+ }
+
+// ---------------------------------------------------------------------------
+// From class MImumInMailboxServices.
+// CImumInMailboxServicesImpl::SaveMailboxSettingsL()
+// ---------------------------------------------------------------------------
+//
+void CImumInMailboxServicesImpl::SaveMailboxSettingsL(
+ CImumInSettingsData& aSettingsData ) const
+ {
+ IMUM_CONTEXT( CImumInMailboxServicesImpl::SaveMailboxSettingsL, 0, KLogInApi );
+ IMUM_IN();
+
+ ValidateSettingsL( aSettingsData );
+
+ iInternalApi.SettingsManagerL().SaveEmailSettingsL( aSettingsData );
+
+ IMUM_OUT();
+ }
+
+// ---------------------------------------------------------------------------
+// From class MImumInMailboxServices.
+// CImumInMailboxServicesImpl::CreateMailboxL()
+// ---------------------------------------------------------------------------
+//
+TMsvId CImumInMailboxServicesImpl::CreateMailboxL(
+ CImumInSettingsData& aSettingsData ) const
+ {
+ IMUM_CONTEXT( CImumInMailboxServicesImpl::CreateMailboxL, 0, KLogInApi );
+ IMUM_IN();
+
+ ValidateSettingsL( aSettingsData );
+
+ IMUM_OUT();
+
+ return iInternalApi.SettingsManagerL().CreateEmailAccountL( aSettingsData );
+ }
+
+// ---------------------------------------------------------------------------
+// From class MImumInMailboxServices.
+// CImumInMailboxServicesImpl::RemoveMailboxL()
+// ---------------------------------------------------------------------------
+//
+CMsvOperation* CImumInMailboxServicesImpl::RemoveMailboxL( const TMsvId aMailboxId,
+ TRequestStatus& aStatus) const
+ {
+ IMUM_CONTEXT( CImumInMailboxServicesImpl::RemoveMailboxL, 0, KLogInApi );
+ IMUM_IN();
+
+ CMsvOperation* op = NULL;
+ CMsvSession& session = iInternalApi.MsvSession();
+
+ //remove mailbox if email settings are not locked.
+ if( !iInternalApi.IsEmailFeatureSupportedL(
+ CImumInternalApi::EMailLockedSettings, R_QTN_SELEC_PROTECTED_SETTING ) )
+ {
+ if ( iInternalApi.MailboxUtilitiesL().IsMailbox( aMailboxId ) )
+ {
+ if ( iInternalApi.SettingsManagerL().CheckAccountDeletionConditionsL(
+ aMailboxId ) )
+ {
+ // The delete will take more than 1 second, set progress note
+ // visibility delay off.
+ CMsvProgressReporterOperation* reporter =
+ CMsvProgressReporterOperation::NewL( ETrue,
+ ETrue, session, aStatus, EMbmAvkonQgn_note_erased );
+
+ // Once delete is started, a cancel option is not offered to the user.
+ // Set right softkey to empty for a duration CMsvProgressReporterOperation
+ // runs the progress dialog.
+ CEikButtonGroupContainer::Current()->SetCommandSetL(
+ R_AVKON_SOFTKEYS_EMPTY );
+
+ CleanupStack::PushL( reporter );
+
+ op = CImumMBoxServiceDeletion::NewL( session,
+ reporter->RequestStatus(), *reporter, aMailboxId );
+
+ CleanupStack::PushL( op );
+
+ reporter->SetOperationL( op ); // Takes immediate ownership
+ CleanupStack::Pop( op );
+ CleanupStack::Pop( reporter );
+ op = reporter;
+ }
+ }
+ else
+ {
+ ServiceExceptionL( TImumDaErrorCode::EIdNotRecongnized );
+ }
+ }
+ IMUM_OUT();
+ return op?op:CMsvCompletedOperation::NewL( session,
+ KUidMsvLocalServiceMtm,
+ KNullDesC8,
+ KMsvLocalServiceIndexEntryId,
+ aStatus );
+ }
+
+// ---------------------------------------------------------------------------
+// From class MImumInMailboxServices.
+// CImumInMailboxServicesImpl::SetDefaultMailboxL()
+// ---------------------------------------------------------------------------
+//
+void CImumInMailboxServicesImpl::SetDefaultMailboxL(
+ const TMsvId aMailboxId ) const
+ {
+ IMUM_CONTEXT( CImumInMailboxServicesImpl::SetDefaultMailboxL, 0, KLogInApi );
+ IMUM1_IN( "aMailboxId = 0x%x", aMailboxId );
+
+ // Make sure valid mailbox is set as default
+ if ( iInternalApi.MailboxUtilitiesL().IsMailbox( aMailboxId ) )
+ {
+ IMUM0( 0, "Provided id belongs to mailbox, setting as default" );
+
+ // When selectable email is in use, the default mailbox is stored also
+ // directly to CenRep.
+ //
+ FeatureManager::InitializeLibL();
+ TBool selectableEmail =
+ FeatureManager::FeatureSupported( KFeatureIdSelectableEmail );
+ FeatureManager::UnInitializeLib();
+ if( selectableEmail )
+ {
+ CRepository* rep =
+ CRepository::NewLC( KCRUidSelectableDefaultEmailSettings );
+ User::LeaveIfError(
+ rep->Set( KSelectableDefaultMailAccount, (TInt)aMailboxId ) );
+ CleanupStack::PopAndDestroy( rep );
+ }
+
+ MuiuEmailTools::SetDefaultSendingMailboxL( aMailboxId );
+ }
+ // No valid mailboxes found, so find the first valid and set it as default
+ else
+ {
+ IMUM0( 0, "Provided ID doesn't belong to mailbox, find first valid" );
+ MImumInHealthServices::RMailboxIdArray mailboxes;
+ iInternalApi.HealthServicesL().GetMailboxList(
+ mailboxes,
+ MImumInHealthServices::EFlagGetHealthy |
+ MImumInHealthServices::EFlagIncludeSmtp );
+
+ if ( mailboxes.Count() )
+ {
+ IMUM1( 0, "WARNING: Mailboxes in system without default. New default: 0x%x", mailboxes[0] );
+ MuiuEmailTools::SetDefaultSendingMailboxL( mailboxes[0] );
+ }
+
+ mailboxes.Close();
+ }
+
+ IMUM_OUT();
+ }
+
+// ---------------------------------------------------------------------------
+// From class MImumInMailboxServices.
+// CImumInMailboxServicesImpl::SetLastUpdateInfoL()
+// ---------------------------------------------------------------------------
+//
+void CImumInMailboxServicesImpl::SetLastUpdateInfoL( TMsvId aMailboxId,
+ TBool aSuccess, const TTime& aTime ) const
+ {
+ // This function is performance optimization as settings are not converted
+ // to CImumInSettingsData format
+ IMUM_CONTEXT( CImumInMailboxServicesImpl::SetLastUpdateInfoL, 0, KLogInApi );
+ IMUM_IN();
+
+ // Get account extension ID
+ TMsvEntry mailbox = iInternalApi.MailboxUtilitiesL().GetMailboxEntryL(
+ aMailboxId, MImumInMailboxUtilities::ERequestReceiving );
+
+ iInternalApi.SettingsStorerL().SetLastUpdateInfoL( mailbox.iMtmData2,
+ mailbox.iMtm, aSuccess, aTime );
+
+ IMUM_OUT();
+ }
+
+// ================ INTERNAL FUNCTIONALITY ================
+
+// ---------------------------------------------------------------------------
+// CImumInMailboxServicesImpl::FillCompulsorySettingsL()
+// ---------------------------------------------------------------------------
+//
+void CImumInMailboxServicesImpl::FillCompulsorySettingsL(
+ CImumInSettingsData& aSettingsData,
+ const TUid& aProtocol,
+ const TDesC& aEmailAddress,
+ const TDesC& aIncomingServer,
+ const TDesC& aOutgoingServer,
+ const TInt aAccessPoint,
+ const TDesC& aMailboxName ) const
+ {
+ IMUM_CONTEXT( CImumInMailboxServicesImpl::FillCompulsorySettingsL, 0, KLogInApi );
+ IMUM_IN();
+
+ aSettingsData.SetAttr( TImumDaSettings::EKeyMailboxName, aMailboxName );
+ aSettingsData.SetAttr( TImumDaSettings::EKeyEmailAddress, aEmailAddress );
+
+ TRAPD( error, aSettingsData.GetSetL( 0 ).SetAttr(
+ TImumDaSettings::EKeyProtocol, aProtocol.iUid ) );
+ if ( error == TImumDaErrorCode::EConnectionIndexOverflow )
+ {
+ aSettingsData.AddSetL( aProtocol );
+ }
+ else
+ {
+ ServiceExceptionL( error );
+ }
+
+ aSettingsData.GetSetL( 0 ).SetAttr(
+ TImumDaSettings::EKeyServer, aIncomingServer );
+ aSettingsData.GetSetL( 0 ).SetAttr(
+ TImumDaSettings::EKeyAccessPoint, aAccessPoint );
+
+ TRAP( error, aSettingsData.GetSetL( 1 ).SetAttr(
+ TImumDaSettings::EKeyProtocol,
+ TImumDaSettings::EValueProtocolSmtp ) );
+ if ( error == TImumDaErrorCode::EConnectionIndexOverflow )
+ {
+ aSettingsData.AddSetL( KSenduiMtmSmtpUid );
+ }
+ else
+ {
+ ServiceExceptionL( error );
+ }
+
+ aSettingsData.GetSetL( 1 ).SetAttr(
+ TImumDaSettings::EKeyServer, aOutgoingServer );
+ aSettingsData.GetSetL( 1 ).SetAttr(
+ TImumDaSettings::EKeyAccessPoint, aAccessPoint );
+
+ IMUM_OUT();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CImumInMailboxServicesImpl::ValidateSettingsL()
+// ---------------------------------------------------------------------------
+//
+void CImumInMailboxServicesImpl::ValidateSettingsL(
+ CImumInSettingsData& aSettingsData ) const
+ {
+ IMUM_CONTEXT( CImumInMailboxServicesImpl::ValidateSettingsL, 0, KLogInApi );
+ IMUM_IN();
+
+ TInt result = aSettingsData.Validate();
+
+ if ( result )
+ {
+ ServiceExceptionL( result );
+ }
+
+ IMUM_OUT();
+ }
+
+// ---------------------------------------------------------------------------
+// CImumInMailboxServicesImpl::ServiceExceptionL()
+// ---------------------------------------------------------------------------
+//
+void CImumInMailboxServicesImpl::ServiceExceptionL(
+ const TInt aErrorCode ) const
+ {
+ IMUM_CONTEXT( CImumInMailboxServicesImpl::ServiceExceptionL, 0, KLogInApi );
+ IMUM_IN();
+
+ IMUM1( 0, "Exception occurred. Error %d", aErrorCode );
+
+ __ASSERT_DEBUG( EFalse,
+ User::Panic( KImumInMailboxServices, aErrorCode ) );
+
+ IMUM_OUT();
+ User::Leave( aErrorCode );
+ }
+
+// ---------------------------------------------------------------------------
+// CImumInMailboxServicesImpl::DefaultDataObjectL()
+// ---------------------------------------------------------------------------
+//
+const CImumMboxDefaultData* CImumInMailboxServicesImpl::DefaultDataObjectL()
+ {
+ // Make sure the object exist
+ if ( !iDefaultData )
+ {
+ iDefaultData = CImumMboxDefaultData::NewL( iInternalApi );
+ }
+
+ return iDefaultData;
+ }
+
+// End of File