ipsservices/ipssosaoplugin/src/IpsSosAOMboxLogic.cpp
changeset 0 8466d47a6819
child 4 e7aa27f58ae1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ipsservices/ipssosaoplugin/src/IpsSosAOMboxLogic.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,848 @@
+/*
+* Copyright (c) 2008 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: 
+*     Contains mailbox specified always online logic
+*
+*/
+
+
+//<cmail> internal dependency removed
+/*#ifdef _DEBUG
+#include "../../internal/IpsSosAOPluginTester/inc/IpsSosAOPluginTester.hrh"
+#endif // _DEBUG*/
+//</cmail>
+
+#include "emailtrace.h"
+#include "IpsSosAOMboxLogic.h"
+#include "ipssetdataapi.h"
+#include "IpsSosAOSchedulerUtils.h"
+#include "IpsSosAOPlugin.hrh"
+#include "IpsSosAOImapPopLogic.h"
+
+const TInt KAOSecondsInMinute = 60;
+const TInt KIpsSosAOMboxLogicMinGra = 1;
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//
+CIpsSosAOMBoxLogic::CIpsSosAOMBoxLogic( 
+        CMsvSession& aSession, 
+        TMsvId aMailboxId ) :
+    iSession( aSession ), iMailboxId( aMailboxId ), iState( EStateError ),
+    iErrorCounter( 0 ), iError( KErrNone ), iTimer( NULL ),
+    iFetchMsgArray( KIpsSosAOMboxLogicMinGra ), iDataApi( NULL ), iAgent( NULL ),
+    iExtendedSettings( NULL ), iIsRoaming( EFalse )
+    {
+    FUNC_LOG;
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//
+CIpsSosAOMBoxLogic::~CIpsSosAOMBoxLogic()
+    {
+    FUNC_LOG;
+    delete iTimer;
+    delete iDataApi;
+    delete iExtendedSettings;
+    delete iAgent;
+    iFetchMsgArray.Close();
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//
+CIpsSosAOMBoxLogic* CIpsSosAOMBoxLogic::NewL( 
+        CMsvSession& aSession,
+        TMsvId aMailboxId )
+    {
+    FUNC_LOG;
+    CIpsSosAOMBoxLogic* self = new (ELeave) CIpsSosAOMBoxLogic( 
+            aSession,  aMailboxId );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//
+void CIpsSosAOMBoxLogic::ConstructL()
+    {
+    FUNC_LOG;
+    iTimer = CIpsSosAOPluginTimer::NewL( CActive::EPriorityStandard, *this );
+    iDataApi = CIpsSetDataApi::NewL( iSession );
+    iAgent = CIpsSosAOBaseAgent::CreateAgentL( iSession, *this, iMailboxId );
+    LoadSettingsL();
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//   
+void CIpsSosAOMBoxLogic::TimerFiredL()
+    {
+    FUNC_LOG;
+    HandleEventAndSwitchStateL( EEventTimerFired );
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//   
+void CIpsSosAOMBoxLogic::OperationCompletedL( TInt aError )
+    {
+    FUNC_LOG;
+    iError = aError;
+    HandleEventAndSwitchStateL( EEventOperationCompleted );
+    iError = KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//  
+void CIpsSosAOMBoxLogic::SendCommandL( TInt aCommand )
+    {
+    FUNC_LOG;
+    switch ( aCommand )
+        {
+        case ECommandStart:
+            HandleEventAndSwitchStateL( EEventStart );
+            break;
+        case ECommandStop:
+            HandleEventAndSwitchStateL( EEventStopAndRemoveOps );
+            break;
+        case ECommandSuspend:
+            HandleEventAndSwitchStateL( EEventSuspendOperations );
+            break;
+        case ECommandContinue:
+            HandleEventAndSwitchStateL( EEventContinueOperations );
+            break;
+        case ECommandStartSync:
+            HandleEventAndSwitchStateL( EEventStartSync );
+            if ( iState != EStateSyncOngoing )
+                {
+                User::Leave( KErrGeneral );
+                }
+            break;
+        case ECommandStartedRoaming:
+            iIsRoaming = ETrue;
+            if ( !CanConnectIfRoamingL() )
+                {
+                HandleEventAndSwitchStateL( EEventStopAndRemoveOps );
+                }
+            break;
+        case ECommandStoppedRoaming:
+            iIsRoaming = EFalse;
+            HandleEventAndSwitchStateL( EEventStart );
+            break;
+        case ECommandCancelAndDisconnect:
+            iAgent->CancelAllAndDisconnectL();
+            CalculateToNextIntervalL();
+            break;
+        case ECommandCancelDoNotDiconnect:
+            if ( iAgent->GetState() != CIpsSosAOBaseAgent::EStateCompleted ||
+                    iAgent->GetState() != CIpsSosAOBaseAgent::EStateIdle  )
+                {
+                iAgent->CancelAllAndDoNotDisconnect();
+                CalculateToNextIntervalL();
+                }
+            break;
+        case ECommandClearDoNotDisconnect:
+            iAgent->ClearDoNotDisconnect();
+            break;
+        case ECommandDoNotDisconnect:
+            iAgent->DoNotDisconnect();
+            break;
+        default:
+            break;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//  
+void CIpsSosAOMBoxLogic::FetchMessagesL( const RArray<TMsvId> aArray )
+    {
+    FUNC_LOG;
+    LoadSettingsL();
+    for ( TInt i = 0; i < aArray.Count(); i++ )
+        {
+        iFetchMsgArray.AppendL( aArray[i] );
+        }
+    HandleEventAndSwitchStateL( EEventFetchMessages );
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//  
+TMsvId CIpsSosAOMBoxLogic::GetMailboxId()
+    {
+    FUNC_LOG;
+    return iMailboxId;
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//  
+CIpsSosAOBaseAgent& CIpsSosAOMBoxLogic::GetAgent() const
+    {
+    FUNC_LOG;
+    return *iAgent;
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// 
+TBool CIpsSosAOMBoxLogic::IsEmnOn() const
+    {
+    FUNC_LOG;
+    TBool ret = ETrue;
+    TIpsSetDataEmnStates state = EMailEmnOff;
+    if ( iExtendedSettings )
+        {
+        state = iExtendedSettings->EmailNotificationState();
+        }
+    if ( state == EMailEmnOff )
+        {
+        ret = EFalse;
+        }
+    return ret;
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// 
+void CIpsSosAOMBoxLogic::GetEmailAddress(  
+    TBuf<KIpsSosAOTextBufferSize>& aEmailAddress ) const
+    {
+    FUNC_LOG;
+    const TDesC& addr = iExtendedSettings->EmailAddress();
+    __ASSERT_DEBUG( ( 
+            addr.Length() <= KIpsSosAOTextBufferSize ), 
+            User::Panic( KIpsSosAOPanicLit, KErrGeneral) );
+    
+    if ( addr.Length() <= KIpsSosAOTextBufferSize )
+        {
+        aEmailAddress.Copy( addr );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//  
+//<cmail>
+void CIpsSosAOMBoxLogic::SetEmnReceivedFlagL( TBool aNewValue )
+//</cmail>
+    {
+    LoadSettingsL();
+    iExtendedSettings->SetEmnReceivedButNotSyncedFlag( aNewValue );
+    iDataApi->SaveExtendedSettingsL(
+        *iExtendedSettings );
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//
+//<cmail>
+TBool CIpsSosAOMBoxLogic::IsMailboxRoamingStoppedL()
+//</cmail>
+    {
+    TBool ret = EFalse;
+    if ( iIsRoaming && !CanConnectIfRoamingL() )
+        {
+        ret = ETrue;
+        }
+    return ret;
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//  
+void CIpsSosAOMBoxLogic::HandleEventAndSwitchStateL( 
+        TInt aEvent )
+    {
+    FUNC_LOG;
+    TInt event = aEvent;
+    TInt cycles = 0;
+    
+    if ( event == EEventStart && iState == EStateError && 
+            CanConnectIfRoamingL() )
+        {
+        event = EEventNop;
+        iAgent->LoadSettingsL();
+        iTimer->Cancel();
+        iTimer->After( KIpsSosAOStartDelaySeconds );
+        iState = EStateWaitSyncStart;
+        }
+    
+    while ( event != EEventNop && iState != EStateError )
+        {
+//<cmail> removing flags    
+/*#ifdef IPSSOSIMAPPOLOGGING_ON
+        WriteDebugData( event );
+#endif*/
+//</cmail>
+        switch ( event )
+            {
+            case EEventTimerFired:
+                event = HandleTimerFiredL();
+              break;
+            case EEventStartSync:
+                if ( iState == EStateWaitSyncStart )
+                    {         
+                    iError = KErrNone;
+                    iAgent->StartSyncL();
+                    iState = EStateSyncOngoing;
+                    }
+                else if ( iState == EStateIdleAndWaitCommands )
+                    {
+                    // start sync command in idle state is currently 
+                    // received when emn arrives, checking scheduling 
+                    // if user have selected week days / hours in setting
+                    CIpsSosAOSchedulerUtils* scheduler = 
+                        CIpsSosAOSchedulerUtils::NewLC( *iExtendedSettings );
+                    TTimeIntervalSeconds seconds;
+                    TIpsSosAOConnectionType type = 
+                        scheduler->SecondsToNextMark( seconds );
+                    if ( type == EAOCConnectAfter )
+                        {
+                        iState = EStateWaitSyncStart;
+                        iTimer->After( seconds );
+                        //<cmail>
+                        SetEmnReceivedFlagL( ETrue );
+                        //</cmail>
+                        }
+                    else
+                        {
+                        iError = KErrNone;
+                        iAgent->StartSyncL();
+                        iState = EStateSyncOngoing;
+                        }
+                    CleanupStack::PopAndDestroy( scheduler );
+                    }
+                // ignore in other states
+                event = EEventNop;
+                break;
+            case EEventFetchMessages:
+                if ( ( iState == EStateWaitSyncStart || 
+                       iState == EStateIdleAndWaitCommands ) &&
+                        iFetchMsgArray.Count() > 0 )
+                    {
+                    iError = KErrNone;
+                    iAgent->StartFetchMessagesL( iFetchMsgArray );
+                    iFetchMsgArray.Reset();
+                    iState = EStateFetchOngoing;
+                    }
+                else 
+                    {
+                    // ignore event in other states
+                    iFetchMsgArray.Reset();
+                    }
+                event = EEventNop;
+                break;
+            case EEventOperationCompleted:
+                event = HandleOperationCompletionL();
+                break;
+            case EEventSuspendOperations:
+                SuspendOperations();
+                iState = EStateSuspended;
+                event = EEventNop;
+                break;
+            case EEventContinueOperations:
+                if ( iState == EStateSuspended )
+                    {
+                    iTimer->After( KIpsSosAOContinueWaitTime );
+                    }
+                else
+                    {
+                    event = EEventNop;
+                    }
+                // ignore if in other states
+                break;
+            case EEventStopAndRemoveOps:
+                // notify deletion
+                iAgent->CancelAllAndDisconnectL();
+                iTimer->Cancel();
+                iState = EStateError;
+                event = EEventNop;
+                break;
+            case EEventStart:
+            default:
+                // ignore other events
+                event = EEventNop;
+                break;
+            }
+        
+        // TO Prevent forever loop (and freezing) 
+        // if there is programming error in state machine logic
+        __ASSERT_ALWAYS( ( 
+                cycles < KIpsSosAOMaxStateCycles ), 
+                User::Panic( KIpsSosAOPanicLit, KErrGeneral) );
+        ++cycles;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// 
+TInt CIpsSosAOMBoxLogic::GetCurrentState() const
+    {
+    FUNC_LOG;
+    return iState;
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// 
+TInt CIpsSosAOMBoxLogic::GetCurrentError() const
+    {
+    FUNC_LOG;
+    return iError;
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// 
+TInt CIpsSosAOMBoxLogic::HandleTimerFiredL()
+    {
+    FUNC_LOG;
+    // panic if we are in wrong state;
+    __ASSERT_DEBUG( ( iState == EStateWaitSyncStart || 
+            iState == EStateSuspended ), 
+            User::Panic( KIpsSosAOPanicLit, KErrGeneral) );
+    
+    // handle emn
+    TInt event = EEventNop;
+
+    CIpsSosAOBaseAgent::TAgentState agentState = iAgent->GetState();
+    if ( iState == EStateSuspended &&
+        ( agentState == CIpsSosAOBaseAgent::EStateConnectAndSyncOnHold || 
+          agentState == CIpsSosAOBaseAgent::EStatePopulateOnHold ) )
+        {
+        iAgent->ContinueHoldOperations();
+        iState = EStateSyncOngoing;
+        }
+    else if ( iState == EStateSuspended && 
+            agentState == CIpsSosAOBaseAgent::EStateFetchOnHold )
+        {
+        iAgent->ContinueHoldOperations();
+        iState = EStateFetchOngoing;
+        }
+    else
+        {
+        event = CheckSchedulingAndSwitchStateL();
+        }
+    // in other states, timer event is ignored
+    
+    return event;
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// 
+TInt CIpsSosAOMBoxLogic::HandleOperationCompletionL()
+    {
+    FUNC_LOG;
+    TInt event = EEventNop;
+    if ( iState == EStateSyncOngoing )
+        {
+        if ( !( iError == KErrNone || iError == KErrCancel ) )
+            {
+            ++iErrorCounter;
+            }
+        else
+            {
+            iError = KErrNone;
+            iErrorCounter = 0;
+            }
+        //<cmail>
+        if ( iError != KErrNone && 
+                IsErrorFatalL( iError ) )
+        //</cmail>
+            {
+            iAgent->CancelAllAndDisconnectL();
+            // switch ao off
+            iExtendedSettings->SetAlwaysOnlineState( EMailAoOff );
+            // emn not swithced of if its going to be "always on" in
+            // future
+            iExtendedSettings->SetEmnReceivedButNotSyncedFlag( EFalse );
+            iDataApi->SaveExtendedSettingsL(
+                *iExtendedSettings );
+            iState = EStateError;
+            iErrorCounter = 0;
+            }
+        else if ( iError != KErrNone && 
+                iErrorCounter < KIpsSosAOMaxReTryTimes )
+            {
+            // not fatal error
+            TIpsSetDataAoStates state = iExtendedSettings->AlwaysOnlineState();
+            if ( state == EMailAoOff )
+                {
+                iState = EStateIdleAndWaitCommands;
+                }
+            else
+                {
+                if( !iTimer->IsActive() )
+                    {
+                iTimer->After( KIpsSosAOReTryInterval );
+                    }
+                iState = EStateWaitSyncStart;
+                }
+            }
+        else if ( iError != KErrNone && 
+                iErrorCounter >= KIpsSosAOMaxReTryTimes )
+            {
+            //<cmail>
+            SetEmnReceivedFlagL( EFalse );
+            //</cmail>
+            // not fatal, but all re trys are gone
+            CalculateToNextIntervalL();
+            }
+        else
+            {
+            // no errors
+            // update successfull sync time to settings
+            SaveSuccessfulSyncTimeL();
+            // and adjust timer to sync interval
+            CalculateToNextIntervalL();
+            }
+        }
+    else if ( iState == EStateFetchOngoing )
+        {
+        iError = KErrNone;
+        if ( iTimer->IsActive() )
+            {
+            iState = EStateWaitSyncStart;
+            }
+        else
+            {
+            event = CheckSchedulingAndSwitchStateL();          
+            }
+        }
+    return event;
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+// 
+void CIpsSosAOMBoxLogic::SuspendOperations()
+    {
+    FUNC_LOG;
+    if ( iState == EStateSyncOngoing || iState == EStateFetchOngoing )
+        {
+        iAgent->HoldOperations();
+        }
+    iState = EStateSuspended;
+    // set suspend watchdog, if clien not continue this
+    // ensure ao logic to continue
+    if ( !iTimer->IsActive() )
+        {
+        iTimer->After( KIpsSosAOSuspendWatchdogTime );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//
+//<cmail>
+TBool CIpsSosAOMBoxLogic::IsErrorFatalL( TInt aError )
+//</cmail>
+    {
+    FUNC_LOG;
+    // error can be fatal only if we haven't got successful connect
+    // in mailbox ever and error is something else than KErrNone or
+    // KErrCancel, and retry interval is reached
+    TBool ret = EFalse;
+    LoadSettingsL();
+    TAOInfo info = iExtendedSettings->LastUpdateInfo();
+    if ( aError != KErrNone && aError != KErrCancel 
+            && !info.iUpdateSuccessfulWithCurSettings
+            && iErrorCounter >= KIpsSosAOMaxReTryTimes )
+        {
+        ret = ETrue;
+        }
+    return ret;
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//
+CIpsSosAOMBoxLogic::TMBoxLogicEvent 
+    CIpsSosAOMBoxLogic::CheckSchedulingAndSwitchStateL()
+    {
+     //<cmail> logs removed </cmail>
+    iTimer->Cancel();
+    TMBoxLogicEvent event = EEventNop;
+    TTimeIntervalSeconds secondsToConnect = CalculateScheduledSyncTimeL();
+    //<cmail> logs removed </cmail>
+    if ( secondsToConnect.Int() == 0 )
+        {
+        //check last successfull sync time and check is interval reached
+        TAOInfo info = iExtendedSettings->LastUpdateInfo();
+        if ( !info.iUpdateSuccessfulWithCurSettings )
+            {
+            event = EEventStartSync;
+            }
+        else 
+            {
+            TTime now;
+            now.HomeTime();
+            TInt interval = 
+                iExtendedSettings->InboxRefreshTime() * KAOSecondsInMinute;
+            TTimeIntervalSeconds secsFromLastSync;
+            now.SecondsFrom( info.iLastSuccessfulUpdate, secsFromLastSync );
+            if ( (secsFromLastSync.Int() > 0) && ( 
+                    secsFromLastSync.Int() < interval ) )
+                {
+                // adjust timer to correct sync time
+                iTimer->After(interval - secsFromLastSync.Int());        
+                iState = EStateWaitSyncStart;
+                }
+            else
+                {
+                event = EEventStartSync;
+                }
+            }
+        }
+    else if ( secondsToConnect.Int() == KErrNotFound )
+        {
+        // means that ao is not on (but emn is)
+        iState = EStateIdleAndWaitCommands;
+        if ( iExtendedSettings->EmnReceivedButNotSyncedFlag() )
+            {
+            // got emn when logic was stopped
+            event = EEventStartSync;
+            }
+        }
+    else
+        {
+        iTimer->After( secondsToConnect );
+        iState = EStateWaitSyncStart;
+        }
+    
+    return event;
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//
+void CIpsSosAOMBoxLogic::CalculateToNextIntervalL()
+    {
+    FUNC_LOG;
+    //<cmail> logs removed </cmail>
+    iTimer->Cancel();
+    TTimeIntervalSeconds interval;
+    // first check and calculate scheduling function also loads settings
+    interval = CalculateScheduledSyncTimeL();
+    //<cmail> logs removed </cmail>
+    if ( interval.Int() == 0 )
+        {
+        // add next interval, if interval is grater than 0 it means
+        // that off-line time is going, user have selected days / times from
+        // settings
+        iTimer->After( 
+                iExtendedSettings->InboxRefreshTime() * KAOSecondsInMinute );
+        iState = EStateWaitSyncStart;
+        }
+    else if ( interval.Int() > 0 )
+        {
+        iTimer->After( interval );
+        iState = EStateWaitSyncStart;
+        }
+    else 
+        {
+        iState = EStateIdleAndWaitCommands;
+        }
+    
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//
+TTimeIntervalSeconds CIpsSosAOMBoxLogic::CalculateScheduledSyncTimeL()
+    {
+    FUNC_LOG;
+    //<cmail> logs removed </cmail> 
+    LoadSettingsL();
+    TTimeIntervalSeconds seconds;
+    
+    // first check is ao or emn on at all
+    if ( (iExtendedSettings->AlwaysOnlineState() == EMailAoOff && 
+            iExtendedSettings->EmailNotificationState() == EMailEmnOff  )||
+        iExtendedSettings->SelectedWeekDays() == 0 ) // no week days chosen
+        {
+        // no timed sync on
+        return KErrNotFound;
+        }
+    
+    if ( iExtendedSettings->EmailNotificationState() != EMailEmnOff && 
+         !iExtendedSettings->EmnReceivedButNotSyncedFlag()   )
+        {
+        return KErrNotFound;
+        }
+    
+    
+    CIpsSosAOSchedulerUtils* scheduler = CIpsSosAOSchedulerUtils::NewLC(
+        *iExtendedSettings );
+
+    TIpsSosAOConnectionType type = scheduler->SecondsToNextMark( seconds );
+    if ( type == EAOCDisconnectAfter ) 
+        {
+        // if type is EAOCDisconnectAfter it means that scheduled days / times
+        // end after interval function returned in seconds reference
+        // when connection is not kept open we not need timer for 
+        // disconnection. Just return 0 as a mark that sync can be started
+        seconds = 0;
+        }
+    else
+        {
+        // this means that user have choosed time/day schedule at 
+        // timed sync and now we have to wait sync time
+        }
+    CleanupStack::PopAndDestroy( scheduler );
+    return seconds;
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//
+void CIpsSosAOMBoxLogic::LoadSettingsL()
+    {
+    FUNC_LOG;
+    //<cmail> logs removed </cmail> 
+    delete iExtendedSettings;
+    iExtendedSettings = NULL;
+    iExtendedSettings = CIpsSetDataExtension::NewL();
+    iDataApi->LoadExtendedSettingsL( iMailboxId, *iExtendedSettings );
+    //<cmail> logs removed </cmail>
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//
+void CIpsSosAOMBoxLogic::SaveSuccessfulSyncTimeL()
+    {
+    FUNC_LOG;
+    TTime now;
+    now.HomeTime();
+    LoadSettingsL();
+    TAOInfo info;
+    info.iLastSuccessfulUpdate = now;
+    info.iUpdateSuccessfulWithCurSettings = ETrue;
+    iExtendedSettings->SetLastUpdateInfo( info );
+    // clear flag
+    iExtendedSettings->SetEmnReceivedButNotSyncedFlag( EFalse );
+    iDataApi->SaveExtendedSettingsL(
+            *iExtendedSettings );
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+TBool CIpsSosAOMBoxLogic::CanConnectIfRoamingL()
+    {
+    FUNC_LOG;
+    TBool ret = ETrue;
+    LoadSettingsL();
+    if ( ( iExtendedSettings->EmailNotificationState() == EMailEmnHomeOnly 
+          || iExtendedSettings->AlwaysOnlineState() == EMailAoHomeOnly
+          || iExtendedSettings->RoamHomeOnlyFlag() ) && iIsRoaming )
+        {
+        ret = EFalse;
+        }
+    return ret;          
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+TBool CIpsSosAOMBoxLogic::FirstEMNReceived()
+    {
+    return iExtendedSettings->FirstEmnReceived();
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+void CIpsSosAOMBoxLogic::SetFirstEMNReceived()
+    {
+    TRAP_IGNORE( LoadSettingsL() );
+    iExtendedSettings->SetFirstEmnReceived( ETrue );
+    
+    //if alwaysonline was allowed to roam, so will EMN be.
+    iExtendedSettings->SetEmailNotificationState(
+            iExtendedSettings->AlwaysOnlineState() == 
+            EMailAoAlways ? EMailEmnAutomatic : EMailEmnHomeOnly );
+    
+    
+    // set always online state off when emn is on
+    iExtendedSettings->SetAlwaysOnlineState( EMailAoOff );    
+    iExtendedSettings->SetInboxRefreshTime( KErrNotFound );
+    
+    TRAP_IGNORE( iDataApi->SaveExtendedSettingsL(
+       *iExtendedSettings ) );    
+    
+    }
+//<cmail> removing flags
+/*
+#ifdef IPSSOSIMAPPOLOGGING_ON
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+//
+void CIpsSosAOMBoxLogic::WriteDebugData( TInt aEvent )
+    {
+    switch ( aEvent )
+        {
+        case EEventTimerFired:
+            break;
+        case EEventStartSync:
+            break;
+        case EEventFetchMessages:
+            break;
+        case EEventOperationCompleted:
+            break;
+        case EEventSuspendOperations:
+            break;
+        case EEventContinueOperations:
+            break;
+        case EEventStart:
+            break;
+        case EEventStopAndRemoveOps:
+            break;
+        case EEventNop:
+            break;
+        default:
+            break;
+        }
+
+    switch ( iState )
+        {
+        case EStateWaitSyncStart:
+            break;
+        case EStateSyncOngoing:
+            break;
+        case EStateFetchOngoing:
+            break;
+        case EStateSuspended:
+            break;
+        case EStateIdleAndWaitCommands:
+            break;
+        case EStateError:
+            break;
+        default:
+            break;
+        };
+    }
+#endif // IPSSMTPLOGGING_ON*/
+//</cmail>    
+
+// End of file
+