email/alwaysonlineemailplugin/src/AlwaysOnlinePopAgent.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/alwaysonlineemailplugin/src/AlwaysOnlinePopAgent.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,696 @@
+/*
+* 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: 
+*     POP specific email agent
+*
+*/
+
+
+//INCLUDES
+#include <SenduiMtmUids.h>
+#include <es_sock.h>
+#include <MuiuOperationWait.h>
+#include <ImumInSettingsKeys.h>
+#include <ImumDaSettingsKeys.h>
+
+#include "AlwaysOnlinePopAgent.h"
+#include "AlwaysOnlineEmailPluginLogging.h"
+#include "AlwaysOnlineEmailLoggingTools.h"
+const TInt KEmailMaxCharsInLine = 75;
+const TInt KEmailKB = 1024;
+
+// ----------------------------------------------------------------------------
+// CAlwaysOnlinePop3Agent()
+// ----------------------------------------------------------------------------
+CAlwaysOnlinePop3Agent::CAlwaysOnlinePop3Agent( 
+    CMsvSession& aSession,
+    CClientMtmRegistry& aClientMtmRegistry,
+    MAlwaysOnlineStatusQueryInterface& aAlwaysOnlineManager,
+    CAlwaysOnlineEmailAgent& aEmailAgent )
+    :
+    CAlwaysOnlineEmailAgentBase( 
+        aSession, aClientMtmRegistry, 
+        aAlwaysOnlineManager, aEmailAgent )
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// NewL
+// ----------------------------------------------------------------------------
+CAlwaysOnlinePop3Agent* CAlwaysOnlinePop3Agent::NewL( 
+    CMsvSession& aSession,
+    CClientMtmRegistry& aClientMtmRegistry,
+    TMsvId aMailboxId,
+    MAlwaysOnlineStatusQueryInterface& aAlwaysOnlineManager,
+    CAlwaysOnlineEmailAgent& aEmailAgent )
+    {
+    AOLOG_IN( "CAlwaysOnlinePop3Agent::NewL" );
+    CAlwaysOnlinePop3Agent* self = new(ELeave)CAlwaysOnlinePop3Agent( 
+        aSession, aClientMtmRegistry, aAlwaysOnlineManager, aEmailAgent );
+    CleanupStack::PushL( self );
+    self->ConstructL( aMailboxId );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ----------------------------------------------------------------------------
+// ConstructL()
+// ----------------------------------------------------------------------------
+void CAlwaysOnlinePop3Agent::ConstructL( TMsvId aMailboxId )
+    {
+    AOLOG_IN( "CAlwaysOnlinePop3Agent::ConstructL" );
+    CAlwaysOnlineEmailAgentBase::ConstructL( aMailboxId );
+    iPop3ClientMtm = (CPop3ClientMtm*) iClientMtmRegistry.NewMtmL( 
+        KSenduiMtmPop3Uid );
+    iFlags->ClearFlag( EAOBFIsImap4 );    
+    }
+
+// ----------------------------------------------------------------------------
+// ~CAlwaysOnlinePop3Agent()
+// ----------------------------------------------------------------------------
+CAlwaysOnlinePop3Agent::~CAlwaysOnlinePop3Agent()
+    {
+    AOLOG_IN( "CAlwaysOnlinePop3Agent::~CAlwaysOnlinePop3Agent" );
+    // cancel ongoing operations
+    CloseServices();
+    delete iPop3ClientMtm;
+    }
+
+// ----------------------------------------------------------------------------
+// StartL()
+// ----------------------------------------------------------------------------
+void CAlwaysOnlinePop3Agent::StartL()
+    {
+    AOLOG_IN( "CAlwaysOnlinePop3Agent::StartL" );
+    //once start delay op has been started we don't ever reset that id.
+    if ( iStartDelayOpId == KErrNotFound )
+        {
+        //check offline & roaming statuses from AO server
+        TBool suspended = EFalse;
+        QueryAndHandleAOServerInfoL( suspended );
+        
+        if ( suspended )
+            {
+            //we got iState = EEmailAgentIdle from CAlwaysOnlineEmailAgentBase::Suspend
+            KAOEMAIL_LOGGER_WRITE("CAlwaysOnlinePop3Agent::StartL() We have been suspended, not starting!");
+            return;
+            }
+
+        iState = EEmailAgentInitialised;
+        KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::StartL. Setting state: %d ",iState );
+
+    
+        TTime home;
+        home.HomeTime();
+
+        //Let's not start immediately on start. Small delay is safer
+        TTimeIntervalSeconds startDelay( KInitWaitSeconds );
+        home += startDelay;
+
+        StartTimerOperationL( home, iStartDelayOpId );
+        KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::StartL(). Activated startDelayWait 5sec Op Id: %d ",iStartDelayOpId );
+        }//if
+    else
+        {
+        KAOEMAIL_LOGGER_WRITE("CAlwaysOnlinePop3Agent::StartL() called, but we're allready started. No changes to state machine");
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// ConnectAndUpdateHeadersL()
+// ----------------------------------------------------------------------------
+void CAlwaysOnlinePop3Agent::ConnectAndUpdateHeadersL()
+    {
+    AOLOG_IN( "CAlwaysOnlinePop3Agent::ConnectAndUpdateHeadersL" );
+    KAOEMAIL_LOGGER_WRITE_FORMAT( "CAlwaysOnlinePop3Agent::ConnectAndUpdateHeadersL(). Starting to connect into: %d", iEntry->Entry().Id() );
+    CreatePop3OperationL( iConnectOpId, KPOP3MTMConnect, EFalse );
+    iState = EEmailAgentConnecting;
+    KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::ConnectAndUpdateHeadersL(). Setting state:  %d ",iState );
+    }
+
+// ----------------------------------------------------------------------------
+// DisconnectL()
+// ----------------------------------------------------------------------------
+void CAlwaysOnlinePop3Agent::DisconnectL( TBool aAutomatic )
+    {
+    AOLOG_IN( "CAlwaysOnlinePop3Agent::DisconnectL" );    
+    TBuf8<1> dummyParams;
+    dummyParams.Zero();
+
+    CMsvSingleOpWatcher* watcher = CMsvSingleOpWatcher::NewL(*this);
+    CleanupStack::PushL( watcher );
+    CMsvOperation* op = NULL;
+
+    if ( iEntry->Entry().Connected() )
+        {
+        CMsvEntrySelection* selection = new(ELeave) CMsvEntrySelection;
+        CleanupStack::PushL( selection );
+        selection->AppendL( iEntry->Entry().iServiceId );
+        iPop3ClientMtm->SwitchCurrentEntryL( iEntry->Entry().iServiceId );
+        op = iPop3ClientMtm->InvokeAsyncFunctionL( 
+            KPOP3MTMDisconnect, *selection, dummyParams, watcher->iStatus);
+
+        CleanupStack::PopAndDestroy( selection );//selection
+        KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::DisconnectL: ADDING DISCONNECT OPERATION: %d", op->Id() );
+        }
+    else 
+        {
+        //already disconnected
+        op = CMsvCompletedOperation::NewL(
+                iSession, iEntry->Entry().iMtm, KNullDesC8, 
+                KMsvLocalServiceIndexEntryId, 
+                watcher->iStatus, KErrCancel);
+        KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::DisconnectL: ADDING COMPLETED OPERATION: %d", op->Id() );
+        }
+
+    CleanupStack::PushL( op );
+    AppendWatcherAndSetOperationL( watcher, op ); // takes immediately ownership
+    CleanupStack::Pop( 2, watcher); // op // CSI: 12,47 # nothing wrong
+
+    if ( aAutomatic )
+        {
+        iState = EEmailAgentAutoDisconnecting;
+        KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::DisconnectL. Automatic, setting state:  %d ",iState );
+        }
+    else
+        {
+        iState = EEmailAgentUserDisconnecting;
+        KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::DisconnectL. Setting state:  %d ",iState );
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// ChangeNextStateL
+// ----------------------------------------------------------------------------
+void CAlwaysOnlinePop3Agent::ChangeNextStateL()
+    {
+    AOLOG_IN( "CAlwaysOnlinePop3Agent::ChangeNextStateL" ); 
+    KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::ChangeNextStateL() iState: %d", iState);
+    
+    //if we are waiting for schedule to start, we don't handle conn errors.
+    //this should only occur if conn op has been started just before schedule ends.
+    if ( iError != KErrNone && iState != EEmailAgentTimerWaitingForStart )
+        {
+        HandleOpErrorL();
+        }
+
+    switch ( iState )
+        {
+        //agent just constructed ( or settings changed ) and ready. Should be here only when settings have be saved
+        //with always / home settings
+        case EEmailAgentInitialised:
+            //settings may have been changed, reset all pending operations
+            //because their timings can be different compared to newly saved settings
+
+            ResetAll();
+            
+            if ( !IsEmn() )
+                {
+                CheckAndHandleSchedulingL();//starts schedule timers and sets state accordingly
+                if( iWaitForStopOpId != KErrNotFound || 
+                    ( iWaitForStopOpId == KErrNotFound && 
+                      iWaitForStartOpId == KErrNotFound ) )//no start or stop waiters, all times
+                    {
+                    //CheckAndHandleCheduling started waitForStopTimer
+                    StartWaitTimerL();
+                    }
+                //else, do nothing, we wait until waitForStartTimer expires and starts updates again
+                }
+            else
+                {
+                iState = EEmailAgentIdle;
+                CreateCompletedOpL();
+                KAOEMAIL_LOGGER_WRITE("CAlwaysOnlinePop3Agent::ChangeNextStateL() EMN is on --> no scheduling or timers needed!");
+                }
+            break;
+
+        //case EEmailAgentConnected:
+        case EEmailAgentConnecting:
+            KAOEMAIL_LOGGER_WRITE("CAlwaysOnlinePop3Agent::ChangeNextStateL() DoFilteredPopulateL");
+            //if filter not used, just moves to next state - disconnect
+            DoFilteredPopulateL();
+            break;
+        case EEmailAgentDoingFilteredPopulate:
+            KAOEMAIL_LOGGER_WRITE("CAlwaysOnlinePop3Agent::ChangeNextStateL() DisconnectL");
+            DisconnectL( ETrue );
+            break;
+        case EEmailAgentConnectFailed:
+        case EEmailAgentQueued:
+        case EEmailAgentReconnecting:
+        case EEmailAgentAutoDisconnecting:
+        case EEmailAgentUserDisconnecting:
+        case EEmailAgentConnTerminated:
+            KAOEMAIL_LOGGER_WRITE("CAlwaysOnlinePop3Agent::ChangeNextStateL() StartWaitTimerL");
+            if ( IsReconnectAfterError() )
+                {
+                StartWaitTimerL();
+                }
+            else
+                {
+                DisconnectL( ETrue );
+                // disconnect if we are connected
+                iState = EEmailAgentIdle;
+                //give up, reset retry counter
+                iRetryCounter = 0;
+                CreateCompletedOpL();
+                }
+            break;
+        case EEmailAgentTimerWaiting:
+            //just make sure that wait has completed before connecting
+            ConnectIfAllowedL( iIntervalWaitId );
+            break;
+
+        case EEmailAgentTimerWaitingForStart://wait end, can connect
+            ConnectIfAllowedL( iWaitForStartOpId );
+            //else, do nothing, we are not going to change state until waitForStart timer completes
+            break;
+        case EEmailAgentIdle:
+            KAOEMAIL_LOGGER_WRITE("CAlwaysOnlinePop3Agent::ChangeNextStateL() Idling.... zZzZzZzZzzzzzzzzzzzzz");
+            //No handling for idle, we just "hang around"
+            break;
+        case EEmailAgentFatalError:
+            //something is so wrong that connection cannot be made without user intervention
+            //like incorrect settings or such
+            DisplayGlobalErrorNoteL();
+            SwitchAutoUpdateOffL();
+            break;
+        default:
+            KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::ChangeNextStateL() Unknown state!: %d,resetting all!", iState);
+            ResetAll();
+            iState = EEmailAgentInitialised;
+            CreateCompletedOpL();
+            break;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// StartWaitTimerL
+// ----------------------------------------------------------------------------
+void CAlwaysOnlinePop3Agent::StartWaitTimerL( )
+    {
+    AOLOG_IN( "CAlwaysOnlinePop3Agent::StartWaitTimerL" );
+    //waiting already
+    if ( iState == EEmailAgentTimerWaiting )
+        {
+        KAOEMAIL_LOGGER_FN1("CAlwaysOnlinePop3Agent::StartWaitTimerL(), already waiting");
+        return;
+        }
+    
+    TTime time;
+    time.HomeTime();
+
+    //if just exited settings we should connect, only when AO is on (not EMN).
+    if ( iFlags->Flag( EAOBFConnectNow ) && !IsEmn() )
+        {
+        // Set to false, one time only
+        iFlags->ClearFlag( EAOBFConnectNow );
+        
+        TTimeIntervalSeconds conn = KInitWaitSeconds;
+        time += conn;
+
+        StartTimerOperationL( time, iIntervalWaitId );
+        iState = EEmailAgentTimerWaiting;
+        KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::StartWaitTimerL. Connecting in 5 seconds. Op Id:  %d ",iIntervalWaitId );
+        return;
+        }
+
+    //if we are retrying a connection. 3 quick retries and then qive up
+    if ( (iRetryCounter % KAOMaxRetries) != 0 )
+        {
+        TTimeIntervalSeconds seconds( 0 );
+        KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::StartWaitTimerL() iRetryCounter %d", iRetryCounter);
+
+        switch ( (iRetryCounter % KAOMaxRetries) )
+            {
+            //values for these retry times configured in AlwaysOnlineEmailAgentBase.h
+            case 1:
+            case 2: // CSI: 47 # see comment above
+                seconds = EEMailAgentReconnectThree;
+                break;
+            default:
+                seconds = EEMailAgentReconnectFive;
+                break;
+            }//switch
+
+        time += seconds;
+        }//if
+    else if( iState == EEmailAgentQueued )
+        {
+        TTimeIntervalSeconds seconds( 0 );
+        seconds = EEMailAgentReconnectFour;
+        time += seconds;
+        }
+    else if ( !IsEmn() )
+        {
+        TInt minutes = RetrievalIntervalInMinutes( LoadSettingL<TInt>( 
+            TImumDaSettings::EKeyAutoRetrievalInterval, EFalse ));
+        KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::StartWaitTimerL(). Minutes to wait: %d", minutes);
+
+        TTimeIntervalMinutes intervalMinutes( minutes );
+        time += intervalMinutes;
+        }
+
+    StartTimerOperationL( time, iIntervalWaitId );
+    KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::StartWaitTimerL. Interval timer started. Op Id:  %d ",iIntervalWaitId );
+
+    iState = EEmailAgentTimerWaiting;
+    KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::StartWaitTimerL. Setting state:  %d ",iState );
+    }
+
+// ----------------------------------------------------------------------------
+// CreatePop3OperationL()
+// ----------------------------------------------------------------------------
+void CAlwaysOnlinePop3Agent::CreatePop3OperationL( 
+    TInt aFunctionId, 
+    TBool aCompletedOperation /*= EFalse*/ )
+    {
+    AOLOG_IN( "CAlwaysOnlinePop3Agent::CreatePop3OperationL" );
+    TMsvOp dummy;
+    CreatePop3OperationL( dummy, aFunctionId, aCompletedOperation );
+    }
+
+// ---------------------------------------------------------------------------
+// CAlwaysOnlinePop3Agent::FillMailOptionsL()
+// ---------------------------------------------------------------------------
+//
+TImPop3PopulateOptions CAlwaysOnlinePop3Agent::FillMailOptionsL()
+    {
+    AOLOG_IN( "CAlwaysOnlinePop3Agent::FillMailOptionsL" );
+    TImPop3PopulateOptions pop3GetMailInfo;
+
+    TInt32 sync = LoadSettingL<TInt32>( 
+        TImumInSettings::EKeySyncFlags, ETrue );
+
+    if ( sync == TImumInSettings::EFlagDownloadPartialCumulative )
+        {
+        // Population limit is set only if user defined limit has been defined
+        TInt32 limit = LoadSettingL<TInt32>(
+            TImumInSettings::EKeyDownloadBodySize, ETrue );
+        pop3GetMailInfo.SetPopulationLimit(
+            ( limit * KEmailKB ) / KEmailMaxCharsInLine );
+        }
+        
+    return pop3GetMailInfo;
+    }
+
+// ----------------------------------------------------------------------------
+// CreatePop3OperationL
+// ----------------------------------------------------------------------------
+void CAlwaysOnlinePop3Agent::CreatePop3OperationL( 
+    TMsvOp& aOpId, 
+    TInt aFunctionId, 
+    TBool aCompletedOperation /*= EFalse*/ )
+    {
+    AOLOG_IN( "CAlwaysOnlinePop3Agent::CreatePop3OperationL" );
+    KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::CreatePop3OperationL() aFunctionId %d", aFunctionId);
+
+    CMsvEntrySelection* selection = new(ELeave) CMsvEntrySelection;
+    CleanupStack::PushL( selection );
+    CMsvSingleOpWatcher* watcher = CMsvSingleOpWatcher::NewL(*this);
+    CleanupStack::PushL( watcher );
+    CMsvOperation* op = NULL;
+
+    if ( aCompletedOperation )
+        {
+        op = CMsvCompletedOperation::NewL(  // CSI: 35 # cleanupstack is used
+                iSession, iEntry->Entry().iMtm, KNullDesC8, 
+                KMsvLocalServiceIndexEntryId, 
+                watcher->iStatus, KErrCancel);
+
+        aOpId = op->Id();
+
+        KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::CreatePop3OperationL: ADDING COMPLETED OPERATION. ID: %d", aOpId );
+        }
+    else
+        {
+        selection->AppendL( iEntry->Entry().iServiceId );
+        iPop3ClientMtm->SwitchCurrentEntryL( iEntry->Entry().iServiceId );
+
+        TImPop3PopulateOptions pop3GetMailInfo = FillMailOptionsL();
+        // Add the population limit to packet for fetch operation
+        TPckg<TImPop3PopulateOptions> params(pop3GetMailInfo);
+        
+        // Begin the fetching operation
+        op = iPop3ClientMtm->InvokeAsyncFunctionL( 
+            aFunctionId, *selection, params, watcher->iStatus);
+
+        aOpId = op->Id();
+        KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::CreatePop3OperationL: ADDING CONNECT OPERATION. ID: %d", aOpId );
+        }
+
+    CleanupStack::PushL( op );
+    AppendWatcherAndSetOperationL( watcher, op ); // takes immediately ownership
+    CleanupStack::Pop( 2, watcher); // op // CSI: 12,47 # nothing wrong
+    CleanupStack::PopAndDestroy( selection );//selection
+    KAOEMAIL_LOGGER_FN2("CAlwaysOnlinePop3Agent::CreatePop3OperationL");
+    }
+
+
+// ----------------------------------------------------------------------------
+// DoFilteredPopulateL
+// ----------------------------------------------------------------------------
+void CAlwaysOnlinePop3Agent::DoFilteredPopulateL()
+    {
+    AOLOG_IN( "CAlwaysOnlinePop3Agent::DoFilteredPopulateL" );
+    TInt32 sync = LoadSettingL<TInt32>( 
+        TImumInSettings::EKeySyncFlags, ETrue );
+
+    if ( sync == TImumInSettings::EFlagDownloadPartialCumulative ||
+         sync == TImumInSettings::EFlagSetDownloadAll )
+        {
+        // Either user defined limit or full download is selected
+        KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::DoFilteredPopulateL(): Doing filtered populate with setting: %d", sync );
+        iState = EEmailAgentDoingFilteredPopulate;
+        CreatePop3OperationL( 
+            iFilteredPopulateOpId, 
+            KPOP3MTMPopulateNew,
+            EFalse );
+        }
+    else
+        {
+        KAOEMAIL_LOGGER_WRITE("CAlwaysOnlinePop3Agent::DoFilteredPopulateL(): Filters not set. Will not populate." );
+        //set state and do completed op to step to next state
+        iState = EEmailAgentDoingFilteredPopulate;
+        CreateCompletedOpL();
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// HandleOpErrorL
+// ----------------------------------------------------------------------------
+void CAlwaysOnlinePop3Agent::HandleOpErrorL()
+    {
+    AOLOG_IN( "CAlwaysOnlinePop3Agent::HandleOpErrorL" );
+    AOLOG_WRMV( "iError: ",  EAoNormalError, iError, EAoLogSt3 );
+    KAOEMAIL_LOGGER_WRITE("CAlwaysOnlinePop3Agent::HandleOpErrorL() Error Handling started" );
+    KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::HandleOpErrorL() Error ID: %d", iError );
+    
+    switch ( iError )
+        {
+        case KErrNone:
+            //shouldn't come here if KErrNone
+            break;
+        case KErrAbort:
+        case KErrCancel:
+            KAOEMAIL_LOGGER_WRITE("CAlwaysOnlinePop3Agent::HandleOpErrorL(): KErrCancel");
+            //sometimes we seem to get these errors with connection operations.
+            //so go to initialised state -> reset all
+            iError = KErrNone;
+            iState = EEmailAgentInitialised; //this will be changed where those timers were cancelled.
+            break;
+        
+        case KErrGeneral://seems that this is what is given when phone/csd is in use
+            KAOEMAIL_LOGGER_WRITE("CAlwaysOnlinePop3Agent::HandleOpErrorL(): KErrGeneral");
+            iState = EEmailAgentQueued;
+            KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::HandleOpErrorL. Setting state:  %d ",iState );
+            break;
+        case KErrInUse:
+            KAOEMAIL_LOGGER_WRITE("CAlwaysOnlinePop3Agent::HandleOpErrorL(): KErrInUse");
+            iState = EEmailAgentQueued;
+            KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::HandleOpErrorL. Setting state:  %d ",iState );
+            break;
+        //fatal errors, cannot recover without user intervention
+        case KPop3InvalidUser:
+        case KPop3InvalidLogin:
+        case KPop3InvalidApopLogin:
+        case KErrPop3TLSNegotiateFailed:
+        case KImskSSLTLSNegotiateFailed:
+        case KErrCorrupt:
+            {
+            iState = EEmailAgentFatalError;
+            iRetryCounter = 0;
+            KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlinePop3Agent::HandleOpErrorL. Setting state:  %d ",iState );
+            }
+            break;
+        //This error occurs sometimes when network is reserverd or there is a dns problems
+        case KErrAoServerNotFound:
+            HandleDefaultError();
+            break;
+            
+        case KErrConnectionTerminated://red key
+        case KErrTimedOut:
+            KAOEMAIL_LOGGER_WRITE("CAlwaysOnlinePop3Agent::HandleOpErrorL. KErrConnectionTimedOut(-33) OR KErrConnectionTerminated");
+            iState = EEmailAgentConnTerminated;
+            break;
+        //let these go to default retry mechanism
+        case KImskErrorDNSNotFound:
+        case KImskErrorControlPanelLocked:
+        case KImskErrorISPOrIAPRecordNotFound:
+        case KImskErrorActiveSettingIsDifferent:
+        case KImskSecuritySettingsFailed:
+        case KPop3CannotCreateApopLogonString:            
+        case KPop3ProblemWithRemotePopServer:            
+        case KPop3CannotOpenServiceEntry:            
+        case KPop3CannotSetRequiredFolderContext:
+        case KPop3CannotConnect:
+        default:
+            HandleDefaultError();
+            break;
+        };
+    //reset error
+    iError = KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// DoSyncDisconnectL
+// ----------------------------------------------------------------------------
+void CAlwaysOnlinePop3Agent::DoSyncDisconnectL()
+    {
+    AOLOG_IN( "CAlwaysOnlinePop3Agent::DoSyncDisconnectL" );
+    if ( iEntry->Entry().Connected() )
+        {
+        KAOEMAIL_LOGGER_WRITE("CAlwaysOnlinePop3Agent::DoSyncDisconnectL() Doing SyncDisconnect! ");
+
+    	TBuf8<1> dummyParams;
+    	dummyParams.Zero();
+
+		// Needed to change next operation to synchronized
+        CMsvOperationActiveSchedulerWait* wait = 
+        	CMsvOperationActiveSchedulerWait::NewLC();
+        
+        CMsvEntrySelection* selection = new(ELeave) CMsvEntrySelection;
+        CleanupStack::PushL( selection );
+
+        selection->AppendL( iEntry->Entry().iServiceId );
+        iPop3ClientMtm->SwitchCurrentEntryL( iEntry->Entry().iServiceId );
+        CMsvOperation* op = iPop3ClientMtm->InvokeAsyncFunctionL( 
+            KPOP3MTMDisconnect, *selection, dummyParams, wait->iStatus);
+
+		// Start wait object
+        wait->Start();
+        
+        delete op;
+        CleanupStack::PopAndDestroy( 2, wait ); // selection // CSI: 12,47 # nothing wrong
+
+        KAOEMAIL_LOGGER_WRITE("CAlwaysOnlinePop3Agent::DoSyncDisconnectL() Should be disconnected now! ");
+        }
+    }
+
+// ----------------------------------------------------------------------------
+//  HandleOpCompleted
+// ----------------------------------------------------------------------------
+void CAlwaysOnlinePop3Agent::HandleOpCompleted( 
+    TMsvOp opId, 
+    TInt aCompletionCode )
+    {
+    AOLOG_IN( "CAlwaysOnlinePop3Agent::HandleOpCompleted" );
+    TInt trapErr;
+    
+    //save error code so we can handle errors elsewhere
+    if ( opId == iConnectOpId && aCompletionCode != KErrNone )
+        {
+        iError = aCompletionCode;
+        SetLastUpdateFailed();
+        }
+    else if ( opId == iConnectOpId )
+        {
+        iError = KErrNone;
+        iConnectOpId = KErrNotFound;
+        iRetryCounter = 0; //reset retry counter
+
+        //set last successful update date and time to settings
+        SetLastSuccessfulUpdate();
+        
+        }
+    else if ( opId == iFilteredPopulateOpId )
+        {
+        iFilteredPopulateOpId = KErrNotFound;
+        }
+    else if ( opId == iIntervalWaitId )
+        {
+        iIntervalWaitId = KErrNotFound;
+        }
+    else if ( opId == iWaitForStopOpId )
+        {
+        if ( aCompletionCode == KErrNone )
+            {
+            iWaitForStopOpId = KErrNotFound;
+            TRAP( trapErr, CheckAndHandleSchedulingL() );
+            }
+        }
+    else if ( opId == iWaitForStartOpId )
+        {
+        if ( aCompletionCode == KErrNone )
+            {
+            iWaitForStartOpId = KErrNotFound;
+            TRAP( trapErr, CheckAndHandleSchedulingL() );
+            }
+        }
+    else if ( opId == iStartDelayOpId )
+        {
+        iFlags->SetFlag( EAOBFConnectNow );        
+        //leave id untouched. We need this only once, on bootup, or when agent is activated via settings
+        //we use this to check is it used already
+        //iStartDelayOpId;
+        }
+    
+    TRAP_IGNORE( CallNewMessagesL() );
+    }
+
+// ----------------------------------------------------------------------------
+//  CreateCompletedOpL
+// ----------------------------------------------------------------------------
+void CAlwaysOnlinePop3Agent::CreateCompletedOpL()
+    {
+    AOLOG_IN( "CAlwaysOnlinePop3Agent::CreateCompletedOpL" );
+    CreatePop3OperationL( 0, ETrue );//creates completed operation
+    }
+
+// ----------------------------------------------------------------------------
+//  MailHasBeenSyncedL()
+// ----------------------------------------------------------------------------
+TBool CAlwaysOnlinePop3Agent::MailHasBeenSyncedL()
+    {
+    AOLOG_IN( "CAlwaysOnlinePop3Agent::MailHasBeenSyncedL" );
+
+    //we need to set this only once during the lifetime of ImapAgent
+    if ( iHasBeenSynced )
+        {
+        return iHasBeenSynced;
+        }
+
+    iHasBeenSynced = EFalse;
+    
+    CMsvEntrySelection* sel = iEntry->ChildrenL();
+    CleanupStack::PushL( sel );
+    if ( sel->Count() )
+        {
+        iHasBeenSynced = ETrue;
+        }
+    CleanupStack::PopAndDestroy( sel );
+
+    return iHasBeenSynced;
+    }