email/alwaysonlineemailplugin/src/AlwaysOnlineEmailAgent.cpp
changeset 0 72b543305e3a
--- /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 <MuiuMsvUiServiceUtilities.h>
+#include <SenduiMtmUids.h>
+#include <ImumInternalApi.h>            // CImumInternalApi
+#include <ImumInSettingsData.h>         // CImumInSettingsData
+#include <AlwaysOnlineManagerCommon.h>
+
+#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<TMsvId> 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<CAlwaysOnlineImap4Agent*>( 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