diff -r 000000000000 -r 72b543305e3a email/alwaysonlineemailplugin/src/AlwaysOnlineEmailAgent.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/alwaysonlineemailplugin/src/AlwaysOnlineEmailAgent.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,684 @@ +/* +* 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: +* Agent which holds an array of email protocol specific agents +* +*/ + + +#include +#include +#include // CImumInternalApi +#include // CImumInSettingsData +#include + +#include "AlwaysOnlineEmailAgent.h" +#include "AlwaysOnlineImapAgent.h" +#include "AlwaysOnlinePopAgent.h" +#include "AlwaysOnlineEmailPluginTimer.h" +#include "AlwaysOnlineEmailEMNResolver.h" +#include "AlwaysOnlineEmailPluginLogging.h" +#include "AlwaysOnlineEmailLoggingTools.h" + +const TInt KAOHalfSecond = 500000; + +const TInt KEmailAgentArrayGranularity = 2; +// How many times we try to load mail settings before giving up. +const TInt KMailSettingsRetryCount = 3; + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::CAlwaysOnlineEmailAgent() +// ---------------------------------------------------------------------------- +CAlwaysOnlineEmailAgent::CAlwaysOnlineEmailAgent( + CMsvSession& aMsvSession, + MAlwaysOnlineStatusQueryInterface& aAlwaysOnlineManager) + : + iAlwaysOnlineManager( aAlwaysOnlineManager ), + iSession( aMsvSession ), + iEmnResolver( NULL ) + { + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::~CAlwaysOnlineEmailAgent() +// ---------------------------------------------------------------------------- +CAlwaysOnlineEmailAgent::~CAlwaysOnlineEmailAgent() + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::~CAlwaysOnlineEmailAgent" ); + KAOEMAIL_LOGGER_FN1("CAlwaysOnlineEmailAgent::~CAlwaysOnlineEmailAgent"); + if ( iMailAgentArray ) + { + iMailAgentArray->ResetAndDestroy(); + } + delete iMailAgentArray; + delete iClientMtmRegistry; + delete iEmnResolver; + KAOEMAIL_LOGGER_FN2("CAlwaysOnlineEmailAgent::~CAlwaysOnlineEmailAgent"); + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::NewL() +// ---------------------------------------------------------------------------- +CAlwaysOnlineEmailAgent* CAlwaysOnlineEmailAgent::NewL( + CMsvSession& aMsvSession, + MAlwaysOnlineStatusQueryInterface& aAlwaysOnlineManager ) + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::NewL" ); + CAlwaysOnlineEmailAgent* self = new (ELeave)CAlwaysOnlineEmailAgent( + aMsvSession, aAlwaysOnlineManager ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::ConstructL +// ---------------------------------------------------------------------------- +void CAlwaysOnlineEmailAgent::ConstructL() + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::ConstructL" ); + iClientMtmRegistry = CClientMtmRegistry::NewL( iSession ); + iMailAgentArray = new (ELeave) CAOEmailAgentArray( + KEmailAgentArrayGranularity ); + iEmnResolver = CAlwaysOnlineEmailEMNResolver::NewL(); + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::StartL() +// ---------------------------------------------------------------------------- +void CAlwaysOnlineEmailAgent::StartL() + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::StartL" ); + RefreshMailAgentArrayL(); + ActivateOnlineMailboxesL(); + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::SuspendNWOperationsL() +// ---------------------------------------------------------------------------- +void CAlwaysOnlineEmailAgent::SuspendNWOperationsL() + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::SuspendNWOperationsL" ); + const TInt count = iMailAgentArray->Count(); + for ( TInt loop = 0; loop < count; loop++ ) + { + iMailAgentArray->At( loop )->Suspend(); + } + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::ResumeNWOperationsL() +// ---------------------------------------------------------------------------- +void CAlwaysOnlineEmailAgent::ResumeNWOperationsL() + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::ResumeNWOperationsL" ); + const TInt count = iMailAgentArray->Count(); + for ( TInt loop = 0; loop < count; loop++ ) + { + iMailAgentArray->At( loop )->ResumeL(); + } + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::RoamingEventL() +// ---------------------------------------------------------------------------- +void CAlwaysOnlineEmailAgent::RoamingEventL() + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::RoamingEventL" ); + const TInt count = iMailAgentArray->Count(); + for ( TInt loop = 0; loop < count; loop++ ) + { + iMailAgentArray->At( loop )->HandleRoamingEventL(); + } + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::HomeNetworkEventL() +// ---------------------------------------------------------------------------- +void CAlwaysOnlineEmailAgent::HomeNetworkEventL() + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::HomeNetworkEventL" ); + const TInt count = iMailAgentArray->Count(); + for ( TInt loop = 0; loop < count; loop++ ) + { + iMailAgentArray->At( loop )->HandleHomeNetworkEventL(); + } + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::HandleOutOfDiskL() +// ---------------------------------------------------------------------------- +void CAlwaysOnlineEmailAgent::HandleOutOfDiskL() + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::HandleOutOfDiskL" ); + const TInt count = iMailAgentArray->Count(); + for ( TInt loop = 0; loop < count; loop++ ) + { + iMailAgentArray->At( loop )->HandleOutOfDiskEventL(); + } + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::HandleEMNMessageL() +// ---------------------------------------------------------------------------- +void CAlwaysOnlineEmailAgent::HandleEMNMessageL( + const TDesC8& aParameters ) + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::HandleEMNMessageL" ); + KAOEMAIL_LOGGER_FN1("CAlwaysOnlineEmailAgent::HandleEMNL"); + TEMNElement elements; + + if ( iEmnResolver->ParameterDispatchTEMNElement( + aParameters, elements ) == KErrNone ) + { + KAOEMAIL_LOGGER_WRITE("CAlwaysOnlineEmailAgent::HandleEMNL(): Find EMN mailbox" ); + + CAlwaysOnlineEmailAgentBase* mailbox = + iEmnResolver->FindEMNMailbox( elements.mailbox, *iMailAgentArray ); + + if ( mailbox ) + { + KAOEMAIL_LOGGER_WRITE("CAlwaysOnlineEmailAgent::HandleEMNL(): EMN mailbox found" ); + mailbox->ConnectL(); + } + else + { + KAOEMAIL_LOGGER_WRITE("CAlwaysOnlineEmailAgent::HandleEMNL(): EMN mailbox not found" ); + } + } + + KAOEMAIL_LOGGER_FN2("CAlwaysOnlineEmailAgent::HandleEMNL"); + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::GetMailboxesLC() +// ---------------------------------------------------------------------------- +CMsvEntrySelection* CAlwaysOnlineEmailAgent::GetMailboxesLC() + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::GetMailboxesLC" ); + KAOEMAIL_LOGGER_FN1("CAlwaysOnlineEmailAgent::GetMailboxesLC"); + CMsvEntrySelection* mailboxSelection = + MsvUiServiceUtilities::GetListOfAccountsWithMTML( + iSession, KSenduiMtmImap4Uid ); + CleanupStack::PushL( mailboxSelection ); + + CMsvEntrySelection* pop3Selection = + MsvUiServiceUtilities::GetListOfAccountsWithMTML( + iSession, KSenduiMtmPop3Uid ); + CleanupStack::PushL( pop3Selection ); + + const TInt count = pop3Selection->Count(); + TInt loop = 0; + for ( loop = 0; loop < count; loop++ ) + { + mailboxSelection->AppendL( (*pop3Selection)[loop] ); + } + CleanupStack::PopAndDestroy( pop3Selection ); + pop3Selection = NULL; + + // remove mailboxes from mailboxSelection which are already in iMailAgentArray + for ( loop = mailboxSelection->Count() - 1; loop >= 0; loop-- ) + { + if ( FindMailbox( (*mailboxSelection)[loop] ) ) + { + // already in iMailAgentArray, delete it + mailboxSelection->Delete( loop ); + } + } + // mailboxSelection in CleanupStack + KAOEMAIL_LOGGER_FN2("CAlwaysOnlineEmailAgent::GetMailboxesLC"); + return mailboxSelection; + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::RefreshMailAgentArrayLC +// ---------------------------------------------------------------------------- +void CAlwaysOnlineEmailAgent::RefreshMailAgentArrayL() + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::RefreshMailAgentArrayL" ); + KAOEMAIL_LOGGER_FN1("CAlwaysOnlineEmailAgent::RefreshMailAgentArrayL"); + // delete first mailboxes from the iMailAgentArray, which does not exists anymore. + TInt cnt = iMailAgentArray->Count(); + TBool isHealthy = EFalse; + TBool setActive = EFalse; + TMsvId mailboxId; + TMsvEntry tEntry; + TMsvId service; + + CImumInternalApi* emailApi = CreateEmailApiLC( &iSession ); + KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlineEmailAgent::RefreshMailAgentArrayL() Mail Agents in array: %d", cnt); + + TInt i; + for ( i = cnt; i > 0; i-- ) + { + mailboxId = ( *iMailAgentArray )[i-1]->MailboxId(); + isHealthy = emailApi->HealthServicesL().IsMailboxHealthy( mailboxId ); + if ( isHealthy ) + { + setActive = IsMailAgentActiveL( mailboxId ); + KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlineEmailAgent::RefreshMailAgentArrayL() setActive = %d", setActive); + } + + //remove if mailbox has been deleted, AO setting disabled, + //EMN turned off or mailbox is not healthy. + if ( !setActive || !isHealthy || + iSession.GetEntry( mailboxId, service, tEntry ) != KErrNone ) + { + KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlineEmailAgent::RefreshMailAgentArrayL() Deleting agent for mailbox: %d", mailboxId); + delete iMailAgentArray->At( i-1 ); + iMailAgentArray->Delete( i-1 ); + } + } + + // then add new mailboxes... + CMsvEntrySelection* mailboxes = GetMailboxesLC(); + const TInt count = mailboxes->Count(); + KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlineEmailAgent::RefreshMailAgentArrayL() New mailboxes count: %d", count); + for ( i = 0; i < count; i++ ) + { + mailboxId = mailboxes->At( i ); + isHealthy = emailApi->HealthServicesL().IsMailboxHealthy( mailboxId ); + + if ( isHealthy && IsMailAgentActiveL( mailboxId ) ) + { + KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlineEmailAgent::RefreshMailAgentArrayL() Adding agent for mailbox: %d", (*mailboxes)[i]); + AddMailboxL( ( *mailboxes )[i] ); + } + } + CleanupStack::PopAndDestroy( 2, emailApi ); // CSI: 12,47 # nothing wrong here + KAOEMAIL_LOGGER_FN2("CAlwaysOnlineEmailAgent::RefreshMailAgentArrayL"); + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::AddMailboxL +// ---------------------------------------------------------------------------- +CAlwaysOnlineEmailAgentBase* CAlwaysOnlineEmailAgent::AddMailboxL( + TMsvId aMailboxId ) + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::AddMailboxL" ); + KAOEMAIL_LOGGER_FN1("CAlwaysOnlineEmailAgent::AddMailboxL"); + CAlwaysOnlineEmailAgentBase* mailAgent = NULL; + if ( !FindMailbox( aMailboxId ) ) + { + TMsvEntry tEntry; + TMsvId service; + if ( iSession.GetEntry( aMailboxId, service, tEntry ) == KErrNone && + tEntry.iType == KUidMsvServiceEntry ) + { + if ( tEntry.iMtm == KSenduiMtmImap4Uid ) + { + mailAgent = CAlwaysOnlineImap4Agent::NewL( + iSession, *iClientMtmRegistry, aMailboxId, + iAlwaysOnlineManager, *this ); + CleanupStack::PushL( mailAgent ); + iMailAgentArray->AppendL( mailAgent ); // takes ownership + CleanupStack::Pop( mailAgent ); + } + else if ( tEntry.iMtm == KSenduiMtmPop3Uid ) + { + mailAgent = CAlwaysOnlinePop3Agent::NewL( + iSession, *iClientMtmRegistry, aMailboxId, + iAlwaysOnlineManager, *this ); + CleanupStack::PushL( mailAgent ); + iMailAgentArray->AppendL( mailAgent ); // takes ownership + CleanupStack::Pop( mailAgent ); + } + } + } + KAOEMAIL_LOGGER_FN2("CAlwaysOnlineEmailAgent::AddMailboxL"); + return mailAgent; + } + + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::ActivateOnlineMailboxesL +// ---------------------------------------------------------------------------- +void CAlwaysOnlineEmailAgent::ActivateOnlineMailboxesL() + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::ActivateOnlineMailboxesL" ); + KAOEMAIL_LOGGER_FN1("CAlwaysOnlineEmailAgent::ActivateOnlineMailboxesL"); + const TInt count = iMailAgentArray->Count(); + + for ( TInt loop = 0; loop < count; loop++ ) + { + (*iMailAgentArray)[loop]->StartL(); + }//for + KAOEMAIL_LOGGER_FN2("CAlwaysOnlineEmailAgent::ActivateOnlineMailboxesL"); + } + + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::FindMailbox +// ---------------------------------------------------------------------------- +CAlwaysOnlineEmailAgentBase* CAlwaysOnlineEmailAgent::FindMailbox( + TMsvId aMailboxId ) + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::FindMailbox" ); + KAOEMAIL_LOGGER_FN1("CAlwaysOnlineEmailAgent::FindMailbox"); + // Get number of agents + const TInt count = iMailAgentArray->Count(); + CAlwaysOnlineEmailAgentBase* mailAgent = NULL; + + // Search through the agents, until correct is found + for ( TInt loop = 0; loop < count && !mailAgent; loop++ ) + { + if ( aMailboxId == (*iMailAgentArray)[loop]->MailboxId() ) + { + mailAgent = (*iMailAgentArray)[loop]; + } + + } + + KAOEMAIL_LOGGER_FN2("CAlwaysOnlineEmailAgent::FindMailbox"); + // Return the pointer + return mailAgent; + } + +// ---------------------------------------------------------------------------- +// DeleteMailbox +// ---------------------------------------------------------------------------- +TBool CAlwaysOnlineEmailAgent::DeleteMailbox( TMsvId aMailboxId ) + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::DeleteMailbox" ); + KAOEMAIL_LOGGER_FN1("CAlwaysOnlineEmailAgent::DeleteMailbox"); + const TInt count = iMailAgentArray->Count(); + for ( TInt loop = 0; loop < count; loop++ ) + { + if ( aMailboxId == (*iMailAgentArray)[loop]->MailboxId() ) + { + delete iMailAgentArray->At( loop ); + iMailAgentArray->Delete( loop ); + return ETrue; + } + + } + KAOEMAIL_LOGGER_FN2("CAlwaysOnlineEmailAgent::DeleteMailbox"); + return EFalse; + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::MailboxSetActivityL +// ---------------------------------------------------------------------------- +void CAlwaysOnlineEmailAgent::MailboxSetActivityL( + const TMsvId aMailboxId, + const TBool aState ) + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::MailboxSetActivityL" ); + KAOEMAIL_LOGGER_FN1("CAlwaysOnlineEmailAgent::MailboxSetActiviytL"); + // Mailbox settings changed, update the array + MailboxSettingsChangedL( aMailboxId ); + + // Find the agent from array + CAlwaysOnlineEmailAgentBase* agent = FindMailbox( aMailboxId ); + + // Check that the agent is valid + if ( agent ) + { + if ( !aState ) + { + // Suspend the agent + agent->Suspend(); + } + else + { + agent->ResumeL( ETrue ); + } + } + KAOEMAIL_LOGGER_FN2("CAlwaysOnlineEmailAgent::MailboxSetActiviytL"); + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::MailboxSettingsChangedL +// ---------------------------------------------------------------------------- +void CAlwaysOnlineEmailAgent::MailboxSettingsChangedL( TMsvId aMailboxId ) + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::MailboxSettingsChangedL" ); + KAOEMAIL_LOGGER_FN1("CAlwaysOnlineEmailAgent::MailboxSettingsChangedL"); + RefreshMailAgentArrayL(); + CAlwaysOnlineEmailAgentBase* mailAgent = FindMailbox( aMailboxId ); + if ( mailAgent ) + { + KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlineEmailAgent::MailboxSettingsChangedL() Calling StartL for: %d", aMailboxId); + mailAgent->StartL(); + } + KAOEMAIL_LOGGER_FN2("CAlwaysOnlineEmailAgent::MailboxSettingsChangedL"); + } + + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::RemoveMailAgentL +// ---------------------------------------------------------------------------- +void CAlwaysOnlineEmailAgent::RemoveMailAgentL() + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::RemoveMailAgentL" ); + KAOEMAIL_LOGGER_FN1("CAlwaysOnlineEmailAgent::RemoveMailAgentL"); + RefreshMailAgentArrayL(); + KAOEMAIL_LOGGER_FN2("CAlwaysOnlineEmailAgent::RemoveMailAgentL"); + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::SwitchOffAllAgentsL +// ---------------------------------------------------------------------------- +void CAlwaysOnlineEmailAgent::SwitchOffAllAgentsL() + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::SwitchOffAllAgentsL" ); + KAOEMAIL_LOGGER_WRITE("CAlwaysOnlineEmailAgent::SwitchOffAllAgentsL() Deleting all agents from agent array!"); + while ( iMailAgentArray->Count() ) + { + delete iMailAgentArray->At( 0 ); + iMailAgentArray->Delete( 0 ); + } + + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::IsMailAgentActiveL +// ---------------------------------------------------------------------------- +TBool CAlwaysOnlineEmailAgent::IsMailAgentActiveL( TMsvId aMailboxId ) + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::IsMailAgentActiveL" ); + KAOEMAIL_LOGGER_FN1("CAlwaysOnlineEmailAgent::IsMailAgentActiveL"); + TMsvEntry entry; + TMsvId service; + + TInt err = iSession.GetEntry( aMailboxId, service, entry ); + if ( err != KErrNone ) + { + return EFalse; + } + + TInt cnt = 0; + CImumInternalApi* emailApi = CreateEmailApiLC( &iSession ); + CImumInSettingsData* settings = NULL; + + err = KErrNotFound; + while ( err && cnt < KMailSettingsRetryCount ) + { + // No need to push, since no leaving method called after + TRAP( err, settings = + emailApi->MailboxServicesL().LoadMailboxSettingsL( aMailboxId ) ); + if ( err || !settings ) + { + // wait for half a second and try again + RTimer timer; + TRequestStatus timerStatus; + timer.CreateLocal(); + timer.After( timerStatus, KAOHalfSecond ); + User::WaitForRequest(timerStatus); // CSI: 94 # not UI code + cnt++; + } + } + + + // Did we got settings or did we fail 3 times? + if ( err && cnt == KMailSettingsRetryCount ) + { + KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlineEmailAgent::IsMailAgentActiveL: failed to load settings, leaving. Err = %d", err ); + User::Leave( err ); + } + + TBool result = EFalse; + + TInt emnState = 0; + settings->GetAttr( TImumDaSettings::EKeyAutoNotifications, emnState ); + TInt aoState = 0; + settings->GetAttr( TImumDaSettings::EKeyAutoRetrieval, aoState ); + + if ( emnState != TImumDaSettings::EValueNotificationsOff ) + { + result = ETrue; + } + else if ( aoState != TImumDaSettings::EValueAutoOff ) + { + result = ETrue; + } + else + { + // There might be temporary agent running. + CAlwaysOnlineEmailAgentBase* mailAgent = FindMailbox( aMailboxId ); + result = mailAgent != NULL; // CSI: 64 # conversion to TBool + } + + CleanupStack::PopAndDestroy( emailApi ); + emailApi = NULL; + delete settings; + settings = NULL; + + KAOEMAIL_LOGGER_FN2("CAlwaysOnlineEmailAgent::IsMailAgentActiveL"); + + return result; + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::ParameterDispatchMsvId +// ---------------------------------------------------------------------------- +TInt CAlwaysOnlineEmailAgent::ParameterDispatchMsvId( + const TDesC8& aParameters, + TMsvId& aMailboxId ) const + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::ParameterDispatchMsvId" ); + KAOEMAIL_LOGGER_WRITE("CAlwaysOnlineEmailAgent::ParameterDispatchMsvId Dispatch the message"); + + // Presume that wrong type of parameter is given + TInt err = KErrNotSupported; + + // Unpack parameters to see to which mailbox command is for + TPckgBuf paramPack; + + // Make sure that the parameter length matches Id length + if ( aParameters.Length() == sizeof( TMsvId ) ) + { + paramPack.Copy( aParameters ); + + // Get the mailbox id from the packet + aMailboxId = paramPack(); + err = KErrNone; + } + + KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlineEmailAgent::ParameterDispatchMsvId Mailbox receiving message: 0x%x", aMailboxId ); + return err; + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::HandleAOStateL +// ---------------------------------------------------------------------------- +void CAlwaysOnlineEmailAgent::HandleAOStateL( + const TInt aCommand, + const TDesC8& aParameters ) + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::HandleAOStateL" ); + // Get the msvid from parameter + TMsvId mailboxId; + + // Make sure parameter has correct type of information in + if ( ParameterDispatchMsvId( aParameters, mailboxId ) != KErrNone ) + { + KAOEMAIL_LOGGER_WRITE("CAlwaysOnlineEmailAgent::HandleAOState -> Invalid parameter!"); + return; + } + + // Handle the command + switch ( aCommand ) + { + case EAOManagerMailboxAgentSuspend: + KAOEMAIL_LOGGER_WRITE("CAlwaysOnlineEmailAgent::HandleAOState -> Command: Suspend agent"); + MailboxSetActivityL( mailboxId, EFalse ); + break; + + case EAOManagerMailboxAgentResume: + KAOEMAIL_LOGGER_WRITE("CAlwaysOnlineEmailAgent::HandleAOState -> Command: Resume agent"); + MailboxSetActivityL( mailboxId, ETrue ); + break; + + case EAOManagerMailboxAgentRemove: + KAOEMAIL_LOGGER_WRITE("CAlwaysOnlineEmailAgent::HandleAOState -> Command: Remove agent"); + DeleteMailbox( mailboxId ); + break; + + case EAOManagerMailboxAgentUpdateMailWhileConnected: + MailboxUpdateMailWhileConnectedL( mailboxId ); // fetch new mail but do not reconnect if connection is dropped! + break; + + default: + break; + } + } + +// ---------------------------------------------------------------------------- +// CAlwaysOnlineEmailAgent::MailboxSetActivityL +// ---------------------------------------------------------------------------- +void CAlwaysOnlineEmailAgent::MailboxUpdateMailWhileConnectedL( + const TMsvId aMailboxId ) + { + AOLOG_IN( "CAlwaysOnlineEmailAgent::MailboxUpdateMailWhileConnectedL" ); + TMsvEntry tEntry; + TMsvId service; + + // this is valid only for imap4 mailboxes which is already connected + if ( iSession.GetEntry( aMailboxId, service, tEntry ) == KErrNone + && tEntry.iMtm == KSenduiMtmImap4Uid + && tEntry.iType == KUidMsvServiceEntry + && tEntry.Connected() ) + + { + // Find the agent from array + CAlwaysOnlineEmailAgentBase* agent = FindMailbox( aMailboxId ); + + // Check that the agent is valid + if ( agent ) + { + // do nothing, this is handled by default + CAlwaysOnlineImap4Agent* mailAgent = + static_cast( agent ); + mailAgent->SetUpdateMailWhileConnectedL( ETrue ); + } + else + { + // create temporary agent... + CAlwaysOnlineImap4Agent* mailAgent = + CAlwaysOnlineImap4Agent::NewL( + iSession, *iClientMtmRegistry, aMailboxId, + iAlwaysOnlineManager, *this ); + CleanupStack::PushL( mailAgent ); + iMailAgentArray->AppendL( mailAgent ); // takes ownership + CleanupStack::Pop( mailAgent ); + mailAgent->SetUpdateMailWhileConnectedL( EFalse ); + } + } + } + + + +//EOF